SeccComm.c 712 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999
  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. usleep(1000);
  1352. TotalTmpVolt = ReadAdcVolt(3);
  1353. ccs->CpVoltage = TotalTmpVolt;
  1354. if (ccs->CpVoltage_pre != ccs->CpVoltage)
  1355. {
  1356. ccs->CpVoltage_pre = ccs->CpVoltage;
  1357. }
  1358. //printf("TotalTmpVolt = %.02f\n", TotalTmpVolt);
  1359. //If CP voltage is higer than 13.5V
  1360. if(TotalTmpVolt >= 13.5)
  1361. {
  1362. //Pilot Error
  1363. if((ccs->CpState == 1) &&
  1364. (TotalTmpVolt < 13.75))
  1365. {
  1366. //V_cp = 13.5 ~ 13.75
  1367. Statetmp = 1;
  1368. }
  1369. else
  1370. {
  1371. //V_cp = 13.5 ~
  1372. Statetmp = 8;
  1373. }
  1374. }
  1375. else if((TotalTmpVolt >= 10.5) && (TotalTmpVolt < 13.5)) //V_cp = 10.5 ~ 13.5
  1376. {
  1377. //State A (12V)
  1378. if((ccs->CpState >= 2) &&
  1379. (ccs->CpState <= 3) &&
  1380. (TotalTmpVolt < 10.75))
  1381. {
  1382. if((ccs->CpDuty >= 5) &&
  1383. (ccs->CpDuty < 100))
  1384. {
  1385. Statetmp = 3;
  1386. }
  1387. else
  1388. {
  1389. Statetmp = 2;
  1390. }
  1391. }
  1392. else if((ccs->CpState == 8) &&
  1393. (TotalTmpVolt >= 13.25))
  1394. {
  1395. Statetmp = 8;
  1396. }
  1397. else
  1398. {
  1399. Statetmp = 1;
  1400. }
  1401. }
  1402. else if((TotalTmpVolt >= 7.5) && (TotalTmpVolt < 10.5))
  1403. {
  1404. //State B (9V)
  1405. if((ccs->CpState == 4) && (TotalTmpVolt < 7.75))
  1406. {
  1407. Statetmp = 4;
  1408. }
  1409. else if((ccs->CpState == 1) && (TotalTmpVolt >= 10.25))
  1410. {
  1411. Statetmp = 1;
  1412. }
  1413. else
  1414. {
  1415. if((ccs->CpDuty >= 5) && (ccs->CpDuty < 100))
  1416. {
  1417. Statetmp = 3;
  1418. }
  1419. else
  1420. {
  1421. Statetmp = 2;
  1422. }
  1423. }
  1424. }
  1425. else if((TotalTmpVolt >= 4.5) && (TotalTmpVolt < 7.5))
  1426. {
  1427. //State C (6V)
  1428. if((ccs->CpState == 5) && (TotalTmpVolt < 4.75))
  1429. {
  1430. Statetmp = 5;
  1431. }
  1432. else if((ccs->CpState >= 2) && (ccs->CpState <= 3) && (TotalTmpVolt >= 7.25))
  1433. {
  1434. if((ccs->CpDuty >= 5)&&(ccs->CpDuty < 100))
  1435. {
  1436. Statetmp = 3;
  1437. }
  1438. else
  1439. {
  1440. Statetmp = 2;
  1441. }
  1442. }
  1443. else
  1444. {
  1445. Statetmp = 4;
  1446. }
  1447. }
  1448. else if((TotalTmpVolt >= 1.5) && (TotalTmpVolt < 4.5))
  1449. {
  1450. //State D (3V)
  1451. if((ccs->CpState == 6)&&(TotalTmpVolt < 1.75))
  1452. {
  1453. Statetmp = 6;
  1454. }
  1455. else if((ccs->CpState == 4)&&(TotalTmpVolt >= 4.25))
  1456. {
  1457. Statetmp = 4;
  1458. }
  1459. else
  1460. {
  1461. Statetmp = 5;
  1462. }
  1463. }
  1464. else if((TotalTmpVolt >= -1.5) && (TotalTmpVolt < 1.5)) //V_cp = -1.5V ~ 1.5V
  1465. {
  1466. //State E (0V)
  1467. if((ccs->CpState == 8) &&
  1468. (TotalTmpVolt < -1.25))
  1469. {
  1470. Statetmp = 8;
  1471. }
  1472. else if((ccs->CpState == 5) &&
  1473. (TotalTmpVolt >= 1.25))
  1474. {
  1475. Statetmp = 5;
  1476. }
  1477. else
  1478. {
  1479. Statetmp = 6;
  1480. }
  1481. }
  1482. else if((TotalTmpVolt >= -13.5) && (TotalTmpVolt < -10.5)) //V_cp = -10.5V ~ -13.5V
  1483. {
  1484. //State F (-12V)
  1485. if((ccs->CpState == 8) &&
  1486. (TotalTmpVolt >= -10.75))
  1487. {
  1488. Statetmp = 8;
  1489. }
  1490. else
  1491. {
  1492. Statetmp = 7;
  1493. }
  1494. }
  1495. else
  1496. {
  1497. //null
  1498. }
  1499. ccs->CpState = Statetmp;
  1500. }
  1501. #endif
  1502. Check_CP_State_Update_fork1(ccs);
  1503. #ifndef AWCCS
  1504. Check_CP_State_Error_fork1(ccs);
  1505. #endif
  1506. //Updating Plugin status
  1507. #if (PP_PROTECTION_MECHANISM == ENABLE)
  1508. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ) &&
  1509. (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)))
  1510. )
  1511. #else
  1512. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ))
  1513. #endif
  1514. {
  1515. ccs->ConnectorPlugIn_new = TRUE;
  1516. }
  1517. else
  1518. {
  1519. ccs->ConnectorPlugIn_new = FALSE;
  1520. OutputCpPwmDuty(100);
  1521. }
  1522. Check_Plugin_Status_Update_fork1(ccs);
  1523. //ftime(&EndTime);
  1524. //DEBUG_PRINTF_EVCOMM_DETAIL("duration:%.02lf\n", DiffTimeb(StartTime, EndTime));
  1525. }//while
  1526. }
  1527. /*===========================================================================
  1528. FUNCTION: PP_Detection
  1529. DESCRIPTION:
  1530. 0. SeccComm fork3
  1531. 1. In order to detect CP in efficient response time, we creat an independent
  1532. thead for this procedure.
  1533. 2. The priority of this thread is set as the same as other tasks.
  1534. PRE-CONDITION:
  1535. INPUT:
  1536. OUTPUT:
  1537. GLOBAL VARIABLES:
  1538. =============================================================================*/
  1539. void PP_Detection()
  1540. {
  1541. pid_t tmp = 0;
  1542. // struct timeb StartTime, EndTime;
  1543. unsigned char Statetmp;
  1544. float TotalTmpVolt;
  1545. if(PP_Detection_Pid == 0)
  1546. {
  1547. tmp = fork();
  1548. if(tmp > 0)
  1549. {
  1550. PP_Detection_Pid = tmp;
  1551. #if 0
  1552. unsigned char buf[64];
  1553. memset(buf, 0, sizeof(buf));
  1554. sprintf(buf, "renice -10 -p %d", tmp);
  1555. system(buf);
  1556. #endif
  1557. return;
  1558. }
  1559. }
  1560. TotalTmpVolt = ReadAdcVolt_PP_fork3();
  1561. while(1)
  1562. {
  1563. TotalTmpVolt = ReadAdcVolt_PP_fork3();
  1564. EVCOMM_SYS_INFO.PpVoltage = TotalTmpVolt;
  1565. if (EVCOMM_SYS_INFO.PpVoltage_pre != EVCOMM_SYS_INFO.PpVoltage)
  1566. {
  1567. 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))
  1568. ||(( (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)))
  1569. {
  1570. // plug-in : CCS1 (0.61 < V <1.185), CCS2 (1.2 < V <2.4)
  1571. sprintf(buf_log_evcomm_fork3,
  1572. "[fork3]PP(%.2f >> %.2fV)",
  1573. EVCOMM_SYS_INFO.PpVoltage_pre,
  1574. EVCOMM_SYS_INFO.PpVoltage
  1575. );
  1576. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork3);
  1577. EVCOMM_SYS_INFO.PpVoltage_pre = EVCOMM_SYS_INFO.PpVoltage;
  1578. }
  1579. }
  1580. #if 0
  1581. sleep(5);
  1582. printf("V_pp = %.02f\n", TotalTmpVolt);
  1583. #endif
  1584. }//while
  1585. }
  1586. /*===========================================================================
  1587. FUNCTION: Error_Monitor
  1588. DESCRIPTION:
  1589. 1. This function only works in SeccComm fork2.
  1590. PRE-CONDITION:
  1591. INPUT:
  1592. OUTPUT:
  1593. GLOBAL VARIABLES:
  1594. =============================================================================*/
  1595. void Error_Monitor()
  1596. {
  1597. pid_t tmp = 0;
  1598. double time_diff = 0;
  1599. unsigned char status = 0;
  1600. struct ChargingInfoData *ccs;
  1601. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1602. if(Error_Monitor_Pid == 0)
  1603. {
  1604. tmp = fork(); //SeccComm fork2
  1605. if(tmp > 0)
  1606. {
  1607. Error_Monitor_Pid = tmp;
  1608. #if 0
  1609. unsigned char buf[64];
  1610. memset(buf, 0, sizeof(buf));
  1611. sprintf(buf, "renice -20 -p %d", tmp);
  1612. system(buf);
  1613. #endif
  1614. return;
  1615. }
  1616. }
  1617. while(1)
  1618. {
  1619. //Step 0
  1620. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  1621. {
  1622. //If the End_Process is in processing, disable Error_Monitor.
  1623. continue;
  1624. }
  1625. //Step1 1: Check and Response to Plugin Status
  1626. if(CheckConnectorPlugIn() == FALSE)
  1627. {
  1628. status = Check_V2G_Flow_Status();
  1629. if (status > IDLE &&
  1630. status < Performance_Timeout &&
  1631. status != CM_SET_KEY_REQ &&
  1632. status != CM_SET_KEY_CNF &&
  1633. EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  1634. {
  1635. #if (CP_PROTECTION_MECHANISM == ENABLE)
  1636. //SAVE_SYS_LOG_MSG_EVCOMM("[fork2] Emergency Stop (due to Connector is plugged out during communication.)");
  1637. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Plug out Error => End_Process");
  1638. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1639. //CCS_SECC_CP_State_Error (023889)
  1640. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1641. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1642. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1643. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1644. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1645. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1646. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1647. End_Process();
  1648. #else
  1649. //SAVE_SYS_LOG_MSG_EVCOMM("CP_PROTECTION_MECHANISM is disabled. Emergency Stop: skipped" );
  1650. #endif
  1651. }
  1652. }
  1653. //Step 2: Check for V2G_SECC_Sequence_Timeout
  1654. //#if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  1655. #if 1
  1656. status = Check_V2G_Flow_Status();
  1657. if (status >= SupportedAppProtocolRequest &&
  1658. status < SessionStopRequest)
  1659. {
  1660. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1661. time_diff = DiffTimeb_fork2_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1662. if(time_diff > V2G_SECC_Sequence_Timeout) //60s
  1663. {
  1664. sprintf(buf_log_evcomm_fork2,
  1665. "[fork2]V2G_SECC_Sequence_Timeout in state %d - (%.02lf of %d ms)\n",
  1666. status,
  1667. time_diff,
  1668. V2G_SECC_Sequence_Timeout);
  1669. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1670. Update_V2G_Flow_Status(Sequence_Timeout);
  1671. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1672. //CCS_SECC_TIMEOUT_V2G_Sequence_Time (023844)
  1673. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1674. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1675. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1676. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1677. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  1678. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  1679. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1680. End_Process();
  1681. break;
  1682. }
  1683. else if (time_diff > 4000) //4s
  1684. {
  1685. //Check for CSU command of "Stop by EVSE"
  1686. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown)
  1687. {
  1688. SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]EVSE_Shutdown");
  1689. Update_V2G_Flow_Status(Other_Fault);
  1690. }
  1691. else if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1692. {
  1693. SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]EVSE_EmergencyShutdown");
  1694. Update_V2G_Flow_Status(Other_Fault);
  1695. }
  1696. else if (ShmInternalComm->ChargingPermission == FALSE)
  1697. {
  1698. if (status >= ChargeParameterDiscoveryRequest) //&& status < SessionStopRequest
  1699. {
  1700. SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]ChargingPermission = FALSE");
  1701. Update_V2G_Flow_Status(Other_Fault);
  1702. }
  1703. }
  1704. else
  1705. {
  1706. //null
  1707. }
  1708. }
  1709. else
  1710. {
  1711. //null
  1712. }
  1713. }
  1714. #endif
  1715. //Step 3: Check and Response to Error V2gFlowStatus
  1716. status = Check_V2G_Flow_Status();
  1717. if (status == Performance_Timeout ||
  1718. status == Sequence_Timeout ||
  1719. status == Other_Fault)
  1720. {
  1721. sprintf(buf_log_evcomm_fork2,
  1722. "[fork2]Timeout or Fault State(%d) => End_Process",
  1723. status);
  1724. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1725. //Normal Stop
  1726. //alarm and duty to 100%
  1727. //OutputCpPwmDuty(100);
  1728. //SwitchCpStateE(ENABLE); //Set CP duty as 100% and set CP state as E (0V).
  1729. //[Joseph/ To-Do] Set State E (0V) via GPIO setting
  1730. End_Process();
  1731. }
  1732. //Step 4: Check and Response to CP State Error
  1733. if(ccs->CpState_err == TRUE)
  1734. {
  1735. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]CP Error => End_Process");
  1736. Update_V2G_Flow_Status(Other_Fault);
  1737. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1738. //CCS_SECC_CP_State_Error (023889)
  1739. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1740. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1741. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1742. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1743. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1744. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1745. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1746. End_Process();
  1747. }
  1748. //Step 5: Check and Response to Shutdown Commnad from CSU
  1749. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown ||
  1750. EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1751. {
  1752. if (Check_V2G_Flow_Status() <= SLACC_SDP_TCP_Connection)
  1753. {
  1754. sprintf(buf_log_evcomm_fork2,
  1755. "[fork2]EVSE Shutdown(%d) => End_Process",
  1756. EVCOMM_SYS_INFO.DC_EVSEStatus);
  1757. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1758. Update_V2G_Flow_Status(Other_Fault);
  1759. End_Process();
  1760. }
  1761. }
  1762. //Step 6: Check and Response to SessionStop
  1763. status = Check_V2G_Flow_Status();
  1764. if (status == SessionStopResponse)
  1765. {
  1766. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]SessionStopResponse => End_Process");
  1767. End_Process();
  1768. }
  1769. //Step 7: Check for ChargingPermission from TRUE to FALSE before V2G Messages
  1770. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  1771. if ((ShmInternalComm->ChargingPermission == FALSE) &&
  1772. (ShmInternalComm->ChargingPermission_pre >=1) &&
  1773. (ccs->CpState >= 3) && (ccs->CpState <=5))
  1774. {
  1775. if (status >= CM_SLAC_PARM_REQ &&
  1776. status != CM_SET_KEY_REQ &&
  1777. status != CM_SET_KEY_CNF &&
  1778. status <= SLACC_SDP_TCP_Connection)
  1779. {
  1780. sprintf(buf_log_evcomm_fork2,
  1781. "[fork2]Permission OFF before V2G msg(%d) => End_Process",
  1782. ShmInternalComm->ChargingPermission);
  1783. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1784. Update_V2G_Flow_Status(Other_Fault);
  1785. End_Process();
  1786. }
  1787. }
  1788. #if 0
  1789. //Step 8: DC OVP Protection
  1790. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1791. status > CableCheckResponse &&
  1792. status <= SessionStopRequest &&
  1793. status != ChargingStatusRequest &&
  1794. status != ChargingStatusResponse &&
  1795. EVCOMM_SYS_INFO.EvBatteryMaxVoltage != 0)
  1796. {
  1797. //Part A: OVP Protection
  1798. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)) // 2%
  1799. {
  1800. sprintf(buf_log_evcomm_fork2,
  1801. "[fork2][Error]OVP => End_Process (%.02f > %.02f)",
  1802. EVCOMM_SYS_INFO.PresentChargingVoltage,
  1803. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02));
  1804. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1805. Update_V2G_Flow_Status(Other_Fault);
  1806. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1807. //System CCS output OVP (012219)
  1808. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1809. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1810. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1811. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1812. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1813. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1814. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1815. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1816. End_Process();
  1817. }
  1818. //Part B: Over Voltage Request Protection
  1819. if (EVCOMM_SYS_INFO.EvBatterytargetVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02))
  1820. {
  1821. sprintf(buf_log_evcomm_fork2,
  1822. "[fork2]Over V Req => End_Process (%.02f > %.02f)",
  1823. EVCOMM_SYS_INFO.EvBatterytargetVoltage,
  1824. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)
  1825. );
  1826. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
  1827. Update_V2G_Flow_Status(Other_Fault);
  1828. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1829. //System CCS output OVP (012219)
  1830. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1831. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1832. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1833. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1834. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1835. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1836. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1837. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1838. End_Process();
  1839. }
  1840. }
  1841. #endif
  1842. #if 1
  1843. //Step 9: Check 60V
  1844. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  1845. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1846. ShmInternalComm->ChargingPermission >=1 &&
  1847. status < CableCheckRequest)
  1848. {
  1849. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= 60) //60V
  1850. {
  1851. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]DC Output Voltage is over 60V => End_Process");
  1852. Update_V2G_Flow_Status(Other_Fault);
  1853. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1854. //CCS_SECC_Unexpected_60V_Before_Charing_Error (023890)
  1855. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1856. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1857. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1858. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1859. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  1860. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  1861. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1862. //Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1863. End_Process();
  1864. }
  1865. }
  1866. #endif
  1867. //Step 10: Check if the connector is unplug from plugin
  1868. if (EVCOMM_SYS_INFO.ConnectorPlugIn_pre == TRUE && EVCOMM_SYS_INFO.ConnectorPlugIn == FALSE)
  1869. {
  1870. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Unplug Reset => End_Process");
  1871. Update_V2G_Flow_Status(Other_Fault);
  1872. End_Process();
  1873. }
  1874. usleep(100000);
  1875. }//while
  1876. }
  1877. /*===========================================================================
  1878. FUNCTION: SendSetKey
  1879. DESCRIPTION:
  1880. PRE-CONDITION:
  1881. INPUT:
  1882. OUTPUT:
  1883. GLOBAL VARIABLES:
  1884. =============================================================================*/
  1885. int SendSetKey()
  1886. {
  1887. int i = 0;
  1888. unsigned char nRandValue = 0x0;
  1889. unsigned char ConstString[16] = "PhihongKey000000";
  1890. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  1891. memcpy(SendMmePacket.ODA,QcaMac,6);
  1892. memcpy(SendMmePacket.OSA,CsuMac,6);
  1893. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  1894. SendMmePacket.MMV = 0x01;
  1895. SendMmePacket.MMTYPE = MMTYPE_CM_SET_KEY_REQ;
  1896. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  1897. SendMmePacketSize = 0;
  1898. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate ��NMK��
  1899. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
  1900. SendMmePacketSize+=4;
  1901. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
  1902. SendMmePacketSize+=4;
  1903. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
  1904. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
  1905. SendMmePacketSize+=2;
  1906. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00;//PMN, Fixed value(0x00) encrypted payload not used
  1907. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//CCo Capablility
  1908. srand(time(NULL));
  1909. for (i = 10; i < 16; i++)
  1910. {
  1911. nRandValue = (rand()%62) + 1;
  1912. if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
  1913. {
  1914. ConstString[i]= nRandValue + 0x30;
  1915. }
  1916. else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
  1917. {
  1918. ConstString[i]= nRandValue -10 + 0x41;
  1919. }
  1920. else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
  1921. {
  1922. ConstString[i]= nRandValue -37 + 0x61;
  1923. }
  1924. else
  1925. {
  1926. ConstString[i]= 0x30;
  1927. }
  1928. }
  1929. memset(NewNmkKey,0,sizeof(NewNmkKey));
  1930. memset(Nid,0,sizeof(Nid));
  1931. HPAVKeyNMK(NewNmkKey, ConstString);
  1932. HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
  1933. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid)); //NID, 54 LSBs contain the NID 2 MSBs = 0b00
  1934. SendMmePacketSize+=sizeof(Nid);
  1935. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
  1936. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
  1937. SendMmePacketSize += sizeof(NewNmkKey);
  1938. SendMmePacketSize += 19; //the size before MMENTRY
  1939. SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Tx]CM_SET_KEY_REQ");
  1940. i = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1941. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  1942. DEBUG_PRINTF_EVCOMM_DETAIL("SendSetKey: send size =%d\n",i);
  1943. }
  1944. /*===========================================================================
  1945. FUNCTION: GetQca7kMac
  1946. DESCRIPTION:
  1947. PRE-CONDITION:
  1948. INPUT:
  1949. OUTPUT:
  1950. GLOBAL VARIABLES:
  1951. =============================================================================*/
  1952. int GetQca7kMac()
  1953. {
  1954. int i = 0;
  1955. struct QcaVendorMmeHeader SendPacket;
  1956. memset(&SendPacket, 0, sizeof(struct QcaVendorMmeHeader));
  1957. memset(SendPacket.ODA, 0xFF, 6); //broadcast
  1958. memcpy(SendPacket.OSA, CsuMac, 6);
  1959. SendPacket.MTYPE = htons(EtherType_HomePlug);
  1960. SendPacket.MMV = 0x00;
  1961. SendPacket.MMTYPE = MMTYPE_VENDOR_VS_NW_INFO;
  1962. SendPacket.OUI[0] = 0x00;
  1963. SendPacket.OUI[1] = 0xB0;
  1964. SendPacket.OUI[2] = 0x52;
  1965. i = sendto(RawSock, &SendPacket, 20, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1966. DEBUG_PRINTF_EVCOMM_DETAIL("GetQca7kMac: send size =%d\n", i);
  1967. SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Tx][VENDOR_VS_NW_INFO]Req for QCA7K MacAddr");
  1968. }
  1969. /*===========================================================================
  1970. FUNCTION: Array_Check_All_Zero
  1971. DESCRIPTION:
  1972. PRE-CONDITION:
  1973. INPUT:
  1974. OUTPUT:
  1975. result:
  1976. (1) TRUE: all zero
  1977. (2) FALSE: not all zero
  1978. GLOBAL VARIABLES:
  1979. =============================================================================*/
  1980. int Array_Check_All_Zero(unsigned char *ptr, int size)
  1981. {
  1982. int result = TRUE;
  1983. int i = 0;
  1984. for (i = 0; i < size; i++)
  1985. {
  1986. if (ptr[i] != 0)
  1987. {
  1988. result = FALSE;
  1989. break;
  1990. }
  1991. }
  1992. return result;
  1993. }
  1994. /*===========================================================================
  1995. FUNCTION: Array_Compare_Identity
  1996. DESCRIPTION:
  1997. PRE-CONDITION:
  1998. INPUT:
  1999. OUTPUT:
  2000. result = FALSE (not identical)
  2001. result = TRUE (identical)
  2002. GLOBAL VARIABLES:
  2003. =============================================================================*/
  2004. int Array_Compare_Identity(unsigned char *ptrA, unsigned char *ptrB, int size)
  2005. {
  2006. int result = TRUE;
  2007. int i = 0;
  2008. for (i = 0; i < size; i++)
  2009. {
  2010. if (ptrA[i] != ptrB[i])
  2011. {
  2012. result = FALSE;
  2013. #if 0
  2014. sprintf(buf_log_evcomm,
  2015. "[Array_Compare_Identity]%02X%02X%02X%02X%02X%02X,%02X%02X%02X%02X%02X%02X(%d)\n",
  2016. ptrA[0], ptrA[1], ptrA[2], ptrA[3], ptrA[4], ptrA[5],
  2017. ptrB[0], ptrB[1], ptrB[2], ptrB[3], ptrB[4], ptrB[5],
  2018. result);
  2019. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2020. #endif
  2021. break;
  2022. }
  2023. }
  2024. return result;
  2025. }
  2026. /*===========================================================================
  2027. FUNCTION: SLAC_DB_Search_EvMac_idx
  2028. DESCRIPTION:
  2029. PRE-CONDITION:
  2030. INPUT:
  2031. OUTPUT:
  2032. idx = -1 (not found)
  2033. GLOBAL VARIABLES:
  2034. =============================================================================*/
  2035. int SLAC_DB_Search_EvMac_idx(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in)
  2036. {
  2037. int idx = -1;
  2038. int i = 0;
  2039. if (evcc->arrayLen == 0)
  2040. {
  2041. //printf("[SLAC_DB_Search_EvMac_idx]arrayLen is empty (%d)\n", evcc->arrayLen);
  2042. //no need to search
  2043. }
  2044. else if (evcc->arrayLen > EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE)
  2045. {
  2046. //error
  2047. sprintf(buf_log_evcomm,
  2048. "[ERROR][SLAC_DB_Search_EvMac_idx]DB length(%d) > %d",
  2049. evcc->arrayLen,
  2050. EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE);
  2051. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2052. evcc->arrayLen = 0; //reset
  2053. }
  2054. else
  2055. {
  2056. //start searching
  2057. for (i = 0; i < evcc->arrayLen; i++)
  2058. {
  2059. //printf("[SLAC_DB_Search_EvMac_idx]checking DB[%d]...\n", i);
  2060. if (Array_Compare_Identity(evcc->array[i].EvMac, EvMac_in, SLAC_EVMAC_LENGTH) == TRUE)
  2061. {
  2062. //printf("[SLAC_DB_Search_EvMac_idx]identical at DB[%d]...\n", i);
  2063. idx = i;
  2064. break;
  2065. }
  2066. }
  2067. }
  2068. //printf("[SLAC_DB_Search_EvMac_idx]return = %d\n", idx);
  2069. return idx;
  2070. }
  2071. /*===========================================================================
  2072. FUNCTION: SLAC_DB_Check_EvMac_RunID_Matching
  2073. DESCRIPTION:
  2074. PRE-CONDITION:
  2075. INPUT:
  2076. OUTPUT:
  2077. res = FALSE (unmatched)
  2078. res = TRUE (matched)
  2079. GLOBAL VARIABLES:
  2080. =============================================================================*/
  2081. int SLAC_DB_Check_EvMac_RunID_Matching(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in, unsigned char *RunID_in)
  2082. {
  2083. int res = FALSE;
  2084. int idx = -1;
  2085. idx = SLAC_DB_Search_EvMac_idx(evcc, EvMac_in);
  2086. if (idx >= 0)
  2087. {
  2088. res = Array_Compare_Identity(evcc->array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2089. }
  2090. else
  2091. {
  2092. //not found the EvMac data in DB
  2093. res = FALSE;
  2094. }
  2095. return res;
  2096. }
  2097. /*===========================================================================
  2098. FUNCTION: SLAC_DB_Add
  2099. DESCRIPTION:
  2100. 1. Saving each CM_SLAC_PARM_REQ data into EVCC database if its
  2101. EvMac and RunID data are different, respectively.
  2102. PRE-CONDITION:
  2103. INPUT:
  2104. OUTPUT:
  2105. idx = saved index (must be a positive value)
  2106. GLOBAL VARIABLES:
  2107. =============================================================================*/
  2108. int SLAC_DB_Add(unsigned char *EvMac_in, unsigned char *RunID_in)
  2109. {
  2110. int idx = -1;
  2111. //Search if this EvMac and RunID already exists
  2112. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2113. if (idx < 0) //not exist, yet.
  2114. {
  2115. if (SLAC_INFO.arrayLen < EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE) //20
  2116. {
  2117. sprintf(buf_log_evcomm,
  2118. "[SLAC_DB_Add]data does not exist => added to %d-th",
  2119. SLAC_INFO.arrayLen);
  2120. DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
  2121. if (SLAC_INFO.arrayLen >= 0)
  2122. {
  2123. memset(&SLAC_INFO.array[SLAC_INFO.arrayLen], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  2124. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  2125. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2126. idx = SLAC_INFO.arrayLen;
  2127. SLAC_INFO.arrayLen++;
  2128. }
  2129. else
  2130. {
  2131. sprintf(buf_log_evcomm,
  2132. "[ERROR][SLAC_DB_Add]arrayLen: unexpected(%d)",
  2133. SLAC_INFO.arrayLen);
  2134. DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
  2135. SLAC_INFO.arrayLen = 0;
  2136. }
  2137. }
  2138. else
  2139. {
  2140. //DB is full
  2141. sprintf(buf_log_evcomm,
  2142. "[SLAC_DB_Add]DB is full(%d) => bypass",
  2143. SLAC_INFO.arrayLen);
  2144. DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
  2145. }
  2146. }
  2147. else
  2148. {
  2149. #if 0
  2150. sprintf(buf_log_evcomm,
  2151. "[SLAC_DB_Add]EvMac: existed (%d)",
  2152. idx);
  2153. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2154. #endif
  2155. //Check RunID
  2156. if (Array_Compare_Identity(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH) == TRUE)
  2157. {
  2158. //RunID is the same
  2159. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Add]RunID: same");
  2160. }
  2161. else
  2162. {
  2163. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Add]RunID: diff");
  2164. }
  2165. //Reset all corresponding parameters
  2166. #if 0
  2167. sprintf(buf_log_evcomm,
  2168. "[SLAC_DB_Add]EvMac: reset para(%d)",
  2169. idx);
  2170. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2171. #endif
  2172. memset(&SLAC_INFO.array[idx], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  2173. memcpy(SLAC_INFO.array[idx].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  2174. memcpy(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2175. }
  2176. return idx;
  2177. }
  2178. /*===========================================================================
  2179. FUNCTION: SLAC_DB_Reset
  2180. DESCRIPTION:
  2181. PRE-CONDITION:
  2182. INPUT:
  2183. OUTPUT:
  2184. GLOBAL VARIABLES:
  2185. =============================================================================*/
  2186. int SLAC_DB_Reset()
  2187. {
  2188. memset(&SLAC_INFO, 0, sizeof(struct EVCC_SLAC_DATA_TYPE));
  2189. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Reset]DONE");
  2190. }
  2191. /*===========================================================================
  2192. FUNCTION: MmeProcess
  2193. DESCRIPTION:
  2194. PRE-CONDITION:
  2195. INPUT:
  2196. OUTPUT:
  2197. GLOBAL VARIABLES:
  2198. =============================================================================*/
  2199. int MmeProcess(unsigned char *Buffer, int DataLength)
  2200. {
  2201. //struct ethhdr *EthPacket;
  2202. struct MmeHeader *MmePacket;
  2203. static unsigned char counter;
  2204. unsigned char state = 0;
  2205. unsigned char *EvMac_in;
  2206. unsigned char *RunID_in;
  2207. int Rtn = 0;
  2208. int idx = 0;
  2209. MmePacket = (struct MmeHeader *)Buffer;
  2210. state = Check_V2G_Flow_Status();
  2211. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2212. {
  2213. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
  2214. DEBUG_PRINTF_EVCOMM_DETAIL("***** Received MME Packet *****\n");
  2215. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  2216. DEBUG_PRINTF_EVCOMM_DETAIL("DataLength=%d\n",DataLength);
  2217. DEBUG_PRINTF_EVCOMM_DETAIL("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Destination MAC Address
  2218. MmePacket->ODA[0], MmePacket->ODA[1],
  2219. MmePacket->ODA[2], MmePacket->ODA[3],
  2220. MmePacket->ODA[4], MmePacket->ODA[5]);
  2221. DEBUG_PRINTF_EVCOMM_DETAIL("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Source MAC Address (EV MAC)
  2222. MmePacket->OSA[0], MmePacket->OSA[1],
  2223. MmePacket->OSA[2], MmePacket->OSA[3],
  2224. MmePacket->OSA[4], MmePacket->OSA[5]);
  2225. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  2226. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", MmePacket->MMV);
  2227. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  2228. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n",
  2229. MmePacket->FMI[0],MmePacket->FMI[1]);
  2230. }
  2231. #endif
  2232. #if (SLAC_FIRST_RESPONSE_METHOD == SET_NO_PWM_IF_NOT_GET_PERMISSION)
  2233. {
  2234. //Check CP as 5%
  2235. if (EVCOMM_SYS_INFO.CpState != 3 &&
  2236. EVCOMM_SYS_INFO.CpState != 4 &&
  2237. MmePacket->MMTYPE != MMTYPE_CM_SET_KEY_CNF &&
  2238. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_HOST_ACTION &&
  2239. MmePacket->MMTYPE != MMTYPE_VENDOR_ATTEN_CHAR &&
  2240. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_NW_INFO_CNF
  2241. )
  2242. {
  2243. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC]ignored(wrong CP state)");
  2244. return 0;
  2245. }
  2246. }
  2247. #endif
  2248. //[To-Do] Adding a pre-check filter mechanism for Source and Destination MAC Address
  2249. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  2250. switch(MmePacket->MMTYPE)
  2251. {
  2252. case MMTYPE_CM_SET_KEY_CNF:
  2253. {
  2254. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SET_KEY_CNF ---\n");
  2255. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[0]);
  2256. SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Rx]CM_SET_KEY_CNF (SetKey: DONE)");
  2257. Update_V2G_Flow_Status(CM_SET_KEY_CNF);
  2258. break;
  2259. }
  2260. case MMTYPE_CM_SLAC_PARM_REQ:
  2261. {
  2262. //Check QCA7000 status
  2263. if (EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  2264. {
  2265. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(QCA7K init...)");
  2266. break;
  2267. }
  2268. //Check error state
  2269. state = Check_V2G_Flow_Status();
  2270. if (state == Performance_Timeout || //253
  2271. state == Sequence_Timeout || //254
  2272. state == Other_Fault) //255
  2273. {
  2274. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(in error state)");
  2275. break;
  2276. }
  2277. //Printing EV MAC Address
  2278. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ");
  2279. //Avoid Coupled SLAC_PARM_REQ
  2280. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2281. {
  2282. #if 0
  2283. sprintf(buf_log_evcomm,
  2284. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(coupled SLAC,%d)",
  2285. CheckConnectorPlugIn());
  2286. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2287. #endif
  2288. break;
  2289. }
  2290. //[TC_SECC_VTB_CmSlacParm_003] SECURITY_TYPE needs to be 0x00 (no security)
  2291. if (MmePacket->MMENTRY[1] != 0)
  2292. {
  2293. sprintf(buf_log_evcomm,
  2294. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(invalid SECURITY_TYPE,%d)", //Source MAC Address (EV MAC)
  2295. MmePacket->MMENTRY[1]);
  2296. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2297. break;
  2298. }
  2299. //=================== Legal CM_SLAC_PARM_REQ Zone =================
  2300. //Update_V2G_Flow_Status(CM_SLAC_PARM_REQ);
  2301. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_RX_CM_SLAC_PARM_REQ)
  2302. {
  2303. //Once receiving CM_SLAC_PARM_REQ, set PWM as 5%
  2304. SwitchCpStateE(DISABLE);
  2305. OutputCpPwmDuty(5);
  2306. }
  2307. #endif
  2308. //Checking if this SLAC Req comes before 5% PWM (for 15118)
  2309. /*if(ShmInternalComm->ChargingPermission == FALSE)
  2310. {
  2311. //Sniffer_Tcpdump(ENABLE);
  2312. sprintf(buf_log_evcomm, "Check Permission: %d (SLAC first => START)", ShmInternalComm->ChargingPermission);
  2313. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2314. }*/
  2315. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2316. {
  2317. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
  2318. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2319. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2320. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2321. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2322. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2323. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2324. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2325. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  2326. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuite [1]: 0x%x,0x%x\n",
  2327. MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  2328. }
  2329. #endif
  2330. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2331. {
  2332. //Saving each CM_SLAC_PARM_REQ data into EVCC database
  2333. EvMac_in = &MmePacket->OSA[0];
  2334. RunID_in = &MmePacket->MMENTRY[2];
  2335. idx = SLAC_DB_Add(EvMac_in, RunID_in); //(EvMac, RunID)
  2336. if (idx < 0)
  2337. {
  2338. sprintf(buf_log_evcomm,
  2339. "[WARNING][CM_SLAC_PARM_REQ]DB is full or errors occour(%d) => ignore",
  2340. idx);
  2341. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2342. break;
  2343. }
  2344. //Select the 1st EV MAC address
  2345. if (SLAC_INFO.arrayLen == 1) //1st Req
  2346. {
  2347. #if 1
  2348. sprintf(buf_log_evcomm,
  2349. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):selected",
  2350. (idx + 1),
  2351. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2352. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2353. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2354. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2355. #endif
  2356. /*
  2357. sprintf(buf_log_evcomm,
  2358. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (selected)", //Source MAC Address (EV MAC)
  2359. SLAC_INFO.arrayLen,
  2360. MmePacket->OSA[0], MmePacket->OSA[1],
  2361. MmePacket->OSA[2], MmePacket->OSA[3],
  2362. MmePacket->OSA[4], MmePacket->OSA[5]);
  2363. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2364. sprintf(buf_log_evcomm,
  2365. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (selected)", //RunID (from EVCC)
  2366. SLAC_INFO.arrayLen,
  2367. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2368. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2369. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2370. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2371. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2372. */
  2373. }
  2374. else //2nd Req
  2375. {
  2376. #if 1
  2377. sprintf(buf_log_evcomm,
  2378. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):not selected",
  2379. (idx + 1),
  2380. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2381. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2382. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2383. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2384. #endif
  2385. /*
  2386. sprintf(buf_log_evcomm,
  2387. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (not selected)", //Source MAC Address (EV MAC)
  2388. SLAC_INFO.arrayLen,
  2389. MmePacket->OSA[0], MmePacket->OSA[1],
  2390. MmePacket->OSA[2], MmePacket->OSA[3],
  2391. MmePacket->OSA[4], MmePacket->OSA[5]);
  2392. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2393. sprintf(buf_log_evcomm,
  2394. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (not selected)", //RunID (from EVCC)
  2395. SLAC_INFO.arrayLen,
  2396. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2397. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2398. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2399. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2400. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2401. */
  2402. }
  2403. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2404. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, SLAC_EVMAC_LENGTH);
  2405. memcpy(SlacRunId, MmePacket->MMENTRY + 2, SLAC_RUNID_LENGTH);
  2406. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2407. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2408. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2409. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2410. SendMmePacket.MMV = MmePacket->MMV;
  2411. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2412. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2413. SendMmePacketSize = 0;
  2414. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2415. SendMmePacketSize += 6;
  2416. 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
  2417. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2418. 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
  2419. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SLAC_INFO.array[idx].EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2420. SendMmePacketSize += 6;
  2421. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2422. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2423. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, SLAC_RUNID_LENGTH); //RunID (8-byte)
  2424. SendMmePacketSize += SLAC_RUNID_LENGTH;
  2425. SendMmePacketSize += 19; //the size before MMENTRY
  2426. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2427. {
  2428. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2429. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2430. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2431. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2432. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2433. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2434. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2435. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2436. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2437. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2438. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2439. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2440. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2441. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2442. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2443. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2444. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2445. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2446. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2447. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2448. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2449. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2450. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2451. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2452. }
  2453. #endif
  2454. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2455. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2456. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2457. ftime(&SeqStartTime);
  2458. break;
  2459. }
  2460. #else
  2461. {
  2462. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2463. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, sizeof(EvMac));
  2464. memcpy(SlacRunId,MmePacket->MMENTRY + 2, sizeof(SlacRunId));
  2465. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2466. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2467. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2468. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2469. SendMmePacket.MMV = MmePacket->MMV;
  2470. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2471. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2472. SendMmePacketSize = 0;
  2473. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2474. SendMmePacketSize += 6;
  2475. 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
  2476. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2477. 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
  2478. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2479. SendMmePacketSize += 6;
  2480. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2481. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2482. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, sizeof(SlacRunId)); //RunID (8-byte)
  2483. SendMmePacketSize += sizeof(SlacRunId);
  2484. SendMmePacketSize += 19; //the size before MMENTRY
  2485. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2486. {
  2487. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2488. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2489. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2490. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2491. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2492. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2493. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2494. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2495. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2496. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2497. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2498. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2499. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2500. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2501. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2502. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2503. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2504. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2505. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2506. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2507. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2508. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2509. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2510. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2511. }
  2512. #endif
  2513. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2514. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2515. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2516. ftime(&SeqStartTime);
  2517. counter = 0;
  2518. break;
  2519. }
  2520. #endif
  2521. }
  2522. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  2523. {
  2524. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2525. {
  2526. SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(timeup)");
  2527. break;
  2528. }
  2529. //Avoid Coupled CM_START_ATTEN_CHAR_IND
  2530. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2531. {
  2532. sprintf(buf_log_evcomm,
  2533. "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(coupled SLAC,%d)",
  2534. CheckConnectorPlugIn());
  2535. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2536. break;
  2537. }
  2538. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2539. {
  2540. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n",counter + 1);
  2541. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2542. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2543. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  2544. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  2545. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]); //Fixed value (0x01) indicating other Green PHY station
  2546. DEBUG_PRINTF_EVCOMM_DETAIL("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2547. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  2548. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  2549. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2550. MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
  2551. MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
  2552. }
  2553. #endif
  2554. //New SLAC architecture designed by Joseph
  2555. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2556. {
  2557. EvMac_in = &MmePacket->OSA[0];
  2558. RunID_in = &MmePacket->MMENTRY[11];
  2559. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2560. if (idx >= 0)
  2561. {
  2562. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2563. //[TC_SECC_VTB_AttenuationCharacterization_013]
  2564. if (MmePacket->MMENTRY[0] != 0) //APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  2565. {
  2566. sprintf(buf_log_evcomm,
  2567. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]APPLICATION_TYPE(%d): invalid => ignore Req",
  2568. MmePacket->MMENTRY[0]);
  2569. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2570. break;
  2571. }
  2572. //[TC_SECC_VTB_AttenuationCharacterization_014]
  2573. if (MmePacket->MMENTRY[1] != 0) //SECURITY_TYPE must be 0x00(No Security)
  2574. {
  2575. sprintf(buf_log_evcomm,
  2576. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]SECURITY_TYPE(%d): invalid => ignore Req",
  2577. MmePacket->MMENTRY[1]);
  2578. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2579. break;
  2580. }
  2581. //[TC_SECC_VTB_AttenuationCharacterization_016]
  2582. if (MmePacket->MMENTRY[3] != 0x06) //Time_Out must be 0x06 , (600ms)
  2583. {
  2584. sprintf(buf_log_evcomm,
  2585. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]Time_Out(%d): invalid => ignore Req",
  2586. MmePacket->MMENTRY[3]);
  2587. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2588. break;
  2589. }
  2590. //[TC_SECC_VTB_AttenuationCharacterization_017]
  2591. if (MmePacket->MMENTRY[4] != 0x01) //RESP_TYPE must be 0x01(Send to another GP STA(EV))
  2592. {
  2593. sprintf(buf_log_evcomm,
  2594. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]RESP_TYPE(%d): invalid => ignore Req",
  2595. MmePacket->MMENTRY[4]);
  2596. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2597. break;
  2598. }
  2599. //[TC_SECC_VTB_AttenuationCharacterization_021]
  2600. //FORWARDING_STA: MAC Address of the EV HLE (station which the measurement results shall be sent to)
  2601. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[5], SLAC_EVMAC_LENGTH) == FALSE)
  2602. {
  2603. sprintf(buf_log_evcomm,
  2604. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]FORWARDING_STA(%02X:%02X:%02X:%02X:%02X:%02X): invalid => ignore Req",
  2605. MmePacket->MMENTRY[5], MmePacket->MMENTRY[6],
  2606. MmePacket->MMENTRY[7], MmePacket->MMENTRY[8],
  2607. MmePacket->MMENTRY[9], MmePacket->MMENTRY[10]);
  2608. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2609. SLAC_INFO.array[idx].StartAttenCharErr = TRUE;
  2610. break;
  2611. }
  2612. //Check RunID
  2613. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2614. {
  2615. SLAC_INFO.array[idx].MnbcSoundNum = MmePacket->MMENTRY[2];
  2616. SLAC_INFO.array[idx].StartAttenCharCnt++;
  2617. #if 0
  2618. sprintf(buf_log_evcomm,
  2619. "[SLAC][Rx]CM_START_ATTEN_CHAR_IND[%d]:%d-th",
  2620. (idx + 1),
  2621. SLAC_INFO.array[idx].StartAttenCharCnt);
  2622. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2623. #endif
  2624. if (SLAC_INFO.array[idx].StartAttenCharCnt == 1)
  2625. {
  2626. memset(SLAC_INFO.array[idx].AAG, 0, sizeof(SLAC_INFO.array[idx].AAG));
  2627. SLAC_INFO.array[idx].AttenProfileCnt = 0;
  2628. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2629. }
  2630. else if (SLAC_INFO.array[idx].StartAttenCharCnt >= 3)
  2631. {
  2632. sprintf(buf_log_evcomm,
  2633. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]counter(%d): unexpected",
  2634. SLAC_INFO.array[idx].StartAttenCharCnt);
  2635. }
  2636. else
  2637. {
  2638. //null
  2639. }
  2640. }
  2641. else
  2642. {
  2643. //This RunID is not matched with this EvMac,
  2644. //or this RunID is not found in DB.
  2645. sprintf(buf_log_evcomm,
  2646. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]EvMac-RunID: unmatched => ignore Req");
  2647. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2648. //Response: ignore
  2649. }
  2650. }
  2651. else
  2652. {
  2653. //this msg source is not in database
  2654. //ignore
  2655. }
  2656. break;
  2657. }
  2658. #else //Old SLAC architecture designed by Vern
  2659. {
  2660. MnbcSoundNum = MmePacket->MMENTRY[2];
  2661. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2662. counter++;
  2663. if(counter == 1)
  2664. {
  2665. memset(Aag, 0, sizeof(Aag));
  2666. AttenProfileCnt = 0;
  2667. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2668. }
  2669. else if(counter >= 3)
  2670. {
  2671. counter = 0;
  2672. }
  2673. break;
  2674. }
  2675. #endif
  2676. }
  2677. case MMTYPE_CM_MNBC_SOUND_IND:
  2678. {
  2679. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2680. {
  2681. SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(timeup)");
  2682. break;
  2683. }
  2684. //Avoid Coupled CM_MNBC_SOUND_IND
  2685. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2686. {
  2687. sprintf(buf_log_evcomm,
  2688. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(coupled SLAC,%d)",
  2689. CheckConnectorPlugIn());
  2690. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2691. break;
  2692. }
  2693. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  2694. {
  2695. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n",counter + 1 , MnbcSoundNum);
  2696. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2697. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2698. DEBUG_PRINTF_EVCOMM_DETAIL("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2699. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2700. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
  2701. MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
  2702. MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
  2703. MmePacket->MMENTRY[18]);
  2704. DEBUG_PRINTF_EVCOMM_DETAIL("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  2705. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2706. MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
  2707. MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
  2708. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2709. MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
  2710. MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
  2711. DEBUG_PRINTF_EVCOMM_DETAIL("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2712. MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
  2713. MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
  2714. MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
  2715. MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
  2716. }
  2717. #endif
  2718. //New SLAC architecture designed by Joseph
  2719. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2720. {
  2721. EvMac_in = &MmePacket->OSA[0];
  2722. RunID_in = &MmePacket->MMENTRY[20];
  2723. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2724. if (idx >= 0)
  2725. {
  2726. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2727. //Check for RunID
  2728. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2729. {
  2730. SLAC_INFO.array[idx].MnbcSoundCnt++;
  2731. /*
  2732. sprintf(buf_log_evcomm,
  2733. "[SLAC][Rx]CM_MNBC_SOUND_IND[%d]:%d-th",
  2734. (idx + 1),
  2735. SLAC_INFO.array[idx].MnbcSoundCnt);
  2736. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2737. */
  2738. }
  2739. else
  2740. {
  2741. //RunID is not matched or does not exist.
  2742. sprintf(buf_log_evcomm,
  2743. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac-RunID: unmatched");
  2744. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2745. }
  2746. }
  2747. else
  2748. {
  2749. //ignore
  2750. sprintf(buf_log_evcomm,
  2751. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac does not exist");
  2752. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2753. }
  2754. break;
  2755. }
  2756. #else //Old SLAC architecture designed by Vern
  2757. {
  2758. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2759. counter++;
  2760. break;
  2761. }
  2762. #endif
  2763. }
  2764. case MMTYPE_CM_ATTEN_PROFILE_IND:
  2765. {
  2766. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2767. {
  2768. SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_ATTEN_PROFILE_IND: ignore(timeup)");
  2769. break;
  2770. }
  2771. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  2772. {
  2773. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n", counter, MnbcSoundNum);
  2774. DEBUG_PRINTF_EVCOMM_DETAIL("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2775. MmePacket->MMENTRY[0], MmePacket->MMENTRY[1], MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2776. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5]);
  2777. DEBUG_PRINTF_EVCOMM_DETAIL("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]); //NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2778. //NumGroups: Number of OFDM carrier groups used for the SLAC signal characterization.
  2779. //AAG[i]: Average Attenuation of Group i (i = 1 ~ 58)
  2780. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  2781. DEBUG_PRINTF_EVCOMM_DETAIL("AAG: \n");
  2782. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2783. {
  2784. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[8 + Rtn]);
  2785. }
  2786. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2787. }
  2788. #endif
  2789. //New SLAC architecture designed by Joseph
  2790. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2791. {
  2792. EvMac_in = &MmePacket->MMENTRY[0]; //[CAUTION] The EvMac address is not &MmePacket->OSA[0]
  2793. //[CAUTION] There is no RunID information of CM_ATTEN_PROFILE_IND
  2794. // packet, which means SECC cannot use the RunID to
  2795. // distinguish those SLAC request with identical EvMac
  2796. // but with different RunID.
  2797. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2798. /*
  2799. printf("%d, %d, %d, %d\n",
  2800. idx,
  2801. SLAC_INFO.array[idx].AagGroupsNum,
  2802. MmePacket->MMENTRY[6],
  2803. SLAC_INFO.array[idx].AttenProfileCnt);
  2804. */
  2805. if (idx >= 0)
  2806. {
  2807. SLAC_INFO.array[idx].AttenProfileCnt++;
  2808. /*
  2809. sprintf(buf_log_evcomm,
  2810. "[SLAC][Rx]CM_ATTEN_PROFILE_IND[%d]:%d-th",
  2811. (idx + 1),
  2812. SLAC_INFO.array[idx].AttenProfileCnt);
  2813. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2814. */
  2815. //printf("%d, %d\n", SLAC_INFO.array[idx].AagGroupsNum, MmePacket->MMENTRY[6]);
  2816. SLAC_INFO.array[idx].AagGroupsNum = MmePacket->MMENTRY[6];
  2817. ////NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2818. for(Rtn = 0; Rtn < SLAC_INFO.array[idx].AagGroupsNum; Rtn++) //ex:58
  2819. {
  2820. SLAC_INFO.array[idx].AAG[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2821. }
  2822. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2823. break;
  2824. }
  2825. else
  2826. {
  2827. //The EvMac is not in the database
  2828. //ignore
  2829. sprintf(buf_log_evcomm,
  2830. "[SLAC][Rx][CM_ATTEN_PROFILE_IND]EvMac(%02X%02X%02X%02X%02X%02X): not exist => ignore",
  2831. EvMac_in[0], EvMac_in[1], EvMac_in[2], EvMac_in[3], EvMac_in[4], EvMac_in[5]);
  2832. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2833. break;
  2834. }
  2835. }
  2836. #else //Old SLAC architecture designed by Vern
  2837. {
  2838. AagGroupsNum = MmePacket->MMENTRY[6];
  2839. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2840. {
  2841. Aag[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2842. }
  2843. AttenProfileCnt++;
  2844. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2845. break;
  2846. }
  2847. #endif
  2848. }
  2849. case MMTYPE_CM_ATTEN_CHAR_RSP:
  2850. {
  2851. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2852. {
  2853. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_CHAR_RSP ---\n");
  2854. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2855. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2856. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2857. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2858. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  2859. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2860. MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
  2861. MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
  2862. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  2863. for(Rtn = 0; Rtn < 17; Rtn++)
  2864. {
  2865. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[16 + Rtn]);
  2866. }
  2867. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2868. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  2869. for(Rtn = 0; Rtn < 17; Rtn++)
  2870. {
  2871. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[33 + Rtn]);
  2872. }
  2873. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2874. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[50]); //Fixed value of 0x00 indicates a successful SLAC process
  2875. }
  2876. #endif
  2877. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2878. {
  2879. //Check ODA (Destination Address)
  2880. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  2881. {
  2882. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_ATTEN_CHAR_RSP]wrong ODA: ignore");
  2883. break;
  2884. }
  2885. EvMac_in = &MmePacket->OSA[0];
  2886. RunID_in = &MmePacket->MMENTRY[8];
  2887. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2888. //Check Parameters
  2889. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2890. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2891. (SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in) < 0) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2892. (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2893. (Array_Check_All_Zero(&MmePacket->MMENTRY[16], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] SourceID(17 bytes) must be all zero.
  2894. (Array_Check_All_Zero(&MmePacket->MMENTRY[33], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] RESP_ID (17 bytes) must be all zero.
  2895. (MmePacket->MMENTRY[50] != 0) //Result: must be 0x00(Success)
  2896. )
  2897. {
  2898. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2899. sprintf(buf_log_evcomm,
  2900. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para(%d,%d,%d,%d,%d) => %d-th retry",
  2901. MmePacket->MMENTRY[0], //applicationType must be 0x00
  2902. MmePacket->MMENTRY[1], //securityType must be 0x00
  2903. SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in),
  2904. SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in),
  2905. MmePacket->MMENTRY[50],
  2906. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry
  2907. );
  2908. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2909. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2910. {
  2911. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2912. ftime(&SeqStartTime);
  2913. break;
  2914. }
  2915. else
  2916. {
  2917. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para => 2-retry fail => End_Process");
  2918. Update_V2G_Flow_Status(Other_Fault);
  2919. break;
  2920. }
  2921. }
  2922. else
  2923. {
  2924. //The CM_ATTEN_CHAR_IND is legal
  2925. SLAC_INFO.array[idx].AttenCharRspCnt++;
  2926. sprintf(buf_log_evcomm,
  2927. "[SLAC][Rx]CM_ATTEN_CHAR_RSP[%d]:%d-th",
  2928. (idx + 1),
  2929. SLAC_INFO.array[idx].AttenCharRspCnt);
  2930. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2931. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2932. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2933. ftime(&SeqStartTime);
  2934. break;
  2935. }
  2936. }
  2937. #else
  2938. {
  2939. //Check Parameters
  2940. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2941. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2942. (Array_Compare_Identity(SLAC_INFO.array[0].EvMac, &MmePacket->MMENTRY[2], 6) == TRUE) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2943. (Array_Compare_Identity(SLAC_INFO.array[0].RunID, &MmePacket->MMENTRY[8], 8) == TRUE) //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2944. )
  2945. {
  2946. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2947. sprintf(buf_log_evcomm,
  2948. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP: invalid parameters(%d-th)",
  2949. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  2950. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2951. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2952. {
  2953. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2954. ftime(&SeqStartTime);
  2955. break;
  2956. }
  2957. else
  2958. {
  2959. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]CM_ATTEN_CHAR_RSP: invalid parameters => End_Process");
  2960. Update_V2G_Flow_Status(Other_Fault);
  2961. ftime(&SeqStartTime);
  2962. break;
  2963. }
  2964. }
  2965. else
  2966. {
  2967. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2968. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2969. ftime(&SeqStartTime);
  2970. break;
  2971. }
  2972. }
  2973. #endif
  2974. }
  2975. case MMTYPE_CM_VALIDATE_REQ: //BCB Toggle
  2976. {
  2977. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2978. {
  2979. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_VALIDATE_REQ ---\n");
  2980. DEBUG_PRINTF_EVCOMM_DETAIL("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]); //Fixed value (0x00) to indicate ��PEV S2 toggles on control pilot line��
  2981. 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.
  2982. 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��.
  2983. }
  2984. #endif
  2985. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2986. {
  2987. counter = 0;
  2988. EvMac_in = &MmePacket->OSA[0];
  2989. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2990. if (idx >= 0)
  2991. {
  2992. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  2993. SLAC_INFO.array[idx].ValidateReqCnt++;
  2994. sprintf(buf_log_evcomm,
  2995. "[SLAC][Rx]CM_VALIDATE_REQ[%d]:%d-th",
  2996. (idx + 1),
  2997. SLAC_INFO.array[idx].ValidateReqCnt);
  2998. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  2999. //[To-Do] Protection
  3000. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3001. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  3002. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3003. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3004. SendMmePacket.MMV = 0x01;
  3005. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  3006. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3007. SendMmePacketSize = 0;
  3008. if(counter == 0)
  3009. {
  3010. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  3011. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SignalType(0x00): Fixed value to indicate "EV S2 toggles on control pilot line"
  3012. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //ToggleNum(0x00): Fixed value. In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  3013. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3014. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  3015. #else
  3016. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3017. #endif
  3018. }
  3019. else
  3020. {
  3021. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  3022. unsigned char PreStatus = 3;
  3023. unsigned char ToggleNum = 0;
  3024. ftime(&SeqStartTime);
  3025. while(1)
  3026. {
  3027. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  3028. {
  3029. ToggleNum++;
  3030. PreStatus = 4;
  3031. }
  3032. else
  3033. {
  3034. PreStatus = 3;
  3035. }
  3036. ftime(&SeqEndTime);
  3037. if((DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))||(EVCOMM_SYS_INFO.CpState == 1))
  3038. {
  3039. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate "PEV S2 toggles on control pilot line"
  3040. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  3041. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3042. if(ToggleNum==0)
  3043. SendMmePacket.MMENTRY[SendMmePacketSize++] = 3; //0x02 = Failure
  3044. else
  3045. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  3046. #else
  3047. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3048. #endif
  3049. break;
  3050. }
  3051. }
  3052. }
  3053. SendMmePacketSize += 19; //the size before MMENTRY
  3054. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3055. ftime(&SeqStartTime);
  3056. }
  3057. else
  3058. {
  3059. //EvMac does not exist.
  3060. //ignore
  3061. }
  3062. break;
  3063. }
  3064. #else
  3065. {
  3066. counter = 0;
  3067. for(Rtn = 0; Rtn < 6; Rtn++)
  3068. {
  3069. if(MmePacket->ODA[Rtn] != CsuMac[Rtn])
  3070. {
  3071. counter = 1;
  3072. break;
  3073. }
  3074. }
  3075. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3076. memcpy(SendMmePacket.ODA, EvMac,6);
  3077. memcpy(SendMmePacket.OSA, CsuMac,6);
  3078. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3079. SendMmePacket.MMV = 0x01;
  3080. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  3081. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3082. SendMmePacketSize = 0;
  3083. if(counter == 0)
  3084. {
  3085. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  3086. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate PEV S2 toggles on control pilot line
  3087. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  3088. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3089. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  3090. #else
  3091. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3092. #endif
  3093. }
  3094. else
  3095. {
  3096. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  3097. unsigned char PreStatus = 3, ToggleNum = 0;
  3098. ftime(&SeqStartTime);
  3099. while(1)
  3100. {
  3101. ftime(&SeqEndTime);
  3102. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  3103. {
  3104. ToggleNum++;
  3105. PreStatus = 4;
  3106. }
  3107. else
  3108. {
  3109. PreStatus = 3;
  3110. }
  3111. if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
  3112. {
  3113. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  3114. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  3115. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3116. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  3117. #else
  3118. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3119. #endif
  3120. break;
  3121. }
  3122. }
  3123. }
  3124. SendMmePacketSize += 19; //the size before MMENTRY
  3125. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3126. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  3127. ftime(&SeqStartTime);
  3128. break;
  3129. }
  3130. #endif
  3131. }
  3132. case MMTYPE_CM_SLAC_MATCH_REQ:
  3133. {
  3134. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3135. {
  3136. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  3137. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  3138. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  3139. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
  3140. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3141. for(Rtn=0; Rtn<17; Rtn++)
  3142. {
  3143. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  3144. }
  3145. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3146. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3147. for(Rtn=0; Rtn<6; Rtn++)
  3148. {
  3149. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  3150. }
  3151. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3152. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3153. for(Rtn=0; Rtn<17; Rtn++)
  3154. {
  3155. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  3156. }
  3157. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3158. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3159. for(Rtn=0; Rtn<6; Rtn++)
  3160. {
  3161. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  3162. }
  3163. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3164. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3165. for(Rtn=0; Rtn<8; Rtn++)
  3166. {
  3167. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  3168. }
  3169. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3170. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3171. for(Rtn=0; Rtn<8; Rtn++)
  3172. {
  3173. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  3174. }
  3175. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3176. }
  3177. #endif
  3178. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  3179. {
  3180. //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3181. //Check ODA (Destination Address)
  3182. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  3183. {
  3184. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_SLAC_MATCH_REQ]wrong ODA: ignore");
  3185. //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
  3186. }
  3187. EvMac_in = &MmePacket->OSA[0];
  3188. RunID_in = &MmePacket->MMENTRY[50];
  3189. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  3190. if (idx >= 0)
  3191. {
  3192. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3193. SLAC_INFO.array[idx].MatchReqNum++;
  3194. sprintf(buf_log_evcomm,
  3195. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:%d-th",
  3196. (idx + 1),
  3197. SLAC_INFO.array[idx].MatchReqNum);
  3198. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3199. //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  3200. //[TC_SECC_VTB_CmSlacMatch_008]
  3201. if (MmePacket->MMENTRY[0] != 0)
  3202. {
  3203. sprintf(buf_log_evcomm,
  3204. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong APPLICATION_TYPE(%d)",
  3205. (idx + 1),
  3206. MmePacket->MMENTRY[0]);
  3207. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3208. break;
  3209. }
  3210. //[TC_SECC_VTB_CmSlacMatch_009] SECURITY_TYPE must be 0x00(No Security)
  3211. //[TC_SECC_VTB_CmSlacMatch_010]
  3212. if (MmePacket->MMENTRY[1] != 0)
  3213. {
  3214. sprintf(buf_log_evcomm,
  3215. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong SECURITY_TYPE(%d)",
  3216. (idx + 1),
  3217. MmePacket->MMENTRY[1]);
  3218. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3219. break;
  3220. }
  3221. //[TC_SECC_VTB_CmSlacMatch_011] MVFLength must be 0x3E(MatchVarField Length)
  3222. //[TC_SECC_VTB_CmSlacMatch_012]
  3223. if (MmePacket->MMENTRY[2] != 0x3E || MmePacket->MMENTRY[3] != 0x00)
  3224. {
  3225. sprintf(buf_log_evcomm,
  3226. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong MVFLength(%d,%d)",
  3227. (idx + 1),
  3228. MmePacket->MMENTRY[2],
  3229. MmePacket->MMENTRY[3]);
  3230. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3231. break;
  3232. }
  3233. //[TC_SECC_VTB_CmSlacMatch_013] EV ID (muxt be all zero)
  3234. //[TC_SECC_VTB_CmSlacMatch_014]
  3235. if (Array_Check_All_Zero(&MmePacket->MMENTRY[4], 17) == FALSE)
  3236. {
  3237. sprintf(buf_log_evcomm,
  3238. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV ID",
  3239. (idx + 1));
  3240. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3241. break;
  3242. }
  3243. //[TC_SECC_VTB_CmSlacMatch_015] EV MAC
  3244. //[TC_SECC_VTB_CmSlacMatch_016]
  3245. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[21], SLAC_EVMAC_LENGTH) == FALSE)
  3246. {
  3247. sprintf(buf_log_evcomm,
  3248. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3249. (idx + 1),
  3250. MmePacket->MMENTRY[21], MmePacket->MMENTRY[22], MmePacket->MMENTRY[23],
  3251. MmePacket->MMENTRY[24], MmePacket->MMENTRY[25], MmePacket->MMENTRY[26]);
  3252. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3253. break;
  3254. }
  3255. //[TC_SECC_VTB_CmSlacMatch_017] EVSE ID should be all zero
  3256. //[TC_SECC_VTB_CmSlacMatch_018]
  3257. if (Array_Check_All_Zero(&MmePacket->MMENTRY[27], 17) == FALSE)
  3258. {
  3259. sprintf(buf_log_evcomm,
  3260. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE ID",
  3261. (idx + 1));
  3262. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3263. break;
  3264. }
  3265. //[TC_SECC_VTB_CmSlacMatch_019] EVSE MAC
  3266. //[TC_SECC_VTB_CmSlacMatch_020]
  3267. if (Array_Compare_Identity(CsuMac, &MmePacket->MMENTRY[44], SLAC_EVSE_MAC_LENGTH) == FALSE)
  3268. {
  3269. sprintf(buf_log_evcomm,
  3270. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3271. (idx + 1),
  3272. MmePacket->MMENTRY[44], MmePacket->MMENTRY[45], MmePacket->MMENTRY[46],
  3273. MmePacket->MMENTRY[47], MmePacket->MMENTRY[48], MmePacket->MMENTRY[49]);
  3274. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3275. break;
  3276. }
  3277. //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
  3278. //[TC_SECC_VTB_CmSlacMatch_022]
  3279. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
  3280. (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
  3281. {
  3282. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3283. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  3284. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3285. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3286. SendMmePacket.MMV = MmePacket->MMV;
  3287. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_MATCH_CNF;
  3288. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3289. SendMmePacketSize = 0;
  3290. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //APPLICATION_TYPE: Fixed value (0x00: EV-EVSE matching)
  3291. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //SECURITY_TYPE: Fixed value (0x00: No Security)
  3292. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x56; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3293. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3294. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EV ID
  3295. SendMmePacketSize += 17;
  3296. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //EV MAC
  3297. SendMmePacketSize += 6;
  3298. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EVSE ID
  3299. SendMmePacketSize += 17;
  3300. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, CsuMac, 6); //EVSE MAC
  3301. SendMmePacketSize += 6;
  3302. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  3303. SendMmePacketSize += SLAC_RUNID_LENGTH;
  3304. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 8); //RSVD
  3305. SendMmePacketSize += 8;
  3306. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, Nid, sizeof(Nid)); //NID: Network ID given by the CCo(EVSE)
  3307. SendMmePacketSize += sizeof(Nid); //NID caculated from the random NMK that will be set.
  3308. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //RSVD
  3309. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, NewNmkKey, sizeof(NewNmkKey)); //NMK: Random value
  3310. SendMmePacketSize += sizeof(NewNmkKey); //NMK: Private NMK of the EVSE (random value)
  3311. SendMmePacketSize += 19; //the size before MMENTRY
  3312. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3313. {
  3314. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3315. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3316. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3317. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3318. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3319. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3320. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3321. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3322. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3323. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3324. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3325. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3326. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3327. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3328. for(Rtn=0; Rtn<17; Rtn++)
  3329. {
  3330. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3331. }
  3332. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3333. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3334. for(Rtn=0; Rtn<6; Rtn++)
  3335. {
  3336. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3337. }
  3338. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3339. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3340. for(Rtn=0; Rtn<17; Rtn++)
  3341. {
  3342. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3343. }
  3344. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3345. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3346. for(Rtn=0; Rtn<6; Rtn++)
  3347. {
  3348. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3349. }
  3350. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3351. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3352. for(Rtn=0; Rtn<8; Rtn++)
  3353. {
  3354. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3355. }
  3356. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3357. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3358. for(Rtn=0; Rtn<8; Rtn++)
  3359. {
  3360. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3361. }
  3362. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3363. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3364. for(Rtn=0; Rtn<7; Rtn++)
  3365. {
  3366. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3367. }
  3368. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3369. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3370. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3371. for(Rtn=0; Rtn<16; Rtn++)
  3372. {
  3373. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3374. }
  3375. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3376. }
  3377. #endif
  3378. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3379. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3380. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3381. sprintf(buf_log_evcomm,
  3382. "[SLAC][Tx]CM_SLAC_MATCH_CNF[%d]",
  3383. (idx + 1));
  3384. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3385. ftime(&SeqStartTime);
  3386. }
  3387. else
  3388. {
  3389. //RunID does not match and it's not the first SLAC request
  3390. //Reset the SLAC database to embrace SLAC retry
  3391. SAVE_SYS_LOG_MSG_EVCOMM("[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
  3392. SLAC_DB_Reset();
  3393. }
  3394. }
  3395. else
  3396. {
  3397. //OSA(EvMac) does not exist
  3398. }
  3399. break;
  3400. }
  3401. #else
  3402. {
  3403. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3404. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3405. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  3406. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  3407. memcpy(SendMmePacket.OSA,CsuMac,6);
  3408. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  3409. SendMmePacket.MMV=MmePacket->MMV;
  3410. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_MATCH_CNF;
  3411. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  3412. SendMmePacketSize=0;
  3413. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating PEV-EVSE matching
  3414. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating No Security
  3415. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56; //Fixed value (0x0056) for matching
  3416. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x0056) for matching
  3417. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //PEV ID
  3418. SendMmePacketSize+=17;
  3419. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  3420. SendMmePacketSize+=6;
  3421. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //EVSE ID
  3422. SendMmePacketSize+=17;
  3423. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
  3424. SendMmePacketSize+=6;
  3425. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  3426. SendMmePacketSize+=sizeof(SlacRunId);
  3427. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8); //RSVD
  3428. SendMmePacketSize+=8;
  3429. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
  3430. SendMmePacketSize+=sizeof(Nid);
  3431. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //RSVD
  3432. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
  3433. SendMmePacketSize+=sizeof(NewNmkKey);
  3434. SendMmePacketSize+=19; //the size before MMENTRY
  3435. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3436. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3437. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3438. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3439. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3440. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3441. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3442. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3443. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3444. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3445. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3446. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3447. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3448. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3449. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3450. for(Rtn=0; Rtn<17; Rtn++)
  3451. {
  3452. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3453. }
  3454. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3455. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3456. for(Rtn=0; Rtn<6; Rtn++)
  3457. {
  3458. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3459. }
  3460. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3461. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3462. for(Rtn=0; Rtn<17; Rtn++)
  3463. {
  3464. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3465. }
  3466. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3467. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3468. for(Rtn=0; Rtn<6; Rtn++)
  3469. {
  3470. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3471. }
  3472. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3473. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3474. for(Rtn=0; Rtn<8; Rtn++)
  3475. {
  3476. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3477. }
  3478. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3479. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3480. for(Rtn=0; Rtn<8; Rtn++)
  3481. {
  3482. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3483. }
  3484. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3485. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3486. for(Rtn=0; Rtn<7; Rtn++)
  3487. {
  3488. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3489. }
  3490. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3491. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3492. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3493. for(Rtn=0; Rtn<16; Rtn++)
  3494. {
  3495. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3496. }
  3497. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3498. #endif
  3499. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3500. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3501. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3502. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Tx]CM_SLAC_MATCH_CNF");
  3503. ftime(&SeqStartTime);
  3504. break;
  3505. }
  3506. #endif
  3507. }
  3508. case MMTYPE_CM_AMP_MAP_REQ:
  3509. {
  3510. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3511. {
  3512. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  3513. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  3514. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  3515. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
  3516. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3517. for(Rtn=0; Rtn<17; Rtn++)
  3518. {
  3519. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  3520. }
  3521. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3522. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3523. for(Rtn=0; Rtn<6; Rtn++)
  3524. {
  3525. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  3526. }
  3527. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3528. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3529. for(Rtn=0; Rtn<17; Rtn++)
  3530. {
  3531. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  3532. }
  3533. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3534. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3535. for(Rtn=0; Rtn<6; Rtn++)
  3536. {
  3537. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  3538. }
  3539. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3540. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3541. for(Rtn=0; Rtn<8; Rtn++)
  3542. {
  3543. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  3544. }
  3545. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3546. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3547. for(Rtn=0; Rtn<8; Rtn++)
  3548. {
  3549. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  3550. }
  3551. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3552. }
  3553. #endif
  3554. //Check ODA (Destination Address)
  3555. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  3556. {
  3557. SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_AMP_MAP_REQ]wrong ODA: ignore");
  3558. //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
  3559. }
  3560. EvMac_in = &MmePacket->OSA[0];
  3561. RunID_in = &MmePacket->MMENTRY[50];
  3562. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  3563. if (idx >= 0)
  3564. {
  3565. Update_V2G_Flow_Status(CM_AMP_MAP_REQ);
  3566. SLAC_INFO.array[idx].MatchReqNum++;
  3567. sprintf(buf_log_evcomm,
  3568. "[SLAC][Rx]CM_AMP_MAP_REQ[%d]:%d-th",
  3569. (idx + 1),
  3570. SLAC_INFO.array[idx].MatchReqNum);
  3571. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3572. //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  3573. //[TC_SECC_VTB_CmSlacMatch_008]
  3574. if ((MmePacket->MMENTRY[0] != 0x3A)||(MmePacket->MMENTRY[1] != 0))
  3575. {
  3576. sprintf(buf_log_evcomm,
  3577. "[SLAC][Rx]CM_AMP_MAP_REQ[%d]:wrong AMLEN(%d)",
  3578. (idx + 1),
  3579. MmePacket->MMENTRY[0]);
  3580. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3581. break;
  3582. }
  3583. //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
  3584. //[TC_SECC_VTB_CmSlacMatch_022]
  3585. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
  3586. (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
  3587. {
  3588. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3589. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  3590. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3591. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3592. SendMmePacket.MMV = MmePacket->MMV;
  3593. SendMmePacket.MMTYPE = MMTYPE_CM_AMP_MAP_CNF;
  3594. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3595. SendMmePacketSize = 0;
  3596. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //success
  3597. Update_V2G_Flow_Status(CM_AMP_MAP_CNF);
  3598. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3599. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3600. sprintf(buf_log_evcomm,
  3601. "[SLAC][Tx]CM_AMP_MAP_CNF[%d]",
  3602. (idx + 1));
  3603. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3604. ftime(&SeqStartTime);
  3605. }
  3606. else
  3607. {
  3608. //RunID does not match and it's not the first SLAC request
  3609. //Reset the SLAC database to embrace SLAC retry
  3610. SAVE_SYS_LOG_MSG_EVCOMM("[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
  3611. SLAC_DB_Reset();
  3612. }
  3613. }
  3614. else
  3615. {
  3616. //OSA(EvMac) does not exist
  3617. }
  3618. break;
  3619. }
  3620. case MMTYPE_VENDOR_VS_HOST_ACTION:
  3621. {
  3622. struct QcaVendorMmeHeader *RecvPacket;
  3623. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3624. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_HOST_ACTION ---\n");
  3625. switch (RecvPacket->MBODY[0])
  3626. {
  3627. case 0x00:
  3628. //Loader (Device Softloader or Bootloader) ready
  3629. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader Ready\n");
  3630. break;
  3631. case 0x01:
  3632. //Firmware Upgrade Ready
  3633. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade Ready\n");
  3634. break;
  3635. case 0x02:
  3636. //PIB Update Ready
  3637. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: PIB Update Ready\n");
  3638. break;
  3639. case 0x03:
  3640. //Firmware Upgrade and PIB Update ready
  3641. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade and PIB Update ready\n");
  3642. break;
  3643. case 0x04:
  3644. //Loader (Bootloader) ready to receive SDRAM configuration.
  3645. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader ready to receive SDRAM configuration\n");
  3646. break;
  3647. case 0x05:
  3648. //Reset to Factory Defaults.
  3649. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reset to Factory Defaults\n");
  3650. break;
  3651. default:
  3652. //Reserved
  3653. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reserved\n");
  3654. break;
  3655. }
  3656. break;
  3657. }
  3658. case MMTYPE_VENDOR_ATTEN_CHAR:
  3659. {
  3660. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_ATTEN_CHAR ---\n");
  3661. break;
  3662. }
  3663. case MMTYPE_VENDOR_VS_NW_INFO_CNF:
  3664. {
  3665. struct QcaVendorMmeHeader *RecvPacket;
  3666. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3667. memcpy(QcaMac, RecvPacket->OSA, 6);
  3668. sprintf(buf_log_evcomm,
  3669. "[QCA7K][Rx][VENDOR_VS_NW_INFO_CNF]Got QCA7K MacAddr:%02X:%02X:%02X:%02X:%02X:%02X (comm:OK)",
  3670. QcaMac[0], QcaMac[1], QcaMac[2], QcaMac[3], QcaMac[4], QcaMac[5]);
  3671. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3672. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
  3673. DEBUG_PRINTF_EVCOMM_DETAIL("QcaMac: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3674. QcaMac[0],
  3675. QcaMac[1],
  3676. QcaMac[2],
  3677. QcaMac[3],
  3678. QcaMac[4],
  3679. QcaMac[5]);
  3680. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  3681. ftime(&SeqStartTime);
  3682. break;
  3683. }
  3684. case MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF:
  3685. {
  3686. struct QcaVendorMmeHeader *RecvPacket;
  3687. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3688. if(RecvPacket->MBODY[1]==0)
  3689. {
  3690. //PLC disconnected
  3691. sprintf(buf_log_evcomm,
  3692. "[QCA7K][Rx][MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF]Got PLC Link Status:%d",
  3693. RecvPacket->MBODY[1]);
  3694. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3695. Update_V2G_Flow_Status(Other_Fault);
  3696. }
  3697. else
  3698. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  3699. ftime(&SeqStartTime);
  3700. break;
  3701. }
  3702. default:
  3703. {
  3704. break;
  3705. }
  3706. }
  3707. }
  3708. /*===========================================================================
  3709. FUNCTION: SlacComm
  3710. DESCRIPTION:
  3711. PRE-CONDITION:
  3712. INPUT:
  3713. OUTPUT:
  3714. GLOBAL VARIABLES:
  3715. =============================================================================*/
  3716. int SlacComm()
  3717. {
  3718. static unsigned char qca7k_comm_retry = 0;
  3719. unsigned char *EvMac_in;
  3720. unsigned char *RunID_in;
  3721. double t_diff = 0;
  3722. int packet_size = 0;
  3723. int count = 0;
  3724. int idx = 0;
  3725. int i = 0;
  3726. if(RawSock >= 0)
  3727. {
  3728. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  3729. packet_size = recvfrom(RawSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0, NULL, NULL);
  3730. if(packet_size > 0)
  3731. {
  3732. /*#ifdef Debug
  3733. DEBUG_PRINTF_EVCOMM_DETAIL("Raw Data: ");
  3734. for(count=0;count<packet_size;count++)
  3735. DEBUG_PRINTF_EVCOMM_DETAIL("0x%x, ",V2gtpMsgRxBuf[count]);
  3736. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3737. #endif*/
  3738. MmeProcess(V2gtpMsgRxBuf, packet_size);
  3739. }
  3740. }
  3741. switch(Check_V2G_Flow_Status())
  3742. {
  3743. case IDLE:
  3744. {
  3745. if(RawSock < 0)
  3746. {
  3747. RawSock = socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  3748. sprintf(buf_log_evcomm, "[RawSock]opened(%d)", RawSock);
  3749. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3750. if(RawSock == -1)
  3751. {
  3752. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Failed to create socket");
  3753. Update_V2G_Flow_Status(Other_Fault);
  3754. return -1;
  3755. }
  3756. ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp=RawSock;
  3757. if (setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE, QcaInterface, 4) < 0)
  3758. {
  3759. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_BINDTODEVICE NG");
  3760. Update_V2G_Flow_Status(Other_Fault);
  3761. return -1;
  3762. }
  3763. struct timeval tv;
  3764. tv.tv_sec = 0;
  3765. tv.tv_usec = 100000; //100ms (Rx timeout)
  3766. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3767. {
  3768. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_RCVTIMEO NG");
  3769. Update_V2G_Flow_Status(Other_Fault);
  3770. return -1;
  3771. }
  3772. tv.tv_usec = 100000; //100ms (Tx timeout)
  3773. if (setsockopt(RawSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3774. {
  3775. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_SNDTIMEO NG");
  3776. Update_V2G_Flow_Status(Other_Fault);
  3777. return -1;
  3778. }
  3779. memset(&Req, 0, sizeof(struct ifreq));
  3780. strcpy( (char*)Req.ifr_name, QcaInterface);
  3781. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  3782. {
  3783. SAVE_SYS_LOG_MSG_EVCOMM("SlacComm: ioctl NG");
  3784. Update_V2G_Flow_Status(Other_Fault);
  3785. return -1;
  3786. }
  3787. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll));
  3788. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  3789. DestSocketAddress.sll_halen = ETH_ALEN;
  3790. PwmStartTime = 0;
  3791. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = FALSE;
  3792. SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K]connecting...");
  3793. //Get QCA7K MAC address
  3794. GetQca7kMac();
  3795. ftime(&SeqStartTime);
  3796. break;
  3797. }
  3798. else //RawSock: opened
  3799. {
  3800. if(EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  3801. {
  3802. ftime(&SeqEndTime);
  3803. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3804. if (t_diff > V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD) //3 secs
  3805. {
  3806. qca7k_comm_retry++;
  3807. sprintf(buf_log_evcomm,
  3808. "[QCA7K]re-try connecting...(%.02lf/%dms)",
  3809. t_diff,
  3810. V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD);
  3811. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3812. GetQca7kMac(); //re-send req
  3813. ftime(&SeqStartTime);
  3814. break;
  3815. }
  3816. else
  3817. {
  3818. //null
  3819. }
  3820. //Retry by 3 times
  3821. if (qca7k_comm_retry >= 3)
  3822. {
  3823. sprintf(buf_log_evcomm,
  3824. "[QCA7K][Error]comm: fail (retry by %d times)",
  3825. qca7k_comm_retry);
  3826. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3827. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3828. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3829. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3830. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3831. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3832. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3833. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3834. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3835. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3836. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3837. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  3838. Update_V2G_Flow_Status(Sequence_Timeout);
  3839. qca7k_comm_retry = 0;
  3840. break;
  3841. }
  3842. }
  3843. else //RawSock: opened; Set Key: DONE
  3844. {
  3845. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  3846. if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission >=1))
  3847. {
  3848. if(PwmStartTime <= 0)
  3849. {
  3850. //Sniffer_Tcpdump(ENABLE);
  3851. //#if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  3852. //sleep(1); //wait for tcpdump to be ready.
  3853. //#endif
  3854. SwitchCpStateE(DISABLE);
  3855. OutputCpPwmDuty(5);
  3856. PwmStartTime = time(NULL);
  3857. }
  3858. else
  3859. {
  3860. if((time(NULL) - PwmStartTime) > ((CCS_ENERGY_TRANSFER_MODE<=1)?20:TT_EVSE_SLAC_init))
  3861. {
  3862. sprintf(buf_log_evcomm,
  3863. "SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init, NowTime(%d)-PwmStartTime(%d)>%d (sec)",
  3864. time(NULL),
  3865. PwmStartTime,
  3866. TT_EVSE_SLAC_init);
  3867. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3868. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3869. //CCS_SECC_TIMEOUT_SLAC_TT_EVSE_SLAC_init (023809)
  3870. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3871. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3872. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3873. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3874. ShmStatusCodeData->PresentStatusCode[0][4] = 0;
  3875. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  3876. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3877. Update_V2G_Flow_Status(Sequence_Timeout);
  3878. PwmStartTime = 0;
  3879. return -1;
  3880. }
  3881. else
  3882. {
  3883. //waiting for CM_SLAC_PARM_REQ
  3884. }
  3885. }
  3886. }
  3887. else
  3888. {
  3889. PwmStartTime = 0;
  3890. }
  3891. }
  3892. }
  3893. break;
  3894. }
  3895. case CM_SET_KEY_REQ: //13
  3896. {
  3897. //CM_SET_KEY_REQ
  3898. //SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Rx]CM_SET_KEY_REQ");
  3899. ftime(&SeqEndTime);
  3900. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3901. if (t_diff > V2G_SECC_QCA7000_COMM_TIMEOUT) //10 seconds
  3902. {
  3903. sprintf(buf_log_evcomm,
  3904. "[QCA7K]Failed on SetKey => End_Process (%.02lf/%dms)",
  3905. t_diff,
  3906. V2G_SECC_QCA7000_COMM_TIMEOUT);
  3907. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3908. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3909. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3910. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3911. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3912. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3913. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3914. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3915. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3916. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3917. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3918. Update_V2G_Flow_Status(Sequence_Timeout);
  3919. }
  3920. else if (t_diff > V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD) //2 seconds
  3921. {
  3922. sprintf(buf_log_evcomm,
  3923. "[QCA7K]SetKey: proceed (%.02lf/%dms)",
  3924. t_diff,
  3925. V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD);
  3926. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3927. SendSetKey();
  3928. ftime(&SeqStartTime);
  3929. }
  3930. else
  3931. {
  3932. //null
  3933. }
  3934. break;
  3935. }
  3936. case CM_SET_KEY_CNF: //14
  3937. {
  3938. sprintf(buf_log_evcomm,
  3939. "[SECCReady]Wait: plugin(%d), matached(%d), permission(%d)...",
  3940. CheckConnectorPlugIn(),
  3941. CSUCOMMDC_TASK_FLAG.matched,
  3942. ShmInternalComm->ChargingPermission
  3943. );
  3944. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3945. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = TRUE;
  3946. PwmStartTime = 0;
  3947. Update_V2G_Flow_Status(IDLE);
  3948. break;
  3949. }
  3950. case CM_SLAC_PARM_CONF:
  3951. {
  3952. ftime(&SeqEndTime);
  3953. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  3954. {
  3955. sprintf(buf_log_evcomm,
  3956. "SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence (%.02lf of %dms)",
  3957. DiffTimeb(SeqStartTime, SeqEndTime),
  3958. TT_match_sequence);
  3959. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3960. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3961. //CCS_SECC_TIMEOUT_CM_START_ATTEN_CHAR_IND (023811):
  3962. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3963. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3964. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3965. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3966. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3967. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3968. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3969. ShmStatusCodeData->PresentStatusCode[0][5] = 1;
  3970. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3971. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3972. Update_V2G_Flow_Status(Sequence_Timeout);
  3973. return -1;
  3974. }
  3975. break;
  3976. }
  3977. case CM_START_ATTEN_CHAR_IND:
  3978. {
  3979. ftime(&SeqEndTime);
  3980. if(DiffTimeb(SeqStartTime, SeqEndTime) > (TP_EV_batch_msg_interval)) //one more time interval for tolerance
  3981. {
  3982. sprintf(buf_log_evcomm,
  3983. "SlacComm: Wait CM_MNBC_SOUND_IND Timeout - TP_EV_batch_msg_interval (%.02lf of %dms)",
  3984. DiffTimeb(SeqStartTime, SeqEndTime),
  3985. TP_EV_batch_msg_interval);
  3986. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  3987. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3988. //CCS_SECC_TIMEOUT_SLAC_CM_MNBC_SOUND_IND (023818):
  3989. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3990. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3991. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3992. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3993. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3994. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3995. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3996. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  3997. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3998. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3999. Update_V2G_Flow_Status(Sequence_Timeout);
  4000. return -1;
  4001. }
  4002. break;
  4003. }
  4004. case CM_MNBC_SOUND_IND:
  4005. {
  4006. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  4007. {
  4008. ftime(&SeqEndTime);
  4009. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  4010. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  4011. if(t_diff > TT_EVSE_match_MNBC ||
  4012. (SLAC_INFO.array[0].AttenProfileCnt >= SLAC_INFO.array[0].MnbcSoundNum) ||
  4013. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)) //TC_SECC_VTB_AttenuationCharacterization_003
  4014. {
  4015. //Wait for other SLAC Req sets
  4016. if ((SLAC_INFO.arrayLen >= 2) &&
  4017. (t_diff < TT_EVSE_match_MNBC) &&
  4018. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)) //not a retry
  4019. {
  4020. break;
  4021. }
  4022. //Check if it is a timeup response
  4023. if (t_diff > TT_EVSE_match_MNBC)
  4024. {
  4025. sprintf(buf_log_evcomm,
  4026. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: timeup(%.2f/%dms) => send",
  4027. (i + 1),
  4028. t_diff,
  4029. TT_EVSE_match_MNBC);
  4030. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4031. }
  4032. //Sending all CM_ATTEN_CHAR_IND according to all corresponding SLAC Req sets
  4033. for (i = 0; i < SLAC_INFO.arrayLen; i++)
  4034. {
  4035. if ((SLAC_INFO.array[i].AttenProfileCnt == 0) ||
  4036. (SLAC_INFO.array[i].AagGroupsNum == 0) ||
  4037. (SLAC_INFO.array[i].StartAttenCharCnt == 0) ||
  4038. (SLAC_INFO.array[i].MnbcSoundNum != 10) || //received in CM_START_ATTEN_CHAR_IND
  4039. (SLAC_INFO.array[i].StartAttenCharErr == TRUE)
  4040. )
  4041. {
  4042. //Ignoring those SLAC request sets without sending CM_MNBC_SOUND_IND(CM_ATTEN_PROFILE_IND)
  4043. sprintf(buf_log_evcomm,
  4044. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: para err(%d,%d,%d,%d,%d) => canceled",
  4045. (i + 1),
  4046. SLAC_INFO.array[i].AttenProfileCnt,
  4047. SLAC_INFO.array[i].AagGroupsNum,
  4048. SLAC_INFO.array[i].StartAttenCharCnt,
  4049. SLAC_INFO.array[i].MnbcSoundNum,
  4050. SLAC_INFO.array[i].StartAttenCharErr);
  4051. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4052. continue;
  4053. }
  4054. //In CM_ATTEN_CHAR_IND retry process, here only re-send this message according to the 1st coming SLAC request
  4055. if ((EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0) && (i != 0))
  4056. {
  4057. sprintf(buf_log_evcomm,
  4058. "[NOTE][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: canceled",
  4059. (i + 1));
  4060. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4061. break;
  4062. }
  4063. EvMac_in = SLAC_INFO.array[i].EvMac;
  4064. RunID_in = SLAC_INFO.array[i].RunID;
  4065. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  4066. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  4067. memcpy(SendMmePacket.OSA, CsuMac, 6);
  4068. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  4069. SendMmePacket.MMV = 0x01;
  4070. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  4071. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  4072. SendMmePacketSize = 0;
  4073. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  4074. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  4075. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //SOURCE_ADDRESS, MAC address of the EV Host
  4076. SendMmePacketSize += SLAC_EVMAC_LENGTH;
  4077. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  4078. SendMmePacketSize += SLAC_RUNID_LENGTH;
  4079. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //SOURCE_ID(0x00)
  4080. SendMmePacketSize += 17;
  4081. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //RESP_ID(0x00)
  4082. SendMmePacketSize += 17;
  4083. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AttenProfileCnt; //NumSounds: Number of M-Sounds used for generation of the ATTEN_PROFILE
  4084. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AagGroupsNum; //NumGroups
  4085. for(count = 0; count < SLAC_INFO.array[i].AagGroupsNum; count++)
  4086. {
  4087. unsigned char TmpAag;
  4088. TmpAag = ((SLAC_INFO.array[i].AAG[count] / SLAC_INFO.array[i].AttenProfileCnt) & 0xFF);
  4089. SLAC_INFO.array[i].AAG_quality_ori += (float) TmpAag; //original signal quality
  4090. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  4091. #if 1
  4092. //TC_SECC_VTB_AttenuationCharacterization_019
  4093. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  4094. #else
  4095. if(TmpAag >= 39) //original method proposed by Vern
  4096. {
  4097. TmpAag = 37;
  4098. }
  4099. #endif
  4100. #endif
  4101. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  4102. SLAC_INFO.array[i].AAG_quality_refined += (float) TmpAag; //refined signal quality
  4103. }
  4104. SendMmePacketSize += 19; //the size before MMENTRY
  4105. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  4106. {
  4107. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  4108. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4109. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  4110. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4111. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  4112. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  4113. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  4114. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  4115. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  4116. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  4117. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  4118. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  4119. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  4120. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  4121. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  4122. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  4123. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  4124. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  4125. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  4126. for(count=0; count<17; count++)
  4127. {
  4128. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
  4129. }
  4130. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4131. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  4132. for(count=0; count<17; count++)
  4133. {
  4134. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
  4135. }
  4136. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4137. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  4138. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
  4139. for(count=0; count<AagGroupsNum; count++)
  4140. {
  4141. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
  4142. }
  4143. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4144. }
  4145. #endif
  4146. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  4147. SLAC_INFO.array[i].AAG_quality_ori /= SLAC_INFO.array[i].AagGroupsNum;
  4148. SLAC_INFO.array[i].AAG_quality_refined /= SLAC_INFO.array[i].AagGroupsNum;
  4149. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  4150. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  4151. {
  4152. sprintf(buf_log_evcomm,
  4153. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: %d-th resend (Q=%.2f/%.2f)(%d/%d)",
  4154. (i + 1),
  4155. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry,
  4156. SLAC_INFO.array[i].AAG_quality_refined,
  4157. SLAC_INFO.array[i].AAG_quality_ori,
  4158. SLAC_INFO.array[i].AttenProfileCnt,
  4159. SLAC_INFO.array[i].MnbcSoundNum);
  4160. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4161. }
  4162. else if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)
  4163. {
  4164. sprintf(buf_log_evcomm,
  4165. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: Q=%.2f/%.2f(%d/%d)",
  4166. (i + 1),
  4167. SLAC_INFO.array[i].AAG_quality_refined,
  4168. SLAC_INFO.array[i].AAG_quality_ori,
  4169. SLAC_INFO.array[i].AttenProfileCnt,
  4170. SLAC_INFO.array[i].MnbcSoundNum);
  4171. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4172. }
  4173. else
  4174. {
  4175. sprintf(buf_log_evcomm,
  4176. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: unexpected CM_ATTEN_CHAR_IND_retry(%d))",
  4177. i,
  4178. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  4179. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4180. }
  4181. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  4182. } //end of for loop
  4183. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  4184. ftime(&SeqStartTime);
  4185. }
  4186. break;
  4187. }
  4188. #else
  4189. {
  4190. ftime(&SeqEndTime);
  4191. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  4192. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_MNBC || (AttenProfileCnt >= MnbcSoundNum) || (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0))
  4193. {
  4194. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  4195. memcpy(SendMmePacket.ODA, EvMac, 6);
  4196. memcpy(SendMmePacket.OSA, CsuMac, 6);
  4197. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  4198. SendMmePacket.MMV = 0x01;
  4199. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  4200. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  4201. SendMmePacketSize = 0;
  4202. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  4203. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  4204. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //SOURCE_ADDRESS, MAC address of the EV Host
  4205. SendMmePacketSize += 6;
  4206. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize, SlacRunId, sizeof(SlacRunId));
  4207. SendMmePacketSize += sizeof(SlacRunId);
  4208. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //SOURCE_ID
  4209. SendMmePacketSize += 17;
  4210. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //RESP_ID
  4211. SendMmePacketSize += 17;
  4212. SendMmePacket.MMENTRY[SendMmePacketSize++] = AttenProfileCnt; //NumSounds
  4213. SendMmePacket.MMENTRY[SendMmePacketSize++] = AagGroupsNum; //NumGroups
  4214. for(count=0; count < AagGroupsNum; count++)
  4215. {
  4216. unsigned char TmpAag;
  4217. TmpAag = ((Aag[count] / AttenProfileCnt) & 0xFF);
  4218. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  4219. #if 1
  4220. //TC_SECC_VTB_AttenuationCharacterization_019
  4221. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  4222. #else
  4223. if(TmpAag >= 39) //original method proposed by Vern
  4224. {
  4225. /*
  4226. // [To-do] If this statement is enabled, SLAC will fail due to timeout.
  4227. {
  4228. unsigned char TmpBuf[64];
  4229. memset(TmpBuf,0,sizeof(TmpBuf));
  4230. sprintf(TmpBuf,"SlacComm: bad Aag[%d]=%d",count,TmpAag);
  4231. SAVE_SYS_LOG_MSG_EVCOMM(TmpBuf);
  4232. }
  4233. */
  4234. printf("%d,", TmpAag);
  4235. TmpAag = 37;
  4236. }
  4237. #endif
  4238. #endif
  4239. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  4240. }
  4241. SendMmePacketSize += 19; //the size before MMENTRY
  4242. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  4243. {
  4244. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  4245. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4246. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  4247. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4248. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  4249. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  4250. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  4251. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  4252. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  4253. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  4254. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  4255. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  4256. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  4257. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  4258. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  4259. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  4260. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  4261. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  4262. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  4263. for(count=0; count<17; count++)
  4264. {
  4265. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
  4266. }
  4267. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4268. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  4269. for(count=0; count<17; count++)
  4270. {
  4271. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
  4272. }
  4273. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4274. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  4275. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
  4276. for(count=0; count<AagGroupsNum; count++)
  4277. {
  4278. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
  4279. }
  4280. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4281. }
  4282. #endif
  4283. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  4284. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  4285. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  4286. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  4287. {
  4288. sprintf(buf_log_evcomm,
  4289. "[SLAC][Tx]CM_ATTEN_CHAR_IND: resend(%d-th)",
  4290. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  4291. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4292. }
  4293. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  4294. ftime(&SeqStartTime);
  4295. }
  4296. break;
  4297. }
  4298. #endif
  4299. }
  4300. case CM_ATTEN_CHAR_IND:
  4301. {
  4302. ftime(&SeqEndTime);
  4303. //if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  4304. 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.
  4305. {
  4306. // Alston - 2022/07/05 : Fix can't resend Atten_char_ind problem
  4307. if(EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry < 2)
  4308. {
  4309. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  4310. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  4311. }
  4312. else
  4313. {
  4314. sprintf(buf_log_evcomm,
  4315. "SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response (%.02lf of %dms)",
  4316. DiffTimeb(SeqStartTime, SeqEndTime),
  4317. TT_match_response);
  4318. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4319. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4320. //CCS_SECC_TIMEOUT_SLAC_CM_ATTEN_CHAR_RSP (023814):
  4321. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4322. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4323. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4324. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4325. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4326. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4327. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  4328. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4329. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4330. Update_V2G_Flow_Status(Sequence_Timeout);
  4331. return -1;
  4332. }
  4333. }
  4334. break;
  4335. }
  4336. case CM_ATTEN_CHAR_RSP:
  4337. {
  4338. ftime(&SeqEndTime);
  4339. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_session)
  4340. {
  4341. sprintf(buf_log_evcomm,
  4342. "SlacComm: Wait CM_VALIDATE_REQ_1ST or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session (%.02lf of %dms)",
  4343. DiffTimeb(SeqStartTime, SeqEndTime),
  4344. TT_EVSE_match_session);
  4345. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4346. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4347. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_1ST__CM_SLAC_MATCH_REQ (023815):
  4348. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4349. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4350. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4351. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4352. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4353. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4354. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  4355. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4356. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4357. Update_V2G_Flow_Status(Sequence_Timeout);
  4358. return -1;
  4359. }
  4360. break;
  4361. }
  4362. case CM_VALIDATE_CNF:
  4363. {
  4364. ftime(&SeqEndTime);
  4365. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  4366. {
  4367. sprintf(buf_log_evcomm,
  4368. "SlacComm: Wait CM_VALIDATE_REQ_2ND or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence (%.02lf of %dms)",
  4369. DiffTimeb(SeqStartTime, SeqEndTime),
  4370. TT_match_sequence);
  4371. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4372. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4373. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_2ND__CM_SLAC_MATCH_REQ (023819):
  4374. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4375. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4376. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4377. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4378. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4379. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4380. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  4381. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4382. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4383. Update_V2G_Flow_Status(Sequence_Timeout);
  4384. return -1;
  4385. }
  4386. break;
  4387. }
  4388. case CM_AMP_MAP_CNF:
  4389. case CM_SLAC_MATCH_CNF:
  4390. {
  4391. if(UdpSock > 0)
  4392. {
  4393. close(UdpSock);
  4394. UdpSock = -1;
  4395. }
  4396. if(TcpSock > 0)
  4397. {
  4398. close(TcpSock);
  4399. TcpSock = -1;
  4400. }
  4401. ftime(&SeqStartTime);
  4402. V2gTcpConnected();
  4403. Update_V2G_Flow_Status(SLACC_SDP_UDP_Connection);
  4404. SAVE_SYS_LOG_MSG_EVCOMM("SLAAC,SDP,UDP: connecting...");
  4405. break;
  4406. }
  4407. default:
  4408. {
  4409. break;
  4410. }
  4411. }
  4412. return 0;
  4413. }
  4414. /*===========================================================================
  4415. FUNCTION: V2gMsgDecoder
  4416. DESCRIPTION:
  4417. 1. Decode the V2GTP messages inside "msg" and save the decoded
  4418. messages in ccs_exi_doc_DIN, ccs_exi_doc_ISO1, and ccs_exi_doc_ISO2,
  4419. respectively.
  4420. 2. After decoding, V2gMsg_Process() could then use
  4421. ccs_exi_doc_DIN, ccs_exi_doc_ISO1, or ccs_exi_doc_ISO2
  4422. to deal with the corresponding Response messages, respectively.
  4423. PRE-CONDITION:
  4424. 1. msg_length > 0
  4425. INPUT:
  4426. 1. msg
  4427. 2. msg_length
  4428. OUTPUT:
  4429. 1. ccs_exi_doc_DIN //global variable
  4430. ccs_exi_doc_ISO1
  4431. ccs_exi_doc_ISO2
  4432. 2. v2g_state //Status Flag
  4433. //indicating the V2gMsg_Process_din to proceed
  4434. the next process.
  4435. 3. return value // < 0: ERROR
  4436. // > 0: Message Type
  4437. GLOBAL VARIABLES:
  4438. =============================================================================*/
  4439. int V2gMsgDecoder(unsigned char *msg, unsigned int msg_length, unsigned int v2g_state)
  4440. {
  4441. int errn = 0;
  4442. //Checking the minimum Header size requirement
  4443. if(msg_length < V2GTP_MSG_HEADER_LENGTH) //The minimum requirement should be 8-byte header.
  4444. {
  4445. errn = -1;
  4446. return errn;
  4447. }
  4448. //Decode the 1st V2GMSG: AppProtocol
  4449. if(v2g_state == SupportedAppProtocolRequest) //17
  4450. {
  4451. if (errn = API_V2GMSG_EXI_Decoder_AppProtocol(msg, msg_length, &ccs_handshake) < 0)
  4452. {
  4453. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: SupportedAppProtocolRequest()\n", errn);
  4454. }
  4455. else //decoded successfully.
  4456. {
  4457. //PRINT_XML_DOC_supportedAppProtocolReq(&ccs_handshake);
  4458. }
  4459. }
  4460. //Decode the subsequent V2GMSG (DIN 70121, ISO 15118-2, ISO 15118-20)
  4461. else if(v2g_state > SupportedAppProtocolRequest && v2g_state <= SessionStopResponse)
  4462. {
  4463. //Decoding according to its own protocol
  4464. switch (ShmCcsData->CommProtocol)
  4465. {
  4466. case V2GT_MSG_PROTOCOL_DIN70121: //0
  4467. {
  4468. //DIN
  4469. if(errn = API_V2GMSG_EXI_Decoder_DIN(msg, msg_length, &ccs_exi_doc_DIN) < 0)
  4470. {
  4471. sprintf(buf_log_evcomm,
  4472. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_DIN()",
  4473. errn);
  4474. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4475. }
  4476. break;
  4477. }
  4478. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  4479. {
  4480. //ISO1
  4481. if(errn = API_V2GMSG_EXI_Decoder_ISO1(msg, msg_length, &ccs_exi_doc_ISO1) < 0)
  4482. {
  4483. sprintf(buf_log_evcomm,
  4484. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO1()",
  4485. errn);
  4486. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4487. }
  4488. break;
  4489. }
  4490. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  4491. {
  4492. //ISO2
  4493. if(errn = API_V2GMSG_EXI_Decoder_ISO2(msg, msg_length, &ccs_exi_doc_ISO2) < 0)
  4494. {
  4495. sprintf(buf_log_evcomm,
  4496. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO2()",
  4497. errn);
  4498. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4499. }
  4500. break;
  4501. }
  4502. default:
  4503. break;
  4504. }
  4505. }
  4506. else
  4507. {
  4508. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: Unexpected v2g_state\n", errn);
  4509. errn = -1;
  4510. }
  4511. return errn;
  4512. }
  4513. /*===========================================================================
  4514. FUNCTION: encode_din_V2GTP_stream
  4515. DESCRIPTION:
  4516. PRE-CONDITION:
  4517. INPUT:
  4518. OUTPUT:
  4519. GLOBAL VARIABLES:
  4520. =============================================================================*/
  4521. int encode_din_V2GTP_stream(bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4522. {
  4523. int errn = 0;
  4524. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4525. errn = encode_dinExiDocument(v2g_tx_stream, ccs_exi_doc_DIN);
  4526. if (errn == 0)
  4527. {
  4528. //successfully encoded
  4529. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4530. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4531. if (errn != 0)
  4532. {
  4533. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4534. }
  4535. }
  4536. else
  4537. {
  4538. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]encode_dinExiDocument(): %d (DEC)\n", errn);
  4539. }
  4540. return errn;
  4541. }
  4542. /*===========================================================================
  4543. FUNCTION: encode_iso1_V2GTP_stream
  4544. DESCRIPTION:
  4545. PRE-CONDITION:
  4546. INPUT:
  4547. OUTPUT:
  4548. GLOBAL VARIABLES:
  4549. =============================================================================*/
  4550. int encode_iso1_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4551. {
  4552. int errn = 0;
  4553. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4554. errn = encode_iso1ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO1);
  4555. if (errn == 0)
  4556. {
  4557. //successfully encoded
  4558. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4559. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4560. if (errn != 0)
  4561. {
  4562. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4563. }
  4564. }
  4565. else
  4566. {
  4567. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]encode_iso1ExiDocument(): %d (DEC)\n", errn);
  4568. }
  4569. return errn;
  4570. }
  4571. /*===========================================================================
  4572. FUNCTION: encode_iso2_V2GTP_stream
  4573. DESCRIPTION:
  4574. PRE-CONDITION:
  4575. INPUT:
  4576. OUTPUT:
  4577. GLOBAL VARIABLES:
  4578. =============================================================================*/
  4579. int encode_iso2_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4580. {
  4581. int errn = 0;
  4582. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4583. errn = encode_iso2ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO2);
  4584. if (errn == 0)
  4585. {
  4586. //successfully encoded
  4587. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4588. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4589. if (errn != 0)
  4590. {
  4591. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4592. }
  4593. }
  4594. else
  4595. {
  4596. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]encode_iso2ExiDocument(): %d (DEC)\n", errn);
  4597. }
  4598. return errn;
  4599. }
  4600. /*===========================================================================
  4601. FUNCTION: send_encoded_din_V2GTP_Stream
  4602. DESCRIPTION:
  4603. PRE-CONDITION:
  4604. INPUT:
  4605. OUTPUT:
  4606. GLOBAL VARIABLES:
  4607. =============================================================================*/
  4608. int send_encoded_din_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4609. {
  4610. int errn = 0;
  4611. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4612. errn = encode_din_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_DIN);
  4613. // STEP 2: =========== Send Response Packet ===========
  4614. int rtn = 0;
  4615. #ifdef SUPPORT_TLS_CONNECTION
  4616. if(EvSecurity == 0)//support security
  4617. {
  4618. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4619. }
  4620. else
  4621. {
  4622. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4623. }
  4624. #else
  4625. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4626. #endif
  4627. if (rtn == v2g_tx_stream->size)
  4628. {
  4629. /*
  4630. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_din_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4631. rtn, v2g_tx_stream->size);
  4632. */
  4633. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4634. }
  4635. else if (rtn >= 0)
  4636. {
  4637. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_din_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4638. rtn, v2g_tx_stream->size);
  4639. }
  4640. else
  4641. {
  4642. errn = rtn;
  4643. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_din_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4644. }
  4645. //STEP 3: ========= Reset V2G MSG Flags ==========
  4646. init_dinBodyType(&ccs_exi_doc_DIN->V2G_Message.Body);
  4647. return errn;
  4648. }
  4649. /*===========================================================================
  4650. FUNCTION: send_encoded_iso1_V2GTP_Stream
  4651. DESCRIPTION:
  4652. PRE-CONDITION:
  4653. INPUT:
  4654. OUTPUT:
  4655. GLOBAL VARIABLES:
  4656. =============================================================================*/
  4657. int send_encoded_iso1_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4658. {
  4659. int errn = 0;
  4660. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4661. errn = encode_iso1_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO1);
  4662. // STEP 2: =========== Send Response Packet ===========
  4663. int rtn = 0;
  4664. #ifdef SUPPORT_TLS_CONNECTION
  4665. if(EvSecurity == 0)//support security
  4666. {
  4667. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4668. }
  4669. else
  4670. {
  4671. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4672. }
  4673. #else
  4674. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4675. #endif
  4676. if (rtn == v2g_tx_stream->size)
  4677. {
  4678. /*
  4679. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso1_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4680. rtn, v2g_tx_stream->size);
  4681. */
  4682. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4683. }
  4684. else if (rtn >= 0)
  4685. {
  4686. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso1_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4687. rtn, v2g_tx_stream->size);
  4688. }
  4689. else
  4690. {
  4691. errn = rtn;
  4692. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso1_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4693. }
  4694. //STEP 3: ========= Reset V2G MSG Flags ==========
  4695. init_iso1BodyType(&ccs_exi_doc_ISO1->V2G_Message.Body);
  4696. return errn;
  4697. }
  4698. /*===========================================================================
  4699. FUNCTION: send_encoded_iso2_V2GTP_Stream
  4700. DESCRIPTION:
  4701. PRE-CONDITION:
  4702. INPUT:
  4703. OUTPUT:
  4704. GLOBAL VARIABLES:
  4705. =============================================================================*/
  4706. int send_encoded_iso2_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4707. {
  4708. int errn = 0;
  4709. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4710. errn = encode_iso2_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO2);
  4711. // STEP 2: =========== Send Response Packet ===========
  4712. int rtn = 0;
  4713. #ifdef SUPPORT_TLS_CONNECTION
  4714. if(EvSecurity == 0)//support security
  4715. {
  4716. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4717. }
  4718. else
  4719. {
  4720. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4721. }
  4722. #else
  4723. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4724. #endif
  4725. if (rtn == v2g_tx_stream->size)
  4726. {
  4727. /*
  4728. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso2_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4729. rtn, v2g_tx_stream->size);
  4730. */
  4731. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4732. }
  4733. else if (rtn >= 0)
  4734. {
  4735. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso2_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4736. rtn, v2g_tx_stream->size);
  4737. }
  4738. else
  4739. {
  4740. errn = rtn;
  4741. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso2_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4742. }
  4743. //STEP 3: ========= Reset V2G MSG Flags ==========
  4744. init_iso2BodyType(&ccs_exi_doc_ISO2->V2G_Message.Body);
  4745. return errn;
  4746. }
  4747. /*===========================================================================
  4748. FUNCTION: Check_din_V2G_Rx_MSG_SessionID
  4749. DESCRIPTION:
  4750. PRE-CONDITION:
  4751. INPUT:
  4752. OUTPUT:
  4753. GLOBAL VARIABLES:
  4754. =============================================================================*/
  4755. int Check_din_V2G_Rx_MSG_SessionID(struct dinEXIDocument *exi_doc_DIN)
  4756. {
  4757. int i = 0;
  4758. int leng = 0;
  4759. int errn = 0;
  4760. leng = exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen;
  4761. //Step 1: Check SessionID Length
  4762. if (leng != 8) //8-byte
  4763. {
  4764. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4765. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4766. errn = -1;
  4767. }
  4768. else
  4769. {
  4770. //Step 2-1: Check SessionID content
  4771. for (i = 0; i < leng; i++)
  4772. {
  4773. if (exi_doc_DIN->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4774. {
  4775. errn = -2;
  4776. break;
  4777. }
  4778. }
  4779. }
  4780. //Step 2-2: Print Incorrect ID
  4781. if (errn == -2) //incorrect ID
  4782. {
  4783. sprintf(buf_log_evcomm,
  4784. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4785. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[0],
  4786. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[1],
  4787. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[2],
  4788. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[3],
  4789. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[4],
  4790. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[5],
  4791. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[6],
  4792. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[7],
  4793. EVCOMM_SYS_INFO.SessionID[0],
  4794. EVCOMM_SYS_INFO.SessionID[1],
  4795. EVCOMM_SYS_INFO.SessionID[2],
  4796. EVCOMM_SYS_INFO.SessionID[3],
  4797. EVCOMM_SYS_INFO.SessionID[4],
  4798. EVCOMM_SYS_INFO.SessionID[5],
  4799. EVCOMM_SYS_INFO.SessionID[6],
  4800. EVCOMM_SYS_INFO.SessionID[7]
  4801. );
  4802. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4803. }
  4804. //Step 3: Correct SessionID for Res Message
  4805. if (errn != 0)
  4806. {
  4807. exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen = 8;
  4808. memset(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, 0, 8);
  4809. memcpy(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4810. }
  4811. return errn;
  4812. }
  4813. /*===========================================================================
  4814. FUNCTION: Check_iso1_V2G_Rx_MSG_SessionID
  4815. DESCRIPTION:
  4816. PRE-CONDITION:
  4817. INPUT:
  4818. OUTPUT:
  4819. GLOBAL VARIABLES:
  4820. =============================================================================*/
  4821. int Check_iso1_V2G_Rx_MSG_SessionID(struct iso1EXIDocument *exi_doc_ISO1)
  4822. {
  4823. int i = 0;
  4824. int leng = 0;
  4825. int errn = 0;
  4826. leng = exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen;
  4827. //Step 1: Check SessionID Length
  4828. if (leng != 8) //8-byte
  4829. {
  4830. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4831. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4832. errn = -1;
  4833. }
  4834. else
  4835. {
  4836. //Step 2-1: Check SessionID content
  4837. for (i = 0; i < leng; i++)
  4838. {
  4839. if (exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4840. {
  4841. errn = -2;
  4842. break;
  4843. }
  4844. }
  4845. }
  4846. //Step 2-2: Print Incorrect ID
  4847. if (errn == -2) //incorrect ID
  4848. {
  4849. sprintf(buf_log_evcomm,
  4850. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4851. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[0],
  4852. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[1],
  4853. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[2],
  4854. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[3],
  4855. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[4],
  4856. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[5],
  4857. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[6],
  4858. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[7],
  4859. EVCOMM_SYS_INFO.SessionID[0],
  4860. EVCOMM_SYS_INFO.SessionID[1],
  4861. EVCOMM_SYS_INFO.SessionID[2],
  4862. EVCOMM_SYS_INFO.SessionID[3],
  4863. EVCOMM_SYS_INFO.SessionID[4],
  4864. EVCOMM_SYS_INFO.SessionID[5],
  4865. EVCOMM_SYS_INFO.SessionID[6],
  4866. EVCOMM_SYS_INFO.SessionID[7]
  4867. );
  4868. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4869. }
  4870. //Step 3: Correct SessionID for Res Message
  4871. if (errn != 0)
  4872. {
  4873. exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen = 8;
  4874. memset(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, 0, 8);
  4875. memcpy(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4876. }
  4877. return errn;
  4878. }
  4879. /*===========================================================================
  4880. FUNCTION: Check_iso2_V2G_Rx_MSG_SessionID
  4881. DESCRIPTION:
  4882. PRE-CONDITION:
  4883. INPUT:
  4884. OUTPUT:
  4885. GLOBAL VARIABLES:
  4886. =============================================================================*/
  4887. int Check_iso2_V2G_Rx_MSG_SessionID(struct iso2EXIDocument *exi_doc_ISO2)
  4888. {
  4889. int i = 0;
  4890. int leng = 0;
  4891. int errn = 0;
  4892. leng = exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen;
  4893. //Step 1: Check SessionID Length
  4894. if (leng != 8) //8-byte
  4895. {
  4896. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4897. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4898. errn = -1;
  4899. }
  4900. else
  4901. {
  4902. //Step 2-1: Check SessionID content
  4903. for (i = 0; i < leng; i++)
  4904. {
  4905. if (exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4906. {
  4907. errn = -2;
  4908. break;
  4909. }
  4910. }
  4911. }
  4912. //Step 2-2: Print Incorrect ID
  4913. if (errn == -2) //incorrect ID
  4914. {
  4915. sprintf(buf_log_evcomm,
  4916. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4917. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[0],
  4918. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[1],
  4919. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[2],
  4920. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[3],
  4921. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[4],
  4922. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[5],
  4923. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[6],
  4924. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[7],
  4925. EVCOMM_SYS_INFO.SessionID[0],
  4926. EVCOMM_SYS_INFO.SessionID[1],
  4927. EVCOMM_SYS_INFO.SessionID[2],
  4928. EVCOMM_SYS_INFO.SessionID[3],
  4929. EVCOMM_SYS_INFO.SessionID[4],
  4930. EVCOMM_SYS_INFO.SessionID[5],
  4931. EVCOMM_SYS_INFO.SessionID[6],
  4932. EVCOMM_SYS_INFO.SessionID[7]
  4933. );
  4934. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4935. }
  4936. //Step 3: Correct SessionID for Res Message
  4937. if (errn != 0)
  4938. {
  4939. exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen = 8;
  4940. memset(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, 0, 8);
  4941. memcpy(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4942. }
  4943. return errn;
  4944. }
  4945. /*===========================================================================
  4946. FUNCTION: GetSchemaID_of_Protocol
  4947. DESCRIPTION:
  4948. 1. Get the SchemaID accroding to the input target
  4949. *V2GT_MSG_PROTOCOL_DIN70121: choose DIN 70121
  4950. *V2GT_MSG_PROTOCOL_ISO15118_2014: choose ISO 15118-2 (ed1)
  4951. *V2GT_MSG_PROTOCOL_ISO15118_2018: choose ISO 15118-20 (ed2)
  4952. *V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY: choose the one with the highest priority
  4953. 2. [To-do] Checking Major and Minor version
  4954. 3. The parsing method will not support those private protocols,
  4955. such as "usr:tesla...," since "tesla" is 5 bytes but "din" and "iso" are 3 bytes.
  4956. 4. [To-do] If the target is selected as DIN," but there is no DIN.
  4957. However, if EV and EVSE all support ISO, how to use ISO instead?
  4958. PRE-CONDITION:
  4959. INPUT:
  4960. 1. target: target protocol
  4961. OUTPUT:
  4962. 1. id: SchemaID of selected protocol by EVSE
  4963. 2. ShmCcsData->CommProtocol (selected protocol)
  4964. 3. SupportedAppProtocol_result
  4965. (1) appHandresponseCodeType_OK_SuccessfulNegotiation = 0,
  4966. (2) appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation = 1,
  4967. (3) appHandresponseCodeType_Failed_NoNegotiation = 2
  4968. GLOBAL VARIABLES:
  4969. 1. ccs_handshake
  4970. 2. ShmCcsData
  4971. =============================================================================*/
  4972. int GetSchemaID_of_Protocol(unsigned char target)
  4973. {
  4974. int i = 0;
  4975. int ii = 0;
  4976. int id = 0;
  4977. unsigned char tmp = 0;
  4978. unsigned char pri = 20; //priority = 1(highest)~20(lowerest)
  4979. char num[10];
  4980. //struct CCS_ProtocolNamespacestructCharacters pro;
  4981. //Choose the 1st protocol as default.
  4982. //id = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  4983. id = -1;
  4984. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4985. for(i = 0; i < CCS_HANDSHAKE_PROTOCOLS.arrayLen; i++)
  4986. {
  4987. //Checking for <ProtocolNamespace>urn:din:70121:2012:MsgDef</ProtocolNamespace>
  4988. //[To-Do] Ignoring the priority from EV and force DIN 70121 as our only option. (for temp)
  4989. //[CAUTION] The parsing method will not support those private protocols, such as "usr:tesla..."
  4990. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[8];
  4991. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[9];
  4992. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[10];
  4993. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[11];
  4994. num[4] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[12];
  4995. num[5] = '\0';
  4996. if (atoi(num) == 70121)
  4997. {
  4998. sprintf(buf_log_evcomm,
  4999. "[GetSchemaID_of_Protocol]supported(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  5000. (i+1),
  5001. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5002. atoi(num),
  5003. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5004. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5005. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5006. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5007. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5008. #ifdef AWCCS
  5009. continue;
  5010. #endif
  5011. if (target == V2GT_MSG_PROTOCOL_DIN70121)
  5012. {
  5013. sprintf(buf_log_evcomm,
  5014. "[GetSchemaID_of_Protocol]selected(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  5015. (i+1),
  5016. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5017. atoi(num),
  5018. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5019. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5020. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5021. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5022. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5023. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == DIN_SPEC_70121_2012_VersionNumberMajor)
  5024. {
  5025. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == DIN_SPEC_70121_2012_VersionNumberMinor)
  5026. {
  5027. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5028. }
  5029. else
  5030. { //[TC_SECC_VTB_SupportedAppProtocol_005]
  5031. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5032. }
  5033. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5034. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  5035. return id;
  5036. }
  5037. else
  5038. {
  5039. //keep looking for the suitable protocol
  5040. }
  5041. }
  5042. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5043. {
  5044. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5045. {
  5046. ii = i;
  5047. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5048. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5049. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  5050. }
  5051. else
  5052. {
  5053. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5054. }
  5055. }
  5056. else
  5057. {
  5058. //null
  5059. }
  5060. }
  5061. else if (atoi(num) == 15118)
  5062. {
  5063. //urn:din:70121:2012:MsgDef
  5064. //urn:iso:15118:2:2013:MsgDef
  5065. memset(num, 0, sizeof(num));
  5066. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[16];
  5067. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[17];
  5068. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[18];
  5069. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[19];
  5070. num[4] = '\0';
  5071. if (atoi(num) < 2018 && atoi(num) >= 2010)
  5072. {
  5073. sprintf(buf_log_evcomm,
  5074. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-2(ed1,%d:v%d.%d;id=%d,pri=%d)",
  5075. (i+1),
  5076. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5077. atoi(num),
  5078. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5079. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5080. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5081. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5082. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5083. if (target == V2GT_MSG_PROTOCOL_ISO15118_2014)
  5084. {
  5085. sprintf(buf_log_evcomm,
  5086. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-2,ed1(%d:v%d.%d;id=%d,pri=%d)",
  5087. (i+1),
  5088. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5089. atoi(num),
  5090. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5091. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5092. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5093. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5094. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5095. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO1_15118_2013_VersionNumberMajor)
  5096. {
  5097. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO1_15118_2013_VersionNumberMinor)
  5098. {
  5099. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5100. }
  5101. else
  5102. {
  5103. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5104. }
  5105. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5106. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  5107. return id;
  5108. }
  5109. else
  5110. {
  5111. //keep looking for the suitable protocol
  5112. }
  5113. }
  5114. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5115. {
  5116. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5117. {
  5118. ii = i;
  5119. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5120. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5121. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  5122. }
  5123. else
  5124. {
  5125. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5126. }
  5127. }
  5128. else
  5129. {
  5130. //null
  5131. }
  5132. }
  5133. else if (atoi(num) >= 2018 && atoi(num) <= 2100) // >= 2018
  5134. {
  5135. sprintf(buf_log_evcomm,
  5136. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-20(ed2,%d:v%d.%d;id=%d,pri=%d)",
  5137. (i+1),
  5138. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5139. atoi(num),
  5140. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5141. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5142. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5143. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5144. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5145. if (target == V2GT_MSG_PROTOCOL_ISO15118_2018)
  5146. {
  5147. sprintf(buf_log_evcomm,
  5148. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-20,ed2(%d:v%d.%d;id=%d,pri=%d)",
  5149. (i+1),
  5150. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5151. atoi(num),
  5152. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5153. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5154. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5155. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5156. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5157. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO2_15118_2018_VersionNumberMajor)
  5158. {
  5159. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO2_15118_2018_VersionNumberMinor)
  5160. {
  5161. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5162. }
  5163. else
  5164. {
  5165. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5166. }
  5167. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5168. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  5169. return id;
  5170. }
  5171. else
  5172. {
  5173. //keep looking for the suitable protocol
  5174. }
  5175. }
  5176. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5177. {
  5178. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5179. {
  5180. ii = i;
  5181. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5182. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5183. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  5184. }
  5185. else
  5186. {
  5187. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5188. }
  5189. }
  5190. else
  5191. {
  5192. //null
  5193. }
  5194. }
  5195. else
  5196. {
  5197. //Unexpected Year
  5198. sprintf(buf_log_evcomm,
  5199. "[GetSchemaID_of_Protocol]unsupported(%d-th/%d): ISO 15118-X(unexpected year:%d,v%d.%d),id=%d,pri=%d",
  5200. (i+1),
  5201. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5202. atoi(num),
  5203. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5204. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5205. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5206. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5207. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5208. //return -1;
  5209. }
  5210. }
  5211. else
  5212. {
  5213. sprintf(buf_log_evcomm,
  5214. "[GetSchemaID_of_Protocol]unsupported protocol(%d-th/%d)(%d:v%d.%d;id=%d,pri=%d)",
  5215. (i+1),
  5216. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5217. atoi(num),
  5218. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5219. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5220. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5221. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5222. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5223. //return -1;
  5224. }
  5225. }
  5226. //The final result of highest priority protocol
  5227. sprintf(buf_log_evcomm,
  5228. "[GetSchemaID_of_Protocol]selected(%d-th/%d): pro=%d(0:DIN,1:ISO1,2:ISO2);id=%d,pri=%d",
  5229. (ii+1),
  5230. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5231. ShmCcsData->CommProtocol,
  5232. id,
  5233. pri);
  5234. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5235. if (id < 0)
  5236. {
  5237. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_Failed_NoNegotiation;
  5238. }
  5239. return id;
  5240. }
  5241. /*===========================================================================
  5242. FUNCTION: Proc_supportedAppProtocolRes
  5243. DESCRIPTION:
  5244. PRE-CONDITION:
  5245. INPUT:
  5246. OUTPUT:
  5247. GLOBAL VARIABLES:
  5248. =============================================================================*/
  5249. int Proc_supportedAppProtocolRes(int AcceptFd)
  5250. {
  5251. int errn = 0;
  5252. bitstream_t v2g_tx_stream;
  5253. static struct ChargingInfoData *sys;
  5254. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5255. //STEP 1: =========== Setting the Response Message ===========
  5256. init_appHandEXIDocument(&ccs_handshake);
  5257. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5258. ccs_handshake.supportedAppProtocolRes_isUsed = 1u;
  5259. //select the 1st one as the default
  5260. ccs_handshake.supportedAppProtocolRes.SchemaID = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  5261. ccs_handshake.supportedAppProtocolRes.SchemaID_isUsed = 1u;
  5262. int id = 0;
  5263. /*+++ 20200808, vern, support both DIN and ISO +++*/
  5264. id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_PREFERENCE); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5265. //id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5266. /*--- 20200808, vern, support both DIN and ISO ---*/
  5267. ccs_handshake.supportedAppProtocolRes.ResponseCode = EVCOMM_SYS_INFO.SupportedAppProtocol_result; //updating the response code
  5268. if (id < 0)
  5269. {
  5270. sprintf(buf_log_evcomm,
  5271. "[Error]No avalible CCS protocol (id = %d, preference = %d)",
  5272. id,
  5273. V2GT_MSG_PROTOCOL_PREFERENCE);
  5274. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5275. }
  5276. else
  5277. {
  5278. //selected SchemaID
  5279. ccs_handshake.supportedAppProtocolRes.SchemaID = (unsigned char) id;
  5280. }
  5281. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  5282. {
  5283. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_supportedAppProtocolRes]EVSE_Shutdown => End_Process");
  5284. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5285. errn = -1;
  5286. }
  5287. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5288. {
  5289. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_supportedAppProtocolRes]EVSE_EmergencyShutdown => End_Process");
  5290. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5291. errn = -1;
  5292. }
  5293. else
  5294. {
  5295. //null
  5296. }
  5297. //Check for Permission Changing from TRUE to FALSE
  5298. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5299. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5300. ShmInternalComm->ChargingPermission == FALSE)
  5301. {
  5302. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][supportedAppProtocolRes]Permission OFF");
  5303. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5304. //errn = -1;
  5305. }
  5306. #if (CP_PROTECTION_MECHANISM == ENABLE)
  5307. {
  5308. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  5309. {
  5310. //Detect for CP State should be 9V with 5% PWM or 100%PWM (State B1, B2)
  5311. if (sys->CpState != 2 && sys->CpState != 3) //State B1, B2
  5312. {
  5313. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5314. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5315. Update_V2G_Flow_Status(Other_Fault);
  5316. sprintf(buf_log_evcomm,
  5317. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5318. sys->CpState,
  5319. sys->CpVoltage);
  5320. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5321. }
  5322. }
  5323. #else
  5324. {
  5325. //Detect for CP State should be 9V (State B)
  5326. if (sys->CpState != 3) //B2
  5327. {
  5328. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5329. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5330. Update_V2G_Flow_Status(Other_Fault);
  5331. sprintf(buf_log_evcomm,
  5332. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5333. sys->CpState,
  5334. sys->CpVoltage);
  5335. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5336. }
  5337. }
  5338. #endif
  5339. }
  5340. #endif
  5341. //STEP 2: =========== Encode into EXI ===========
  5342. if (errn = API_V2GMSG_EXI_Encoder_AppProtocol(&ccs_handshake, &v2g_tx_stream) !=0)
  5343. {
  5344. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Error]API_V2GMSG_EXI_Encoder_AppProtocol\n");
  5345. return errn;
  5346. }
  5347. //STEP 3: =========== Send Response Packet ===========
  5348. int Rtn = 0;
  5349. #ifdef SUPPORT_TLS_CONNECTION
  5350. if(EvSecurity == 0)//support security
  5351. {
  5352. Rtn = SSL_write(ssl, v2g_tx_stream.data, v2g_tx_stream.size);
  5353. }
  5354. else
  5355. {
  5356. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5357. }
  5358. #else
  5359. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5360. #endif
  5361. //Rtn = send(6, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5362. DEBUG_PRINTF_EVCOMM_DETAIL("Send V2GTP Packet Size = %d, Rtn = %d (Bytes, DEC)\n", v2g_tx_stream.size, Rtn);
  5363. if (Rtn < 0)
  5364. {
  5365. return Rtn;
  5366. }
  5367. //STEP 4: =========== Save into Share Memory =========
  5368. //[Joseph, To-Do] Adding a mechanism to choose DIN 70121 as our 1st priority. (for multiple protocols)
  5369. //STEP 5: =========== Updating the Flow State Flag =========
  5370. if (id < 0)
  5371. {
  5372. errn = -1;
  5373. }
  5374. //STEP 6: =========== Reset Flags ============
  5375. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  5376. init_appHandEXIDocument(&ccs_handshake);
  5377. return errn;
  5378. }
  5379. /*===========================================================================
  5380. FUNCTION: Proc_supportedAppProtocolReq
  5381. DESCRIPTION:
  5382. PRE-CONDITION:
  5383. INPUT:
  5384. OUTPUT:
  5385. GLOBAL VARIABLES:
  5386. =============================================================================*/
  5387. int Proc_supportedAppProtocolReq(int AcceptFd)
  5388. {
  5389. //[Joseph, To-Do] analysis on Req message and choose the prefered protocol
  5390. //Default: DIN 70121 (find SchemaID)
  5391. int errn = 0;
  5392. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]supportedAppProtocolReq");
  5393. SHM_Save_din_supportedAppProtocolReq(ShmCcsData, &ccs_handshake, ShmSysConfigAndInfo);
  5394. errn = Proc_supportedAppProtocolRes(AcceptFd);
  5395. if (errn == 0)
  5396. {
  5397. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]supportedAppProtocolRes");
  5398. }
  5399. else
  5400. {
  5401. DEBUG_PRINTF_EVCOMM_DETAIL("[Error]Proc_supportedAppProtocolRes(): %d (DEC)\n", errn);
  5402. }
  5403. return errn;
  5404. }
  5405. /*===========================================================================
  5406. FUNCTION: Proc_din_SessionSetupRes
  5407. DESCRIPTION:
  5408. PRE-CONDITION:
  5409. INPUT:
  5410. OUTPUT:
  5411. GLOBAL VARIABLES:
  5412. =============================================================================*/
  5413. int Proc_din_SessionSetupRes(int AcceptFd)
  5414. {
  5415. int i = 0;
  5416. int errn = 0;
  5417. bitstream_t v2g_tx_stream;
  5418. static struct ChargingInfoData *sys;
  5419. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5420. size_t pos = 0;
  5421. v2g_tx_stream.pos = &pos;
  5422. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5423. v2g_tx_stream.data = V2GTP_Tx_buf;
  5424. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5425. init_dinSessionSetupResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes);
  5426. // ====== [BODY (1/2) ResponseCode ======
  5427. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5428. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_OK_NewSessionEstablished;
  5429. //[HEADER] Assign Res SessionID
  5430. ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytesLen = 8;
  5431. memset(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, 0, 8);
  5432. memcpy(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5433. //Check for SequenceError
  5434. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5435. {
  5436. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError;
  5437. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5438. errn = -1;
  5439. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5440. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5441. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5442. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5443. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5444. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5445. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5446. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5447. }
  5448. //#if PARAMETER_NORMAL_MODE == ENABLE
  5449. //SHM_Read_din_V2GMSG_Header(&ccs_exi_doc_DIN, ShmCcsData);
  5450. //#endif
  5451. //Detect for CP State should be 9V (State B)
  5452. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5453. {
  5454. #if CP_PROTECTION_MECHANISM == ENABLE
  5455. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5456. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5457. Update_V2G_Flow_Status(Other_Fault);
  5458. errn = -1;
  5459. sprintf(buf_log_evcomm,
  5460. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5461. sys->CpState);
  5462. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5463. #else
  5464. sprintf(buf_log_evcomm,
  5465. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5466. sys->CpState);
  5467. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5468. #endif
  5469. }
  5470. //Check for shutdown commands from EVSE(DC Main Board)
  5471. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5472. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5473. {
  5474. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5475. sprintf(buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5476. EVSE_Shutdown,
  5477. EVSE_EmergencyShutdown,
  5478. sys->DC_EVSEStatus);
  5479. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5480. errn = -1;
  5481. }
  5482. else if (sys->DC_EVSEStatus == EVSE_Shutdown/* ||
  5483. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5484. {
  5485. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5486. sprintf(buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5487. EVSE_Shutdown,
  5488. EVSE_EmergencyShutdown,
  5489. sys->DC_EVSEStatus);
  5490. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5491. //errn = -1;
  5492. }
  5493. //Check for Permission Changing from TRUE to FALSE
  5494. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5495. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5496. ShmInternalComm->ChargingPermission == FALSE)
  5497. {
  5498. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][SessionSetupRes]Permission OFF");
  5499. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5500. errn = -1;
  5501. }
  5502. // ====== [BODY (2/3) EVSEID ======
  5503. //EVSEID = all zero
  5504. memset(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes, 0, sizeof(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes));
  5505. //vern, should be encode by SN
  5506. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytesLen = 1; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5507. // ====== [BODY (3/3) DateTimeNow ======
  5508. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow_isUsed = 1u;
  5509. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5510. #if PARAMETER_NORMAL_MODE == ENABLE
  5511. ///////////SHM_Read_din_SessionSetupRes(&ccs_exi_doc_DIN, ShmCcsData);
  5512. #endif
  5513. // ============ Encode and Send Response Message ===========
  5514. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5515. {
  5516. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_SessionSetupRes][Error]Tx encoded msg error");
  5517. errn = -1;
  5518. }
  5519. return errn;
  5520. }
  5521. /*===========================================================================
  5522. FUNCTION: Proc_iso1_SessionSetupRes
  5523. DESCRIPTION:
  5524. PRE-CONDITION:
  5525. INPUT:
  5526. OUTPUT:
  5527. GLOBAL VARIABLES:
  5528. =============================================================================*/
  5529. int Proc_iso1_SessionSetupRes(int AcceptFd)
  5530. {
  5531. int i = 0;
  5532. int errn = 0;
  5533. bitstream_t v2g_tx_stream;
  5534. static struct ChargingInfoData *sys;
  5535. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5536. size_t pos = 0;
  5537. v2g_tx_stream.pos = &pos;
  5538. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5539. v2g_tx_stream.data = V2GTP_Tx_buf;
  5540. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5541. init_iso1SessionSetupResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes);
  5542. // ====== [BODY (1/2) ResponseCode ======
  5543. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5544. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_OK_NewSessionEstablished;
  5545. //[HEADER] Assign Res SessionID
  5546. ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytesLen = 8;
  5547. memset(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, 0, 8);
  5548. memcpy(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5549. //Check for SequenceError
  5550. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5551. {
  5552. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5553. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5554. errn = -1;
  5555. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5556. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5557. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5558. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5559. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5560. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5561. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5562. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5563. }
  5564. //#if PARAMETER_NORMAL_MODE == ENABLE
  5565. //SHM_Read_iso1_V2GMSG_Header(&ccs_exi_doc_ISO1, ShmCcsData);
  5566. //#endif
  5567. //Detect for CP State should be 9V (State B)
  5568. //if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2 //Benz already CP=4
  5569. if ((sys->CpState < 2) ||(sys->CpState > 5)) //State B1, B2 //Benz already CP=4
  5570. {
  5571. #if CP_PROTECTION_MECHANISM == ENABLE
  5572. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5573. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5574. Update_V2G_Flow_Status(Other_Fault);
  5575. errn = -1;
  5576. sprintf(buf_log_evcomm,
  5577. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5578. sys->CpState);
  5579. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5580. #else
  5581. sprintf(buf_log_evcomm,
  5582. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5583. sys->CpState);
  5584. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5585. #endif
  5586. }
  5587. //Check for shutdown commands from EVSE(DC Main Board)
  5588. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5589. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5590. {
  5591. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5592. sprintf(buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5593. EVSE_Shutdown,
  5594. EVSE_EmergencyShutdown,
  5595. sys->DC_EVSEStatus);
  5596. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5597. errn = -1;
  5598. }
  5599. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  5600. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5601. {
  5602. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5603. sprintf(buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5604. EVSE_Shutdown,
  5605. EVSE_EmergencyShutdown,
  5606. sys->DC_EVSEStatus);
  5607. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5608. // errn = -1;
  5609. }
  5610. //Check for Permission Changing from TRUE to FALSE
  5611. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5612. ShmInternalComm->ChargingPermission == FALSE)
  5613. {
  5614. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][SessionSetupRes]Permission OFF");
  5615. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5616. //errn = -1;
  5617. }
  5618. // ====== [BODY (2/3) EVSEID ======
  5619. //EVSEID = all zero
  5620. memset(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5621. /*+++ 20200808, vern, set default EVSEID +++*/
  5622. //vern, should be encoded by SN
  5623. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[0]='Z';
  5624. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[1]='Z';
  5625. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[2]='0';
  5626. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[3]='0';
  5627. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[4]='0';
  5628. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[5]='0';
  5629. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[6]='0';
  5630. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 7; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5631. /*--- 20200808, vern, set default EVSEID ---*/
  5632. // ====== [BODY (3/3) DateTimeNow ======
  5633. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5634. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5635. #if PARAMETER_NORMAL_MODE == ENABLE
  5636. ///////////SHM_Read_iso1_SessionSetupRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5637. #endif
  5638. // ============ Encode and Send Response Message ===========
  5639. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5640. {
  5641. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_SessionSetupRes][Error]Tx encoded msg error");
  5642. errn = -1;
  5643. }
  5644. return errn;
  5645. }
  5646. /*===========================================================================
  5647. FUNCTION: Proc_iso2_SessionSetupRes
  5648. DESCRIPTION:
  5649. PRE-CONDITION:
  5650. INPUT:
  5651. OUTPUT:
  5652. GLOBAL VARIABLES:
  5653. =============================================================================*/
  5654. int Proc_iso2_SessionSetupRes(int AcceptFd)
  5655. {
  5656. int i = 0;
  5657. int errn = 0;
  5658. bitstream_t v2g_tx_stream;
  5659. static struct ChargingInfoData *sys;
  5660. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5661. size_t pos = 0;
  5662. v2g_tx_stream.pos = &pos;
  5663. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5664. v2g_tx_stream.data = V2GTP_Tx_buf;
  5665. init_iso2BodyType(&ccs_exi_doc_ISO2.V2G_Message.Body);
  5666. init_iso2SessionSetupResType(&ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes);
  5667. // ====== [BODY (1/2) ResponseCode ======
  5668. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5669. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_OK_NewSessionEstablished;
  5670. //[HEADER] Assign Res SessionID
  5671. ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytesLen = 8;
  5672. memset(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, 0, 8);
  5673. memcpy(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5674. //Check for SequenceError
  5675. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5676. {
  5677. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5678. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5679. errn = -1;
  5680. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5681. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5682. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5683. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5684. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5685. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5686. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5687. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5688. }
  5689. //#if PARAMETER_NORMAL_MODE == ENABLE
  5690. //SHM_Read_iso2_V2GMSG_Header(&ccs_exi_doc_ISO2, ShmCcsData);
  5691. //#endif
  5692. //Detect for CP State should be 9V (State B)
  5693. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5694. {
  5695. #if CP_PROTECTION_MECHANISM == ENABLE
  5696. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5697. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5698. Update_V2G_Flow_Status(Other_Fault);
  5699. errn = -1;
  5700. sprintf(buf_log_evcomm,
  5701. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d)",
  5702. sys->CpState);
  5703. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5704. #else
  5705. sprintf(buf_log_evcomm,
  5706. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d): ignored",
  5707. sys->CpState);
  5708. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5709. #endif
  5710. }
  5711. //Check for shutdown commands from EVSE(DC Main Board)
  5712. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5713. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5714. {
  5715. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5716. sprintf(buf_log_evcomm, "[Proc_iso2_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5717. EVSE_Shutdown,
  5718. EVSE_EmergencyShutdown,
  5719. sys->DC_EVSEStatus);
  5720. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5721. errn = -1;
  5722. }
  5723. //Check for Permission Changing from TRUE to FALSE
  5724. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5725. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5726. ShmInternalComm->ChargingPermission == FALSE)
  5727. {
  5728. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO2][SessionSetupRes]Permission OFF");
  5729. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5730. errn = -1;
  5731. }
  5732. // ====== [BODY (2/3) EVSEID ======
  5733. //EVSEID = all zero
  5734. memset(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5735. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5736. // ====== [BODY (3/3) DateTimeNow ======
  5737. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5738. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5739. #if PARAMETER_NORMAL_MODE == ENABLE
  5740. ///////////SHM_Read_iso2_SessionSetupRes(&ccs_exi_doc_ISO2, ShmCcsData);
  5741. #endif
  5742. // ============ Encode and Send Response Message ===========
  5743. if (send_encoded_iso2_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO2) != 0)
  5744. {
  5745. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso2_SessionSetupRes][Error]Tx encoded msg error");
  5746. errn = -1;
  5747. }
  5748. return errn;
  5749. }
  5750. /*===========================================================================
  5751. FUNCTION: Proc_din_SessionSetupReq
  5752. DESCRIPTION:
  5753. PRE-CONDITION:
  5754. INPUT:
  5755. OUTPUT:
  5756. GLOBAL VARIABLES:
  5757. 2. ccs_exi_doc_DIN
  5758. =============================================================================*/
  5759. int Proc_din_SessionSetupReq(int AcceptFd)
  5760. {
  5761. int errn = 0;
  5762. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_din_SessionSetupReq]Got SessionSetupReq\n");
  5763. //Print the decoded XML Document
  5764. PRINT_XML_DOC_DIN_SessionSetupReq(&ccs_exi_doc_DIN);
  5765. //Save into Share Memory
  5766. SHM_Save_din_SessionSetupReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5767. errn = Proc_din_SessionSetupRes(AcceptFd);
  5768. if (errn == 0)
  5769. {
  5770. //successfully send response.
  5771. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]SessionSetupRes");
  5772. }
  5773. else
  5774. {
  5775. sprintf(buf_log_evcomm,
  5776. "[Error]Proc_din_SessionSetupRes(): %d (DEC)",
  5777. errn);
  5778. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5779. }
  5780. return errn;
  5781. }
  5782. /*===========================================================================
  5783. FUNCTION: Proc_iso1_SessionSetupReq
  5784. DESCRIPTION:
  5785. PRE-CONDITION:
  5786. INPUT:
  5787. OUTPUT:
  5788. GLOBAL VARIABLES:
  5789. 2. ccs_exi_doc_ISO1
  5790. =============================================================================*/
  5791. int Proc_iso1_SessionSetupReq(int AcceptFd)
  5792. {
  5793. int errn = 0;
  5794. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso1_SessionSetupReq]Got SessionSetupReq\n");
  5795. //Print the decoded XML Document
  5796. PRINT_XML_DOC_ISO1_SessionSetupReq(&ccs_exi_doc_ISO1);
  5797. //Save into Share Memory
  5798. SHM_Save_iso1_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5799. errn = Proc_iso1_SessionSetupRes(AcceptFd);
  5800. if (errn == 0)
  5801. {
  5802. //successfully send response.
  5803. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]SessionSetupRes");
  5804. }
  5805. else
  5806. {
  5807. sprintf(buf_log_evcomm,
  5808. "[Error]Proc_iso1_SessionSetupRes(): %d (DEC)",
  5809. errn);
  5810. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5811. }
  5812. return errn;
  5813. }
  5814. /*===========================================================================
  5815. FUNCTION: Proc_iso2_SessionSetupReq
  5816. DESCRIPTION:
  5817. PRE-CONDITION:
  5818. INPUT:
  5819. OUTPUT:
  5820. GLOBAL VARIABLES:
  5821. 2. ccs_exi_doc_ISO2
  5822. =============================================================================*/
  5823. int Proc_iso2_SessionSetupReq(int AcceptFd)
  5824. {
  5825. int errn = 0;
  5826. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso2_SessionSetupReq]Got SessionSetupReq\n");
  5827. //Print the decoded XML Document
  5828. PRINT_XML_DOC_ISO2_SessionSetupReq(&ccs_exi_doc_ISO2);
  5829. //Save into Share Memory
  5830. SHM_Save_iso2_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO2, ShmSysConfigAndInfo);
  5831. errn = Proc_iso2_SessionSetupRes(AcceptFd);
  5832. if (errn == 0)
  5833. {
  5834. //successfully send response.
  5835. SAVE_SYS_LOG_MSG_EVCOMM("[ISO2][V2G][Tx]SessionSetupRes");
  5836. }
  5837. else
  5838. {
  5839. sprintf(buf_log_evcomm,
  5840. "[Error]Proc_iso2_SessionSetupRes(): %d (DEC)",
  5841. errn);
  5842. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5843. }
  5844. return errn;
  5845. }
  5846. /*===========================================================================
  5847. FUNCTION: Proc_din_ServiceDiscoveryRes
  5848. DESCRIPTION:
  5849. PRE-CONDITION:
  5850. INPUT:
  5851. OUTPUT:
  5852. GLOBAL VARIABLES:
  5853. =============================================================================*/
  5854. int Proc_din_ServiceDiscoveryRes(int AcceptFd)
  5855. {
  5856. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5857. //if it is not the same, the packet should be ignored.
  5858. int i = 0;
  5859. int errn = 0;
  5860. bitstream_t v2g_tx_stream;
  5861. struct ChargingInfoData *sys;
  5862. struct ServiceDiscoveryRequest_DIN70121 *req;
  5863. struct ServiceDiscoveryResponse_DIN70121 *res;
  5864. size_t pos = 0;
  5865. v2g_tx_stream.pos = &pos;
  5866. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5867. v2g_tx_stream.data = V2GTP_Tx_buf;
  5868. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5869. req = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryRequest;
  5870. res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5871. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5872. init_dinServiceDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes);
  5873. //[1/4] Response Code
  5874. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5875. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_OK;
  5876. //[HEADER] Check Req SessionID
  5877. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5878. {
  5879. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5880. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  5881. errn = -1;
  5882. }
  5883. //Check for SequenceError
  5884. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5885. {
  5886. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5887. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5888. errn = -1;
  5889. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5890. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5891. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5892. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5893. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5894. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5895. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5896. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5897. }
  5898. //Detect for CP State should be 9V (State B)
  5899. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5900. {
  5901. #if CP_PROTECTION_MECHANISM == ENABLE
  5902. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5903. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5904. Update_V2G_Flow_Status(Other_Fault);
  5905. errn = -1;
  5906. sprintf(buf_log_evcomm,
  5907. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  5908. sys->CpState);
  5909. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5910. #else
  5911. sprintf(buf_log_evcomm,
  5912. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5913. sys->CpState);
  5914. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5915. #endif
  5916. }
  5917. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  5918. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5919. {
  5920. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5921. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5922. // errn = -1;
  5923. }
  5924. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5925. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5926. {
  5927. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5928. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5929. errn = -1;
  5930. }
  5931. //Check for Permission Changing from TRUE to FALSE
  5932. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5933. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5934. ShmInternalComm->ChargingPermission == FALSE)
  5935. {
  5936. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ServiceDiscoveryRes]Permission OFF");
  5937. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5938. // errn = -1;
  5939. }
  5940. //[2/4] PaymentOptions
  5941. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.arrayLen = 1u;
  5942. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.array[0] = dinpaymentOptionType_ExternalPayment; //1
  5943. //[3/4] Charge Service
  5944. res->ChargeService_DIN70121.Services.ServiceTag.ServiceID = 1;
  5945. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceID = (unsigned short) res->ChargeService_DIN70121.Services.ServiceTag.ServiceID;
  5946. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceCategory = dinserviceCategoryType_EVCharging;
  5947. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5948. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.EnergyTransferType = dinEVSESupportedEnergyTransferType_DC_extended;
  5949. //[4/4] Service List (null, not be uesed for now.)
  5950. //#if PARAMETER_NORMAL_MODE == ENABLE
  5951. ///////////////SHM_Read_din_ServiceDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  5952. //#endif
  5953. // ============ Encode and Send Response Message ===========
  5954. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5955. {
  5956. errn = -1;
  5957. }
  5958. return errn;
  5959. }
  5960. /*===========================================================================
  5961. FUNCTION: Proc_iso1_ServiceDiscoveryRes
  5962. DESCRIPTION:
  5963. PRE-CONDITION:
  5964. INPUT:
  5965. OUTPUT:
  5966. GLOBAL VARIABLES:
  5967. =============================================================================*/
  5968. int Proc_iso1_ServiceDiscoveryRes(int AcceptFd)
  5969. {
  5970. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5971. //if it is not the same, the packet should be ignored.
  5972. int i = 0;
  5973. int errn = 0;
  5974. bitstream_t v2g_tx_stream;
  5975. struct ChargingInfoData *sys;
  5976. struct ServiceDiscoveryRequest_ISO15118_2014 *req;
  5977. struct ServiceDiscoveryResponse_ISO15118_2014 *res;
  5978. size_t pos = 0;
  5979. v2g_tx_stream.pos = &pos;
  5980. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5981. v2g_tx_stream.data = V2GTP_Tx_buf;
  5982. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5983. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryRequest;
  5984. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  5985. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5986. init_iso1ServiceDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes);
  5987. //[1/4] Response Code
  5988. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5989. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_OK;
  5990. //[HEADER] Check Req SessionID
  5991. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  5992. {
  5993. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  5994. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  5995. errn = -1;
  5996. }
  5997. //Check for SequenceError
  5998. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5999. {
  6000. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6001. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6002. errn = -1;
  6003. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6004. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6005. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6006. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6007. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6008. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6009. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6010. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6011. }
  6012. //Detect for CP State should be 9V (State B)
  6013. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6014. {
  6015. #if CP_PROTECTION_MECHANISM == ENABLE
  6016. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6017. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6018. Update_V2G_Flow_Status(Other_Fault);
  6019. errn = -1;
  6020. sprintf(buf_log_evcomm,
  6021. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  6022. sys->CpState);
  6023. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6024. #else
  6025. sprintf(buf_log_evcomm,
  6026. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  6027. sys->CpState);
  6028. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6029. #endif
  6030. }
  6031. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6032. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6033. {
  6034. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6035. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  6036. errn = -1;
  6037. }
  6038. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6039. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6040. {
  6041. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6042. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  6043. // errn = -1;
  6044. }
  6045. //Check for Permission Changing from TRUE to FALSE
  6046. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6047. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6048. ShmInternalComm->ChargingPermission == FALSE)
  6049. {
  6050. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ServiceDiscoveryRes]Permission OFF");
  6051. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6052. // errn = -1;
  6053. }
  6054. //[2/4] PaymentOptionList
  6055. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 1u;
  6056. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = iso1paymentOptionType_ExternalPayment; //1
  6057. #ifdef SUPPORT_ISO15118_PnC
  6058. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 2u;
  6059. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[1] = iso1paymentOptionType_Contract; //0
  6060. #endif
  6061. //[3/4] Charge Service
  6062. res->ChargeService.Services.ServiceID = 1;
  6063. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = (unsigned short) res->ChargeService.Services.ServiceID;
  6064. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1;
  6065. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = strlen("AC_DC_Charging");//AC_Charging
  6066. writeStringToEXIString("AC_DC_Charging", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters);
  6067. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = iso1serviceCategoryType_EVCharging;
  6068. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1;
  6069. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 1u; //[ISO1] max = 6
  6070. switch (ShmCcsData->EnergyTransferMode)
  6071. {
  6072. case DC_extended:
  6073. {
  6074. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  6075. break;
  6076. }
  6077. case AC_single_phase_core:
  6078. {
  6079. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_single_phase_core;
  6080. break;
  6081. }
  6082. case AC_three_phase_core:
  6083. {
  6084. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_three_phase_core;
  6085. break;
  6086. }
  6087. default:
  6088. {
  6089. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  6090. sprintf(buf_log_evcomm,
  6091. "[ISO1][ServiceDiscoveryRes][Warning]unexpected EnergyTransferMode(%d)",
  6092. ShmCcsData->EnergyTransferMode);
  6093. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6094. break;
  6095. }
  6096. }
  6097. //[4/4] Service List
  6098. i=0;
  6099. #ifdef SUPPORT_ISO15118_PnC
  6100. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
  6101. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen=i;
  6102. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceID = 2;
  6103. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName_isUsed = 1;
  6104. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen = strlen("Certificate");
  6105. writeStringToEXIString("Certificate", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters);
  6106. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory = iso1serviceCategoryType_ContractCertificate;
  6107. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].FreeService = 0;
  6108. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen++;
  6109. i++;
  6110. #endif
  6111. #ifdef SUPPORT_ISO15118_VAS
  6112. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
  6113. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen=i;
  6114. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceID = 3;
  6115. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName_isUsed = 1;
  6116. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen = strlen("InternetAccess");
  6117. writeStringToEXIString("InternetAccess", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters);
  6118. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory = iso1serviceCategoryType_Internet;
  6119. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].FreeService = 0;
  6120. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen++;
  6121. i++;
  6122. #endif
  6123. // ============ Encode and Send Response Message ===========
  6124. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6125. {
  6126. errn = -1;
  6127. }
  6128. return errn;
  6129. }
  6130. /*===========================================================================
  6131. FUNCTION: Proc_iso1_ServiceDetailReq
  6132. DESCRIPTION:
  6133. PRE-CONDITION:
  6134. INPUT:
  6135. OUTPUT:
  6136. GLOBAL VARIABLES:
  6137. =============================================================================*/
  6138. int Proc_iso1_ServiceDetailReq(int AcceptFd)
  6139. {
  6140. int errn = 0;
  6141. //Save into Share Memory
  6142. SHM_Save_iso1_ServiceDetailReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6143. errn = Proc_iso1_ServiceDetailRes(AcceptFd);
  6144. if (errn == 0)
  6145. {
  6146. //send response successfully.
  6147. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceDetailRes");
  6148. }
  6149. else
  6150. {
  6151. sprintf(buf_log_evcomm,
  6152. "[Error][SeccComm][Proc_iso1_ServiceDetailReq]Proc_iso1_ServiceDetailRes(): %d (DEC)",
  6153. errn
  6154. );
  6155. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6156. }
  6157. return errn;
  6158. }
  6159. /*===========================================================================
  6160. FUNCTION: Proc_iso1_ServiceDetailRes
  6161. DESCRIPTION:
  6162. PRE-CONDITION:
  6163. INPUT:
  6164. OUTPUT:
  6165. GLOBAL VARIABLES:
  6166. =============================================================================*/
  6167. int Proc_iso1_ServiceDetailRes(int AcceptFd)
  6168. {
  6169. int i = 0;
  6170. int errn = 0;
  6171. bitstream_t v2g_tx_stream;
  6172. struct ChargingInfoData *sys;
  6173. struct ServiceDetailRequest_ISO15118_2014 *req;
  6174. struct ServiceDetailResponse_ISO15118_2014 *res;
  6175. size_t pos = 0;
  6176. v2g_tx_stream.pos = &pos;
  6177. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6178. v2g_tx_stream.data = V2GTP_Tx_buf;
  6179. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6180. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDetailRequest;
  6181. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDetailResponse;
  6182. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6183. init_iso1ServiceDetailResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes);
  6184. //[1/4] Response Code
  6185. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes_isUsed = 1u;
  6186. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_OK;
  6187. //[HEADER] Check Req SessionID
  6188. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6189. {
  6190. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6191. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6192. errn = -1;
  6193. }
  6194. //Check for SequenceError
  6195. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6196. {
  6197. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6198. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6199. errn = -1;
  6200. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6201. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6202. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6203. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6204. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6205. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6206. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6207. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6208. }
  6209. //Detect for CP State should be 9V (State B)
  6210. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6211. {
  6212. #if CP_PROTECTION_MECHANISM == ENABLE
  6213. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6214. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6215. Update_V2G_Flow_Status(Other_Fault);
  6216. errn = -1;
  6217. sprintf(buf_log_evcomm,
  6218. "[ServiceDetailRes]Emergency Stop by CP Error (%d)",
  6219. sys->CpState);
  6220. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6221. #else
  6222. sprintf(buf_log_evcomm,
  6223. "[ServiceDetailRes]Emergency Stop by CP Error (%d): ignored",
  6224. sys->CpState);
  6225. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6226. #endif
  6227. }
  6228. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6229. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6230. {
  6231. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6232. SAVE_SYS_LOG_MSG_EVCOMM("[ServiceDetailRes]shutdown by EVSE");
  6233. errn = -1;
  6234. }
  6235. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6236. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6237. {
  6238. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6239. SAVE_SYS_LOG_MSG_EVCOMM("[ServiceDetailRes]shutdown by EVSE");
  6240. // errn = -1;
  6241. }
  6242. //Check for Permission Changing from TRUE to FALSE
  6243. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6244. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6245. ShmInternalComm->ChargingPermission == FALSE)
  6246. {
  6247. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ServiceDetailRes]Permission OFF");
  6248. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6249. // errn = -1;
  6250. }
  6251. switch (req->ServiceID)
  6252. {
  6253. #ifdef SUPPORT_ISO15118_PnC
  6254. case 2:
  6255. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6256. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1;
  6257. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 2;//Installation(1), Update(2)
  6258. //=============Set ParameterSet===================
  6259. {
  6260. unsigned char ServiceName[16];
  6261. for(int j=0;j<ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen;j++)
  6262. {
  6263. memset(ServiceName,0,sizeof(ServiceName));
  6264. switch (j)
  6265. {
  6266. case 0://ftp with port 20
  6267. strcpy(ServiceName,"Installation");
  6268. break;
  6269. case 1://ftp with port 21
  6270. strcpy(ServiceName,"Update");
  6271. break;
  6272. default:
  6273. break;
  6274. }
  6275. if(strlen(ServiceName)>0)
  6276. {
  6277. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].ParameterSetID=j+1;
  6278. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.arrayLen=1;//Service
  6279. //Name= Protocol
  6280. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.charactersLen= strlen("Service");
  6281. writeStringToEXIString("Service", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.characters);
  6282. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue_isUsed=1;
  6283. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.charactersLen=strlen(ServiceName);
  6284. writeStringToEXIString(ServiceName, ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.characters);
  6285. }
  6286. else
  6287. break;
  6288. }//for
  6289. }
  6290. break;
  6291. #endif
  6292. #ifdef SUPPORT_ISO15118_VAS
  6293. case 3:
  6294. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6295. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1;
  6296. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 4;//ftp(1), ftp(2), http(3), https(4)
  6297. //=============Set ParameterSet===================
  6298. {
  6299. unsigned char ProtocolName[16];
  6300. int ProtocolPort;
  6301. for(int j=0;j<ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen;j++)
  6302. {
  6303. memset(ProtocolName,0,sizeof(ProtocolName));
  6304. switch (j)
  6305. {
  6306. case 0://ftp with port 20
  6307. strcpy(ProtocolName,"ftp");
  6308. ProtocolPort=20;
  6309. break;
  6310. case 1://ftp with port 21
  6311. strcpy(ProtocolName,"ftp");
  6312. ProtocolPort=21;
  6313. break;
  6314. case 2://http with port 80
  6315. strcpy(ProtocolName,"http");
  6316. ProtocolPort=80;
  6317. break;
  6318. case 3://https with port 443
  6319. strcpy(ProtocolName,"https");
  6320. ProtocolPort=443;
  6321. break;
  6322. default:
  6323. break;
  6324. }
  6325. if(strlen(ProtocolName)>0)
  6326. {
  6327. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].ParameterSetID=j+1;
  6328. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.arrayLen=2;//protocol and port
  6329. //Name= Protocol
  6330. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6331. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.characters);
  6332. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue_isUsed=1;
  6333. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.charactersLen=strlen(ProtocolName);
  6334. writeStringToEXIString(ProtocolName, ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.characters);
  6335. //Name= Port
  6336. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].Name.charactersLen= strlen("Port");
  6337. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].Name.characters);
  6338. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].intValue_isUsed=1;
  6339. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].intValue=ProtocolPort;
  6340. }
  6341. else
  6342. break;
  6343. }//for
  6344. }
  6345. /*
  6346. //=============http,ParameterSetID=3===================
  6347. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].ParameterSetID=3;//http
  6348. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.arrayLen=2;//protocol and port
  6349. //Name= Protocol, value= "HTTP"
  6350. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6351. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters);
  6352. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue_isUsed=1;
  6353. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue.charactersLen=strlen("http");
  6354. writeStringToEXIString("http", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue.characters);
  6355. //Name= Port, value= 80
  6356. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.charactersLen= strlen("Port");
  6357. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.characters);
  6358. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].intValue_isUsed=1;
  6359. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].intValue=80;
  6360. //==================https,ParameterSetID=4=====================
  6361. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].ParameterSetID=4;//https
  6362. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.arrayLen=2;//protocol and port
  6363. //Name= Protocol, value= "HTTP"
  6364. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6365. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters);
  6366. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue_isUsed=1;
  6367. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue.charactersLen=strlen("https");
  6368. writeStringToEXIString("https", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue.characters);
  6369. //Name= Port, value= 443
  6370. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].Name.charactersLen= strlen("Port");
  6371. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].Name.characters);
  6372. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].intValue_isUsed=1;
  6373. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].intValue=443;
  6374. */
  6375. break;
  6376. #endif
  6377. default:
  6378. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6379. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 0;
  6380. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_ServiceIDInvalid;
  6381. break;
  6382. }
  6383. // ============ Encode and Send Response Message ===========
  6384. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6385. {
  6386. errn = -1;
  6387. }
  6388. return errn;
  6389. }
  6390. /*===========================================================================
  6391. FUNCTION: Proc_din_ServiceDiscoveryReq
  6392. DESCRIPTION:
  6393. PRE-CONDITION:
  6394. INPUT:
  6395. OUTPUT:
  6396. GLOBAL VARIABLES:
  6397. =============================================================================*/
  6398. int Proc_din_ServiceDiscoveryReq(int AcceptFd)
  6399. {
  6400. int errn = 0;
  6401. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  6402. //Print the decoded XML Document
  6403. PRINT_XML_DOC_DIN_ServiceDiscoveryReq(&ccs_exi_doc_DIN);
  6404. //Save into Share Memory
  6405. SHM_Save_din_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6406. errn = Proc_din_ServiceDiscoveryRes(AcceptFd);
  6407. if (errn == 0)
  6408. {
  6409. //send response successfully.
  6410. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ServiceDiscoveryRes");
  6411. }
  6412. else
  6413. {
  6414. sprintf(buf_log_evcomm,
  6415. "[Error][SeccComm][Proc_din_ServiceDiscoveryReq]Proc_din_ServiceDiscoveryRes(): %d (DEC)",
  6416. errn
  6417. );
  6418. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6419. }
  6420. return errn;
  6421. }
  6422. /*===========================================================================
  6423. FUNCTION: Proc_iso1_ServiceDiscoveryReq
  6424. DESCRIPTION:
  6425. PRE-CONDITION:
  6426. INPUT:
  6427. OUTPUT:
  6428. GLOBAL VARIABLES:
  6429. =============================================================================*/
  6430. int Proc_iso1_ServiceDiscoveryReq(int AcceptFd)
  6431. {
  6432. int errn = 0;
  6433. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  6434. //Print the decoded XML Document
  6435. PRINT_XML_DOC_ISO1_ServiceDiscoveryReq(&ccs_exi_doc_ISO1);
  6436. //Save into Share Memory
  6437. SHM_Save_iso1_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6438. errn = Proc_iso1_ServiceDiscoveryRes(AcceptFd);
  6439. if (errn == 0)
  6440. {
  6441. //send response successfully.
  6442. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceDiscoveryRes");
  6443. }
  6444. else
  6445. {
  6446. sprintf(buf_log_evcomm,
  6447. "[Error][SeccComm][Proc_iso1_ServiceDiscoveryReq]Proc_iso1_ServiceDiscoveryRes(): %d (DEC)",
  6448. errn
  6449. );
  6450. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6451. }
  6452. return errn;
  6453. }
  6454. /*===========================================================================
  6455. FUNCTION: Proc_din_ServiceAndPaymentSelectionRes
  6456. DESCRIPTION:
  6457. PRE-CONDITION:
  6458. INPUT:
  6459. OUTPUT:
  6460. GLOBAL VARIABLES:
  6461. =============================================================================*/
  6462. int Proc_din_ServiceAndPaymentSelectionRes(int AcceptFd)
  6463. {
  6464. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6465. //if it is not the same, the packet should be ignored.
  6466. int i = 0;
  6467. int errn = 0;
  6468. bitstream_t v2g_tx_stream;
  6469. struct ServiceAndPaymentSelectionRequest_DIN70121 *req;
  6470. struct ServiceAndPaymentSelectionResponse_DIN70121 *res;
  6471. struct ServiceDiscoveryResponse_DIN70121 *sd_res;
  6472. struct ChargingInfoData *sys;
  6473. size_t pos = 0;
  6474. v2g_tx_stream.pos = &pos;
  6475. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6476. v2g_tx_stream.data = V2GTP_Tx_buf;
  6477. req = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionRequest;
  6478. res = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionResponse;
  6479. sd_res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  6480. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6481. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6482. init_dinServicePaymentSelectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes);
  6483. //[1/1] Response Code
  6484. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes_isUsed = 1u;
  6485. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_OK;
  6486. //[HEADER] Check Req SessionID
  6487. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6488. {
  6489. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6490. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6491. errn = -1;
  6492. }
  6493. //Check for SequenceError
  6494. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6495. {
  6496. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6497. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6498. errn = -1;
  6499. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6500. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6501. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6502. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6503. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6504. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6505. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6506. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6507. }
  6508. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  6509. if (req->SelectedPaymentOption != dinpaymentOptionType_ExternalPayment) //1
  6510. {
  6511. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_PaymentSelectionInvalid;
  6512. sprintf(buf_log_evcomm,
  6513. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6514. req->SelectedPaymentOption);
  6515. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6516. errn = -1;
  6517. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6518. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6519. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6520. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6521. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6522. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6523. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6524. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6525. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6526. }
  6527. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  6528. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService_DIN70121.Services.ServiceTag.ServiceID)
  6529. {
  6530. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_ServiceSelectionInvalid; //8
  6531. sprintf(buf_log_evcomm,
  6532. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6533. req->SelectedServiceList.SelectedService[0].ServiceID);
  6534. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6535. errn = -1;
  6536. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6537. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6538. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6539. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6540. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6541. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6542. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6543. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6544. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6545. }
  6546. //Detect for CP State should be 9V (State B)
  6547. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6548. {
  6549. #if CP_PROTECTION_MECHANISM == ENABLE
  6550. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6551. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6552. Update_V2G_Flow_Status(Other_Fault);
  6553. errn = -1;
  6554. sprintf(buf_log_evcomm,
  6555. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6556. sys->CpState);
  6557. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6558. #else
  6559. sprintf(buf_log_evcomm,
  6560. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6561. sys->CpState);
  6562. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6563. #endif
  6564. }
  6565. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6566. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6567. {
  6568. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6569. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6570. // errn = -1;
  6571. }
  6572. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6573. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6574. {
  6575. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6576. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6577. errn = -1;
  6578. }
  6579. //Check for Permission Changing from TRUE to FALSE
  6580. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6581. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6582. ShmInternalComm->ChargingPermission == FALSE)
  6583. {
  6584. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ServicePaymentSelectionRes]Permission OFF");
  6585. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6586. //errn = -1;
  6587. }
  6588. // ============ Encode and Send Response Message ===========
  6589. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6590. {
  6591. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6592. errn = -1;
  6593. }
  6594. return errn;
  6595. }
  6596. /*===========================================================================
  6597. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionRes
  6598. DESCRIPTION:
  6599. PRE-CONDITION:
  6600. INPUT:
  6601. OUTPUT:
  6602. GLOBAL VARIABLES:
  6603. =============================================================================*/
  6604. int Proc_iso1_ServiceAndPaymentSelectionRes(int AcceptFd)
  6605. {
  6606. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6607. //if it is not the same, the packet should be ignored.
  6608. int i = 0;
  6609. int errn = 0;
  6610. bitstream_t v2g_tx_stream;
  6611. struct ServiceAndPaymentSelectionRequest_ISO15118_2014 *req;
  6612. struct ServiceAndPaymentSelectionResponse_ISO15118_2014 *res;
  6613. struct ServiceDiscoveryResponse_ISO15118_2014 *sd_res;
  6614. static struct ChargingInfoData *sys;
  6615. size_t pos = 0;
  6616. v2g_tx_stream.pos = &pos;
  6617. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6618. v2g_tx_stream.data = V2GTP_Tx_buf;
  6619. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionRequest;
  6620. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionResponse;
  6621. sd_res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  6622. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6623. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6624. init_iso1PaymentServiceSelectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes);
  6625. //[1/1] Response Code
  6626. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes_isUsed = 1u;
  6627. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_OK;
  6628. //[HEADER] Check Req SessionID
  6629. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6630. {
  6631. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6632. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6633. errn = -1;
  6634. }
  6635. //Check for SequenceError
  6636. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6637. {
  6638. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6639. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6640. errn = -1;
  6641. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6642. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6643. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6644. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6645. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6646. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6647. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6648. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6649. }
  6650. #ifdef SUPPORT_ISO15118_PnC
  6651. if (req->SelectedPaymentOption > iso1paymentOptionType_ExternalPayment) //1
  6652. {
  6653. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  6654. sprintf(buf_log_evcomm,
  6655. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6656. req->SelectedPaymentOption);
  6657. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6658. errn = -1;
  6659. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6660. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6661. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6662. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6663. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6664. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6665. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6666. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6667. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6668. }
  6669. #else
  6670. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  6671. if (req->SelectedPaymentOption != iso1paymentOptionType_ExternalPayment) //1
  6672. {
  6673. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  6674. sprintf(buf_log_evcomm,
  6675. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6676. req->SelectedPaymentOption);
  6677. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6678. errn = -1;
  6679. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6680. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6681. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6682. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6683. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6684. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6685. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6686. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6687. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6688. }
  6689. #endif
  6690. for(i=0;i<req->SelectedServiceList.SelectedServiceLen;i++)
  6691. {
  6692. switch(req->SelectedServiceList.SelectedService[i].ServiceID)
  6693. {
  6694. case 1:
  6695. break;
  6696. case 2:
  6697. #ifndef SUPPORT_ISO15118_PnC
  6698. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6699. sprintf(buf_log_evcomm,
  6700. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6701. req->SelectedServiceList.SelectedService[0].ServiceID);
  6702. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6703. errn = -1;
  6704. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6705. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6706. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6707. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6708. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6709. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6710. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6711. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6712. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6713. #endif
  6714. break;
  6715. case 3:
  6716. #ifndef SUPPORT_ISO15118_VAS
  6717. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6718. sprintf(buf_log_evcomm,
  6719. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6720. req->SelectedServiceList.SelectedService[0].ServiceID);
  6721. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6722. errn = -1;
  6723. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6724. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6725. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6726. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6727. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6728. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6729. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6730. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6731. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6732. #endif
  6733. break;
  6734. default:
  6735. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6736. sprintf(buf_log_evcomm,
  6737. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6738. req->SelectedServiceList.SelectedService[0].ServiceID);
  6739. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6740. errn = -1;
  6741. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6742. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6743. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6744. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6745. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6746. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6747. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6748. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6749. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6750. break;
  6751. }
  6752. }
  6753. //Detect for CP State should be 9V (State B)
  6754. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6755. {
  6756. #if CP_PROTECTION_MECHANISM == ENABLE
  6757. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6758. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6759. Update_V2G_Flow_Status(Other_Fault);
  6760. errn = -1;
  6761. sprintf(buf_log_evcomm,
  6762. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6763. sys->CpState);
  6764. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6765. #else
  6766. sprintf(buf_log_evcomm,
  6767. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6768. sys->CpState);
  6769. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6770. #endif
  6771. }
  6772. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6773. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6774. {
  6775. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6776. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6777. //errn = -1;
  6778. }
  6779. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6780. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6781. {
  6782. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6783. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6784. errn = -1;
  6785. }
  6786. //Check for Permission Changing from TRUE to FALSE
  6787. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6788. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6789. ShmInternalComm->ChargingPermission == FALSE)
  6790. {
  6791. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][PaymentServiceSelectionRes]Permission OFF");
  6792. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6793. // errn = -1;
  6794. }
  6795. // ============ Encode and Send Response Message ===========
  6796. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6797. {
  6798. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6799. errn = -1;
  6800. }
  6801. return errn;
  6802. }
  6803. /*===========================================================================
  6804. FUNCTION: Proc_din_ServiceAndPaymentSelectionReq
  6805. DESCRIPTION:
  6806. PRE-CONDITION:
  6807. INPUT:
  6808. OUTPUT:
  6809. GLOBAL VARIABLES:
  6810. =============================================================================*/
  6811. int Proc_din_ServiceAndPaymentSelectionReq(int AcceptFd)
  6812. {
  6813. int errn = 0;
  6814. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_din_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6815. //Print the decoded XML Document
  6816. PRINT_XML_DOC_DIN_ServiceAndPaymentSelectionReq(&ccs_exi_doc_DIN);
  6817. //Save into Share Memory
  6818. SHM_Save_din_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6819. errn = Proc_din_ServiceAndPaymentSelectionRes(AcceptFd);
  6820. if (errn == 0)
  6821. {
  6822. //send response successfully.
  6823. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ServiceAndPaymentSelectionRes");
  6824. }
  6825. else
  6826. {
  6827. sprintf(buf_log_evcomm,
  6828. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6829. errn);
  6830. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6831. }
  6832. return errn;
  6833. }
  6834. /*===========================================================================
  6835. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionReq
  6836. DESCRIPTION:
  6837. PRE-CONDITION:
  6838. INPUT:
  6839. OUTPUT:
  6840. GLOBAL VARIABLES:
  6841. =============================================================================*/
  6842. int Proc_iso1_ServiceAndPaymentSelectionReq(int AcceptFd)
  6843. {
  6844. int errn = 0;
  6845. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6846. //Print the decoded XML Document
  6847. PRINT_XML_DOC_ISO1_ServiceAndPaymentSelectionReq(&ccs_exi_doc_ISO1);
  6848. //Save into Share Memory
  6849. SHM_Save_iso1_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6850. errn = Proc_iso1_ServiceAndPaymentSelectionRes(AcceptFd);
  6851. if (errn == 0)
  6852. {
  6853. //send response successfully.
  6854. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceAndPaymentSelectionRes");
  6855. }
  6856. else
  6857. {
  6858. sprintf(buf_log_evcomm,
  6859. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6860. errn);
  6861. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6862. }
  6863. return errn;
  6864. }
  6865. /*===========================================================================
  6866. FUNCTION: Proc_din_ContractAuthenticationRes
  6867. DESCRIPTION:
  6868. PRE-CONDITION:
  6869. INPUT:
  6870. OUTPUT:
  6871. GLOBAL VARIABLES:
  6872. =============================================================================*/
  6873. int Proc_din_ContractAuthenticationRes(int AcceptFd)
  6874. {
  6875. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6876. //if it is not the same, the packet should be ignored.
  6877. int i = 0;
  6878. int errn = 0;
  6879. bitstream_t v2g_tx_stream;
  6880. static struct ChargingInfoData *sys;
  6881. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6882. size_t pos = 0;
  6883. v2g_tx_stream.pos = &pos;
  6884. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6885. v2g_tx_stream.data = V2GTP_Tx_buf;
  6886. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6887. init_dinContractAuthenticationResType(&ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes);
  6888. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes_isUsed = 1u;
  6889. //[BODY (1/2)] ResponseCode
  6890. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_OK;
  6891. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6892. //[HEADER] Check Req SessionID
  6893. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6894. {
  6895. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6896. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6897. errn = -1;
  6898. }
  6899. //Check for SequenceError
  6900. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6901. {
  6902. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6903. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6904. errn = -1;
  6905. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6906. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6907. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6908. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6909. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6910. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6911. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6912. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6913. }
  6914. //Detect for CP State should be 9V (State B)
  6915. #if CP_PROTECTION_MECHANISM == ENABLE
  6916. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6917. {
  6918. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6919. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6920. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6921. Update_V2G_Flow_Status(Other_Fault);
  6922. errn = -1;
  6923. sprintf(buf_log_evcomm,
  6924. "[Proc_din_ContractAuthenticationRes]Emergency Stop by CP Error (%d)",
  6925. sys->CpState);
  6926. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6927. }
  6928. #endif
  6929. //Check for CSU command of "Stop by EVSE"
  6930. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6931. {
  6932. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6933. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6934. // errn = -1;
  6935. }
  6936. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6937. {
  6938. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6939. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6940. errn = -1;
  6941. }
  6942. //[BODY (2/2)] EVSEProcessing
  6943. if(ShmInternalComm->ChargingPermission == TRUE)
  6944. {
  6945. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6946. SAVE_SYS_LOG_MSG_EVCOMM("CSU Permission: OK");
  6947. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6948. {
  6949. //Set PWM as 5% (for SLAC first case)
  6950. SAVE_SYS_LOG_MSG_EVCOMM("Set PWM as 5%%");
  6951. SwitchCpStateE(DISABLE);
  6952. OutputCpPwmDuty(5);
  6953. }
  6954. #endif
  6955. }
  6956. //Check for Permission Changing from TRUE to FALSE
  6957. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6958. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6959. ShmInternalComm->ChargingPermission == FALSE)
  6960. {
  6961. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ContractAuthenticationRes]Permission OFF");
  6962. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6963. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6964. // errn = -1;
  6965. }
  6966. #if PARAMETER_NORMAL_MODE == ENABLE
  6967. ////////////SHM_Read_din_ContractAuthenticationRes(&ccs_exi_doc_DIN, ShmCcsData);
  6968. #endif
  6969. // ============ Encode and Send Response Message ===========
  6970. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6971. {
  6972. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6973. errn = -1;
  6974. }
  6975. return errn;
  6976. }
  6977. /*===========================================================================
  6978. FUNCTION: Proc_iso1_AuthorizationRes
  6979. DESCRIPTION:
  6980. PRE-CONDITION:
  6981. INPUT:
  6982. OUTPUT:
  6983. GLOBAL VARIABLES:
  6984. =============================================================================*/
  6985. int Proc_iso1_AuthorizationRes(int AcceptFd)
  6986. {
  6987. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6988. //if it is not the same, the packet should be ignored.
  6989. int i = 0;
  6990. int errn = 0;
  6991. bitstream_t v2g_tx_stream;
  6992. static struct ChargingInfoData *sys;
  6993. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6994. size_t pos = 0;
  6995. v2g_tx_stream.pos = &pos;
  6996. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6997. v2g_tx_stream.data = V2GTP_Tx_buf;
  6998. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6999. init_iso1AuthorizationResType(&ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes);
  7000. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes_isUsed = 1u;
  7001. //[BODY (1/2)] ResponseCode
  7002. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_OK;
  7003. /*+++ 20200808, vern, EVSEProcessing should be waiting for Customer during authrization +++*/
  7004. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction; //0
  7005. /*--- 20200808, vern, should be waiting for Customer during authrization ---*/
  7006. //[HEADER] Check Req SessionID
  7007. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7008. {
  7009. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7010. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7011. errn = -1;
  7012. }
  7013. //Check for SequenceError
  7014. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7015. {
  7016. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7017. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7018. errn = -1;
  7019. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7020. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7021. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7022. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7023. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7024. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7025. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7026. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7027. }
  7028. //Detect for CP State should be 9V (State B)
  7029. #if CP_PROTECTION_MECHANISM == ENABLE
  7030. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  7031. {
  7032. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED;
  7033. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7034. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7035. Update_V2G_Flow_Status(Other_Fault);
  7036. errn = -1;
  7037. sprintf(buf_log_evcomm,
  7038. "[Proc_iso1_AuthorizationRes]Emergency Stop by CP Error (%d)",
  7039. sys->CpState);
  7040. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7041. }
  7042. #endif
  7043. //Check for CSU command of "Stop by EVSE"
  7044. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7045. {
  7046. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7047. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7048. //errn = -1;
  7049. }
  7050. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7051. {
  7052. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7053. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7054. errn = -1;
  7055. }
  7056. //[BODY (2/2)] EVSEProcessing
  7057. //Check for Permission from CSU
  7058. if(ShmInternalComm->ChargingPermission == TRUE)
  7059. {
  7060. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7061. SAVE_SYS_LOG_MSG_EVCOMM("CSU Permission: OK");
  7062. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  7063. {
  7064. //Set PWM as 5% (for SLAC first case)
  7065. SAVE_SYS_LOG_MSG_EVCOMM("Set PWM as 5%%");
  7066. SwitchCpStateE(DISABLE);
  7067. OutputCpPwmDuty(5);
  7068. }
  7069. #endif
  7070. }
  7071. //Check for Permission Changing from TRUE to FALSE
  7072. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  7073. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  7074. ShmInternalComm->ChargingPermission == FALSE)
  7075. {
  7076. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][AuthorizationRes]Permission OFF");
  7077. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7078. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7079. // errn = -1;
  7080. }
  7081. #if PARAMETER_NORMAL_MODE == ENABLE
  7082. ////////////SHM_Read_iso1_AuthorizationRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7083. #endif
  7084. // ============ Encode and Send Response Message ===========
  7085. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7086. {
  7087. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7088. errn = -1;
  7089. }
  7090. return errn;
  7091. }
  7092. /*===========================================================================
  7093. FUNCTION: Proc_din_ContractAuthenticationReq
  7094. DESCRIPTION:
  7095. PRE-CONDITION:
  7096. INPUT:
  7097. OUTPUT:
  7098. GLOBAL VARIABLES:
  7099. =============================================================================*/
  7100. int Proc_din_ContractAuthenticationReq(int AcceptFd)
  7101. {
  7102. int errn = 0;
  7103. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ContractAuthenticationReq]Got Proc_din_ContractAuthenticationReq\n");
  7104. //Print the decoded XML Document
  7105. PRINT_XML_DOC_DIN_ContractAuthenticationReq(&ccs_exi_doc_DIN);
  7106. //Save into Share Memory
  7107. SHM_Save_din_ContractAuthenticationReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7108. errn = Proc_din_ContractAuthenticationRes(AcceptFd);
  7109. if (errn == 0)
  7110. {
  7111. //send response successfully.
  7112. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ContractAuthenticationRes");
  7113. }
  7114. else
  7115. {
  7116. sprintf(buf_log_evcomm,
  7117. "[Error][SeccComm][Proc_din_ContractAuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  7118. errn);
  7119. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7120. }
  7121. return errn;
  7122. }
  7123. /*===========================================================================
  7124. FUNCTION: Proc_iso1_AuthenticationReq
  7125. DESCRIPTION:
  7126. PRE-CONDITION:
  7127. INPUT:
  7128. OUTPUT:
  7129. GLOBAL VARIABLES:
  7130. =============================================================================*/
  7131. int Proc_iso1_AuthenticationReq(int AcceptFd)
  7132. {
  7133. int errn = 0;
  7134. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_AuthenticationReq]Got AuthorizationReq\n");
  7135. //Print the decoded XML Document
  7136. PRINT_XML_DOC_ISO1_AuthorizationReq(&ccs_exi_doc_ISO1);
  7137. //Save into Share Memory
  7138. SHM_Save_iso1_AuthorizationReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7139. errn = Proc_iso1_AuthorizationRes(AcceptFd);
  7140. if (errn == 0)
  7141. {
  7142. //send response successfully.
  7143. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]AuthorizationRes");
  7144. }
  7145. else
  7146. {
  7147. sprintf(buf_log_evcomm,
  7148. "[Error][SeccComm][Proc_iso1_AuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  7149. errn);
  7150. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7151. }
  7152. return errn;
  7153. }
  7154. /*===========================================================================
  7155. FUNCTION: SHM_Init_dinDC_EVSEStatusType
  7156. DESCRIPTION:
  7157. PRE-CONDITION:
  7158. INPUT:
  7159. 1. in
  7160. OUTPUT:
  7161. 2. out
  7162. GLOBAL VARIABLES:
  7163. =============================================================================*/
  7164. void SHM_Init_dinDC_EVSEStatusType(struct DC_EVSEStatusType_DIN70121 *in)
  7165. {
  7166. in->EVSEIsolationStatus = dinisolationLevelType_Valid;
  7167. // dinisolationLevelType_Invalid = 0,
  7168. // dinisolationLevelType_Valid = 1, (default)
  7169. // dinisolationLevelType_Warning = 2,
  7170. // dinisolationLevelType_Fault = 3
  7171. in->EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7172. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7173. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1, (default)
  7174. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7175. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7176. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7177. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7178. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7179. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7180. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7181. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7182. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7183. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7184. in->EVSENotification = dinEVSENotificationType_None;
  7185. // dinEVSENotificationType_None = 0, (default)
  7186. // dinEVSENotificationType_StopCharging = 1,
  7187. // dinEVSENotificationType_ReNegotiation = 2
  7188. }
  7189. /*===========================================================================
  7190. FUNCTION: SHM_Save_dinPhysicalValueType
  7191. DESCRIPTION:
  7192. PRE-CONDITION:
  7193. INPUT:
  7194. OUTPUT:
  7195. GLOBAL VARIABLES:
  7196. =============================================================================*/
  7197. void SHM_Save_dinPhysicalValueType(struct PhysicalValueType_DIN70121 *obj, short value, int multiplier, unsigned char unit)
  7198. {
  7199. obj->Value = value;
  7200. obj->Multiplier = multiplier;
  7201. obj->Unit =unit;
  7202. }
  7203. /*===========================================================================
  7204. FUNCTION: SHM_Init_din_ChargeParameterDiscoveryRes
  7205. DESCRIPTION:
  7206. PRE-CONDITION:
  7207. INPUT:
  7208. 1. shm_ccs
  7209. OUTPUT:
  7210. 2. shm_ccs
  7211. GLOBAL VARIABLES:
  7212. =============================================================================*/
  7213. void SHM_Init_din_ChargeParameterDiscoveryRes(struct CcsData *shm_ccs)
  7214. {
  7215. struct ChargeParameterDiscoveryResponse_DIN70121 *in;
  7216. in = &shm_ccs->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  7217. //----- [BODY (1/5)] ResponseCode -----
  7218. in->ResponseCode = dinresponseCodeType_OK;
  7219. //----- [BODY (2/5)] EVSEProcessing -----
  7220. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  7221. // dinEVSEProcessingType_Finished = 0,
  7222. // dinEVSEProcessingType_Ongoing = 1
  7223. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7224. //be fixed in another function.
  7225. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7226. //ignore, since DIN doesn't support AC
  7227. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7228. struct DC_EVSEChargeParameterType_DIN70121 *in_para;
  7229. in_para = &in->DC_EVSEChargeParameter;
  7230. //DC_EVSEStatus
  7231. SHM_Init_dinDC_EVSEStatusType(&in_para->DC_EVSEStatus);
  7232. in_para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7233. short value = 0; int multiplier = 0; unsigned char unit = 0;
  7234. //EVSEMaximumCurrentLimit
  7235. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  7236. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumCurrentLimit, value, multiplier, unit);
  7237. //EVSEMaximumPowerLimit
  7238. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  7239. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumPowerLimit, value, multiplier, unit);
  7240. //EVSEMaximumVoltageLimit
  7241. value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  7242. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumVoltageLimit, value, multiplier, unit);
  7243. //EVSEMinimumVoltageLimit
  7244. value = 1500; multiplier = -1; unit = V_DIN70121; //150V
  7245. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumVoltageLimit, value, multiplier, unit);
  7246. //EVSEMinimumCurrentLimit
  7247. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  7248. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumCurrentLimit, value, multiplier, unit);
  7249. //EVSECurrentRegulationTolerance
  7250. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  7251. SHM_Save_dinPhysicalValueType(&in_para->EVSECurrentRegulationTolerance, value, multiplier, unit);
  7252. //EVSEPeakCurrentRipple
  7253. value = 2; multiplier = -1; unit = A_DIN70121; //0.2A
  7254. SHM_Save_dinPhysicalValueType(&in_para->EVSEPeakCurrentRipple, value, multiplier, unit);
  7255. //EVSEEnergyToBeDelivered (optional)
  7256. //SHM_Save_dinPhysicalValueType(&out_para->EVSEEnergyToBeDelivered, &in_para->EVSEEnergyToBeDelivered);
  7257. }
  7258. /*===========================================================================
  7259. FUNCTION: Sudo_Parameter_din_ChargeParameterDiscoveryRes
  7260. DESCRIPTION:
  7261. PRE-CONDITION:
  7262. INPUT:
  7263. OUTPUT:
  7264. GLOBAL VARIABLES:
  7265. =============================================================================*/
  7266. void Sudo_Parameter_din_ChargeParameterDiscoveryRes()
  7267. {
  7268. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7269. init_dinChargeParameterDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes);
  7270. ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  7271. //----- [BODY (1/5)] ResponseCode -----
  7272. struct dinChargeParameterDiscoveryResType *res;
  7273. res = &ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes;
  7274. res->ResponseCode = dinresponseCodeType_OK;
  7275. //----- [BODY (2/5)] EVSEProcessing -----
  7276. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  7277. // dinEVSEProcessingType_Finished = 0,
  7278. // dinEVSEProcessingType_Ongoing = 1
  7279. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7280. res->SAScheduleList_isUsed = 1u;
  7281. struct dinSAScheduleListType *list;
  7282. list = &res->SAScheduleList;
  7283. //
  7284. list->SAScheduleTuple.arrayLen = 1;
  7285. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  7286. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleID = 0;
  7287. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  7288. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  7289. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  7290. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  7291. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  7292. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  7293. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  7294. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  7295. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  7296. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7297. //ignore, since DIN doesn't support AC
  7298. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7299. res->DC_EVSEChargeParameter_isUsed = 1u;
  7300. struct dinDC_EVSEChargeParameterType *para;
  7301. para = &res->DC_EVSEChargeParameter;
  7302. //DC_EVSEStatus
  7303. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7304. para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7305. // dinisolationLevelType_Invalid = 0,
  7306. // dinisolationLevelType_Valid = 1,
  7307. // dinisolationLevelType_Warning = 2,
  7308. // dinisolationLevelType_Fault = 3
  7309. para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7310. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7311. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7312. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7313. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7314. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7315. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7316. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7317. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7318. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7319. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7320. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7321. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7322. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7323. para->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  7324. // dinEVSENotificationType_None = 0,
  7325. // dinEVSENotificationType_StopCharging = 1,
  7326. // dinEVSENotificationType_ReNegotiation = 2
  7327. //EVSEMaximumCurrentLimit
  7328. para->EVSEMaximumCurrentLimit.Value = 2400;
  7329. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  7330. para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  7331. para->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  7332. // dinunitSymbolType_h = 0,
  7333. // dinunitSymbolType_m = 1,
  7334. // dinunitSymbolType_s = 2,
  7335. // dinunitSymbolType_A = 3,
  7336. // dinunitSymbolType_Ah = 4,
  7337. // dinunitSymbolType_V = 5,
  7338. // dinunitSymbolType_VA = 6,
  7339. // dinunitSymbolType_W = 7,
  7340. // dinunitSymbolType_W_s = 8,
  7341. // dinunitSymbolType_Wh = 9
  7342. //EVSEMaximumPowerLimit
  7343. para->EVSEMaximumPowerLimit.Value = 6000;
  7344. para->EVSEMaximumPowerLimit.Multiplier = 1;
  7345. para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  7346. para->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  7347. //EVSEMaximumVoltageLimit
  7348. para->EVSEMaximumVoltageLimit.Value = 7500;
  7349. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  7350. para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  7351. para->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  7352. //EVSEMinimumVoltageLimit
  7353. para->EVSEMinimumVoltageLimit.Value = 1500;
  7354. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  7355. para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  7356. para->EVSEMinimumVoltageLimit.Unit = dinunitSymbolType_V;
  7357. //EVSEMinimumCurrentLimit
  7358. para->EVSEMinimumCurrentLimit.Value = 20;
  7359. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  7360. para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  7361. para->EVSEMinimumCurrentLimit.Unit = dinunitSymbolType_A;
  7362. //EVSECurrentRegulationTolerance_isUsed
  7363. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  7364. //EVSECurrentRegulationTolerance
  7365. para->EVSECurrentRegulationTolerance.Value = 10;
  7366. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  7367. para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  7368. para->EVSECurrentRegulationTolerance.Unit = dinunitSymbolType_A;
  7369. //EVSEEnergyToBeDelivered_isUsed
  7370. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  7371. //EVSEPeakCurrentRipple
  7372. para->EVSEPeakCurrentRipple.Value = 2;
  7373. para->EVSEPeakCurrentRipple.Multiplier = -1;
  7374. para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  7375. para->EVSEPeakCurrentRipple.Unit = dinunitSymbolType_A;
  7376. //EVSEEnergyToBeDelivered (optional)
  7377. /*
  7378. para->EVSEEnergyToBeDelivered.Value = 360;
  7379. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  7380. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  7381. para->EVSEEnergyToBeDelivered.Unit = dinunitSymbolType_Wh;
  7382. */
  7383. }
  7384. /*===========================================================================
  7385. FUNCTION: Sudo_Parameter_iso1_ChargeParameterDiscoveryRes
  7386. DESCRIPTION:
  7387. PRE-CONDITION:
  7388. INPUT:
  7389. OUTPUT:
  7390. GLOBAL VARIABLES:
  7391. =============================================================================*/
  7392. void Sudo_Parameter_iso1_ChargeParameterDiscoveryRes()
  7393. {
  7394. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  7395. init_iso1ChargeParameterDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes);
  7396. ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  7397. //----- [BODY (1/5)] ResponseCode -----
  7398. struct iso1ChargeParameterDiscoveryResType *res;
  7399. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes;
  7400. res->ResponseCode = iso1responseCodeType_OK;
  7401. //----- [BODY (2/5)] EVSEProcessing -----
  7402. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7403. // iso1EVSEProcessingType_Finished = 0,
  7404. // iso1EVSEProcessingType_Ongoing = 1
  7405. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7406. res->SAScheduleList_isUsed = 1u;
  7407. struct iso1SAScheduleListType *list;
  7408. list = &res->SAScheduleList;
  7409. //
  7410. list->SAScheduleTuple.arrayLen = 1;
  7411. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  7412. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  7413. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  7414. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  7415. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  7416. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  7417. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  7418. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  7419. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  7420. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  7421. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7422. //ignore, since our ISO1 doesn't support AC, yet
  7423. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7424. res->DC_EVSEChargeParameter_isUsed = 1u;
  7425. struct iso1DC_EVSEChargeParameterType *para;
  7426. para = &res->DC_EVSEChargeParameter;
  7427. //DC_EVSEStatus
  7428. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7429. para->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7430. // iso1isolationLevelType_Invalid = 0,
  7431. // iso1isolationLevelType_Valid = 1,
  7432. // iso1isolationLevelType_Warning = 2,
  7433. // iso1isolationLevelType_Fault = 3
  7434. para->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7435. // iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7436. // iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  7437. // iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7438. // iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7439. // iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7440. // iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7441. // iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7442. // iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  7443. // iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  7444. // iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  7445. // iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  7446. // iso1DC_EVSEStatusCodeType_Reserved_C = 11
  7447. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7448. para->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  7449. // iso1EVSENotificationType_None = 0,
  7450. // iso1EVSENotificationType_StopCharging = 1,
  7451. // iso1EVSENotificationType_ReNegotiation = 2
  7452. //EVSEMaximumCurrentLimit
  7453. para->EVSEMaximumCurrentLimit.Value = 2400;
  7454. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  7455. //para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  7456. para->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  7457. //iso1unitSymbolType_h = 0,
  7458. //iso1unitSymbolType_m = 1,
  7459. //iso1unitSymbolType_s = 2,
  7460. //iso1unitSymbolType_A = 3,
  7461. //iso1unitSymbolType_V = 4,
  7462. //iso1unitSymbolType_W = 5,
  7463. //iso1unitSymbolType_Wh = 6
  7464. //EVSEMaximumPowerLimit
  7465. para->EVSEMaximumPowerLimit.Value = 6000;
  7466. para->EVSEMaximumPowerLimit.Multiplier = 1;
  7467. //para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  7468. para->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  7469. //EVSEMaximumVoltageLimit
  7470. para->EVSEMaximumVoltageLimit.Value = 7500;
  7471. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  7472. //para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  7473. para->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  7474. //EVSEMinimumVoltageLimit
  7475. para->EVSEMinimumVoltageLimit.Value = 1500;
  7476. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  7477. //para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  7478. para->EVSEMinimumVoltageLimit.Unit = iso1unitSymbolType_V;
  7479. //EVSEMinimumCurrentLimit
  7480. para->EVSEMinimumCurrentLimit.Value = 20;
  7481. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  7482. //para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  7483. para->EVSEMinimumCurrentLimit.Unit = iso1unitSymbolType_A;
  7484. //EVSECurrentRegulationTolerance_isUsed
  7485. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  7486. //EVSECurrentRegulationTolerance
  7487. para->EVSECurrentRegulationTolerance.Value = 10;
  7488. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  7489. //para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  7490. para->EVSECurrentRegulationTolerance.Unit = iso1unitSymbolType_A;
  7491. //EVSEEnergyToBeDelivered_isUsed
  7492. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  7493. //EVSEPeakCurrentRipple
  7494. para->EVSEPeakCurrentRipple.Value = 2;
  7495. para->EVSEPeakCurrentRipple.Multiplier = -1;
  7496. //para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  7497. para->EVSEPeakCurrentRipple.Unit = iso1unitSymbolType_A;
  7498. //EVSEEnergyToBeDelivered (optional)
  7499. /*
  7500. para->EVSEEnergyToBeDelivered.Value = 360;
  7501. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  7502. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  7503. para->EVSEEnergyToBeDelivered.Unit = iso1unitSymbolType_Wh;
  7504. */
  7505. }
  7506. /*===========================================================================
  7507. FUNCTION: Proc_din_ChargeParameterDiscoveryRes
  7508. DESCRIPTION:
  7509. PRE-CONDITION:
  7510. INPUT:
  7511. OUTPUT:
  7512. GLOBAL VARIABLES:
  7513. =============================================================================*/
  7514. int Proc_din_ChargeParameterDiscoveryRes(int AcceptFd)
  7515. {
  7516. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7517. //if it is not the same, the packet should be ignored.
  7518. //STEP 1: ============ Initialize ============
  7519. int errn = 0;
  7520. bitstream_t v2g_tx_stream;
  7521. struct ChargeParameterDiscoveryResponse_DIN70121 *res;
  7522. struct ChargeParameterDiscoveryRequest_DIN70121 *req;
  7523. struct DC_EVSEChargeParameterType_DIN70121 *dc_para;
  7524. struct ChargingInfoData *sys;
  7525. size_t pos = 0;
  7526. v2g_tx_stream.pos = &pos;
  7527. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7528. v2g_tx_stream.data = V2GTP_Tx_buf;
  7529. res = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  7530. req = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest;
  7531. dc_para = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  7532. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7533. res->ResponseCode = OK_DIN70121;
  7534. res->EVSEProcessing = Ongoing_DIN70121;
  7535. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready; //1
  7536. //[HEADER] Check Req SessionID
  7537. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  7538. {
  7539. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  7540. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7541. errn = -1;
  7542. }
  7543. //Check for SequenceError
  7544. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7545. {
  7546. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  7547. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7548. errn = -1;
  7549. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7550. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7551. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7552. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7553. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7554. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7555. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7556. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7557. }
  7558. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  7559. if ( (sys->EvBatteryMaxCurrent < 0) ||
  7560. (sys->EvBatteryMaxVoltage<150)
  7561. )
  7562. {
  7563. sprintf(buf_log_evcomm,
  7564. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  7565. sys->EvBatteryMaxCurrent);
  7566. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7567. res->ResponseCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  7568. res->EVSEProcessing = Finished_DIN70121;
  7569. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7570. errn = -1;
  7571. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7572. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  7573. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7574. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7575. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7576. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7577. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7578. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  7579. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7580. }
  7581. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  7582. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  7583. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  7584. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  7585. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumVoltageLimit, 1500, V_DIN70121); //150V
  7586. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumCurrentLimit, MIN_SUPPORTED_CURRENT*10, A_DIN70121); //1A
  7587. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSECurrentRegulationTolerance, 10, A_DIN70121); //1A
  7588. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEPeakCurrentRipple, 2, A_DIN70121); //0.2A
  7589. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEEnergyToBeDelivered, 0, WH_DIN70121); //optional
  7590. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  7591. if (sys->EvBatteryMaxVoltage <= 500)
  7592. {
  7593. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  7594. }
  7595. #endif
  7596. //for test with Tesla Model 3, 10A
  7597. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_DIN70121); //10A, for testing with Tesla Model 3
  7598. //Check for EnergyTransferMode [TC_SECC_VTB_ChargeParameterDiscovery_004]
  7599. if (req->EVRequestedEnergyTransferType != dinEVSESupportedEnergyTransferType_DC_extended)
  7600. {
  7601. sprintf(buf_log_evcomm,
  7602. "[ERROR]Wrong EVRequestedEnergyTransferType(%d,%d)",
  7603. req->EVRequestedEnergyTransferType,
  7604. dinEVSESupportedEnergyTransferType_DC_extended);
  7605. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7606. res->ResponseCode = FAILED_WrongEnergyTransferType_DIN70121;
  7607. res->EVSEProcessing = Finished_DIN70121;
  7608. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7609. errn = -1;
  7610. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7611. Update_V2G_Flow_Status(Other_Fault);
  7612. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7613. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  7614. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7615. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7616. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7617. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7618. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7619. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  7620. }
  7621. //Check for CSU command of "Stop by EVSE"
  7622. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7623. {
  7624. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7625. res->ResponseCode = FAILED_DIN70121;
  7626. res->EVSEProcessing = Finished_DIN70121;
  7627. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7628. // errn = -1;
  7629. }
  7630. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7631. {
  7632. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7633. res->ResponseCode = FAILED_DIN70121;
  7634. res->EVSEProcessing = Finished_DIN70121;
  7635. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7636. errn = -1;
  7637. }
  7638. //Detect for CP State should be 9V (State B)
  7639. #if CP_PROTECTION_MECHANISM == ENABLE
  7640. if (sys->CpState != 3) //State B1, B2
  7641. {
  7642. res->ResponseCode = FAILED_DIN70121;
  7643. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7644. res->EVSEProcessing = Finished_DIN70121;
  7645. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7646. Update_V2G_Flow_Status(Other_Fault);
  7647. errn = -1;
  7648. sprintf(buf_log_evcomm,
  7649. "[Proc_din_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7650. sys->CpState,
  7651. sys->CpVoltage);
  7652. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7653. }
  7654. #endif
  7655. //Check for Permission from CSU
  7656. if (ShmInternalComm->ChargingPermission == TRUE)
  7657. {
  7658. res->EVSEProcessing = Finished_DIN70121;
  7659. }
  7660. //Check for Permission Off
  7661. if (ShmInternalComm->ChargingPermission == FALSE)
  7662. {
  7663. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ChargeParameterDiscoveryRes]Permission OFF");
  7664. res->ResponseCode = FAILED_DIN70121;
  7665. res->EVSEProcessing = Finished_DIN70121;
  7666. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7667. // errn = -1;
  7668. }
  7669. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7670. #if PARAMETER_NORMAL_MODE == ENABLE
  7671. SHM_Read_din_ChargeParameterDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  7672. #else
  7673. Sudo_Parameter_din_ChargeParameterDiscoveryRes();
  7674. #endif
  7675. //STEP 4: ============ Encode and Send Response Message ===========
  7676. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  7677. {
  7678. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7679. errn = -1;
  7680. }
  7681. //STPE 5: ============ Update Flags ============
  7682. return errn;
  7683. }
  7684. /*===========================================================================
  7685. FUNCTION: Proc_iso1_ChargeParameterDiscoveryRes
  7686. DESCRIPTION:
  7687. PRE-CONDITION:
  7688. INPUT:
  7689. OUTPUT:
  7690. GLOBAL VARIABLES:
  7691. =============================================================================*/
  7692. int Proc_iso1_ChargeParameterDiscoveryRes(int AcceptFd)
  7693. {
  7694. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7695. //if it is not the same, the packet should be ignored.
  7696. //STEP 1: ============ Initialize ============
  7697. int errn = 0;
  7698. bitstream_t v2g_tx_stream;
  7699. struct ChargeParameterDiscoveryResponse_ISO15118_2014 *res;
  7700. struct ChargeParameterDiscoveryRequest_ISO15118_2014 *req;
  7701. struct DC_EVSEChargeParameterType_ISO15118_2014 *dc_para;
  7702. struct AC_EVSEChargeParameterType_ISO15118_2014 *ac_para;
  7703. struct ChargingInfoData *sys;
  7704. size_t pos = 0;
  7705. v2g_tx_stream.pos = &pos;
  7706. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7707. v2g_tx_stream.data = V2GTP_Tx_buf;
  7708. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse;
  7709. req = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest;
  7710. dc_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  7711. ac_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.AC_EVSEChargeParameter;
  7712. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7713. res->ResponseCode = OK_ISO15118_2014;
  7714. /*+++ 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery +++*/
  7715. res->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7716. /*--- 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery ---*/
  7717. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; //1
  7718. ac_para->AC_EVSEStatus.RCD = ShmInternalComm->AC_RcdStatus; //0:no error, 1:error
  7719. ac_para->AC_EVSEStatus.NotificationMaxDelay = 0; //unit: 1s
  7720. ac_para->AC_EVSEStatus.EVSENotification = ShmInternalComm->AC_EVSENotification; //0:none, 1:StopCharging, 2:RenNgotiation
  7721. //[HEADER] Check Req SessionID
  7722. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7723. {
  7724. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7725. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7726. errn = -1;
  7727. }
  7728. //Check for SequenceError
  7729. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7730. {
  7731. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7732. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7733. errn = -1;
  7734. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7735. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7736. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7737. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7738. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7739. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7740. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7741. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7742. }
  7743. /* printf("req->RequestedEnergyTransferMode=%d\n",req->RequestedEnergyTransferMode);
  7744. printf("req->AC_EVChargeParameter.DepartureTime=%d\n",req->AC_EVChargeParameter.DepartureTime);
  7745. printf("req->AC_EVChargeParameter.EAmount.Multiplier=%d\n",req->AC_EVChargeParameter.EAmount.Multiplier);
  7746. printf("req->AC_EVChargeParameter.EAmount.Unit=%d\n",req->AC_EVChargeParameter.EAmount.Unit);
  7747. printf("req->AC_EVChargeParameter.EAmount.Value=%d\n",req->AC_EVChargeParameter.EAmount.Value);
  7748. printf("req->AC_EVChargeParameter.EVMaxVoltage.Multiplier=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Multiplier);
  7749. printf("req->AC_EVChargeParameter.EVMaxVoltage.Unit=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Unit);
  7750. printf("req->AC_EVChargeParameter.EVMaxVoltage.Value=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Value);
  7751. printf("req->AC_EVChargeParameter.EVMaxCurrent.Multiplier=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Multiplier);
  7752. printf("req->AC_EVChargeParameter.EVMaxCurrent.Unit=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Unit);
  7753. printf("req->AC_EVChargeParameter.EVMaxCurrent.Value=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Value);
  7754. printf("req->AC_EVChargeParameter.EVMinCurrent.Multiplier=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Multiplier);
  7755. printf("req->AC_EVChargeParameter.EVMinCurrent.Unit=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Unit);
  7756. printf("req->AC_EVChargeParameter.EVMinCurrent.Value=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Value);*/
  7757. if(req->RequestedEnergyTransferMode <= 1)//0 for 1P, 1 for 3P
  7758. {
  7759. //AC parameters
  7760. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]AC charging");
  7761. //AC
  7762. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSENominalVoltage, (int) (sys->AC_EVSENominalVoltage * 10), V_ISO15118_2014);
  7763. //SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7764. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (ShmInternalComm->AC_EVSEMaxCurrent * 10), A_ISO15118_2014);
  7765. }
  7766. else
  7767. {
  7768. //DC parameters
  7769. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]DC charging");
  7770. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  7771. /*+++ 20200808, vern, should check the voltage and current to see if the range of battery parameter is accepted by charger ---*/
  7772. if ((sys->EvBatteryMaxCurrent < 0) ||(sys->EvBatteryMaxVoltage<150))
  7773. {
  7774. sprintf(buf_log_evcomm,
  7775. "[ERROR]EvBatteryMaxCurrent/MaxVolatge is mismatch(current=%.02f, voltage=%.02f) => End_Process",
  7776. sys->EvBatteryMaxCurrent,sys->EvBatteryMaxVoltage);
  7777. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7778. res->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  7779. res->EVSEProcessing = Finished_ISO15118_2014;
  7780. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7781. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7782. errn = -1;
  7783. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7784. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  7785. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7786. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7787. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7788. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7789. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7790. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  7791. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7792. }
  7793. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  7794. //DC
  7795. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  7796. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7797. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  7798. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumVoltageLimit, 1500, V_ISO15118_2014); //150V
  7799. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumCurrentLimit, MIN_SUPPORTED_CURRENT*10, A_ISO15118_2014); //1A
  7800. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSECurrentRegulationTolerance, 10, A_ISO15118_2014); //1A
  7801. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEPeakCurrentRipple, 2, A_ISO15118_2014); //0.2A
  7802. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEEnergyToBeDelivered, 0, Wh_ISO15118_2014); //optional
  7803. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  7804. if (sys->EvBatteryMaxVoltage <= 500)
  7805. {
  7806. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  7807. }
  7808. #endif
  7809. //Check for CSU command of "Stop by EVSE"
  7810. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7811. {
  7812. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7813. res->ResponseCode = FAILED_ISO15118_2014;
  7814. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7815. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7816. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7817. // errn = -1;
  7818. }
  7819. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7820. {
  7821. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7822. res->ResponseCode = FAILED_ISO15118_2014;
  7823. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7824. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7825. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7826. errn = -1;
  7827. }
  7828. //Detect for CP State should be 9V (State B)
  7829. #if CP_PROTECTION_MECHANISM == ENABLE
  7830. if (sys->CpState != 3) //State B1, B2
  7831. {
  7832. res->ResponseCode = FAILED_ISO15118_2014;
  7833. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7834. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7835. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7836. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7837. Update_V2G_Flow_Status(Other_Fault);
  7838. errn = -1;
  7839. sprintf(buf_log_evcomm,
  7840. "[Proc_iso1_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7841. sys->CpState,
  7842. sys->CpVoltage);
  7843. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7844. }
  7845. #endif
  7846. }
  7847. //for test with Tesla Model 3, 10A
  7848. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_ISO15118_2014); //10A, for testing with Tesla Model 3
  7849. //Check for EnergyTransferMode
  7850. if (req->RequestedEnergyTransferMode != ShmCcsData->EnergyTransferMode) //[CAUTION] Their table should be kept as the same.
  7851. {
  7852. sprintf(buf_log_evcomm,
  7853. "[ERROR]Unmatched RequestedEnergyTransferMode(%d,%d)",
  7854. req->RequestedEnergyTransferMode,
  7855. ShmCcsData->EnergyTransferMode);
  7856. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7857. res->ResponseCode = FAILED_WrongEnergyTransferMode_ISO15118_2014;
  7858. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7859. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7860. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7861. errn = -1;
  7862. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7863. Update_V2G_Flow_Status(Other_Fault);
  7864. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7865. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  7866. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7867. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7868. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7869. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7870. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7871. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  7872. }
  7873. //Check for Permission from CSU
  7874. if(ShmInternalComm->ChargingPermission == TRUE)
  7875. {
  7876. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7877. }
  7878. //Check for Permission Off
  7879. if (ShmInternalComm->ChargingPermission == FALSE)
  7880. {
  7881. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ChargeParameterDiscoveryRes]Permission OFF");
  7882. res->ResponseCode = FAILED_ISO15118_2014;
  7883. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7884. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7885. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7886. // errn = -1;
  7887. }
  7888. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7889. #if PARAMETER_NORMAL_MODE == ENABLE
  7890. SHM_Read_iso1_ChargeParameterDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7891. #else
  7892. Sudo_Parameter_iso1_ChargeParameterDiscoveryRes();
  7893. #endif
  7894. //STEP 4: ============ Encode and Send Response Message ===========
  7895. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7896. {
  7897. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7898. errn = -1;
  7899. }
  7900. //STPE 5: ============ Update Flags ============
  7901. return errn;
  7902. }
  7903. /*===========================================================================
  7904. FUNCTION: Proc_din_ChargeParameterDiscoveryReq
  7905. DESCRIPTION:
  7906. PRE-CONDITION:
  7907. INPUT:
  7908. OUTPUT:
  7909. GLOBAL VARIABLES:
  7910. =============================================================================*/
  7911. int Proc_din_ChargeParameterDiscoveryReq(int AcceptFd)
  7912. {
  7913. int errn = 0;
  7914. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7915. //ftime(&SeqStartTime);
  7916. //Print the decoded XML Document
  7917. PRINT_XML_DOC_DIN_ChargeParameterDiscoveryReq(&ccs_exi_doc_DIN);
  7918. //Save into Share Memory
  7919. SHM_Save_din_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7920. //Check for EV Error Code
  7921. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7922. errn = Proc_din_ChargeParameterDiscoveryRes(AcceptFd);
  7923. //ftime(&SeqEndTime);
  7924. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7925. if ( errn == 0)
  7926. {
  7927. //send response successfully.
  7928. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ChargeParameterDiscoveryRes");
  7929. }
  7930. else
  7931. {
  7932. sprintf(buf_log_evcomm,
  7933. "[Error][DIN][ChargeParameterDiscoveryRes]%d (DEC)",
  7934. errn);
  7935. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7936. }
  7937. return errn;
  7938. }
  7939. /*===========================================================================
  7940. FUNCTION: Proc_iso1_ChargeParameterDiscoveryReq
  7941. DESCRIPTION:
  7942. PRE-CONDITION:
  7943. INPUT:
  7944. OUTPUT:
  7945. GLOBAL VARIABLES:
  7946. =============================================================================*/
  7947. int Proc_iso1_ChargeParameterDiscoveryReq(int AcceptFd)
  7948. {
  7949. int errn = 0;
  7950. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7951. //ftime(&SeqStartTime);
  7952. //Print the decoded XML Document
  7953. PRINT_XML_DOC_ISO1_ChargeParameterDiscoveryReq(&ccs_exi_doc_ISO1);
  7954. //Save into Share Memory
  7955. SHM_Save_iso1_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7956. //Check for EV Error Code
  7957. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7958. errn = Proc_iso1_ChargeParameterDiscoveryRes(AcceptFd);
  7959. //ftime(&SeqEndTime);
  7960. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7961. if (errn == 0)
  7962. {
  7963. //send response successfully.
  7964. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ChargeParameterDiscoveryRes");
  7965. }
  7966. else
  7967. {
  7968. sprintf(buf_log_evcomm,
  7969. "[Error][ISO1][ChargeParameterDiscoveryRes]%d (DEC)",
  7970. errn);
  7971. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7972. }
  7973. return errn;
  7974. }
  7975. /*===========================================================================
  7976. FUNCTION: SHM_Init_din_CableCheckRes
  7977. DESCRIPTION:
  7978. PRE-CONDITION:
  7979. INPUT:
  7980. 1. shm_ccs
  7981. OUTPUT:
  7982. 1. shm_ccs
  7983. GLOBAL VARIABLES:
  7984. =============================================================================*/
  7985. void SHM_Init_din_CableCheckRes(struct CcsData *shm_ccs)
  7986. {
  7987. struct CableCheckResponse_DIN70121 *in;
  7988. in = &shm_ccs->V2GMessage_DIN70121.CableCheckResponse;
  7989. //----- [BODY (1/3)] ResponseCode -----
  7990. in->ResponseCode = dinresponseCodeType_OK;
  7991. //----- [BODY (2/3)] EVSEProcessing -----
  7992. //in->EVSEProcessing = dinEVSEProcessingType_Finished; //for test
  7993. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //default
  7994. // dinEVSEProcessingType_Finished = 0,
  7995. // dinEVSEProcessingType_Ongoing = 1
  7996. //----- [BODY (3/3)] DC_EVSEStatus -----
  7997. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7998. in->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0 (default)
  7999. // dinisolationLevelType_Invalid = 0,
  8000. // dinisolationLevelType_Valid = 1, (default)
  8001. // dinisolationLevelType_Warning = 2,
  8002. // dinisolationLevelType_Fault = 3
  8003. }
  8004. /*===========================================================================
  8005. FUNCTION: Sudo_Parameter_din_CableCheckRes
  8006. DESCRIPTION:
  8007. PRE-CONDITION:
  8008. INPUT:
  8009. OUTPUT:
  8010. GLOBAL VARIABLES:
  8011. =============================================================================*/
  8012. void Sudo_Parameter_din_CableCheckRes()
  8013. {
  8014. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8015. init_dinCableCheckResType(&ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes);
  8016. ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  8017. //----- [BODY (1/3)] ResponseCode -----
  8018. struct dinCableCheckResType *res;
  8019. res = &ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes;
  8020. res->ResponseCode = dinresponseCodeType_OK;
  8021. //----- [BODY (2/3)] EVSEProcessing -----
  8022. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  8023. // dinEVSEProcessingType_Finished = 0,
  8024. // dinEVSEProcessingType_Ongoing = 1
  8025. //----- [BODY (3/3)] DC_EVSEStatus -----
  8026. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8027. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8028. // dinisolationLevelType_Invalid = 0,
  8029. // dinisolationLevelType_Valid = 1,
  8030. // dinisolationLevelType_Warning = 2,
  8031. // dinisolationLevelType_Fault = 3
  8032. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8033. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8034. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8035. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8036. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8037. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8038. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8039. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8040. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8041. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8042. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8043. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8044. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8045. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8046. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8047. // dinEVSENotificationType_None = 0,
  8048. // dinEVSENotificationType_StopCharging = 1,
  8049. // dinEVSENotificationType_ReNegotiation = 2
  8050. }
  8051. /*===========================================================================
  8052. FUNCTION: Sudo_Parameter_iso1_CableCheckRes
  8053. DESCRIPTION:
  8054. PRE-CONDITION:
  8055. INPUT:
  8056. OUTPUT:
  8057. GLOBAL VARIABLES:
  8058. =============================================================================*/
  8059. void Sudo_Parameter_iso1_CableCheckRes()
  8060. {
  8061. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8062. init_iso1CableCheckResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes);
  8063. ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  8064. //----- [BODY (1/3)] ResponseCode -----
  8065. struct iso1CableCheckResType *res;
  8066. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes;
  8067. res->ResponseCode = iso1responseCodeType_OK;
  8068. //----- [BODY (2/3)] EVSEProcessing -----
  8069. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  8070. //iso1EVSEProcessingType_Finished = 0,
  8071. //iso1EVSEProcessingType_Ongoing = 1,
  8072. //iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction = 2
  8073. //----- [BODY (3/3)] DC_EVSEStatus -----
  8074. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8075. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8076. //iso1isolationLevelType_Invalid = 0,
  8077. //iso1isolationLevelType_Valid = 1,
  8078. //iso1isolationLevelType_Warning = 2,
  8079. //iso1isolationLevelType_Fault = 3,
  8080. //iso1isolationLevelType_No_IMD = 4
  8081. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8082. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8083. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8084. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8085. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8086. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8087. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8088. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8089. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8090. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8091. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8092. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8093. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8094. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8095. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8096. //iso1EVSENotificationType_None = 0,
  8097. //iso1EVSENotificationType_StopCharging = 1,
  8098. //iso1EVSENotificationType_ReNegotiation = 2
  8099. }
  8100. /*===========================================================================
  8101. FUNCTION: Proc_din_CableCheckRes
  8102. DESCRIPTION:
  8103. PRE-CONDITION:
  8104. INPUT:
  8105. OUTPUT:
  8106. GLOBAL VARIABLES:
  8107. =============================================================================*/
  8108. int Proc_din_CableCheckRes(int AcceptFd)
  8109. {
  8110. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8111. //if it is not the same, the packet should be ignored.
  8112. //STEP 1: ============ Initialize ============
  8113. int i = 0;
  8114. int errn = 0;
  8115. bitstream_t v2g_tx_stream;
  8116. static struct CableCheckResponse_DIN70121 *cab;
  8117. static struct ChargingInfoData *sys;
  8118. size_t pos = 0;
  8119. v2g_tx_stream.pos = &pos;
  8120. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8121. v2g_tx_stream.data = V2GTP_Tx_buf;
  8122. cab = &ShmCcsData->V2GMessage_DIN70121.CableCheckResponse;
  8123. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8124. cab->ResponseCode = OK_DIN70121;
  8125. cab->cnt++;
  8126. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  8127. sys->CpState,
  8128. sys->CpVoltage,
  8129. sys->PresentChargingVoltage,
  8130. sys->IsolationStatus,
  8131. cab->EVSEProcessing);
  8132. //[HEADER] Check Req SessionID
  8133. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8134. {
  8135. cab->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8136. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8137. errn = -1;
  8138. }
  8139. //Check for SequenceError
  8140. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8141. {
  8142. cab->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8143. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8144. errn = -1;
  8145. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8146. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8147. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8148. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8149. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8150. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8151. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8152. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8153. }
  8154. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8155. if (sys->IsolationStatus == GFD_Invalid) //0: on going
  8156. {
  8157. //For PSU
  8158. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  8159. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  8160. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8161. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive; //4
  8162. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  8163. }
  8164. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2: warning
  8165. {
  8166. //For PSU
  8167. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8168. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8169. if (sys->PresentChargingVoltage < 60) // < 60V
  8170. {
  8171. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  8172. sprintf(buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  8173. sys->PresentChargingVoltage,
  8174. sys->IsolationStatus);
  8175. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8176. //IsolationStatus
  8177. if (sys->IsolationStatus == GFD_Valid)
  8178. {
  8179. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8180. }
  8181. else if (sys->IsolationStatus == GFD_Warning)
  8182. {
  8183. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning;
  8184. }
  8185. else
  8186. {
  8187. sprintf(buf_log_evcomm,
  8188. "[WARNING]unexpected IsolationStatus(%d)",
  8189. sys->IsolationStatus);
  8190. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8191. }
  8192. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8193. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8194. }
  8195. else
  8196. {
  8197. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8198. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8199. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  8200. }
  8201. }
  8202. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8203. {
  8204. //For PSU
  8205. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8206. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8207. cab->ResponseCode = FAILED_DIN70121;
  8208. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8209. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  8210. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8211. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]IsolationStatus = 3 (fault)");
  8212. errn = -1;
  8213. }
  8214. else
  8215. {
  8216. //For PSU
  8217. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8218. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8219. cab->ResponseCode = FAILED_DIN70121;
  8220. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8221. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  8222. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8223. sprintf(buf_log_evcomm,
  8224. "[Proc_din_CableCheckRes]Undefined Isolation Status(%d)",
  8225. sys->IsolationStatus);
  8226. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8227. }
  8228. //Check for CSU command of "Stop by EVSE"
  8229. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8230. {
  8231. cab->ResponseCode = FAILED_DIN70121;
  8232. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8233. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8234. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8235. // errn = -1;
  8236. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]EVSE_Shutdown");
  8237. }
  8238. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8239. {
  8240. cab->ResponseCode = FAILED_DIN70121;
  8241. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8242. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8243. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8244. errn = -1;
  8245. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]EVSE_EmergencyShutdown");
  8246. }
  8247. else if (ShmInternalComm->ChargingPermission == FALSE)
  8248. {
  8249. cab->ResponseCode = FAILED_DIN70121;
  8250. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8251. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8252. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8253. // errn = -1;
  8254. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_CableCheckRes]ChargingPermission = FALSE");
  8255. }
  8256. else
  8257. {
  8258. //null
  8259. }
  8260. //Response to CP Error
  8261. #if CP_PROTECTION_MECHANISM == ENABLE
  8262. //#if 1
  8263. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  8264. {
  8265. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8266. {
  8267. cab->ResponseCode = FAILED_DIN70121;
  8268. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8269. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8270. Update_V2G_Flow_Status(Other_Fault);
  8271. errn = -1;
  8272. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8273. //CCS_SECC_CP_State_Error (023889)
  8274. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8275. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8276. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8277. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8278. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8279. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8280. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8281. sprintf(buf_log_evcomm,
  8282. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  8283. sys->CpState,
  8284. sys->CpVoltage,
  8285. cab->cnt
  8286. );
  8287. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8288. //cab->cnt = 0;
  8289. }
  8290. }
  8291. #endif
  8292. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8293. #if PARAMETER_NORMAL_MODE == ENABLE
  8294. SHM_Read_din_CableCheckRes(&ccs_exi_doc_DIN, ShmCcsData);
  8295. #else
  8296. Sudo_Parameter_din_CableCheckRes();
  8297. #endif
  8298. //STEP 4: ============ Encode and Send Response Message ===========
  8299. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8300. {
  8301. errn = -1;
  8302. }
  8303. //STEP 5: ============ Update Flags ===========
  8304. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  8305. return errn;
  8306. }
  8307. /*===========================================================================
  8308. FUNCTION: Proc_iso1_CableCheckRes
  8309. DESCRIPTION:
  8310. PRE-CONDITION:
  8311. INPUT:
  8312. OUTPUT:
  8313. GLOBAL VARIABLES:
  8314. =============================================================================*/
  8315. int Proc_iso1_CableCheckRes(int AcceptFd)
  8316. {
  8317. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8318. //if it is not the same, the packet should be ignored.
  8319. //STEP 1: ============ Initialize ============
  8320. int i = 0;
  8321. int errn = 0;
  8322. bitstream_t v2g_tx_stream;
  8323. static struct CableCheckResponse_ISO15118_2014 *cab;
  8324. static struct ChargingInfoData *sys;
  8325. size_t pos = 0;
  8326. v2g_tx_stream.pos = &pos;
  8327. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8328. v2g_tx_stream.data = V2GTP_Tx_buf;
  8329. cab = &ShmCcsData->V2GMessage_ISO15118_2014.CableCheckResponse;
  8330. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8331. cab->ResponseCode = OK_ISO15118_2014;
  8332. cab->cnt++;
  8333. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  8334. sys->CpState,
  8335. sys->CpVoltage,
  8336. sys->PresentChargingVoltage,
  8337. sys->IsolationStatus,
  8338. cab->EVSEProcessing);
  8339. //[HEADER] Check Req SessionID
  8340. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8341. {
  8342. cab->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8343. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8344. errn = -1;
  8345. }
  8346. //Check for SequenceError
  8347. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8348. {
  8349. cab->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8350. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8351. errn = -1;
  8352. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8353. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8354. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8355. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8356. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8357. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8358. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8359. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8360. }
  8361. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8362. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  8363. {
  8364. //For PSU
  8365. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  8366. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  8367. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8368. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8369. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  8370. }
  8371. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2:waring
  8372. {
  8373. //For PSU
  8374. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8375. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8376. if (sys->PresentChargingVoltage < 60) // < 60V
  8377. {
  8378. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  8379. sprintf(buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  8380. sys->PresentChargingVoltage,
  8381. sys->IsolationStatus);
  8382. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8383. //IsolationStatus
  8384. if (sys->IsolationStatus == GFD_Valid)
  8385. {
  8386. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8387. }
  8388. else if (sys->IsolationStatus == GFD_Warning)
  8389. {
  8390. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning;
  8391. }
  8392. else
  8393. {
  8394. sprintf(buf_log_evcomm,
  8395. "[WARNING]unexpected IsolationStatus(%d)",
  8396. sys->IsolationStatus);
  8397. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8398. }
  8399. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8400. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8401. }
  8402. else
  8403. {
  8404. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8405. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8406. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  8407. }
  8408. }
  8409. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8410. {
  8411. //For PSU
  8412. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8413. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8414. cab->ResponseCode = FAILED_ISO15118_2014;
  8415. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8416. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  8417. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8418. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]IsolationStatus = 3 (fault)");
  8419. errn = -1;
  8420. }
  8421. //else if (sys->IsolationStatus == GFD_No_IMD){} //only for ISO15118
  8422. else
  8423. {
  8424. //For PSU
  8425. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8426. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8427. cab->ResponseCode = FAILED_ISO15118_2014;
  8428. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8429. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  8430. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8431. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]Undefined Isolation Status.");
  8432. }
  8433. //Check for CSU command of "Stop by EVSE"
  8434. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8435. {
  8436. cab->ResponseCode = FAILED_ISO15118_2014;
  8437. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8438. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8439. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8440. // errn = -1;
  8441. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]EVSE_Shutdown");
  8442. }
  8443. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8444. {
  8445. cab->ResponseCode = FAILED_ISO15118_2014;
  8446. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8447. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8448. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8449. errn = -1;
  8450. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]EVSE_EmergencyShutdown");
  8451. }
  8452. else if (ShmInternalComm->ChargingPermission == FALSE)
  8453. {
  8454. cab->ResponseCode = FAILED_ISO15118_2014;
  8455. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8456. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8457. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8458. // errn = -1;
  8459. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_CableCheckRes]ChargingPermission = FALSE");
  8460. }
  8461. else
  8462. {
  8463. //null
  8464. }
  8465. //Response to CP Error
  8466. #if CP_PROTECTION_MECHANISM == ENABLE
  8467. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  8468. {
  8469. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8470. {
  8471. cab->ResponseCode = FAILED_ISO15118_2014;
  8472. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8473. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8474. Update_V2G_Flow_Status(Other_Fault);
  8475. errn = -1;
  8476. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8477. //CCS_SECC_CP_State_Error (023889)
  8478. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8479. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8480. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8481. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8482. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8483. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8484. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8485. sprintf(buf_log_evcomm,
  8486. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  8487. sys->CpState,
  8488. sys->CpVoltage,
  8489. cab->cnt
  8490. );
  8491. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8492. //cab->cnt = 0;
  8493. }
  8494. }
  8495. #endif
  8496. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8497. #if PARAMETER_NORMAL_MODE == ENABLE
  8498. SHM_Read_iso1_CableCheckRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8499. #else
  8500. Sudo_Parameter_iso1_CableCheckRes();
  8501. #endif
  8502. //STEP 4: ============ Encode and Send Response Message ===========
  8503. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8504. {
  8505. errn = -1;
  8506. }
  8507. //STEP 5: ============ Update Flags ===========
  8508. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  8509. return errn;
  8510. }
  8511. /*===========================================================================
  8512. FUNCTION: Proc_din_CableCheckReq
  8513. DESCRIPTION:
  8514. PRE-CONDITION:
  8515. INPUT:
  8516. OUTPUT:
  8517. GLOBAL VARIABLES:
  8518. =============================================================================*/
  8519. int Proc_din_CableCheckReq(int AcceptFd)
  8520. {
  8521. int errn = 0;
  8522. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckReq] Got CableCheckReq\n");
  8523. //Print the decoded XML Document
  8524. PRINT_XML_DOC_DIN_CableCheckReq(&ccs_exi_doc_DIN);
  8525. //Save into Share Memory
  8526. SHM_Save_din_CableCheckReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8527. //Check for EV Error Code
  8528. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CableCheckRequest.DC_EVStatus.EVErrorCode);
  8529. errn = Proc_din_CableCheckRes(AcceptFd);
  8530. if (errn == 0)
  8531. {
  8532. //send response successfully.
  8533. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]CableCheckRes");
  8534. }
  8535. else
  8536. {
  8537. sprintf(buf_log_evcomm,
  8538. "[Error][SeccComm][Proc_din_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  8539. errn);
  8540. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8541. }
  8542. return errn;
  8543. }
  8544. /*===========================================================================
  8545. FUNCTION: Proc_iso1_CableCheckReq
  8546. DESCRIPTION:
  8547. PRE-CONDITION:
  8548. INPUT:
  8549. OUTPUT:
  8550. GLOBAL VARIABLES:
  8551. =============================================================================*/
  8552. int Proc_iso1_CableCheckReq(int AcceptFd)
  8553. {
  8554. int errn = 0;
  8555. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckReq] Got CableCheckReq");
  8556. //Print the decoded XML Document
  8557. PRINT_XML_DOC_ISO1_CableCheckReq(&ccs_exi_doc_ISO1);
  8558. //Save into Share Memory
  8559. SHM_Save_iso1_CableCheckReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8560. //Check for EV Error Code
  8561. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CableCheckRequest.DC_EVStatus.EVErrorCode);
  8562. errn = Proc_iso1_CableCheckRes(AcceptFd);
  8563. if (errn == 0)
  8564. {
  8565. //send response successfully.
  8566. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]CableCheckRes");
  8567. }
  8568. else
  8569. {
  8570. sprintf(buf_log_evcomm,
  8571. "[Error][SeccComm][Proc_iso1_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  8572. errn);
  8573. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8574. }
  8575. return errn;
  8576. }
  8577. /*===========================================================================
  8578. FUNCTION: SHM_Init_din_PreChargeRes
  8579. DESCRIPTION:
  8580. PRE-CONDITION:
  8581. INPUT:
  8582. 1. shm_ccs
  8583. OUTPUT:
  8584. 1. shm_ccs
  8585. GLOBAL VARIABLES:
  8586. =============================================================================*/
  8587. void SHM_Init_din_PreChargeRes(struct CcsData *shm_ccs)
  8588. {
  8589. struct PreChargeResponse_DIN70121 *in;
  8590. in = &shm_ccs->V2GMessage_DIN70121.PreChargeResponse;
  8591. //----- [BODY (1/3)] ResponseCode -----
  8592. in->ResponseCode = dinresponseCodeType_OK;
  8593. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8594. short value = 0; int multiplier = 0; unsigned char unit = 0;
  8595. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for Test
  8596. value = 0; multiplier = 0; unit = V_DIN70121; //waiting for CsuComm to update V to fit EV Target
  8597. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  8598. //----- [BODY (3/3)] DC_EVSEStatus -----
  8599. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8600. }
  8601. /*===========================================================================
  8602. FUNCTION: Sudo_Parameter_din_PreChargeRes
  8603. DESCRIPTION:
  8604. PRE-CONDITION:
  8605. INPUT:
  8606. OUTPUT:
  8607. GLOBAL VARIABLES:
  8608. =============================================================================*/
  8609. void Sudo_Parameter_din_PreChargeRes()
  8610. {
  8611. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8612. init_dinPreChargeResType(&ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes);
  8613. ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  8614. //----- [BODY (1/3)] ResponseCode -----
  8615. struct dinPreChargeResType *res;
  8616. res = &ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes;
  8617. res->ResponseCode = dinresponseCodeType_OK;
  8618. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8619. res->EVSEPresentVoltage.Value = 3820;
  8620. res->EVSEPresentVoltage.Multiplier = -1;
  8621. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8622. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  8623. // dinunitSymbolType_h = 0,
  8624. // dinunitSymbolType_m = 1,
  8625. // dinunitSymbolType_s = 2,
  8626. // dinunitSymbolType_A = 3,
  8627. // dinunitSymbolType_Ah = 4,
  8628. // dinunitSymbolType_V = 5,
  8629. // dinunitSymbolType_VA = 6,
  8630. // dinunitSymbolType_W = 7,
  8631. // dinunitSymbolType_W_s = 8,
  8632. // dinunitSymbolType_Wh = 9
  8633. //----- [BODY (3/3)] DC_EVSEStatus -----
  8634. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8635. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8636. // dinisolationLevelType_Invalid = 0,
  8637. // dinisolationLevelType_Valid = 1,
  8638. // dinisolationLevelType_Warning = 2,
  8639. // dinisolationLevelType_Fault = 3
  8640. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8641. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8642. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8643. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8644. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8645. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8646. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8647. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8648. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8649. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8650. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8651. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8652. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8653. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8654. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8655. // dinEVSENotificationType_None = 0,
  8656. // dinEVSENotificationType_StopCharging = 1,
  8657. // dinEVSENotificationType_ReNegotiation = 2
  8658. }
  8659. /*===========================================================================
  8660. FUNCTION: Sudo_Parameter_iso1_PreChargeRes
  8661. DESCRIPTION:
  8662. PRE-CONDITION:
  8663. INPUT:
  8664. OUTPUT:
  8665. GLOBAL VARIABLES:
  8666. =============================================================================*/
  8667. void Sudo_Parameter_iso1_PreChargeRes()
  8668. {
  8669. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8670. init_iso1PreChargeResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes);
  8671. ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  8672. //----- [BODY (1/3)] ResponseCode -----
  8673. struct iso1PreChargeResType *res;
  8674. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes;
  8675. res->ResponseCode = iso1responseCodeType_OK;
  8676. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8677. res->EVSEPresentVoltage.Value = 3820;
  8678. res->EVSEPresentVoltage.Multiplier = -1;
  8679. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8680. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  8681. //iso1unitSymbolType_h = 0,
  8682. //iso1unitSymbolType_m = 1,
  8683. //iso1unitSymbolType_s = 2,
  8684. //iso1unitSymbolType_A = 3,
  8685. //iso1unitSymbolType_V = 4,
  8686. //iso1unitSymbolType_W = 5,
  8687. //iso1unitSymbolType_Wh = 6
  8688. //----- [BODY (3/3)] DC_EVSEStatus -----
  8689. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8690. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8691. //iso1isolationLevelType_Invalid = 0,
  8692. //iso1isolationLevelType_Valid = 1,
  8693. //iso1isolationLevelType_Warning = 2,
  8694. //iso1isolationLevelType_Fault = 3,
  8695. //iso1isolationLevelType_No_IMD = 4
  8696. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8697. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8698. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8699. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8700. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8701. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8702. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8703. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8704. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8705. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8706. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8707. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8708. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8709. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8710. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8711. //iso1EVSENotificationType_None = 0,
  8712. //iso1EVSENotificationType_StopCharging = 1,
  8713. //iso1EVSENotificationType_ReNegotiation = 2
  8714. }
  8715. /*===========================================================================
  8716. FUNCTION: Proc_din_PreChargeRes
  8717. DESCRIPTION:
  8718. PRE-CONDITION:
  8719. INPUT:
  8720. OUTPUT:
  8721. GLOBAL VARIABLES:
  8722. =============================================================================*/
  8723. int Proc_din_PreChargeRes(int AcceptFd)
  8724. {
  8725. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8726. //if it is not the same, the packet should be ignored.
  8727. //STEP 1: ============ Initialize ============
  8728. int i = 0;
  8729. int errn = 0;
  8730. bitstream_t v2g_tx_stream;
  8731. static struct PreChargeResponse_DIN70121 *pre;
  8732. static struct ChargingInfoData *sys;
  8733. size_t pos = 0;
  8734. v2g_tx_stream.pos = &pos;
  8735. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8736. v2g_tx_stream.data = V2GTP_Tx_buf;
  8737. pre = &ShmCcsData->V2GMessage_DIN70121.PreChargeResponse;
  8738. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8739. pre->ResponseCode = OK_DIN70121;
  8740. //EVSE Status Code
  8741. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8742. //[HEADER] Check Req SessionID
  8743. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8744. {
  8745. pre->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8746. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8747. errn = -1;
  8748. }
  8749. //Check for SequenceError
  8750. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8751. {
  8752. pre->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8753. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8754. errn = -1;
  8755. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8756. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8757. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8758. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8759. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8760. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8761. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8762. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8763. }
  8764. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8765. SAVE_PhysicalValueType_DIN70121(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  8766. //Isolation Status
  8767. if (sys->IsolationStatus == GFD_Invalid) //0: invalid
  8768. {
  8769. #if 0
  8770. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  8771. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8772. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8773. Update_V2G_Flow_Status(Other_Fault);
  8774. errn = -1;
  8775. sprintf(buf_log_evcomm, "[Error][Proc_din_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8776. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8777. #else
  8778. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8779. #endif
  8780. }
  8781. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8782. {
  8783. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8784. }
  8785. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  8786. {
  8787. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  8788. }
  8789. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8790. {
  8791. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8792. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8793. pre->ResponseCode = FAILED_DIN70121;
  8794. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8795. errn = -1;
  8796. }
  8797. else //GFD_No_IMD or other unexpected status
  8798. {
  8799. pre->ResponseCode = FAILED_DIN70121;
  8800. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8801. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8802. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8803. Update_V2G_Flow_Status(Other_Fault);
  8804. errn = -1;
  8805. sprintf(buf_log_evcomm,
  8806. "[Error][Proc_din_PreChargeRes]IsolationStatus = %d (undefined)",
  8807. sys->IsolationStatus);
  8808. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8809. }
  8810. //Check for CSU command of "Stop by EVSE"
  8811. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8812. {
  8813. //Check for Alarm Code: CCS GFD trip (012235)
  8814. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8815. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8816. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8817. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8818. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8819. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8820. {
  8821. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  8822. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8823. }
  8824. else
  8825. {
  8826. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]EVSE_Shutdown");
  8827. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8828. }
  8829. pre->ResponseCode = FAILED_DIN70121;
  8830. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8831. errn = -1;
  8832. }
  8833. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8834. {
  8835. //Check for Alarm Code: CCS GFD trip (012235)
  8836. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8837. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8838. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8839. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8840. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8841. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8842. {
  8843. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  8844. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8845. }
  8846. else
  8847. {
  8848. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]EVSE_EmergencyShutdown");
  8849. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8850. }
  8851. pre->ResponseCode = FAILED_DIN70121;
  8852. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8853. errn = -1;
  8854. }
  8855. else if (ShmInternalComm->ChargingPermission == FALSE)
  8856. {
  8857. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]ChargingPermission = FALSE");
  8858. pre->ResponseCode = FAILED_DIN70121;
  8859. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8860. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8861. errn = -1;
  8862. }
  8863. else
  8864. {
  8865. //null
  8866. }
  8867. //Response to CP Error
  8868. #if CP_PROTECTION_MECHANISM == ENABLE
  8869. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8870. {
  8871. pre->ResponseCode = FAILED_DIN70121;
  8872. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8873. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8874. Update_V2G_Flow_Status(Other_Fault);
  8875. errn = -1;
  8876. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8877. //CCS_SECC_CP_State_Error (023889)
  8878. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8879. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8880. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8881. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8882. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8883. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8884. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8885. sprintf(buf_log_evcomm,
  8886. "[Error][Proc_din_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8887. sys->CpState,
  8888. sys->CpVoltage
  8889. );
  8890. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8891. }
  8892. #endif
  8893. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8894. #if PARAMETER_NORMAL_MODE == ENABLE
  8895. SHM_Read_din_PreChargeRes(&ccs_exi_doc_DIN, ShmCcsData);
  8896. #else
  8897. Sudo_Parameter_din_PreChargeRes();
  8898. #endif
  8899. //STEP 4: ============ Encode and Send Response Message ===========
  8900. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8901. {
  8902. SAVE_SYS_LOG_MSG_EVCOMM("[Error][send_encoded_din_V2GTP_Stream]:Tx encoded msg error");
  8903. errn = -1;
  8904. }
  8905. //STEP 5: ============ Update Flags ===========
  8906. return errn;
  8907. }
  8908. /*===========================================================================
  8909. FUNCTION: Proc_iso1_PreChargeRes
  8910. DESCRIPTION:
  8911. PRE-CONDITION:
  8912. INPUT:
  8913. OUTPUT:
  8914. GLOBAL VARIABLES:
  8915. =============================================================================*/
  8916. int Proc_iso1_PreChargeRes(int AcceptFd)
  8917. {
  8918. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8919. //if it is not the same, the packet should be ignored.
  8920. //STEP 1: ============ Initialize ============
  8921. int i = 0;
  8922. int errn = 0;
  8923. bitstream_t v2g_tx_stream;
  8924. static struct PreChargeResponse_ISO15118_2014 *pre;
  8925. static struct ChargingInfoData *sys;
  8926. size_t pos = 0;
  8927. v2g_tx_stream.pos = &pos;
  8928. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8929. v2g_tx_stream.data = V2GTP_Tx_buf;
  8930. pre = &ShmCcsData->V2GMessage_ISO15118_2014.PreChargeResponse;
  8931. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8932. pre->ResponseCode = OK_ISO15118_2014;
  8933. //EVSE Status Code
  8934. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8935. //[HEADER] Check Req SessionID
  8936. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8937. {
  8938. pre->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8939. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8940. errn = -1;
  8941. }
  8942. //Check for SequenceError
  8943. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8944. {
  8945. pre->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8946. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8947. errn = -1;
  8948. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8949. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8950. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8951. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8952. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8953. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8954. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8955. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8956. }
  8957. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8958. SAVE_PhysicalValueType_ISO15118_2014(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  8959. //Isolation Status
  8960. if (sys->IsolationStatus == GFD_Invalid) //0: invalid(on going)
  8961. {
  8962. #if 0
  8963. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  8964. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8965. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8966. // Update_V2G_Flow_Status(Other_Fault);
  8967. // errn = -1;
  8968. sprintf(buf_log_evcomm, "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8969. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8970. #else
  8971. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8972. #endif
  8973. }
  8974. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8975. {
  8976. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8977. }
  8978. else if (sys->IsolationStatus == GFD_Warning) //2: waring
  8979. {
  8980. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //1
  8981. }
  8982. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8983. {
  8984. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8985. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8986. pre->ResponseCode = FAILED_ISO15118_2014;
  8987. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8988. errn = -1;
  8989. }
  8990. else
  8991. {
  8992. pre->ResponseCode = FAILED_ISO15118_2014;
  8993. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8994. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8995. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8996. Update_V2G_Flow_Status(Other_Fault);
  8997. errn = -1;
  8998. sprintf(buf_log_evcomm,
  8999. "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d (undefined)",
  9000. sys->IsolationStatus);
  9001. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9002. }
  9003. //Check for CSU command of "Stop by EVSE"
  9004. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9005. {
  9006. //Check for Alarm Code: CCS GFD trip (012235)
  9007. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9008. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9009. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9010. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9011. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9012. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9013. {
  9014. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  9015. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9016. }
  9017. else
  9018. {
  9019. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]EVSE_Shutdown");
  9020. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9021. }
  9022. pre->ResponseCode = FAILED_ISO15118_2014;
  9023. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9024. // errn = -1;
  9025. }
  9026. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9027. {
  9028. //Check for Alarm Code: CCS GFD trip (012235)
  9029. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9030. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9031. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9032. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9033. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9034. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9035. {
  9036. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9037. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9038. }
  9039. else
  9040. {
  9041. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]EVSE_EmergencyShutdown");
  9042. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9043. }
  9044. pre->ResponseCode = FAILED_ISO15118_2014;
  9045. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9046. errn = -1;
  9047. }
  9048. else if (ShmInternalComm->ChargingPermission == FALSE)
  9049. {
  9050. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]ChargingPermission = FALSE");
  9051. pre->ResponseCode = FAILED_ISO15118_2014;
  9052. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9053. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9054. // errn = -1;
  9055. }
  9056. else
  9057. {
  9058. //null
  9059. }
  9060. //Response to CP Error
  9061. #if CP_PROTECTION_MECHANISM == ENABLE
  9062. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9063. {
  9064. pre->ResponseCode = FAILED_ISO15118_2014;
  9065. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9066. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9067. Update_V2G_Flow_Status(Other_Fault);
  9068. errn = -1;
  9069. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9070. //CCS_SECC_CP_State_Error (023889)
  9071. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9072. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9073. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9074. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9075. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9076. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9077. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9078. sprintf(buf_log_evcomm,
  9079. "[Error][Proc_iso1_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  9080. sys->CpState,
  9081. sys->CpVoltage
  9082. );
  9083. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9084. }
  9085. #endif
  9086. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9087. #if PARAMETER_NORMAL_MODE == ENABLE
  9088. SHM_Read_iso1_PreChargeRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9089. #else
  9090. Sudo_Parameter_iso1_PreChargeRes();
  9091. #endif
  9092. //STEP 4: ============ Encode and Send Response Message ===========
  9093. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9094. {
  9095. SAVE_SYS_LOG_MSG_EVCOMM("[Error][send_encoded_iso1_V2GTP_Stream]:Tx encoded msg error");
  9096. errn = -1;
  9097. }
  9098. //STEP 5: ============ Update Flags ===========
  9099. return errn;
  9100. }
  9101. /*===========================================================================
  9102. FUNCTION: Proc_din_PreChargeReq
  9103. DESCRIPTION:
  9104. PRE-CONDITION:
  9105. INPUT:
  9106. OUTPUT:
  9107. GLOBAL VARIABLES:
  9108. =============================================================================*/
  9109. int Proc_din_PreChargeReq(int AcceptFd)
  9110. {
  9111. int errn = 0;
  9112. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PreChargeReq] Got PreChargeReq");
  9113. //Print the decoded XML Document
  9114. PRINT_XML_DOC_DIN_PreChargeReq(&ccs_exi_doc_DIN);
  9115. //Save into Share Memory
  9116. SHM_Save_din_PreChargeReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9117. //Check for EV Error Code
  9118. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PreChargeRequest.DC_EVStatus.EVErrorCode);
  9119. errn = Proc_din_PreChargeRes(AcceptFd);
  9120. if (errn == 0)
  9121. {
  9122. //send response successfully.
  9123. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PreChargeRes");
  9124. }
  9125. else
  9126. {
  9127. sprintf(buf_log_evcomm,
  9128. "[Error][SeccComm][Proc_din_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  9129. errn);
  9130. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9131. }
  9132. return errn;
  9133. }
  9134. /*===========================================================================
  9135. FUNCTION: Proc_iso1_PreChargeReq
  9136. DESCRIPTION:
  9137. PRE-CONDITION:
  9138. INPUT:
  9139. OUTPUT:
  9140. GLOBAL VARIABLES:
  9141. =============================================================================*/
  9142. int Proc_iso1_PreChargeReq(int AcceptFd)
  9143. {
  9144. int errn = 0;
  9145. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PreChargeReq] Got PreChargeReq");
  9146. //Print the decoded XML Document
  9147. PRINT_XML_DOC_ISO1_PreChargeReq(&ccs_exi_doc_ISO1);
  9148. //Save into Share Memory
  9149. SHM_Save_iso1_PreChargeReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9150. //Check for EV Error Code
  9151. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PreChargeRequest.DC_EVStatus.EVErrorCode);
  9152. errn = Proc_iso1_PreChargeRes(AcceptFd);
  9153. if (errn == 0)
  9154. {
  9155. //send response successfully.
  9156. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PreChargeRes");
  9157. }
  9158. else
  9159. {
  9160. sprintf(buf_log_evcomm,
  9161. "[Error][SeccComm][Proc_iso1_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  9162. errn);
  9163. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9164. }
  9165. return errn;
  9166. }
  9167. /*===========================================================================
  9168. FUNCTION: SHM_Init_din_PowerDeliveryRes
  9169. DESCRIPTION:
  9170. PRE-CONDITION:
  9171. INPUT:
  9172. 1. shm_ccs
  9173. OUTPUT:
  9174. 1. shm_ccs
  9175. GLOBAL VARIABLES:
  9176. =============================================================================*/
  9177. void SHM_Init_din_PowerDeliveryRes(struct CcsData *shm_ccs)
  9178. {
  9179. struct PowerDeliveryResponse_DIN70121 *in;
  9180. in = &shm_ccs->V2GMessage_DIN70121.PowerDeliveryResponse;
  9181. //----- [BODY (1/3)] ResponseCode -----
  9182. in->ResponseCode = dinresponseCodeType_OK;
  9183. //----- [BODY (2/3)] AC_EVSEStatus -----
  9184. //ignore, since DIN 70121 doesn't support AC, yet.
  9185. //----- [BODY (2/3)] DC_EVSEStatus -----
  9186. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  9187. }
  9188. /*===========================================================================
  9189. FUNCTION: Sudo_Parameter_din_PowerDeliveryRes
  9190. DESCRIPTION:
  9191. PRE-CONDITION:
  9192. INPUT:
  9193. OUTPUT:
  9194. GLOBAL VARIABLES:
  9195. =============================================================================*/
  9196. void Sudo_Parameter_din_PowerDeliveryRes()
  9197. {
  9198. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  9199. init_dinPowerDeliveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes);
  9200. ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  9201. //----- [BODY (1/3)] ResponseCode -----
  9202. struct dinPowerDeliveryResType *res;
  9203. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9204. res->ResponseCode = dinresponseCodeType_OK;
  9205. //----- [BODY (2/3)] AC_EVSEStatus -----
  9206. //ignore, since DIN 70121 doesn't support AC, yet.
  9207. //----- [BODY (2/3)] DC_EVSEStatus -----
  9208. res->DC_EVSEStatus_isUsed = 1u;
  9209. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9210. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  9211. // dinisolationLevelType_Invalid = 0,
  9212. // dinisolationLevelType_Valid = 1,
  9213. // dinisolationLevelType_Warning = 2,
  9214. // dinisolationLevelType_Fault = 3
  9215. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9216. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9217. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  9218. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9219. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9220. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9221. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9222. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9223. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  9224. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  9225. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  9226. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  9227. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  9228. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9229. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  9230. // dinEVSENotificationType_None = 0,
  9231. // dinEVSENotificationType_StopCharging = 1,
  9232. // dinEVSENotificationType_ReNegotiation = 2
  9233. }
  9234. /*===========================================================================
  9235. FUNCTION: Sudo_Parameter_iso1_PowerDeliveryRes
  9236. DESCRIPTION:
  9237. PRE-CONDITION:
  9238. INPUT:
  9239. OUTPUT:
  9240. GLOBAL VARIABLES:
  9241. =============================================================================*/
  9242. void Sudo_Parameter_iso1_PowerDeliveryRes()
  9243. {
  9244. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9245. init_iso1PowerDeliveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes);
  9246. ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  9247. //----- [BODY (1/3)] ResponseCode -----
  9248. struct iso1PowerDeliveryResType *res;
  9249. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  9250. res->ResponseCode = iso1responseCodeType_OK;
  9251. //----- [BODY (2/3)] AC_EVSEStatus -----
  9252. //ignore, since our ISO1 70121 doesn't support AC, yet.
  9253. //----- [BODY (2/3)] DC_EVSEStatus -----
  9254. res->DC_EVSEStatus_isUsed = 1u;
  9255. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9256. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  9257. //iso1isolationLevelType_Invalid = 0,
  9258. //iso1isolationLevelType_Valid = 1,
  9259. //iso1isolationLevelType_Warning = 2,
  9260. //iso1isolationLevelType_Fault = 3,
  9261. //iso1isolationLevelType_No_IMD = 4
  9262. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9263. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9264. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  9265. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9266. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9267. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9268. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9269. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9270. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  9271. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  9272. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  9273. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  9274. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  9275. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9276. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9277. //iso1EVSENotificationType_None = 0,
  9278. //iso1EVSENotificationType_StopCharging = 1,
  9279. //iso1EVSENotificationType_ReNegotiation = 2
  9280. }
  9281. /*===========================================================================
  9282. FUNCTION: Proc_din_PowerDeliveryStartRes
  9283. DESCRIPTION:
  9284. PRE-CONDITION:
  9285. INPUT:
  9286. OUTPUT:
  9287. GLOBAL VARIABLES:
  9288. =============================================================================*/
  9289. int Proc_din_PowerDeliveryStartRes(int AcceptFd)
  9290. {
  9291. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9292. //if it is not the same, the packet should be ignored.
  9293. //STEP 1: ============ Initialize ============
  9294. int i = 0;
  9295. int errn = 0;
  9296. bitstream_t v2g_tx_stream;
  9297. struct dinPowerDeliveryResType *res;
  9298. struct ChargingInfoData *sys;
  9299. size_t pos = 0;
  9300. v2g_tx_stream.pos = &pos;
  9301. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9302. v2g_tx_stream.data = V2GTP_Tx_buf;
  9303. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9304. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9305. res->ResponseCode = OK_DIN70121;
  9306. //[HEADER] Check Req SessionID
  9307. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9308. {
  9309. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  9310. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  9311. errn = -1;
  9312. }
  9313. //Check for SequenceError
  9314. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9315. {
  9316. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  9317. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  9318. errn = -1;
  9319. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9320. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9321. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9322. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9323. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9324. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9325. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9326. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9327. }
  9328. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9329. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9330. #if PARAMETER_NORMAL_MODE == ENABLE
  9331. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  9332. #else
  9333. Sudo_Parameter_din_PowerDeliveryRes();
  9334. #endif
  9335. //EVSE Status Code
  9336. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  9337. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9338. //Check for CSU command of "Stop by EVSE"
  9339. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9340. {
  9341. //res->ResponseCode = FAILED_DIN70121;
  9342. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9343. }
  9344. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9345. {
  9346. //res->ResponseCode = FAILED_DIN70121;
  9347. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9348. errn = -1;
  9349. }
  9350. else if (ShmInternalComm->ChargingPermission == FALSE)
  9351. {
  9352. //res->ResponseCode = FAILED_DIN70121;
  9353. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9354. }
  9355. //STEP 4: ============ Encode and Send Response Message ===========
  9356. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9357. {
  9358. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PowerDeliveryStartRes][Error]Tx encoded msg error");
  9359. errn = -1;
  9360. }
  9361. //STEP 5: ============ Update Flags ===========
  9362. return errn;
  9363. }
  9364. /*===========================================================================
  9365. FUNCTION: Proc_iso1_PowerDeliveryStartRes
  9366. DESCRIPTION:
  9367. PRE-CONDITION:
  9368. INPUT:
  9369. OUTPUT:
  9370. GLOBAL VARIABLES:
  9371. =============================================================================*/
  9372. int Proc_iso1_PowerDeliveryStartRes(int AcceptFd)
  9373. {
  9374. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9375. //if it is not the same, the packet should be ignored.
  9376. //STEP 1: ============ Initialize ============
  9377. int i = 0;
  9378. int errn = 0;
  9379. bitstream_t v2g_tx_stream;
  9380. struct iso1PowerDeliveryResType *res;
  9381. struct ChargingInfoData *sys;
  9382. size_t pos = 0;
  9383. v2g_tx_stream.pos = &pos;
  9384. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9385. v2g_tx_stream.data = V2GTP_Tx_buf;
  9386. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  9387. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9388. res->ResponseCode = OK_ISO15118_2014;
  9389. //[HEADER] Check Req SessionID
  9390. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9391. {
  9392. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9393. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  9394. errn = -1;
  9395. }
  9396. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9397. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9398. #if PARAMETER_NORMAL_MODE == ENABLE
  9399. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9400. #else
  9401. Sudo_Parameter_iso1_PowerDeliveryRes();
  9402. #endif
  9403. //EVSE Status Code
  9404. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  9405. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9406. //Check for CSU command of "Stop by EVSE"
  9407. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9408. {
  9409. //res->ResponseCode = FAILED_ISO15118_2014;
  9410. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9411. }
  9412. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9413. {
  9414. //res->ResponseCode = FAILED_ISO15118_2014;
  9415. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9416. errn = -1;
  9417. }
  9418. else if (ShmInternalComm->ChargingPermission == FALSE)
  9419. {
  9420. //res->ResponseCode = FAILED_ISO15118_2014;
  9421. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9422. }
  9423. //STEP 4: ============ Encode and Send Response Message ===========
  9424. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9425. {
  9426. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PowerDeliveryStartRes][Error]Tx encoded msg error");
  9427. errn = -1;
  9428. }
  9429. //STEP 5: ============ Update Flags ===========
  9430. return errn;
  9431. }
  9432. /*===========================================================================
  9433. FUNCTION: Proc_din_PowerDeliveryStartReq
  9434. DESCRIPTION:
  9435. PRE-CONDITION:
  9436. INPUT:
  9437. OUTPUT:
  9438. GLOBAL VARIABLES:
  9439. =============================================================================*/
  9440. int Proc_din_PowerDeliveryStartReq(int AcceptFd)
  9441. {
  9442. int errn = 0;
  9443. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryStartReq");
  9444. //Print the decoded XML Document
  9445. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  9446. //Save into Share Memory
  9447. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9448. //Check for EV Error Code
  9449. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  9450. errn = Proc_din_PowerDeliveryStartRes(AcceptFd);
  9451. if (errn == 0)
  9452. {
  9453. //send response successfully.
  9454. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PowerDeliveryStartRes");
  9455. }
  9456. else
  9457. {
  9458. sprintf(buf_log_evcomm,
  9459. "[Error][Proc_din_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  9460. errn);
  9461. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9462. }
  9463. return errn;
  9464. }
  9465. /*===========================================================================
  9466. FUNCTION: Proc_iso1_PowerDeliveryStartReq
  9467. DESCRIPTION:
  9468. PRE-CONDITION:
  9469. INPUT:
  9470. OUTPUT:
  9471. GLOBAL VARIABLES:
  9472. =============================================================================*/
  9473. int Proc_iso1_PowerDeliveryStartReq(int AcceptFd)
  9474. {
  9475. int errn = 0;
  9476. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryStartReq");
  9477. //Print the decoded XML Document
  9478. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  9479. //Save into Share Memory
  9480. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9481. //Check for EV Error Code
  9482. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  9483. errn = Proc_iso1_PowerDeliveryStartRes(AcceptFd);
  9484. if (errn == 0)
  9485. {
  9486. //send response successfully.
  9487. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PowerDeliveryStartRes");
  9488. }
  9489. else
  9490. {
  9491. sprintf(buf_log_evcomm,
  9492. "[Error][Proc_iso1_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  9493. errn);
  9494. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9495. }
  9496. return errn;
  9497. }
  9498. /*===========================================================================
  9499. FUNCTION: SHM_Init_din_CurrentDemandRes
  9500. DESCRIPTION:
  9501. PRE-CONDITION:
  9502. INPUT:
  9503. 1. shm_ccs
  9504. OUTPUT:
  9505. 1. shm_ccs
  9506. GLOBAL VARIABLES:
  9507. =============================================================================*/
  9508. void SHM_Init_din_CurrentDemandRes(struct CcsData *shm_ccs)
  9509. {
  9510. struct CurrentDemandResponse_DIN70121 *in;
  9511. in = &shm_ccs->V2GMessage_DIN70121.CurrentDemandResponse;
  9512. //----- [BODY (1/10)] ResponseCode -----
  9513. in->ResponseCode = dinresponseCodeType_OK;
  9514. //----- [BODY (2/10)] DC_EVSEStatus -----
  9515. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  9516. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9517. short value = 0; int multiplier = 0; unsigned char unit = 0;
  9518. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  9519. value = 0; multiplier = 0; unit = V_DIN70121;
  9520. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  9521. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9522. //value = 600; multiplier = -1; unit = A_DIN70121; //60A, for test only.
  9523. value = 0; multiplier = 0; unit = A_DIN70121;
  9524. SHM_Save_dinPhysicalValueType(&in->EVSEPresentCurrent, value, multiplier, unit);
  9525. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9526. in->EVSECurrentLimitAchieved = FALSE;
  9527. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9528. in->EVSEVoltageLimitAchieved = FALSE;
  9529. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9530. in->EVSEPowerLimitAchieved = FALSE;
  9531. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9532. //value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  9533. value = 5000; multiplier = -1; unit = V_DIN70121; //500V
  9534. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumVoltageLimit, value, multiplier, unit);
  9535. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9536. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  9537. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumCurrentLimit, value, multiplier, unit);
  9538. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9539. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  9540. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumPowerLimit, value, multiplier, unit);
  9541. }
  9542. /*===========================================================================
  9543. FUNCTION: Sudo_Parameter_din_CurrentDemandRes
  9544. DESCRIPTION:
  9545. PRE-CONDITION:
  9546. INPUT:
  9547. OUTPUT:
  9548. GLOBAL VARIABLES:
  9549. =============================================================================*/
  9550. void Sudo_Parameter_din_CurrentDemandRes()
  9551. {
  9552. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  9553. init_dinCurrentDemandResType(&ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes);
  9554. ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  9555. //----- [BODY (1/10)] ResponseCode -----
  9556. struct dinCurrentDemandResType *res;
  9557. res = &ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes;
  9558. res->ResponseCode = dinresponseCodeType_OK;
  9559. //----- [BODY (2/10)] DC_EVSEStatus -----
  9560. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9561. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  9562. // dinisolationLevelType_Invalid = 0,
  9563. // dinisolationLevelType_Valid = 1,
  9564. // dinisolationLevelType_Warning = 2,
  9565. // dinisolationLevelType_Fault = 3
  9566. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9567. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9568. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  9569. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9570. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9571. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9572. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9573. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9574. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  9575. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  9576. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  9577. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  9578. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  9579. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9580. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  9581. // dinEVSENotificationType_None = 0,
  9582. // dinEVSENotificationType_StopCharging = 1,
  9583. // dinEVSENotificationType_ReNegotiation = 2
  9584. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9585. res->EVSEPresentVoltage.Value = 3820;
  9586. res->EVSEPresentVoltage.Multiplier = -1;
  9587. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  9588. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  9589. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9590. res->EVSEPresentCurrent.Value = 1200;
  9591. res->EVSEPresentCurrent.Multiplier = -1;
  9592. res->EVSEPresentCurrent.Unit_isUsed = 1u;
  9593. res->EVSEPresentCurrent.Unit = dinunitSymbolType_A;
  9594. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9595. res->EVSECurrentLimitAchieved = 0;
  9596. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9597. res->EVSEVoltageLimitAchieved = 0;
  9598. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9599. res->EVSEPowerLimitAchieved = 0;
  9600. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9601. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  9602. res->EVSEMaximumVoltageLimit.Value = 7500;
  9603. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  9604. res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  9605. res->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  9606. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9607. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  9608. res->EVSEMaximumCurrentLimit.Value = 1200;
  9609. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  9610. res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  9611. res->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  9612. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9613. res->EVSEMaximumPowerLimit_isUsed = 1u;
  9614. res->EVSEMaximumPowerLimit.Value = 6000;
  9615. res->EVSEMaximumPowerLimit.Multiplier = 1;
  9616. res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  9617. res->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  9618. }
  9619. /*===========================================================================
  9620. FUNCTION: Sudo_Parameter_iso1_CurrentDemandRes
  9621. DESCRIPTION:
  9622. PRE-CONDITION:
  9623. INPUT:
  9624. OUTPUT:
  9625. GLOBAL VARIABLES:
  9626. =============================================================================*/
  9627. void Sudo_Parameter_iso1_CurrentDemandRes()
  9628. {
  9629. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9630. init_iso1CurrentDemandResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes);
  9631. ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  9632. //----- [BODY (1/10)] ResponseCode -----
  9633. struct iso1CurrentDemandResType *res;
  9634. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes;
  9635. res->ResponseCode = iso1responseCodeType_OK;
  9636. //----- [BODY (2/10)] DC_EVSEStatus -----
  9637. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9638. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  9639. //iso1isolationLevelType_Invalid = 0,
  9640. //iso1isolationLevelType_Valid = 1,
  9641. //iso1isolationLevelType_Warning = 2,
  9642. //iso1isolationLevelType_Fault = 3,
  9643. //iso1isolationLevelType_No_IMD = 4
  9644. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9645. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9646. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  9647. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9648. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9649. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9650. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9651. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9652. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  9653. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  9654. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  9655. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  9656. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  9657. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9658. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9659. //iso1EVSENotificationType_None = 0,
  9660. //iso1EVSENotificationType_StopCharging = 1,
  9661. //iso1EVSENotificationType_ReNegotiation = 2
  9662. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9663. res->EVSEPresentVoltage.Value = 3820;
  9664. res->EVSEPresentVoltage.Multiplier = -1;
  9665. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  9666. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  9667. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9668. res->EVSEPresentCurrent.Value = 1200;
  9669. res->EVSEPresentCurrent.Multiplier = -1;
  9670. //res->EVSEPresentCurrent.Unit_isUsed = 1u;
  9671. res->EVSEPresentCurrent.Unit = iso1unitSymbolType_A;
  9672. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9673. res->EVSECurrentLimitAchieved = 0;
  9674. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9675. res->EVSEVoltageLimitAchieved = 0;
  9676. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9677. res->EVSEPowerLimitAchieved = 0;
  9678. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9679. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  9680. res->EVSEMaximumVoltageLimit.Value = 7500;
  9681. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  9682. //res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  9683. res->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  9684. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9685. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  9686. res->EVSEMaximumCurrentLimit.Value = 1200;
  9687. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  9688. //res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  9689. res->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  9690. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9691. res->EVSEMaximumPowerLimit_isUsed = 1u;
  9692. res->EVSEMaximumPowerLimit.Value = 6000;
  9693. res->EVSEMaximumPowerLimit.Multiplier = 1;
  9694. //res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  9695. res->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  9696. }
  9697. /*===========================================================================
  9698. FUNCTION: Sudo_Parameter_iso1_ChargingStatusRes
  9699. DESCRIPTION:
  9700. PRE-CONDITION:
  9701. INPUT:
  9702. OUTPUT:
  9703. GLOBAL VARIABLES:
  9704. =============================================================================*/
  9705. void Sudo_Parameter_iso1_ChargingStatusRes()
  9706. {
  9707. int i = 0;
  9708. struct iso1ChargingStatusResType *res;
  9709. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9710. init_iso1ChargingStatusResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes);
  9711. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes;
  9712. ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes_isUsed = 1u;
  9713. //----- [BODY (1/10)] ResponseCode -----
  9714. res->ResponseCode = OK_ISO15118_2014;
  9715. //----- [BODY (2/10)] AC_EVSEStatus -----
  9716. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9717. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  9718. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9719. // iso1EVSENotificationType_None = 0,
  9720. // iso1EVSENotificationType_StopCharging = 1,
  9721. // iso1EVSENotificationType_ReNegotiation = 2
  9722. //----- [BODY (3/10)] EVSEMaxCurrent -----
  9723. res->EVSEMaxCurrent_isUsed = 1u;
  9724. res->EVSEMaxCurrent.Value = 32;
  9725. res->EVSEMaxCurrent.Multiplier = 0;
  9726. res->EVSEMaxCurrent.Unit = iso1unitSymbolType_A;
  9727. //----- [BODY (4/10)] SAScheduleTupleID -----
  9728. res->SAScheduleTupleID = 0;
  9729. //----- [BODY (5/10)] EVSEID -----
  9730. res->EVSEID.charactersLen = 37;
  9731. memset(res->EVSEID.characters, 0, sizeof(res->EVSEID.characters));
  9732. //sprintf(res->EVSEID.characters, CCS_AC_EVSEID);
  9733. //----- [BODY (6/10)] MeterInfo -----
  9734. res->MeterInfo_isUsed = 1u;
  9735. memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  9736. memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  9737. //[MeterInfo][1/5] MeterID
  9738. //sprintf(res->MeterInfo.MeterID , CCS_AC_METER_ID);
  9739. //[MeterInfo][2/5] SigMeterReading (optional)
  9740. //sprintf(res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  9741. //[MeterInfo][3/5] MeterStatus (optional)
  9742. res->MeterInfo.MeterStatus = 0;
  9743. //[MeterInfo][4/5] MeterReading (optional)
  9744. res->MeterInfo.MeterReading = 12345;
  9745. //[MeterInfo][5/5] TMeter (optional)
  9746. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  9747. //----- [BODY (7/10)] ReceiptRequired -----
  9748. res->ReceiptRequired_isUsed = 1u;
  9749. res->ReceiptRequired = FALSE; //optional
  9750. }
  9751. /*===========================================================================
  9752. FUNCTION: Check_EVErrorCode
  9753. DESCRIPTION:
  9754. PRE-CONDITION:
  9755. INPUT:
  9756. OUTPUT:
  9757. GLOBAL VARIABLES:
  9758. =============================================================================*/
  9759. void Check_EVErrorCode(int code)
  9760. {
  9761. struct ChargingInfoData *sys;
  9762. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9763. if (code != NO_ERROR) //NO_ERROR = 0
  9764. {
  9765. //Asking CSU to Stop
  9766. switch (code)
  9767. {
  9768. /*case dinDC_EVErrorCodeType_NO_ERROR: // = 0,
  9769. {
  9770. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(NO_ERROR)");
  9771. break;
  9772. }*/
  9773. case dinDC_EVErrorCodeType_FAILED_RESSTemperatureInhibit: // = 1,
  9774. { //023737
  9775. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9776. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9777. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9778. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9779. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9780. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  9781. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_RESSTemperatureInhibit)");
  9782. break;
  9783. }
  9784. case dinDC_EVErrorCodeType_FAILED_EVShiftPosition: // = 2,
  9785. {//023738
  9786. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9787. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9788. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9789. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9790. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9791. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9792. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_EVShiftPosition)");
  9793. break;
  9794. }
  9795. case dinDC_EVErrorCodeType_FAILED_ChargerConnectorLockFault: // = 3,
  9796. {
  9797. //023739
  9798. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9799. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9800. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9801. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9802. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9803. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9804. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(ChargerConnectorLockFault)");
  9805. break;
  9806. }
  9807. case dinDC_EVErrorCodeType_FAILED_EVRESSMalfunction: // = 4,
  9808. {
  9809. //023740
  9810. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9811. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9812. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9813. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9814. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9815. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  9816. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_EVRESSMalfunction)");
  9817. break;
  9818. }
  9819. case dinDC_EVErrorCodeType_FAILED_ChargingCurrentdifferential: // = 5,
  9820. {
  9821. //023741
  9822. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9823. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9824. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9825. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9826. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9827. ShmStatusCodeData->PresentStatusCode[0][5] = 1;
  9828. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingCurrentdifferential)");
  9829. break;
  9830. }
  9831. case dinDC_EVErrorCodeType_FAILED_ChargingVoltageOutOfRange: // = 6,
  9832. {
  9833. //023742
  9834. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9835. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9836. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9837. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9838. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9839. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  9840. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingVoltageOutOfRange)");
  9841. break;
  9842. }
  9843. case dinDC_EVErrorCodeType_Reserved_A: // = 7,
  9844. {
  9845. //023983
  9846. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9847. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9848. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9849. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9850. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9851. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9852. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_A)");
  9853. break;
  9854. }
  9855. case dinDC_EVErrorCodeType_Reserved_B: // = 8,
  9856. {
  9857. //023983
  9858. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9859. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9860. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9861. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9862. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9863. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9864. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_B)");
  9865. break;
  9866. }
  9867. case dinDC_EVErrorCodeType_Reserved_C: // = 9,
  9868. {
  9869. //023983
  9870. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9871. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9872. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9873. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9874. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9875. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9876. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_C)");
  9877. break;
  9878. }
  9879. case dinDC_EVErrorCodeType_FAILED_ChargingSystemIncompatibility:// = 10,
  9880. {
  9881. //023743
  9882. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9883. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9884. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9885. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9886. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9887. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9888. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingSystemIncompatibility)");
  9889. break;
  9890. }
  9891. case dinDC_EVErrorCodeType_NoData: // = 11
  9892. {
  9893. //023746
  9894. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9895. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9896. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9897. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9898. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9899. ShmStatusCodeData->PresentStatusCode[0][5] = 6;
  9900. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(NoData)");
  9901. break;
  9902. }
  9903. default:
  9904. {
  9905. if(sys->EvBatterySoc==100)
  9906. {
  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] = 7;
  9912. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9913. }
  9914. else
  9915. {
  9916. //023983
  9917. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9918. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9919. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9920. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9921. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9922. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9923. }
  9924. DEBUG_PRINTF_EXI_ENGINE_DETAIL("([WARNING] Unexpected din EVErrorCode)");
  9925. break;
  9926. }
  9927. }
  9928. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9929. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9930. //Update_V2G_Flow_Status(Other_Fault);
  9931. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  9932. sprintf(buf_log_evcomm,
  9933. "Stop by EV (EVErrorCode = %d (DEC))",
  9934. code);
  9935. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9936. }
  9937. else
  9938. {
  9939. if(Check_V2G_Flow_Status()>=49)
  9940. {
  9941. if((sys->EvBatterySoc==100)||(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.ChargingComplete))
  9942. {
  9943. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9944. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9945. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9946. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9947. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9948. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9949. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  9950. sprintf(buf_log_evcomm,
  9951. "Check_EVErrorCode => Stop by EV (EVErrorCode = %d (023979))",
  9952. code);
  9953. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9954. }
  9955. else if(ShmStatusCodeData->PresentStatusCode[0][1] ==0)
  9956. {
  9957. if(!( (ShmInternalComm->ChargingPermission == FALSE)||
  9958. (sys->DC_EVSEStatus == EVSE_Shutdown)||
  9959. (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)))
  9960. {
  9961. //023983
  9962. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9963. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9964. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9965. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9966. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9967. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9968. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9969. sprintf(buf_log_evcomm,
  9970. "Check_EVErrorCode => Stop by EV (EVErrorCode = %d (023983))",
  9971. code);
  9972. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9973. }
  9974. }
  9975. }
  9976. }
  9977. }
  9978. /*===========================================================================
  9979. FUNCTION: Proc_din_CurrentDemandRes
  9980. DESCRIPTION:
  9981. PRE-CONDITION:
  9982. INPUT:
  9983. OUTPUT:
  9984. GLOBAL VARIABLES:
  9985. =============================================================================*/
  9986. int Proc_din_CurrentDemandRes(int AcceptFd)
  9987. {
  9988. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9989. //if it is not the same, the packet should be ignored.
  9990. //STEP 1: ============ Initialize ============
  9991. int i = 0;
  9992. int errn = 0;
  9993. bitstream_t v2g_tx_stream;
  9994. static struct CurrentDemandResponse_DIN70121 *cur;
  9995. static struct ChargingInfoData *sys;
  9996. static int EVSE_max_current;
  9997. int tmp = 0;
  9998. size_t pos = 0;
  9999. v2g_tx_stream.pos = &pos;
  10000. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10001. v2g_tx_stream.data = V2GTP_Tx_buf;
  10002. cur = &ShmCcsData->V2GMessage_DIN70121.CurrentDemandResponse;
  10003. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10004. cur->ResponseCode = OK_DIN70121;
  10005. //EVSE Status Code
  10006. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10007. //[HEADER] Check Req SessionID
  10008. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10009. {
  10010. cur->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10011. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10012. errn = -1;
  10013. }
  10014. //Check for SequenceError
  10015. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10016. {
  10017. cur->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10018. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10019. errn = -1;
  10020. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10021. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10022. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10023. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10024. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10025. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10026. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10027. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10028. }
  10029. //Check for negative EvBatteryMaxCurrent
  10030. if (sys->EvBatteryMaxCurrent < 0)
  10031. {
  10032. sprintf(buf_log_evcomm,
  10033. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  10034. sys->EvBatteryMaxCurrent);
  10035. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10036. cur->DC_EVSEStatus.EVSEStatusCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  10037. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10038. errn = -1;
  10039. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10040. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  10041. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10042. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10043. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10044. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10045. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  10046. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  10047. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10048. }
  10049. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10050. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_DIN70121);
  10051. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  10052. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  10053. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  10054. #endif
  10055. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  10056. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  10057. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  10058. if (sys->EvBatteryMaxVoltage <= 500)
  10059. {
  10060. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  10061. }
  10062. #endif
  10063. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  10064. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  10065. {
  10066. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  10067. //[To-Do] Limit is achieved flag
  10068. }
  10069. //Isolation Status
  10070. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  10071. {
  10072. #if 0
  10073. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  10074. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10075. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10076. sprintf(buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  10077. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10078. //Update_V2G_Flow_Status(Other_Fault);
  10079. //errn = -1;
  10080. #else
  10081. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10082. #endif
  10083. }
  10084. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10085. {
  10086. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10087. }
  10088. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10089. {
  10090. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10091. }
  10092. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10093. {
  10094. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10095. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10096. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10097. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_CurrentDemandRes]GFD_Fault => Emergency Shutdown");
  10098. Update_V2G_Flow_Status(Other_Fault);
  10099. errn = -1;
  10100. }
  10101. else //GFD_No_IMD or other unexpected status
  10102. {
  10103. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10104. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10105. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10106. sprintf(buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10107. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10108. Update_V2G_Flow_Status(Other_Fault);
  10109. errn = -1;
  10110. }
  10111. //For testing with Tesla Model 3
  10112. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  10113. //[CAUTION][To-Do] Decresement of Current is not implemented.
  10114. //SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, 10, A_DIN70121);
  10115. if (sys->EvBatterytargetCurrent <= 0)
  10116. {
  10117. EVSE_max_current = 50; //10A
  10118. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  10119. /*
  10120. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10121. sys->PresentChargingCurrent,
  10122. sys->EvBatterytargetCurrent,
  10123. EVSE_max_current,
  10124. cur->EVSEMaximumCurrentLimit.Value
  10125. );
  10126. */
  10127. }
  10128. else //1A
  10129. {
  10130. /*
  10131. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10132. sys->PresentChargingCurrent,
  10133. sys->EvBatterytargetCurrent,
  10134. EVSE_max_current,
  10135. cur->EVSEMaximumCurrentLimit.Value
  10136. );
  10137. */
  10138. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  10139. {
  10140. tmp = EVSE_max_current + 50; //10A
  10141. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  10142. {
  10143. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  10144. EVSE_max_current = tmp;
  10145. }
  10146. else
  10147. {
  10148. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  10149. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  10150. }
  10151. }
  10152. }
  10153. #endif
  10154. //Check for CSU command of "Stop by EVSE"
  10155. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10156. {
  10157. //Check for Alarm Code: CCS GFD trip (012235)
  10158. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10159. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10160. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10161. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10162. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10163. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10164. {
  10165. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  10166. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  10167. }
  10168. else
  10169. {
  10170. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE_Shutdown");
  10171. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10172. }
  10173. //cur->ResponseCode = FAILED_DIN70121;
  10174. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10175. //errn = -1;
  10176. }
  10177. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10178. {
  10179. //Check for Alarm Code: CCS GFD trip (012235)
  10180. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10181. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10182. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10183. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10184. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10185. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10186. {
  10187. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  10188. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  10189. }
  10190. else
  10191. {
  10192. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  10193. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10194. }
  10195. //cur->ResponseCode = FAILED_DIN70121;
  10196. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10197. errn = -1;
  10198. }
  10199. else if (ShmInternalComm->ChargingPermission == FALSE)
  10200. {
  10201. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]Permission OFF");
  10202. //cur->ResponseCode = FAILED_DIN70121;
  10203. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10204. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10205. //errn = -1;
  10206. }
  10207. else
  10208. {
  10209. //null
  10210. }
  10211. //Response to CP Error
  10212. #if CP_PROTECTION_MECHANISM == ENABLE
  10213. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10214. {
  10215. if(sys->CpState <= 1)
  10216. {
  10217. cur->ResponseCode = FAILED_DIN70121;
  10218. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10219. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10220. Update_V2G_Flow_Status(Other_Fault);
  10221. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10222. //CCS_SECC_CP_State_Error (023889)
  10223. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10224. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10225. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10226. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10227. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10228. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10229. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10230. sprintf(buf_log_evcomm,
  10231. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  10232. sys->CpState,
  10233. sys->CpVoltage);
  10234. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10235. }
  10236. else
  10237. {
  10238. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE Normal Stop");
  10239. //cur->ResponseCode = FAILED_DIN70121;
  10240. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10241. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10242. //errn = -1;
  10243. }
  10244. }
  10245. #endif
  10246. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10247. #if PARAMETER_NORMAL_MODE == ENABLE
  10248. SHM_Read_din_CurrentDemandRes(&ccs_exi_doc_DIN, ShmCcsData);
  10249. #else
  10250. Sudo_Parameter_din_CurrentDemandRes();
  10251. #endif
  10252. //STEP 4: ============ Encode and Send Response Message ===========
  10253. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10254. {
  10255. errn = -1;
  10256. }
  10257. //STEP 5: ============ Update Flags ===========
  10258. return errn;
  10259. }
  10260. /*===========================================================================
  10261. FUNCTION: Proc_iso1_CurrentDemandRes
  10262. DESCRIPTION:
  10263. PRE-CONDITION:
  10264. INPUT:
  10265. OUTPUT:
  10266. GLOBAL VARIABLES:
  10267. =============================================================================*/
  10268. int Proc_iso1_CurrentDemandRes(int AcceptFd)
  10269. {
  10270. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10271. //if it is not the same, the packet should be ignored.
  10272. //STEP 1: ============ Initialize ============
  10273. int i = 0;
  10274. int errn = 0;
  10275. bitstream_t v2g_tx_stream;
  10276. static struct CurrentDemandResponse_ISO15118_2014 *cur;
  10277. static struct ChargingInfoData *sys;
  10278. static int EVSE_max_current;
  10279. int tmp = 0;
  10280. size_t pos = 0;
  10281. v2g_tx_stream.pos = &pos;
  10282. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10283. v2g_tx_stream.data = V2GTP_Tx_buf;
  10284. cur = &ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandResponse;
  10285. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10286. cur->ResponseCode = OK_ISO15118_2014;
  10287. //EVSE Status Code
  10288. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10289. //[HEADER] Check Req SessionID
  10290. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10291. {
  10292. cur->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10293. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10294. errn = -1;
  10295. }
  10296. //Check for SequenceError
  10297. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10298. {
  10299. cur->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10300. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10301. errn = -1;
  10302. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10303. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10304. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10305. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10306. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10307. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10308. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10309. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10310. }
  10311. //Check for negative EvBatteryMaxCurrent
  10312. if (sys->EvBatteryMaxCurrent < 0)
  10313. {
  10314. sprintf(buf_log_evcomm,
  10315. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  10316. sys->EvBatteryMaxCurrent);
  10317. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10318. cur->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  10319. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10320. errn = -1;
  10321. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10322. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  10323. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10324. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10325. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10326. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10327. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  10328. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  10329. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10330. }
  10331. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10332. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_ISO15118_2014);
  10333. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  10334. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  10335. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  10336. #endif
  10337. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  10338. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  10339. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  10340. if (sys->EvBatteryMaxVoltage <= 500)
  10341. {
  10342. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  10343. }
  10344. #endif
  10345. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  10346. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  10347. {
  10348. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  10349. //[To-Do] Limit is achieved flag
  10350. }
  10351. //Isolation Status
  10352. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  10353. {
  10354. #if 0
  10355. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  10356. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10357. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10358. sprintf(buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  10359. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10360. // Update_V2G_Flow_Status(Other_Fault);
  10361. //errn = -1;
  10362. #else
  10363. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10364. #endif
  10365. }
  10366. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10367. {
  10368. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10369. }
  10370. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10371. {
  10372. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //2
  10373. }
  10374. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10375. {
  10376. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10377. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10378. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10379. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_CurrentDemandRes]GFD_Fault => EmergencyShutdown");
  10380. Update_V2G_Flow_Status(Other_Fault);
  10381. errn = -1;
  10382. }
  10383. else
  10384. {
  10385. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10386. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10387. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10388. sprintf(buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10389. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10390. Update_V2G_Flow_Status(Other_Fault);
  10391. errn = -1;
  10392. }
  10393. //For testing with Tesla Model 3
  10394. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  10395. //[CAUTION][To-Do] Decresement of Current is not implemented.
  10396. //SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, 10, A_ISO15118_2014);
  10397. if (sys->EvBatterytargetCurrent <= 0)
  10398. {
  10399. EVSE_max_current = 50; //10A
  10400. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  10401. /*
  10402. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10403. sys->PresentChargingCurrent,
  10404. sys->EvBatterytargetCurrent,
  10405. EVSE_max_current,
  10406. cur->EVSEMaximumCurrentLimit.Value
  10407. );
  10408. */
  10409. }
  10410. else //1A
  10411. {
  10412. /*
  10413. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10414. sys->PresentChargingCurrent,
  10415. sys->EvBatterytargetCurrent,
  10416. EVSE_max_current,
  10417. cur->EVSEMaximumCurrentLimit.Value
  10418. );
  10419. */
  10420. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  10421. {
  10422. tmp = EVSE_max_current + 50; //10A
  10423. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  10424. {
  10425. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  10426. EVSE_max_current = tmp;
  10427. }
  10428. else
  10429. {
  10430. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  10431. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  10432. }
  10433. }
  10434. }
  10435. #endif
  10436. //Check for CSU command of "Stop by EVSE"
  10437. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10438. {
  10439. //Check for Alarm Code: CCS GFD trip (012235)
  10440. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10441. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10442. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10443. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10444. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10445. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10446. {
  10447. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  10448. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  10449. }
  10450. else
  10451. {
  10452. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE_Shutdown");
  10453. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10454. }
  10455. //cur->ResponseCode = FAILED_ISO15118_2014;
  10456. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10457. //errn = -1;
  10458. }
  10459. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10460. {
  10461. //Check for Alarm Code: CCS GFD trip (012235)
  10462. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10463. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10464. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10465. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10466. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10467. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10468. {
  10469. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  10470. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  10471. }
  10472. else
  10473. {
  10474. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  10475. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10476. }
  10477. //cur->ResponseCode = FAILED_ISO15118_2014;
  10478. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10479. errn = -1;
  10480. }
  10481. else if (ShmInternalComm->ChargingPermission == FALSE)
  10482. {
  10483. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]Permission OFF");
  10484. //cur->ResponseCode = FAILED_ISO15118_2014;
  10485. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10486. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10487. //errn = -1;
  10488. }
  10489. else
  10490. {
  10491. //null
  10492. }
  10493. //Response to CP Error
  10494. #if CP_PROTECTION_MECHANISM == ENABLE
  10495. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10496. {
  10497. if(sys->CpState <= 1)
  10498. {
  10499. cur->ResponseCode = FAILED_ISO15118_2014;
  10500. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10501. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10502. Update_V2G_Flow_Status(Other_Fault);
  10503. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10504. //CCS_SECC_CP_State_Error (023889)
  10505. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10506. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10507. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10508. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10509. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10510. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10511. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10512. sprintf(buf_log_evcomm,
  10513. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  10514. sys->CpState,
  10515. sys->CpVoltage);
  10516. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10517. }
  10518. else
  10519. {
  10520. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE Normal Stop");
  10521. //cur->ResponseCode = FAILED_ISO15118_2014;
  10522. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10523. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10524. }
  10525. }
  10526. #endif
  10527. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10528. #if PARAMETER_NORMAL_MODE == ENABLE
  10529. SHM_Read_iso1_CurrentDemandRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10530. #else
  10531. Sudo_Parameter_iso1_CurrentDemandRes();
  10532. #endif
  10533. //STEP 4: ============ Encode and Send Response Message ===========
  10534. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10535. {
  10536. errn = -1;
  10537. }
  10538. //STEP 5: ============ Update Flags ===========
  10539. return errn;
  10540. }
  10541. /*===========================================================================
  10542. FUNCTION: Proc_iso1_ChargingStatusRes
  10543. DESCRIPTION:
  10544. PRE-CONDITION:
  10545. INPUT:
  10546. OUTPUT:
  10547. GLOBAL VARIABLES:
  10548. =============================================================================*/
  10549. int Proc_iso1_ChargingStatusRes(int AcceptFd)
  10550. {
  10551. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10552. //if it is not the same, the packet should be ignored.
  10553. //STEP 1: ============ Initialize ============
  10554. int i = 0;
  10555. int errn = 0;
  10556. bitstream_t v2g_tx_stream;
  10557. static struct ChargingStatusResponse_ISO15118_2014 *res;
  10558. static struct ChargingInfoData *sys;
  10559. size_t pos = 0;
  10560. v2g_tx_stream.pos = &pos;
  10561. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10562. v2g_tx_stream.data = V2GTP_Tx_buf;
  10563. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargingStatusResponse;
  10564. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10565. //Init
  10566. res->ResponseCode = OK_ISO15118_2014;
  10567. res->ReceiptRequired = FALSE; //optional
  10568. res->SAScheduleTupleID = 1;
  10569. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  10570. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  10571. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  10572. // iso1EVSENotificationType_None = 0,
  10573. // iso1EVSENotificationType_StopCharging = 1,
  10574. // iso1EVSENotificationType_ReNegotiation = 2
  10575. //[HEADER] Check Req SessionID
  10576. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10577. {
  10578. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10579. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10580. errn = -1;
  10581. }
  10582. //Check for SequenceError
  10583. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10584. {
  10585. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10586. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10587. errn = -1;
  10588. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10589. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10590. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10591. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10592. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10593. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10594. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10595. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10596. }
  10597. //EVSE ID
  10598. memset(res->EVSEID, 0, sizeof(res->EVSEID));
  10599. res->EVSEID[0]='Z';
  10600. res->EVSEID[1]='Z';
  10601. res->EVSEID[2]='0';
  10602. res->EVSEID[3]='0';
  10603. res->EVSEID[4]='0';
  10604. res->EVSEID[5]='0';
  10605. res->EVSEID[6]='0';
  10606. //sprintf(res->EVSEID, CCS_AC_EVSEID);
  10607. //[MeterInfo][0/5] init
  10608. //memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  10609. //memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  10610. //[MeterInfo][1/5] MeterID
  10611. strcpy(res->MeterInfo.MeterID , ShmSysConfigAndInfo->SysConfig.SerialNumber);
  10612. //[MeterInfo][2/5] SigMeterReading (optional)
  10613. //sprintf(res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  10614. //[MeterInfo][3/5] MeterStatus (optional)
  10615. res->MeterInfo.MeterStatus = 1;
  10616. //[MeterInfo][4/5] MeterReading (optional)
  10617. res->MeterInfo.MeterReading = ShmInternalComm->AC_MeterReadingValue;//Wh
  10618. //[MeterInfo][5/5] TMeter (optional)
  10619. res->MeterInfo.TMeter = time(NULL); //Unix Time Stamp format
  10620. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10621. SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  10622. //Isolation Status (RCD)
  10623. if (ShmInternalComm->AC_RcdStatus == 1) //RCD tripped,Isolation is invalid
  10624. {
  10625. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  10626. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10627. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10628. sprintf(buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d", sys->IsolationStatus);
  10629. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10630. Update_V2G_Flow_Status(Other_Fault);
  10631. errn = -1;
  10632. }
  10633. if (ShmInternalComm->ChargingPermission == FALSE)
  10634. {
  10635. //res->ResponseCode = FAILED_ISO15118_2014;
  10636. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10637. sprintf(buf_log_evcomm, "[ISO1][ChargingStatusRes]ChargingPermission = FALSE");
  10638. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10639. //errn = -1;
  10640. }
  10641. //Response to CP Error
  10642. //#if CP_PROTECTION_MECHANISM == ENABLE
  10643. #if 1
  10644. // if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10645. if ((sys->CpState < 3) || (sys->CpState > 5)) //State C (6V), D (3V)
  10646. {
  10647. res->ResponseCode = FAILED_ISO15118_2014;
  10648. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10649. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10650. Update_V2G_Flow_Status(Other_Fault);
  10651. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10652. //CCS_SECC_CP_State_Error (023889)
  10653. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10654. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10655. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10656. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10657. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10658. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10659. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10660. sprintf(buf_log_evcomm,
  10661. "[ChargingStatus]Emergency Stop by CP Error (%d, %.02f V)",
  10662. sys->CpState,
  10663. sys->CpVoltage);
  10664. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10665. }
  10666. #endif
  10667. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10668. #if PARAMETER_NORMAL_MODE == ENABLE
  10669. SHM_Read_iso1_ChargingStatusRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10670. #else
  10671. Sudo_Parameter_iso1_ChargingStatusRes();
  10672. #endif
  10673. //STEP 4: ============ Encode and Send Response Message ===========
  10674. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10675. {
  10676. errn = -1;
  10677. }
  10678. //STEP 5: ============ Update Flags ===========
  10679. return errn;
  10680. }
  10681. /*===========================================================================
  10682. FUNCTION: Proc_din_CurrentDemandReq
  10683. DESCRIPTION:
  10684. PRE-CONDITION:
  10685. INPUT:
  10686. OUTPUT:
  10687. GLOBAL VARIABLES:
  10688. =============================================================================*/
  10689. int Proc_din_CurrentDemandReq(int AcceptFd)
  10690. {
  10691. int errn = 0;
  10692. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CurrentDemandReq] Got CurrentDemandReq\n");
  10693. //Print the decoded XML Document
  10694. PRINT_XML_DOC_DIN_CurrentDemandReq(&ccs_exi_doc_DIN);
  10695. //Save into Share Memory
  10696. SHM_Save_din_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10697. //Check for EV Error Code
  10698. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  10699. errn = Proc_din_CurrentDemandRes(AcceptFd);
  10700. if (errn == 0)
  10701. {
  10702. //Response is sent successfully.
  10703. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]CurrentDemandRes");
  10704. }
  10705. else
  10706. {
  10707. sprintf(buf_log_evcomm,
  10708. "[DIN][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  10709. errn);
  10710. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10711. }
  10712. return errn;
  10713. }
  10714. /*===========================================================================
  10715. FUNCTION: Proc_iso1_CurrentDemandReq
  10716. DESCRIPTION:
  10717. PRE-CONDITION:
  10718. INPUT:
  10719. OUTPUT:
  10720. GLOBAL VARIABLES:
  10721. =============================================================================*/
  10722. int Proc_iso1_CurrentDemandReq(int AcceptFd)
  10723. {
  10724. int errn = 0;
  10725. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CurrentDemandReq] Got CurrentDemandReq\n");
  10726. //Print the decoded XML Document
  10727. PRINT_XML_DOC_ISO1_CurrentDemandReq(&ccs_exi_doc_ISO1);
  10728. //Save into Share Memory
  10729. SHM_Save_iso1_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10730. //Check for EV Error Code
  10731. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  10732. errn = Proc_iso1_CurrentDemandRes(AcceptFd);
  10733. if (errn == 0)
  10734. {
  10735. //Response is sent successfully.
  10736. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]CurrentDemandRes");
  10737. }
  10738. else
  10739. {
  10740. sprintf(buf_log_evcomm,
  10741. "[ISO1][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  10742. errn);
  10743. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10744. }
  10745. return errn;
  10746. }
  10747. /*===========================================================================
  10748. FUNCTION: Proc_iso1_ChargingStatusReq
  10749. DESCRIPTION:
  10750. PRE-CONDITION:
  10751. INPUT:
  10752. OUTPUT:
  10753. GLOBAL VARIABLES:
  10754. =============================================================================*/
  10755. int Proc_iso1_ChargingStatusReq(int AcceptFd)
  10756. {
  10757. int errn = 0;
  10758. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargingStatusReq] Got ChargingStatusReq\n");
  10759. //Print the decoded XML Document
  10760. PRINT_XML_DOC_ISO1_ChargingStatusReq(&ccs_exi_doc_ISO1);
  10761. //Save into Share Memory
  10762. SHM_Save_iso1_ChargingStatusReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10763. //Check for EV Error Code
  10764. //no content in ISO1
  10765. errn = Proc_iso1_ChargingStatusRes(AcceptFd);
  10766. if (errn == 0)
  10767. {
  10768. //Response is sent successfully.
  10769. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ChargingStatusRes");
  10770. }
  10771. else
  10772. {
  10773. sprintf(buf_log_evcomm,
  10774. "[ISO1][Error][ChargingStatusReq]ChargingStatusRes: fail(%d,DEC)",
  10775. errn);
  10776. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10777. }
  10778. return errn;
  10779. }
  10780. /*===========================================================================
  10781. FUNCTION: Proc_din_PowerDeliveryStopRes
  10782. DESCRIPTION:
  10783. PRE-CONDITION:
  10784. INPUT:
  10785. OUTPUT:
  10786. GLOBAL VARIABLES:
  10787. =============================================================================*/
  10788. int Proc_din_PowerDeliveryStopRes(int AcceptFd)
  10789. {
  10790. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10791. //if it is not the same, the packet should be ignored.
  10792. //STEP 1: ============ Initialize ============
  10793. int i = 0;
  10794. int errn = 0;
  10795. bitstream_t v2g_tx_stream;
  10796. struct dinPowerDeliveryResType *res;
  10797. struct ChargingInfoData *sys;
  10798. size_t pos = 0;
  10799. v2g_tx_stream.pos = &pos;
  10800. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10801. v2g_tx_stream.data = V2GTP_Tx_buf;
  10802. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  10803. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10804. res->ResponseCode = OK_DIN70121;
  10805. //[HEADER] Check Req SessionID
  10806. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10807. {
  10808. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10809. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10810. errn = -1;
  10811. }
  10812. //Check for SequenceError
  10813. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10814. {
  10815. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10816. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10817. errn = -1;
  10818. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10819. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10820. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10821. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10822. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10823. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10824. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10825. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10826. }
  10827. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10828. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10829. #if PARAMETER_NORMAL_MODE == ENABLE
  10830. ShmCcsData->V2GMessage_DIN70121.PowerDeliveryResponse.DC_EVSEStatus.EVSEStatusCode = EVSE_NotReady;
  10831. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  10832. #else
  10833. Sudo_Parameter_din_PreChargeRes();
  10834. #endif
  10835. //EVSE Status Code
  10836. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10837. //Check for CSU command of "Stop by EVSE"
  10838. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10839. {
  10840. //res->ResponseCode = FAILED_DIN70121;
  10841. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10842. }
  10843. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10844. {
  10845. //res->ResponseCode = FAILED_DIN70121;
  10846. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10847. errn = -1;
  10848. }
  10849. else if (ShmInternalComm->ChargingPermission == FALSE)
  10850. {
  10851. //res->ResponseCode = FAILED_DIN70121;
  10852. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10853. }
  10854. //STEP 4: ============ Encode and Send Response Message ===========
  10855. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10856. {
  10857. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PowerDeliveryStopRes][Error]Tx encoded msg error");
  10858. errn = -1;
  10859. }
  10860. //STEP 5: ============ Update Flags ===========
  10861. return errn;
  10862. }
  10863. /*===========================================================================
  10864. FUNCTION: Proc_iso1_PowerDeliveryStopRes
  10865. DESCRIPTION:
  10866. PRE-CONDITION:
  10867. INPUT:
  10868. OUTPUT:
  10869. GLOBAL VARIABLES:
  10870. =============================================================================*/
  10871. int Proc_iso1_PowerDeliveryStopRes(int AcceptFd)
  10872. {
  10873. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10874. //if it is not the same, the packet should be ignored.
  10875. //STEP 1: ============ Initialize ============
  10876. int i = 0;
  10877. int errn = 0;
  10878. bitstream_t v2g_tx_stream;
  10879. struct iso1PowerDeliveryResType *res;
  10880. struct ChargingInfoData *sys;
  10881. size_t pos = 0;
  10882. v2g_tx_stream.pos = &pos;
  10883. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10884. v2g_tx_stream.data = V2GTP_Tx_buf;
  10885. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  10886. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10887. res->ResponseCode = OK_ISO15118_2014;
  10888. //[HEADER] Check Req SessionID
  10889. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10890. {
  10891. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10892. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10893. errn = -1;
  10894. }
  10895. //Check for SequenceError
  10896. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10897. {
  10898. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10899. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10900. errn = -1;
  10901. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10902. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10903. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10904. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10905. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10906. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10907. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10908. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10909. }
  10910. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10911. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10912. #if PARAMETER_NORMAL_MODE == ENABLE
  10913. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  10914. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryResponse.DC_EVSEStatus.DC_EVSEStatusCode = EVSE_NotReady;
  10915. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10916. #else
  10917. Sudo_Parameter_iso1_PreChargeRes();
  10918. #endif
  10919. //EVSE Status Code
  10920. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10921. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1 /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10922. //Check for CSU command of "Stop by EVSE"
  10923. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10924. {
  10925. //res->ResponseCode = FAILED_ISO15118_2014;
  10926. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10927. }
  10928. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10929. {
  10930. //res->ResponseCode = FAILED_ISO15118_2014;
  10931. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10932. errn = -1;
  10933. }
  10934. else if (ShmInternalComm->ChargingPermission == FALSE)
  10935. {
  10936. //res->ResponseCode = FAILED_ISO15118_2014;
  10937. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10938. }
  10939. //STEP 4: ============ Encode and Send Response Message ===========
  10940. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10941. {
  10942. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PowerDeliveryStopRes][Error]Tx encoded msg error");
  10943. errn = -1;
  10944. }
  10945. //STEP 5: ============ Update Flags ===========
  10946. return errn;
  10947. }
  10948. /*===========================================================================
  10949. FUNCTION: Proc_din_PowerDeliveryStopReq
  10950. DESCRIPTION:
  10951. PRE-CONDITION:
  10952. INPUT:
  10953. OUTPUT:
  10954. GLOBAL VARIABLES:
  10955. =============================================================================*/
  10956. int Proc_din_PowerDeliveryStopReq(int AcceptFd)
  10957. {
  10958. int errn = 0;
  10959. struct ChargingInfoData *sys;
  10960. //Request CSU to STOP
  10961. //This should be reponsed as soon as possible once this message is received.
  10962. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10963. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  10964. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  10965. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd)\n");
  10966. //Print the decoded XML Document
  10967. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  10968. //Save into Share Memory
  10969. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10970. //Check for EV Error Code
  10971. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  10972. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10973. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  10974. usleep(1500000); //1.5 seconds
  10975. //sleep(1); //1 second
  10976. errn = Proc_din_PowerDeliveryStopRes(AcceptFd);
  10977. if (errn == 0)
  10978. {
  10979. //send response successfully.
  10980. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PowerDeliveryRes (2nd)\n");
  10981. }
  10982. else
  10983. {
  10984. sprintf(buf_log_evcomm,
  10985. "[Error][SeccComm][Proc_din_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  10986. errn);
  10987. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10988. }
  10989. return errn;
  10990. }
  10991. /*===========================================================================
  10992. FUNCTION: Proc_iso1_PowerDeliveryStopReq
  10993. DESCRIPTION:
  10994. PRE-CONDITION:
  10995. INPUT:
  10996. OUTPUT:
  10997. GLOBAL VARIABLES:
  10998. =============================================================================*/
  10999. int Proc_iso1_PowerDeliveryStopReq(int AcceptFd)
  11000. {
  11001. int errn = 0;
  11002. struct ChargingInfoData *sys;
  11003. //Request CSU to STOP
  11004. //This should be reponsed as soon as possible once this message is received.
  11005. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11006. //Print the decoded XML Document
  11007. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  11008. //Save into Share Memory
  11009. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11010. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  11011. {
  11012. //CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11013. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  11014. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  11015. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11016. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd-Stop)\n");
  11017. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  11018. usleep(1500000); //1.5 seconds
  11019. //sleep(1); //1 second
  11020. }
  11021. else
  11022. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd-Renegotiation)\n");
  11023. //Check for EV Error Code
  11024. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  11025. errn = Proc_iso1_PowerDeliveryStopRes(AcceptFd);
  11026. if (errn == 0)
  11027. {
  11028. //send response successfully.
  11029. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PowerDeliveryRes (2nd-stop)");
  11030. }
  11031. else
  11032. {
  11033. sprintf(buf_log_evcomm,
  11034. "[Error][SeccComm][Proc_iso1_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  11035. errn);
  11036. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11037. }
  11038. return errn;
  11039. }
  11040. /*===========================================================================
  11041. FUNCTION: SHM_Init_din_WeldingDetectionRes
  11042. DESCRIPTION:
  11043. PRE-CONDITION:
  11044. INPUT:
  11045. 1. shm_ccs
  11046. OUTPUT:
  11047. 1. shm_ccs
  11048. GLOBAL VARIABLES:
  11049. =============================================================================*/
  11050. void SHM_Init_din_WeldingDetectionRes(struct CcsData *shm_ccs)
  11051. {
  11052. struct WeldingDetectionResponse_DIN70121 *in;
  11053. in = &shm_ccs->V2GMessage_DIN70121.WeldingDetectionResponse;
  11054. //----- [BODY (1/3)] ResponseCode -----
  11055. in->ResponseCode = dinresponseCodeType_OK;
  11056. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11057. short value = 0; int multiplier = 0; unsigned char unit = 0;
  11058. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  11059. value = 0; multiplier = 0; unit = V_DIN70121;
  11060. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  11061. //----- [BODY (3/3)] DC_EVSEStatus -----
  11062. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  11063. }
  11064. /*===========================================================================
  11065. FUNCTION: Sudo_Parameter_din_WeldingDetectionRes
  11066. DESCRIPTION:
  11067. PRE-CONDITION:
  11068. INPUT:
  11069. OUTPUT:
  11070. GLOBAL VARIABLES:
  11071. =============================================================================*/
  11072. void Sudo_Parameter_din_WeldingDetectionRes()
  11073. {
  11074. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  11075. init_dinWeldingDetectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes);
  11076. ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  11077. //----- [BODY (1/3)] ResponseCode -----
  11078. struct dinWeldingDetectionResType *res;
  11079. res = &ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes;
  11080. res->ResponseCode = dinresponseCodeType_OK;
  11081. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11082. res->EVSEPresentVoltage.Value = 3820;
  11083. res->EVSEPresentVoltage.Multiplier = -1;
  11084. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  11085. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  11086. // dinunitSymbolType_h = 0,
  11087. // dinunitSymbolType_m = 1,
  11088. // dinunitSymbolType_s = 2,
  11089. // dinunitSymbolType_A = 3,
  11090. // dinunitSymbolType_Ah = 4,
  11091. // dinunitSymbolType_V = 5,
  11092. // dinunitSymbolType_VA = 6,
  11093. // dinunitSymbolType_W = 7,
  11094. // dinunitSymbolType_W_s = 8,
  11095. // dinunitSymbolType_Wh = 9
  11096. //----- [BODY (3/3)] DC_EVSEStatus -----
  11097. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  11098. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  11099. // dinisolationLevelType_Invalid = 0,
  11100. // dinisolationLevelType_Valid = 1,
  11101. // dinisolationLevelType_Warning = 2,
  11102. // dinisolationLevelType_Fault = 3
  11103. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  11104. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  11105. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  11106. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  11107. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  11108. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  11109. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  11110. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  11111. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  11112. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  11113. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  11114. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  11115. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  11116. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  11117. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  11118. // dinEVSENotificationType_None = 0,
  11119. // dinEVSENotificationType_StopCharging = 1,
  11120. // dinEVSENotificationType_ReNegotiation = 2
  11121. }
  11122. /*===========================================================================
  11123. FUNCTION: Sudo_Parameter_iso1_WeldingDetectionRes
  11124. DESCRIPTION:
  11125. PRE-CONDITION:
  11126. INPUT:
  11127. OUTPUT:
  11128. GLOBAL VARIABLES:
  11129. =============================================================================*/
  11130. void Sudo_Parameter_iso1_WeldingDetectionRes()
  11131. {
  11132. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  11133. init_iso1WeldingDetectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes);
  11134. ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  11135. //----- [BODY (1/3)] ResponseCode -----
  11136. struct iso1WeldingDetectionResType *res;
  11137. res = &ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes;
  11138. res->ResponseCode = iso1responseCodeType_OK;
  11139. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11140. res->EVSEPresentVoltage.Value = 3820;
  11141. res->EVSEPresentVoltage.Multiplier = -1;
  11142. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  11143. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  11144. //iso1unitSymbolType_h = 0,
  11145. //iso1unitSymbolType_m = 1,
  11146. //iso1unitSymbolType_s = 2,
  11147. //iso1unitSymbolType_A = 3,
  11148. //iso1unitSymbolType_V = 4,
  11149. //iso1unitSymbolType_W = 5,
  11150. //iso1unitSymbolType_Wh = 6
  11151. //----- [BODY (3/3)] DC_EVSEStatus -----
  11152. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  11153. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  11154. //iso1isolationLevelType_Invalid = 0,
  11155. //iso1isolationLevelType_Valid = 1,
  11156. //iso1isolationLevelType_Warning = 2,
  11157. //iso1isolationLevelType_Fault = 3,
  11158. //iso1isolationLevelType_No_IMD = 4
  11159. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11160. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  11161. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  11162. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  11163. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  11164. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  11165. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  11166. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  11167. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  11168. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  11169. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  11170. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  11171. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  11172. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  11173. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  11174. //iso1EVSENotificationType_None = 0,
  11175. //iso1EVSENotificationType_StopCharging = 1,
  11176. //iso1EVSENotificationType_ReNegotiation = 2
  11177. }
  11178. /*===========================================================================
  11179. FUNCTION: Proc_din_WeldingDetectionRes
  11180. DESCRIPTION:
  11181. PRE-CONDITION:
  11182. INPUT:
  11183. OUTPUT:
  11184. GLOBAL VARIABLES:
  11185. =============================================================================*/
  11186. int Proc_din_WeldingDetectionRes(int AcceptFd)
  11187. {
  11188. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11189. //if it is not the same, the packet should be ignored.
  11190. //STEP 1: ============ Initialize ============
  11191. int i = 0;
  11192. int errn = 0;
  11193. bitstream_t v2g_tx_stream;
  11194. static struct WeldingDetectionResponse_DIN70121 *wel;
  11195. static struct ChargingInfoData *sys;
  11196. size_t pos = 0;
  11197. v2g_tx_stream.pos = &pos;
  11198. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11199. v2g_tx_stream.data = V2GTP_Tx_buf;
  11200. wel = &ShmCcsData->V2GMessage_DIN70121.WeldingDetectionResponse;
  11201. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11202. wel->ResponseCode = OK_DIN70121;
  11203. //[HEADER] Check Req SessionID
  11204. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  11205. {
  11206. wel->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  11207. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11208. errn = -1;
  11209. }
  11210. //Check for SequenceError
  11211. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11212. {
  11213. wel->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  11214. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11215. errn = -1;
  11216. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11217. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11218. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11219. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11220. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11221. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11222. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11223. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11224. }
  11225. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11226. SAVE_PhysicalValueType_DIN70121(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  11227. //EVSE Status Code
  11228. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  11229. //Check for CSU command of "Stop by EVSE"
  11230. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  11231. {
  11232. //wel->ResponseCode = FAILED_DIN70121;
  11233. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  11234. }
  11235. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  11236. {
  11237. //wel->ResponseCode = FAILED_DIN70121;
  11238. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11239. errn = -1;
  11240. }
  11241. else if (ShmInternalComm->ChargingPermission == FALSE)
  11242. {
  11243. //wel->ResponseCode = FAILED_DIN70121;
  11244. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  11245. }
  11246. //Isolation Status
  11247. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  11248. {
  11249. // wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  11250. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  11251. //wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11252. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11253. sprintf(buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  11254. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11255. //Update_V2G_Flow_Status(Other_Fault);
  11256. // errn = -1;
  11257. }
  11258. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  11259. {
  11260. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  11261. }
  11262. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  11263. {
  11264. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  11265. }
  11266. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  11267. {
  11268. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  11269. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11270. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11271. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_WeldingDetectionRes]GFD_Fault => Emergency Shutdown");
  11272. Update_V2G_Flow_Status(Other_Fault);
  11273. errn = -1;
  11274. }
  11275. else //GFD_No_IMD or other unexpected status
  11276. {
  11277. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  11278. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11279. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11280. sprintf(buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  11281. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11282. Update_V2G_Flow_Status(Other_Fault);
  11283. errn = -1;
  11284. }
  11285. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11286. #if PARAMETER_NORMAL_MODE == ENABLE
  11287. SHM_Read_din_WeldingDetectionRes(&ccs_exi_doc_DIN, ShmCcsData);
  11288. #else
  11289. Sudo_Parameter_din_WeldingDetectionRes();
  11290. #endif
  11291. //STEP 4: ============ Encode and Send Response Message ===========
  11292. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  11293. {
  11294. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_WeldingDetectionRes][Error]Tx encoded msg error");
  11295. errn = -1;
  11296. }
  11297. //STEP 5: ============ Update Flags ===========
  11298. return errn;
  11299. }
  11300. /*===========================================================================
  11301. FUNCTION: Proc_iso1_WeldingDetectionRes
  11302. DESCRIPTION:
  11303. PRE-CONDITION:
  11304. INPUT:
  11305. OUTPUT:
  11306. GLOBAL VARIABLES:
  11307. =============================================================================*/
  11308. int Proc_iso1_WeldingDetectionRes(int AcceptFd)
  11309. {
  11310. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11311. //if it is not the same, the packet should be ignored.
  11312. //STEP 1: ============ Initialize ============
  11313. int i = 0;
  11314. int errn = 0;
  11315. bitstream_t v2g_tx_stream;
  11316. static struct WeldingDetectionResponse_ISO15118_2014 *wel;
  11317. static struct ChargingInfoData *sys;
  11318. size_t pos = 0;
  11319. v2g_tx_stream.pos = &pos;
  11320. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11321. v2g_tx_stream.data = V2GTP_Tx_buf;
  11322. wel = &ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionResponse;
  11323. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11324. wel->ResponseCode = OK_ISO15118_2014;
  11325. //[HEADER] Check Req SessionID
  11326. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  11327. {
  11328. wel->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  11329. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11330. errn = -1;
  11331. }
  11332. //Check for SequenceError
  11333. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11334. {
  11335. wel->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  11336. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11337. errn = -1;
  11338. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11339. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11340. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11341. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11342. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11343. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11344. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11345. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11346. }
  11347. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11348. SAVE_PhysicalValueType_ISO15118_2014(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  11349. //EVSE Status Code
  11350. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11351. //Check for CSU command of "Stop by EVSE"
  11352. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  11353. {
  11354. //wel->ResponseCode = FAILED_ISO15118_2014;
  11355. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11356. }
  11357. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  11358. {
  11359. //wel->ResponseCode = FAILED_ISO15118_2014;
  11360. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11361. errn = -1;
  11362. }
  11363. else if (ShmInternalComm->ChargingPermission == FALSE)
  11364. {
  11365. //wel->ResponseCode = FAILED_ISO15118_2014;
  11366. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11367. }
  11368. //Isolation Status
  11369. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  11370. {
  11371. //wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  11372. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  11373. // wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11374. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11375. sprintf(buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  11376. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11377. // Update_V2G_Flow_Status(Other_Fault);
  11378. // errn = -1;
  11379. }
  11380. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  11381. {
  11382. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  11383. }
  11384. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  11385. {
  11386. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  11387. }
  11388. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  11389. {
  11390. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  11391. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11392. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11393. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_WeldingDetectionRes]GFD_Fault => EmergencyShutdown");
  11394. Update_V2G_Flow_Status(Other_Fault);
  11395. errn = -1;
  11396. }
  11397. else
  11398. {
  11399. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  11400. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11401. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11402. sprintf(buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  11403. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11404. Update_V2G_Flow_Status(Other_Fault);
  11405. errn = -1;
  11406. }
  11407. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11408. #if PARAMETER_NORMAL_MODE == ENABLE
  11409. SHM_Read_iso1_WeldingDetectionRes(&ccs_exi_doc_ISO1, ShmCcsData);
  11410. #else
  11411. Sudo_Parameter_iso1_WeldingDetectionRes();
  11412. #endif
  11413. //STEP 4: ============ Encode and Send Response Message ===========
  11414. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  11415. {
  11416. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_WeldingDetectionRes][Error]Tx encoded msg error");
  11417. errn = -1;
  11418. }
  11419. //STEP 5: ============ Update Flags ===========
  11420. return errn;
  11421. }
  11422. /*===========================================================================
  11423. FUNCTION: Proc_din_WeldingDetectionReq
  11424. DESCRIPTION:
  11425. PRE-CONDITION:
  11426. INPUT:
  11427. OUTPUT:
  11428. GLOBAL VARIABLES:
  11429. =============================================================================*/
  11430. int Proc_din_WeldingDetectionReq(int AcceptFd)
  11431. {
  11432. int errn = 0;
  11433. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_WeldingDetectionReq] Got WeldingDetectionReq\n");
  11434. //Print the decoded XML Document
  11435. PRINT_XML_DOC_DIN_WeldingDetectionReq(&ccs_exi_doc_DIN);
  11436. //Save into Share Memory
  11437. SHM_Save_din_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  11438. //Check for EV Error Code
  11439. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  11440. errn = Proc_din_WeldingDetectionRes(AcceptFd);
  11441. if (errn == 0)
  11442. {
  11443. //send response successfully.
  11444. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]WeldingDetectionRes");
  11445. }
  11446. else
  11447. {
  11448. sprintf(buf_log_evcomm,
  11449. "[Error][SeccComm][Proc_din_WeldingDetectionReq]Proc_din_WeldingDetectionRes(): %d (DEC)",
  11450. errn);
  11451. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11452. }
  11453. return errn;
  11454. }
  11455. /*===========================================================================
  11456. FUNCTION: Proc_iso1_WeldingDetectionReq
  11457. DESCRIPTION:
  11458. PRE-CONDITION:
  11459. INPUT:
  11460. OUTPUT:
  11461. GLOBAL VARIABLES:
  11462. =============================================================================*/
  11463. int Proc_iso1_WeldingDetectionReq(int AcceptFd)
  11464. {
  11465. int errn = 0;
  11466. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_WeldingDetectionReq] Got WeldingDetectionReq\n");
  11467. //Print the decoded XML Document
  11468. PRINT_XML_DOC_ISO1_WeldingDetectionReq(&ccs_exi_doc_ISO1);
  11469. //Save into Share Memory
  11470. SHM_Save_iso1_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11471. //Check for EV Error Code
  11472. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  11473. errn = Proc_iso1_WeldingDetectionRes(AcceptFd);
  11474. if (errn == 0)
  11475. {
  11476. //send response successfully.
  11477. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]WeldingDetectionRes");
  11478. }
  11479. else
  11480. {
  11481. sprintf(buf_log_evcomm,
  11482. "[Error][SeccComm][Proc_iso1_WeldingDetectionReq]Proc_iso1_WeldingDetectionRes(): %d (DEC)",
  11483. errn);
  11484. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11485. }
  11486. return errn;
  11487. }
  11488. /*===========================================================================
  11489. FUNCTION: SHM_Init_din_SessionStopRes
  11490. DESCRIPTION:
  11491. PRE-CONDITION:
  11492. INPUT:
  11493. 1. shm_ccs
  11494. OUTPUT:
  11495. 1. shm_ccs
  11496. GLOBAL VARIABLES:
  11497. =============================================================================*/
  11498. void SHM_Init_din_SessionStopRes(struct CcsData *shm_ccs)
  11499. {
  11500. struct SessionStopResponse_DIN70121 *in;
  11501. in = &shm_ccs->V2GMessage_DIN70121.SessionStopResponse;
  11502. //----- [BODY (1/3)] ResponseCode -----
  11503. in->ResponseCode = dinresponseCodeType_OK;
  11504. }
  11505. /*===========================================================================
  11506. FUNCTION: Sudo_Parameter_din_SessionStopRes
  11507. DESCRIPTION:
  11508. PRE-CONDITION:
  11509. INPUT:
  11510. OUTPUT:
  11511. GLOBAL VARIABLES:
  11512. =============================================================================*/
  11513. void Sudo_Parameter_din_SessionStopRes()
  11514. {
  11515. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  11516. init_dinSessionStopResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes);
  11517. ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  11518. //----- [BODY (1/3)] ResponseCode -----
  11519. struct dinSessionStopResType *res;
  11520. res = &ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes;
  11521. res->ResponseCode = dinresponseCodeType_OK;
  11522. }
  11523. /*===========================================================================
  11524. FUNCTION: Sudo_Parameter_iso1_SessionStopRes
  11525. DESCRIPTION:
  11526. PRE-CONDITION:
  11527. INPUT:
  11528. OUTPUT:
  11529. GLOBAL VARIABLES:
  11530. =============================================================================*/
  11531. void Sudo_Parameter_iso1_SessionStopRes()
  11532. {
  11533. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  11534. init_iso1SessionStopResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes);
  11535. ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  11536. //----- [BODY (1/3)] ResponseCode -----
  11537. struct iso1SessionStopResType *res;
  11538. res = &ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes;
  11539. res->ResponseCode = iso1responseCodeType_OK;
  11540. }
  11541. /*===========================================================================
  11542. FUNCTION: Proc_din_SessionStopRes
  11543. DESCRIPTION:
  11544. PRE-CONDITION:
  11545. INPUT:
  11546. OUTPUT:
  11547. GLOBAL VARIABLES:
  11548. =============================================================================*/
  11549. int Proc_din_SessionStopRes(int AcceptFd)
  11550. {
  11551. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11552. //if it is not the same, the packet should be ignored.
  11553. //STEP 1: ============ Initialize ============
  11554. int i = 0;
  11555. int errn = 0;
  11556. bitstream_t v2g_tx_stream;
  11557. struct SessionStopResponse_DIN70121 *stp;
  11558. struct ChargingInfoData *sys;
  11559. size_t pos = 0;
  11560. v2g_tx_stream.pos = &pos;
  11561. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11562. v2g_tx_stream.data = V2GTP_Tx_buf;
  11563. stp = &ShmCcsData->V2GMessage_DIN70121.SessionStopResponse;
  11564. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11565. stp->ResponseCode = OK_DIN70121;
  11566. //[HEADER] Check Req SessionID
  11567. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  11568. {
  11569. stp->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  11570. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11571. errn = -1;
  11572. }
  11573. //Check for SequenceError
  11574. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11575. {
  11576. stp->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  11577. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11578. errn = -1;
  11579. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11580. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11581. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11582. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11583. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11584. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11585. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11586. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11587. }
  11588. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11589. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11590. #if PARAMETER_NORMAL_MODE == ENABLE
  11591. SHM_Read_din_SessionStopRes(&ccs_exi_doc_DIN, ShmCcsData);
  11592. #else
  11593. Sudo_Parameter_din_SessionStopRes();
  11594. #endif
  11595. //STEP 4: ============ Encode and Send Response Message ===========
  11596. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  11597. {
  11598. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes: fail");
  11599. errn = -1;
  11600. }
  11601. else
  11602. {
  11603. //send response successfully.
  11604. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes");
  11605. }
  11606. //STEP 5: ============ Update Flags ===========
  11607. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  11608. //Once this is set, the CSU should
  11609. // =========== Annouce to CSU [To-Be Implemented]=============
  11610. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  11611. // =========== Re-initialized [To-Be Implemented]=============
  11612. //Keep 5% PWM for 2 seconds
  11613. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 2");
  11614. sleep(1);
  11615. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 1");
  11616. sleep(1);
  11617. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 0");
  11618. OutputCpPwmDuty(100);
  11619. //[To-Do] Reset All Share memory
  11620. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  11621. //system("reboot -f");
  11622. //sleep(5);
  11623. //system("reboot -f");
  11624. return errn;
  11625. }
  11626. /*===========================================================================
  11627. FUNCTION: Proc_iso1_SessionStopRes
  11628. DESCRIPTION:
  11629. PRE-CONDITION:
  11630. INPUT:
  11631. OUTPUT:
  11632. GLOBAL VARIABLES:
  11633. =============================================================================*/
  11634. int Proc_iso1_SessionStopRes(int AcceptFd)
  11635. {
  11636. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11637. //if it is not the same, the packet should be ignored.
  11638. //STEP 1: ============ Initialize ============
  11639. int i = 0;
  11640. int errn = 0;
  11641. bitstream_t v2g_tx_stream;
  11642. struct SessionStopResponse_ISO15118_2014 *stp;
  11643. struct ChargingInfoData *sys;
  11644. size_t pos = 0;
  11645. v2g_tx_stream.pos = &pos;
  11646. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11647. v2g_tx_stream.data = V2GTP_Tx_buf;
  11648. stp = &ShmCcsData->V2GMessage_ISO15118_2014.SessionStopResponse;
  11649. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11650. stp->ResponseCode = OK_ISO15118_2014;
  11651. //[HEADER] Check Req SessionID
  11652. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  11653. {
  11654. stp->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  11655. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11656. errn = -1;
  11657. }
  11658. //Check for SequenceError
  11659. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11660. {
  11661. stp->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  11662. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11663. errn = -1;
  11664. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11665. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11666. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11667. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11668. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11669. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11670. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11671. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11672. }
  11673. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11674. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11675. #if PARAMETER_NORMAL_MODE == ENABLE
  11676. SHM_Read_iso1_SessionStopRes(&ccs_exi_doc_ISO1, ShmCcsData);
  11677. #else
  11678. Sudo_Parameter_iso1_SessionStopRes();
  11679. #endif
  11680. //STEP 4: ============ Encode and Send Response Message ===========
  11681. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  11682. {
  11683. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes: fail");
  11684. errn = -1;
  11685. }
  11686. else
  11687. {
  11688. //send response successfully.
  11689. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes");
  11690. }
  11691. //STEP 5: ============ Update Flags ===========
  11692. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  11693. //Once this is set, the CSU should
  11694. // =========== Annouce to CSU [To-Be Implemented]=============
  11695. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  11696. // =========== Re-initialized [To-Be Implemented]=============
  11697. //Keep 5% PWM for 2 seconds
  11698. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 2");
  11699. sleep(1);
  11700. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 1");
  11701. sleep(1);
  11702. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 0");
  11703. OutputCpPwmDuty(100);
  11704. //[To-Do] Reset All Share memory
  11705. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  11706. //system("reboot -f");
  11707. //sleep(5);
  11708. //system("reboot -f");
  11709. return errn;
  11710. }
  11711. /*===========================================================================
  11712. FUNCTION: Proc_din_SessionStopReq
  11713. DESCRIPTION:
  11714. PRE-CONDITION:
  11715. INPUT:
  11716. OUTPUT:
  11717. GLOBAL VARIABLES:
  11718. =============================================================================*/
  11719. int Proc_din_SessionStopReq(int AcceptFd)
  11720. {
  11721. int errn = 0;
  11722. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]SessionStopReq");
  11723. //Print the decoded XML Document
  11724. PRINT_XML_DOC_DIN_SessionStopReq(&ccs_exi_doc_DIN);
  11725. //Save into Share Memory
  11726. SHM_Save_din_SessionStopReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  11727. errn = Proc_din_SessionStopRes(AcceptFd);
  11728. if (errn == 0)
  11729. {
  11730. //send response successfully.
  11731. }
  11732. else
  11733. {
  11734. sprintf(buf_log_evcomm,
  11735. "[Error][SeccComm][Proc_din_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  11736. errn);
  11737. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11738. }
  11739. return errn;
  11740. }
  11741. /*===========================================================================
  11742. FUNCTION: Proc_iso1_SessionStopReq
  11743. DESCRIPTION:
  11744. PRE-CONDITION:
  11745. INPUT:
  11746. OUTPUT:
  11747. GLOBAL VARIABLES:
  11748. =============================================================================*/
  11749. int Proc_iso1_SessionStopReq(int AcceptFd)
  11750. {
  11751. int errn = 0;
  11752. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]SessionStopReq");
  11753. //Print the decoded XML Document
  11754. PRINT_XML_DOC_ISO1_SessionStopReq(&ccs_exi_doc_ISO1);
  11755. //Save into Share Memory
  11756. SHM_Save_iso1_SessionStopReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11757. errn = Proc_iso1_SessionStopRes(AcceptFd);
  11758. if (errn == 0)
  11759. {
  11760. //send response successfully.
  11761. }
  11762. else
  11763. {
  11764. sprintf(buf_log_evcomm,
  11765. "[Error][SeccComm][Proc_iso1_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  11766. errn);
  11767. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11768. }
  11769. return errn;
  11770. }
  11771. /*===========================================================================
  11772. FUNCTION: V2gMsg_Process_din
  11773. DESCRIPTION:
  11774. PRE-CONDITION:
  11775. INPUT:
  11776. 1. V2gFlowStatus
  11777. OUTPUT:
  11778. GLOBAL VARIABLES:
  11779. 1. V2gFlowStatus
  11780. =============================================================================*/
  11781. int V2gMsg_Process_din(int AcceptFd)
  11782. {
  11783. unsigned char req_is_responsed = FALSE;
  11784. while (req_is_responsed == FALSE)
  11785. {
  11786. //Check if it is in End_Process
  11787. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  11788. {
  11789. break;
  11790. }
  11791. switch(V2gFlowStatus)
  11792. {
  11793. //-------------------------------------------
  11794. case SupportedAppProtocolRequest:
  11795. {
  11796. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  11797. {
  11798. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  11799. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  11800. {
  11801. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11802. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  11803. }
  11804. else
  11805. {
  11806. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  11807. Update_V2G_Flow_Status(Other_Fault);
  11808. }
  11809. }
  11810. req_is_responsed = TRUE;
  11811. break;
  11812. }
  11813. case SupportedAppProtocolResponse:
  11814. {
  11815. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  11816. {
  11817. Update_V2G_Flow_Status(SessionSetupRequest);
  11818. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11819. }
  11820. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11821. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11822. {
  11823. sprintf(buf_log_evcomm,
  11824. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11825. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11826. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11827. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11828. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11829. }
  11830. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11831. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11832. {
  11833. sprintf(buf_log_evcomm,
  11834. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11835. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11836. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11837. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11838. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11839. {
  11840. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11841. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11842. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11843. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11844. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11845. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11846. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11847. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11848. }
  11849. }
  11850. else
  11851. {
  11852. break;
  11853. }
  11854. break;
  11855. }
  11856. //-------------------------------------------
  11857. case SessionSetupRequest: //19
  11858. {
  11859. if (Proc_din_SessionSetupReq(AcceptFd) == 0)
  11860. {
  11861. Update_V2G_Flow_Status(SessionSetupResponse);
  11862. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11863. }
  11864. else
  11865. {
  11866. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  11867. Update_V2G_Flow_Status(Other_Fault);
  11868. }
  11869. req_is_responsed = TRUE;
  11870. break;
  11871. }
  11872. case SessionSetupResponse: //20
  11873. {
  11874. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  11875. {
  11876. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  11877. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11878. }
  11879. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11880. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11881. {
  11882. sprintf(buf_log_evcomm,
  11883. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11884. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11885. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11886. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11887. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11888. }
  11889. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11890. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11891. {
  11892. sprintf(buf_log_evcomm,
  11893. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11894. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11895. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11896. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11897. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11898. {
  11899. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11900. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11901. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11902. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11903. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11904. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11905. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11906. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11907. }
  11908. }
  11909. else
  11910. {
  11911. break;
  11912. }
  11913. break;
  11914. }
  11915. //-------------------------------------------
  11916. case ServiceDiscoveryRequest: //21
  11917. {
  11918. if (Proc_din_ServiceDiscoveryReq(AcceptFd) == 0)
  11919. {
  11920. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  11921. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11922. }
  11923. else
  11924. {
  11925. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  11926. Update_V2G_Flow_Status(Other_Fault);
  11927. }
  11928. req_is_responsed = TRUE;
  11929. break;
  11930. }
  11931. case ServiceDiscoveryResponse: //22
  11932. {
  11933. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  11934. {
  11935. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  11936. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11937. }
  11938. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11939. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11940. {
  11941. sprintf(buf_log_evcomm,
  11942. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11943. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11944. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11945. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11946. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11947. }
  11948. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11949. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11950. {
  11951. sprintf(buf_log_evcomm,
  11952. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11953. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11954. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11955. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11956. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11957. {
  11958. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11959. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11960. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11961. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11962. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11963. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11964. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11965. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11966. }
  11967. }
  11968. else
  11969. {
  11970. break;
  11971. }
  11972. break;
  11973. }
  11974. //-------------------------------------------
  11975. case ServiceAndPaymentSelectionRequest: //25
  11976. {
  11977. if (Proc_din_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  11978. {
  11979. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  11980. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11981. }
  11982. else
  11983. {
  11984. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  11985. Update_V2G_Flow_Status(Other_Fault);
  11986. }
  11987. req_is_responsed = TRUE;
  11988. break;
  11989. }
  11990. case ServiceAndPaymentSelectionResponse: //26
  11991. {
  11992. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11993. {
  11994. Update_V2G_Flow_Status(AuthorizationRequest);
  11995. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11996. }
  11997. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11998. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11999. {
  12000. sprintf(buf_log_evcomm,
  12001. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12002. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12003. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12004. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12005. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12006. }
  12007. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12008. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12009. {
  12010. sprintf(buf_log_evcomm,
  12011. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12012. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12013. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12014. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12015. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12016. {
  12017. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12018. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12019. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12020. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12021. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12022. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12023. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12024. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12025. }
  12026. }
  12027. else
  12028. {
  12029. break;
  12030. }
  12031. break;
  12032. }
  12033. //-------------------------------------------
  12034. //case ContractAuthenticationReq:
  12035. case AuthorizationRequest: //29
  12036. {
  12037. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  12038. {
  12039. Update_V2G_Flow_Status(AuthorizationResponse);
  12040. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12041. }
  12042. else
  12043. {
  12044. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  12045. Update_V2G_Flow_Status(Other_Fault);
  12046. }
  12047. req_is_responsed = TRUE;
  12048. break;
  12049. }
  12050. case AuthorizationResponse: //30
  12051. {
  12052. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12053. {
  12054. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12055. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  12056. {
  12057. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12058. }
  12059. else
  12060. {
  12061. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  12062. Update_V2G_Flow_Status(Other_Fault);
  12063. }
  12064. req_is_responsed = TRUE;
  12065. break;
  12066. }
  12067. //Check for ChargeParameterDiscoveryReq
  12068. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12069. {
  12070. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12071. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  12072. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  12073. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12074. ftime(&SeqStartTime);
  12075. #endif
  12076. }
  12077. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12078. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12079. {
  12080. sprintf(buf_log_evcomm,
  12081. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12082. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12083. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12084. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12085. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12086. }
  12087. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12088. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12089. {
  12090. sprintf(buf_log_evcomm,
  12091. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12092. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12093. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12094. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12095. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12096. {
  12097. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12098. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12099. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12100. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12101. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12102. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12103. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12104. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12105. }
  12106. }
  12107. else
  12108. {
  12109. break;
  12110. }
  12111. break;
  12112. }
  12113. //-------------------------------------------
  12114. case ChargeParameterDiscoveryRequest: //35
  12115. {
  12116. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12117. {
  12118. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  12119. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12120. }
  12121. else
  12122. {
  12123. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  12124. Update_V2G_Flow_Status(Other_Fault);
  12125. }
  12126. req_is_responsed = TRUE;
  12127. break;
  12128. }
  12129. case ChargeParameterDiscoveryResponse:
  12130. {
  12131. //STEP 1: Check for Process Timeout
  12132. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12133. ftime(&SeqEndTime);
  12134. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  12135. {
  12136. sprintf(buf_log_evcomm,
  12137. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  12138. DiffTimeb(SeqStartTime, SeqEndTime),
  12139. V2G_SECC_ChargingParameter_Performance_Time);
  12140. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12141. Update_V2G_Flow_Status(Sequence_Timeout);
  12142. break;
  12143. }
  12144. #endif
  12145. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12146. {
  12147. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12148. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12149. {
  12150. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12151. }
  12152. else
  12153. {
  12154. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  12155. Update_V2G_Flow_Status(Other_Fault);
  12156. }
  12157. req_is_responsed = TRUE;
  12158. break;
  12159. }
  12160. //STEP 2: Check for CableCheckReq message
  12161. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  12162. {
  12163. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12164. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  12165. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  12166. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  12167. Update_V2G_Flow_Status(CableCheckRequest);
  12168. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12169. ftime(&SeqStartTime);
  12170. #endif
  12171. }
  12172. //STEP 3: Wait for PowerDeliveryReq Message
  12173. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12174. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12175. {
  12176. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12177. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12178. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12179. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12180. ftime(&SeqStartTime);
  12181. #endif
  12182. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12183. {
  12184. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12185. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12186. }
  12187. else
  12188. {
  12189. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12190. Update_V2G_Flow_Status(Other_Fault);
  12191. }
  12192. break;
  12193. }
  12194. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12195. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12196. {
  12197. sprintf(buf_log_evcomm,
  12198. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12199. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12200. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12201. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12202. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12203. }
  12204. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12205. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12206. {
  12207. sprintf(buf_log_evcomm,
  12208. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12209. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12210. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12211. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12212. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12213. {
  12214. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12215. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12216. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12217. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12218. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12219. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12220. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12221. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12222. }
  12223. }
  12224. else
  12225. {
  12226. break;
  12227. }
  12228. break;
  12229. }
  12230. //-------------------------------------------
  12231. case CableCheckRequest: //37
  12232. {
  12233. //STEP 3: Execute Cable Check Process
  12234. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  12235. {
  12236. Update_V2G_Flow_Status(CableCheckResponse);
  12237. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12238. }
  12239. else
  12240. {
  12241. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  12242. Update_V2G_Flow_Status(Other_Fault);
  12243. }
  12244. req_is_responsed = TRUE;
  12245. break;
  12246. }
  12247. case CableCheckResponse: //38
  12248. {
  12249. //STEP 1: Check for Process Timeout
  12250. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12251. ftime(&SeqEndTime);
  12252. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  12253. {
  12254. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  12255. sprintf(buf_log_evcomm,
  12256. "CableCheck Timeout - (%.02lf of %d ms)\n",
  12257. DiffTimeb(SeqStartTime, SeqEndTime),
  12258. V2G_SECC_CableCheck_Performance_Time);
  12259. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12260. Update_V2G_Flow_Status(Sequence_Timeout);
  12261. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12262. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  12263. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12264. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12265. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12266. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12267. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  12268. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  12269. break;
  12270. }
  12271. #endif
  12272. //STEP 2: Check for CableCheckReq message
  12273. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  12274. {
  12275. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12276. //STEP 3: Execute Cable Check Process
  12277. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  12278. {
  12279. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12280. }
  12281. else
  12282. {
  12283. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  12284. Update_V2G_Flow_Status(Other_Fault);
  12285. }
  12286. req_is_responsed = TRUE;
  12287. break;
  12288. }
  12289. //STEP 3: Check for PreChargeReq message
  12290. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12291. {
  12292. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12293. Update_V2G_Flow_Status(PreChargeRequest);
  12294. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  12295. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  12296. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  12297. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12298. ftime(&SeqStartTime);
  12299. #endif
  12300. }
  12301. //STEP 3: Wait for PowerDeliveryReq Message
  12302. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12303. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12304. {
  12305. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12306. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12307. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12308. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12309. ftime(&SeqStartTime);
  12310. #endif
  12311. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12312. {
  12313. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12314. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12315. }
  12316. else
  12317. {
  12318. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12319. Update_V2G_Flow_Status(Other_Fault);
  12320. }
  12321. break;
  12322. }
  12323. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12324. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12325. {
  12326. sprintf(buf_log_evcomm,
  12327. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12328. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12329. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12330. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12331. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12332. }
  12333. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12334. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12335. {
  12336. sprintf(buf_log_evcomm,
  12337. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12338. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12339. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12340. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12341. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12342. {
  12343. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12344. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12345. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12346. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12347. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12348. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12349. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12350. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12351. }
  12352. }
  12353. else
  12354. {
  12355. break;
  12356. }
  12357. break;
  12358. }
  12359. //-------------------------------------------
  12360. case PreChargeRequest: //39
  12361. {
  12362. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  12363. {
  12364. Update_V2G_Flow_Status(PreChargeResponse);
  12365. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12366. }
  12367. else
  12368. {
  12369. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  12370. Update_V2G_Flow_Status(Other_Fault);
  12371. }
  12372. req_is_responsed = TRUE;
  12373. break;
  12374. }
  12375. case PreChargeResponse: //40
  12376. {
  12377. //STEP 1: Check for Process Timeout
  12378. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12379. ftime(&SeqEndTime);
  12380. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  12381. {
  12382. sprintf(buf_log_evcomm,
  12383. "Precharge Timeout - (%.02lf of %d ms)\n",
  12384. DiffTimeb(SeqStartTime, SeqEndTime),
  12385. V2G_SECC_PreCharge_Performance_Time);
  12386. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12387. Update_V2G_Flow_Status(Sequence_Timeout);
  12388. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12389. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  12390. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12391. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12392. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12393. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12394. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  12395. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  12396. break;
  12397. }
  12398. #endif
  12399. //STEP 2: Check for PreChargeReq message
  12400. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12401. {
  12402. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12403. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  12404. {
  12405. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12406. }
  12407. else
  12408. {
  12409. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  12410. Update_V2G_Flow_Status(Other_Fault);
  12411. }
  12412. req_is_responsed = TRUE;
  12413. break;
  12414. }
  12415. //STEP 3: Check for PowerDeliveryReq message
  12416. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12417. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12418. {
  12419. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12420. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  12421. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  12422. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12423. ftime(&SeqStartTime);
  12424. #endif
  12425. }
  12426. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12427. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12428. {
  12429. sprintf(buf_log_evcomm,
  12430. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12431. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12432. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12433. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12434. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12435. }
  12436. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12437. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12438. {
  12439. sprintf(buf_log_evcomm,
  12440. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12441. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12442. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12443. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12444. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12445. {
  12446. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12447. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12448. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12449. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12450. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12451. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12452. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12453. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12454. }
  12455. }
  12456. else
  12457. {
  12458. break;
  12459. }
  12460. break;
  12461. }
  12462. //-------------------------------------------
  12463. case PowerDeliveryRequestStart: //41
  12464. {
  12465. if (Proc_din_PowerDeliveryStartReq(AcceptFd) == 0)
  12466. {
  12467. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  12468. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12469. }
  12470. else
  12471. {
  12472. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  12473. Update_V2G_Flow_Status(Other_Fault);
  12474. }
  12475. req_is_responsed = TRUE;
  12476. break;
  12477. }
  12478. case PowerDeliveryResponsetStart: //42
  12479. {
  12480. //STEP 1: Check for Process Timeout
  12481. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12482. if (ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12483. {
  12484. ftime(&SeqEndTime);
  12485. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12486. {
  12487. sprintf(buf_log_evcomm,
  12488. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  12489. DiffTimeb(SeqStartTime, SeqEndTime),
  12490. 2000);
  12491. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12492. Update_V2G_Flow_Status(Sequence_Timeout);
  12493. }
  12494. break;
  12495. }
  12496. #endif
  12497. //STEP 2: Wait for CurrentDemandReq Message
  12498. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12499. {
  12500. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12501. Update_V2G_Flow_Status(CurrentDemandRequest);
  12502. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  12503. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  12504. }
  12505. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12506. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12507. {
  12508. sprintf(buf_log_evcomm,
  12509. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12510. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12511. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12512. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12513. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12514. }
  12515. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12516. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12517. {
  12518. sprintf(buf_log_evcomm,
  12519. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12520. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12521. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12522. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12523. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12524. {
  12525. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12526. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12527. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12528. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12529. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12530. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12531. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12532. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12533. }
  12534. }
  12535. else
  12536. {
  12537. break;
  12538. }
  12539. break;
  12540. }
  12541. //-------------------------------------------
  12542. case CurrentDemandRequest: //45,
  12543. {
  12544. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  12545. {
  12546. Update_V2G_Flow_Status(CurrentDemandResponse);
  12547. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12548. }
  12549. else
  12550. {
  12551. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  12552. Update_V2G_Flow_Status(Other_Fault);
  12553. }
  12554. req_is_responsed = TRUE;
  12555. break;
  12556. }
  12557. case CurrentDemandResponse: //46,
  12558. {
  12559. //STEP 1: Wait for CurrentDemandReq Message
  12560. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12561. {
  12562. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12563. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  12564. {
  12565. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12566. }
  12567. else
  12568. {
  12569. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  12570. Update_V2G_Flow_Status(Other_Fault);
  12571. }
  12572. req_is_responsed = TRUE;
  12573. break;
  12574. }
  12575. //STEP 2: Wait for PowerDeliveryReq Message
  12576. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12577. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12578. {
  12579. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12580. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12581. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  12582. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12583. {
  12584. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12585. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12586. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12587. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12588. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12589. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12590. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12591. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12592. }
  12593. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12594. ftime(&SeqStartTime);
  12595. #endif
  12596. }
  12597. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12598. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12599. {
  12600. sprintf(buf_log_evcomm,
  12601. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12602. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12603. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12604. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12605. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12606. }
  12607. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12608. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12609. {
  12610. sprintf(buf_log_evcomm,
  12611. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12612. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12613. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12614. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12615. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12616. {
  12617. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12618. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12619. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12620. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12621. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12622. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12623. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12624. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12625. }
  12626. }
  12627. else
  12628. {
  12629. break;
  12630. }
  12631. break;
  12632. }
  12633. //-------------------------------------------
  12634. case PowerDeliveryRequestStop: //49,
  12635. {
  12636. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12637. {
  12638. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12639. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12640. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12641. ftime(&SeqStartTime);
  12642. #endif
  12643. }
  12644. else
  12645. {
  12646. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12647. Update_V2G_Flow_Status(Other_Fault);
  12648. }
  12649. req_is_responsed = TRUE;
  12650. break;
  12651. }
  12652. case PowerDeliveryResponseStop: //50,
  12653. {
  12654. //STEP 1: Check for Process Timeout
  12655. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12656. ftime(&SeqEndTime);
  12657. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12658. {
  12659. sprintf(buf_log_evcomm,
  12660. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12661. DiffTimeb(SeqStartTime, SeqEndTime),
  12662. 2000);
  12663. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12664. Update_V2G_Flow_Status(Sequence_Timeout);
  12665. break;
  12666. }
  12667. #endif
  12668. //STEP 2: Check for WeldingDetectionReq Message
  12669. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12670. {
  12671. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12672. Update_V2G_Flow_Status(WeldingDetectionRequest);
  12673. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  12674. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  12675. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12676. ftime(&SeqStartTime);
  12677. #endif
  12678. }
  12679. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12680. {
  12681. Update_V2G_Flow_Status(SessionStopRequest);
  12682. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12683. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  12684. {
  12685. Update_V2G_Flow_Status(SessionStopResponse);
  12686. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12687. }
  12688. else
  12689. {
  12690. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  12691. Update_V2G_Flow_Status(Other_Fault);
  12692. }
  12693. break;
  12694. }
  12695. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12696. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12697. {
  12698. sprintf(buf_log_evcomm,
  12699. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12700. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12701. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12702. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12703. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12704. }
  12705. else
  12706. {
  12707. break;
  12708. }
  12709. break;
  12710. }
  12711. //-------------------------------------------
  12712. case WeldingDetectionRequest: //51,
  12713. {
  12714. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  12715. {
  12716. Update_V2G_Flow_Status(WeldingDetectionResponse);
  12717. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12718. }
  12719. else
  12720. {
  12721. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  12722. Update_V2G_Flow_Status(Other_Fault);
  12723. }
  12724. req_is_responsed = TRUE;
  12725. break;
  12726. }
  12727. case WeldingDetectionResponse: //52,
  12728. {
  12729. //STEP 1: Check for Process Timeout
  12730. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12731. ftime(&SeqEndTime);
  12732. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  12733. {
  12734. sprintf(buf_log_evcomm,
  12735. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12736. DiffTimeb(SeqStartTime, SeqEndTime),
  12737. V2G_SECC_WeldingDetection_Performance_Time);
  12738. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12739. Update_V2G_Flow_Status(Sequence_Timeout);
  12740. break;
  12741. }
  12742. #endif
  12743. //STEP 2: Check for WeldingDetectionReq Message
  12744. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12745. {
  12746. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12747. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  12748. {
  12749. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12750. }
  12751. else
  12752. {
  12753. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  12754. Update_V2G_Flow_Status(Other_Fault);
  12755. }
  12756. req_is_responsed = TRUE;
  12757. break;
  12758. }
  12759. //STEP 3: Check for SessionStopReq Message
  12760. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12761. {
  12762. Update_V2G_Flow_Status(SessionStopRequest);
  12763. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12764. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  12765. }
  12766. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12767. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12768. {
  12769. sprintf(buf_log_evcomm,
  12770. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12771. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12772. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12773. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12774. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12775. }
  12776. else
  12777. {
  12778. break;
  12779. }
  12780. break;
  12781. }
  12782. //-------------------------------------------
  12783. case SessionStopRequest: //53,
  12784. {
  12785. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  12786. {
  12787. Update_V2G_Flow_Status(SessionStopResponse);
  12788. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12789. }
  12790. else
  12791. {
  12792. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  12793. Update_V2G_Flow_Status(Other_Fault);
  12794. }
  12795. req_is_responsed = TRUE;
  12796. break;
  12797. }
  12798. case SessionStopResponse: //54,
  12799. {
  12800. break;
  12801. }
  12802. //-------------------------------------------
  12803. default:
  12804. {
  12805. break;
  12806. }
  12807. }
  12808. }
  12809. }
  12810. /*===========================================================================
  12811. FUNCTION: V2gMsg_Process_iso1_DC
  12812. DESCRIPTION:
  12813. PRE-CONDITION:
  12814. INPUT:
  12815. 1. V2gFlowStatus
  12816. OUTPUT:
  12817. GLOBAL VARIABLES:
  12818. 1. V2gFlowStatus
  12819. =============================================================================*/
  12820. int V2gMsg_Process_iso1_DC(int AcceptFd)
  12821. {
  12822. unsigned char req_is_responsed = FALSE;
  12823. while (req_is_responsed == FALSE)
  12824. {
  12825. //Check if it is in End_Process
  12826. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  12827. {
  12828. break;
  12829. }
  12830. switch(V2gFlowStatus)
  12831. {
  12832. //-------------------------------------------
  12833. case SupportedAppProtocolRequest:
  12834. {
  12835. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  12836. {
  12837. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  12838. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  12839. {
  12840. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12841. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  12842. }
  12843. else
  12844. {
  12845. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  12846. Update_V2G_Flow_Status(Other_Fault);
  12847. }
  12848. }
  12849. req_is_responsed = TRUE;
  12850. break;
  12851. }
  12852. case SupportedAppProtocolResponse:
  12853. {
  12854. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  12855. {
  12856. Update_V2G_Flow_Status(SessionSetupRequest);
  12857. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12858. }
  12859. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12860. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12861. {
  12862. sprintf(buf_log_evcomm,
  12863. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12864. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12865. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12866. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12867. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12868. }
  12869. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12870. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12871. {
  12872. sprintf(buf_log_evcomm,
  12873. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12874. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12875. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12876. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12877. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12878. {
  12879. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12880. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12881. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12882. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12883. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12884. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12885. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12886. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12887. }
  12888. }
  12889. else
  12890. {
  12891. break;
  12892. }
  12893. break;
  12894. }
  12895. //-------------------------------------------
  12896. case SessionSetupRequest: //19
  12897. {
  12898. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  12899. {
  12900. Update_V2G_Flow_Status(SessionSetupResponse);
  12901. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12902. }
  12903. else
  12904. {
  12905. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  12906. Update_V2G_Flow_Status(Other_Fault);
  12907. }
  12908. req_is_responsed = TRUE;
  12909. break;
  12910. }
  12911. case SessionSetupResponse: //20
  12912. {
  12913. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  12914. {
  12915. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  12916. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12917. }
  12918. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12919. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12920. {
  12921. sprintf(buf_log_evcomm,
  12922. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12923. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12924. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12925. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12926. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12927. }
  12928. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12929. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12930. {
  12931. sprintf(buf_log_evcomm,
  12932. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12933. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12934. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12935. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12936. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12937. {
  12938. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12939. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12940. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12941. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12942. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12943. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12944. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12945. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12946. }
  12947. }
  12948. else
  12949. {
  12950. break;
  12951. }
  12952. break;
  12953. }
  12954. //-------------------------------------------
  12955. case ServiceDiscoveryRequest: //21
  12956. {
  12957. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  12958. {
  12959. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  12960. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12961. }
  12962. else
  12963. {
  12964. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  12965. Update_V2G_Flow_Status(Other_Fault);
  12966. }
  12967. req_is_responsed = TRUE;
  12968. break;
  12969. }
  12970. case ServiceDiscoveryResponse: //22
  12971. {
  12972. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  12973. {
  12974. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  12975. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12976. }
  12977. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12978. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12979. {
  12980. sprintf(buf_log_evcomm,
  12981. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12982. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12983. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12984. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12985. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12986. }
  12987. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12988. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12989. {
  12990. sprintf(buf_log_evcomm,
  12991. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12992. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12993. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12994. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12995. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12996. {
  12997. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12998. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12999. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13000. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13001. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13002. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13003. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13004. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13005. }
  13006. }
  13007. else
  13008. {
  13009. break;
  13010. }
  13011. break;
  13012. }
  13013. //-------------------------------------------
  13014. case ServiceAndPaymentSelectionRequest: //25
  13015. {
  13016. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  13017. {
  13018. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  13019. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13020. }
  13021. else
  13022. {
  13023. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  13024. Update_V2G_Flow_Status(Other_Fault);
  13025. }
  13026. req_is_responsed = TRUE;
  13027. break;
  13028. }
  13029. case ServiceAndPaymentSelectionResponse: //26
  13030. {
  13031. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13032. {
  13033. Update_V2G_Flow_Status(AuthorizationRequest);
  13034. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13035. }
  13036. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13037. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13038. {
  13039. sprintf(buf_log_evcomm,
  13040. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13041. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13042. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13043. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13044. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13045. }
  13046. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13047. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13048. {
  13049. sprintf(buf_log_evcomm,
  13050. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13051. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13052. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13053. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13054. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13055. {
  13056. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13057. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13058. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13059. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13060. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13061. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13062. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13063. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13064. }
  13065. }
  13066. else
  13067. {
  13068. break;
  13069. }
  13070. break;
  13071. }
  13072. //-------------------------------------------
  13073. //case ContractAuthenticationReq:
  13074. case AuthorizationRequest: //29
  13075. {
  13076. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  13077. {
  13078. Update_V2G_Flow_Status(AuthorizationResponse);
  13079. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13080. }
  13081. else
  13082. {
  13083. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  13084. Update_V2G_Flow_Status(Other_Fault);
  13085. }
  13086. req_is_responsed = TRUE;
  13087. break;
  13088. }
  13089. case AuthorizationResponse: //30
  13090. {
  13091. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13092. {
  13093. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13094. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  13095. {
  13096. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13097. }
  13098. else
  13099. {
  13100. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  13101. Update_V2G_Flow_Status(Other_Fault);
  13102. }
  13103. req_is_responsed = TRUE;
  13104. break;
  13105. }
  13106. //Check for ChargeParameterDiscoveryReq
  13107. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13108. {
  13109. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13110. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  13111. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  13112. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13113. ftime(&SeqStartTime);
  13114. #endif
  13115. }
  13116. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13117. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13118. {
  13119. sprintf(buf_log_evcomm,
  13120. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13121. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13122. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13123. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13124. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13125. }
  13126. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13127. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13128. {
  13129. sprintf(buf_log_evcomm,
  13130. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13131. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13132. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13133. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13134. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13135. {
  13136. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13137. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13138. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13139. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13140. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13141. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13142. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13143. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13144. }
  13145. }
  13146. else
  13147. {
  13148. break;
  13149. }
  13150. break;
  13151. }
  13152. //-------------------------------------------
  13153. case ChargeParameterDiscoveryRequest: //35
  13154. {
  13155. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13156. {
  13157. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  13158. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13159. }
  13160. else
  13161. {
  13162. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  13163. Update_V2G_Flow_Status(Other_Fault);
  13164. }
  13165. req_is_responsed = TRUE;
  13166. break;
  13167. }
  13168. case ChargeParameterDiscoveryResponse:
  13169. {
  13170. //STEP 1: Check for Process Timeout
  13171. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13172. ftime(&SeqEndTime);
  13173. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  13174. {
  13175. sprintf(buf_log_evcomm,
  13176. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  13177. DiffTimeb(SeqStartTime, SeqEndTime),
  13178. V2G_SECC_ChargingParameter_Performance_Time);
  13179. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13180. Update_V2G_Flow_Status(Sequence_Timeout);
  13181. break;
  13182. }
  13183. #endif
  13184. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13185. {
  13186. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13187. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13188. {
  13189. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13190. }
  13191. else
  13192. {
  13193. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  13194. Update_V2G_Flow_Status(Other_Fault);
  13195. }
  13196. req_is_responsed = TRUE;
  13197. break;
  13198. }
  13199. //STEP 2: Check for CableCheckReq message
  13200. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13201. {
  13202. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13203. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  13204. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  13205. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13206. Update_V2G_Flow_Status(CableCheckRequest);
  13207. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13208. ftime(&SeqStartTime);
  13209. #endif
  13210. }
  13211. //STEP 3: Wait for PowerDeliveryReq Message
  13212. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13213. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13214. {
  13215. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13216. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13217. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13218. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13219. ftime(&SeqStartTime);
  13220. #endif
  13221. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13222. {
  13223. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13224. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13225. }
  13226. else
  13227. {
  13228. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13229. Update_V2G_Flow_Status(Other_Fault);
  13230. }
  13231. break;
  13232. }
  13233. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13234. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13235. {
  13236. sprintf(buf_log_evcomm,
  13237. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13238. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13239. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13240. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13241. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13242. }
  13243. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13244. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13245. {
  13246. sprintf(buf_log_evcomm,
  13247. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13248. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13249. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13250. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13251. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13252. {
  13253. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13254. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13255. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13256. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13257. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13258. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13259. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13260. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13261. }
  13262. }
  13263. else
  13264. {
  13265. break;
  13266. }
  13267. break;
  13268. }
  13269. //-------------------------------------------
  13270. case CableCheckRequest: //37
  13271. {
  13272. //STEP 3: Execute Cable Check Process
  13273. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  13274. {
  13275. Update_V2G_Flow_Status(CableCheckResponse);
  13276. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13277. }
  13278. else
  13279. {
  13280. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  13281. Update_V2G_Flow_Status(Other_Fault);
  13282. }
  13283. req_is_responsed = TRUE;
  13284. break;
  13285. }
  13286. case CableCheckResponse: //38
  13287. {
  13288. //STEP 1: Check for Process Timeout
  13289. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13290. ftime(&SeqEndTime);
  13291. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  13292. {
  13293. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  13294. sprintf(buf_log_evcomm,
  13295. "CableCheck Timeout - (%.02lf of %d ms)\n",
  13296. DiffTimeb(SeqStartTime, SeqEndTime),
  13297. V2G_SECC_CableCheck_Performance_Time);
  13298. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13299. Update_V2G_Flow_Status(Sequence_Timeout);
  13300. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13301. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  13302. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13303. {
  13304. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13305. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13306. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13307. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13308. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13309. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13310. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13311. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13312. }
  13313. break;
  13314. }
  13315. #endif
  13316. //STEP 2: Check for CableCheckReq message
  13317. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13318. {
  13319. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13320. //STEP 3: Execute Cable Check Process
  13321. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  13322. {
  13323. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13324. }
  13325. else
  13326. {
  13327. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  13328. Update_V2G_Flow_Status(Other_Fault);
  13329. }
  13330. req_is_responsed = TRUE;
  13331. break;
  13332. }
  13333. //STEP 3: Check for PreChargeReq message
  13334. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13335. {
  13336. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13337. Update_V2G_Flow_Status(PreChargeRequest);
  13338. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  13339. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13340. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  13341. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13342. ftime(&SeqStartTime);
  13343. #endif
  13344. }
  13345. //STEP 3: Wait for PowerDeliveryReq Message
  13346. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13347. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13348. {
  13349. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13350. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13351. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13352. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13353. ftime(&SeqStartTime);
  13354. #endif
  13355. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13356. {
  13357. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13358. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13359. }
  13360. else
  13361. {
  13362. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13363. Update_V2G_Flow_Status(Other_Fault);
  13364. }
  13365. break;
  13366. }
  13367. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13368. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13369. {
  13370. sprintf(buf_log_evcomm,
  13371. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13372. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13373. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13374. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13375. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13376. }
  13377. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13378. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13379. {
  13380. sprintf(buf_log_evcomm,
  13381. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13382. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13383. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13384. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13385. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13386. {
  13387. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13388. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13389. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13390. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13391. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13392. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13393. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13394. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13395. }
  13396. }
  13397. else
  13398. {
  13399. break;
  13400. }
  13401. break;
  13402. }
  13403. //-------------------------------------------
  13404. case PreChargeRequest: //39
  13405. {
  13406. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  13407. {
  13408. Update_V2G_Flow_Status(PreChargeResponse);
  13409. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13410. }
  13411. else
  13412. {
  13413. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  13414. Update_V2G_Flow_Status(Other_Fault);
  13415. }
  13416. req_is_responsed = TRUE;
  13417. break;
  13418. }
  13419. case PreChargeResponse: //40
  13420. {
  13421. //STEP 1: Check for Process Timeout
  13422. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13423. ftime(&SeqEndTime);
  13424. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  13425. {
  13426. sprintf(buf_log_evcomm,
  13427. "Precharge Timeout - (%.02lf of %d ms)\n",
  13428. DiffTimeb(SeqStartTime, SeqEndTime),
  13429. V2G_SECC_PreCharge_Performance_Time);
  13430. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13431. Update_V2G_Flow_Status(Sequence_Timeout);
  13432. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13433. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  13434. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13435. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13436. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13437. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13438. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  13439. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  13440. break;
  13441. }
  13442. #endif
  13443. //STEP 2: Check for PreChargeReq message
  13444. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13445. {
  13446. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13447. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  13448. {
  13449. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13450. }
  13451. else
  13452. {
  13453. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  13454. Update_V2G_Flow_Status(Other_Fault);
  13455. }
  13456. req_is_responsed = TRUE;
  13457. break;
  13458. }
  13459. //STEP 3: Check for PowerDeliveryReq message
  13460. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13461. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13462. {
  13463. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13464. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  13465. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  13466. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13467. ftime(&SeqStartTime);
  13468. #endif
  13469. }
  13470. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13471. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13472. {
  13473. sprintf(buf_log_evcomm,
  13474. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13475. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13476. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13477. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13478. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13479. }
  13480. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13481. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13482. {
  13483. sprintf(buf_log_evcomm,
  13484. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13485. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13486. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13487. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13488. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13489. {
  13490. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13491. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13492. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13493. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13494. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13495. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13496. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13497. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13498. }
  13499. }
  13500. else
  13501. {
  13502. break;
  13503. }
  13504. break;
  13505. }
  13506. //-------------------------------------------
  13507. case PowerDeliveryRequestStart: //41
  13508. {
  13509. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  13510. {
  13511. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  13512. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13513. }
  13514. else
  13515. {
  13516. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  13517. Update_V2G_Flow_Status(Other_Fault);
  13518. }
  13519. req_is_responsed = TRUE;
  13520. break;
  13521. }
  13522. case PowerDeliveryResponsetStart: //42
  13523. {
  13524. //STEP 1: Check for Process Timeout
  13525. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13526. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  13527. {
  13528. ftime(&SeqEndTime);
  13529. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  13530. {
  13531. sprintf(buf_log_evcomm,
  13532. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  13533. DiffTimeb(SeqStartTime, SeqEndTime),
  13534. 2000);
  13535. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13536. Update_V2G_Flow_Status(Sequence_Timeout);
  13537. }
  13538. break;
  13539. }
  13540. #endif
  13541. //STEP 2: Wait for CurrentDemandReq Message
  13542. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13543. {
  13544. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13545. Update_V2G_Flow_Status(CurrentDemandRequest);
  13546. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  13547. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  13548. }
  13549. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13550. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13551. {
  13552. sprintf(buf_log_evcomm,
  13553. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13554. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13555. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13556. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13557. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13558. }
  13559. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13560. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13561. {
  13562. sprintf(buf_log_evcomm,
  13563. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13564. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13565. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13566. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13567. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13568. {
  13569. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13570. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13571. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13572. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13573. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13574. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13575. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13576. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13577. }
  13578. }
  13579. else
  13580. {
  13581. break;
  13582. }
  13583. break;
  13584. }
  13585. //-------------------------------------------
  13586. case CurrentDemandRequest: //45,
  13587. {
  13588. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  13589. {
  13590. Update_V2G_Flow_Status(CurrentDemandResponse);
  13591. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13592. }
  13593. else
  13594. {
  13595. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  13596. Update_V2G_Flow_Status(Other_Fault);
  13597. }
  13598. req_is_responsed = TRUE;
  13599. break;
  13600. }
  13601. case CurrentDemandResponse: //46,
  13602. {
  13603. //STEP 1: Wait for CurrentDemandReq Message
  13604. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13605. {
  13606. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13607. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  13608. {
  13609. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13610. }
  13611. else
  13612. {
  13613. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  13614. Update_V2G_Flow_Status(Other_Fault);
  13615. }
  13616. req_is_responsed = TRUE;
  13617. break;
  13618. }
  13619. //STEP 2: Wait for PowerDeliveryReq Message
  13620. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13621. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13622. {
  13623. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13624. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13625. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  13626. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13627. ftime(&SeqStartTime);
  13628. #endif
  13629. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13630. {
  13631. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13632. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13633. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13634. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13635. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13636. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13637. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13638. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13639. }
  13640. }
  13641. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13642. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13643. {
  13644. sprintf(buf_log_evcomm,
  13645. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13646. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13647. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13648. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13649. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13650. }
  13651. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13652. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13653. {
  13654. sprintf(buf_log_evcomm,
  13655. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13656. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13657. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13658. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13659. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13660. {
  13661. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13662. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13663. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13664. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13665. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13666. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13667. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13668. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13669. }
  13670. }
  13671. else
  13672. {
  13673. break;
  13674. }
  13675. break;
  13676. }
  13677. //-------------------------------------------
  13678. case PowerDeliveryRequestStop: //49,
  13679. {
  13680. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13681. {
  13682. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13683. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13684. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13685. ftime(&SeqStartTime);
  13686. #endif
  13687. }
  13688. else
  13689. {
  13690. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13691. Update_V2G_Flow_Status(Other_Fault);
  13692. }
  13693. req_is_responsed = TRUE;
  13694. break;
  13695. }
  13696. case PowerDeliveryResponseStop: //50,
  13697. {
  13698. //STEP 1: Check for Process Timeout
  13699. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13700. ftime(&SeqEndTime);
  13701. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  13702. {
  13703. sprintf(buf_log_evcomm,
  13704. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13705. DiffTimeb(SeqStartTime, SeqEndTime),
  13706. 2000);
  13707. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13708. Update_V2G_Flow_Status(Sequence_Timeout);
  13709. break;
  13710. }
  13711. #endif
  13712. //STEP 2: Check for WeldingDetectionReq Message
  13713. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13714. {
  13715. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13716. Update_V2G_Flow_Status(WeldingDetectionRequest);
  13717. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  13718. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  13719. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13720. ftime(&SeqStartTime);
  13721. #endif
  13722. }
  13723. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13724. {
  13725. Update_V2G_Flow_Status(SessionStopRequest);
  13726. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13727. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  13728. {
  13729. Update_V2G_Flow_Status(SessionStopResponse);
  13730. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13731. }
  13732. else
  13733. {
  13734. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  13735. Update_V2G_Flow_Status(Other_Fault);
  13736. }
  13737. break;
  13738. }
  13739. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13740. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13741. {
  13742. sprintf(buf_log_evcomm,
  13743. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13744. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13745. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  13746. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13747. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13748. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13749. }
  13750. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13751. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13752. {
  13753. sprintf(buf_log_evcomm,
  13754. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13755. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13756. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13757. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13758. }
  13759. else
  13760. {
  13761. break;
  13762. }
  13763. break;
  13764. }
  13765. //-------------------------------------------
  13766. case WeldingDetectionRequest: //51,
  13767. {
  13768. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13769. {
  13770. Update_V2G_Flow_Status(WeldingDetectionResponse);
  13771. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13772. }
  13773. else
  13774. {
  13775. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  13776. Update_V2G_Flow_Status(Other_Fault);
  13777. }
  13778. req_is_responsed = TRUE;
  13779. break;
  13780. }
  13781. case WeldingDetectionResponse: //52,
  13782. {
  13783. //STEP 1: Check for Process Timeout
  13784. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13785. ftime(&SeqEndTime);
  13786. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  13787. {
  13788. sprintf(buf_log_evcomm,
  13789. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13790. DiffTimeb(SeqStartTime, SeqEndTime),
  13791. V2G_SECC_WeldingDetection_Performance_Time);
  13792. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13793. Update_V2G_Flow_Status(Sequence_Timeout);
  13794. break;
  13795. }
  13796. #endif
  13797. //STEP 2: Check for WeldingDetectionReq Message
  13798. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13799. {
  13800. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13801. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13802. {
  13803. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13804. }
  13805. else
  13806. {
  13807. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  13808. Update_V2G_Flow_Status(Other_Fault);
  13809. }
  13810. req_is_responsed = TRUE;
  13811. break;
  13812. }
  13813. //STEP 3: Check for SessionStopReq Message
  13814. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13815. {
  13816. Update_V2G_Flow_Status(SessionStopRequest);
  13817. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13818. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  13819. }
  13820. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13821. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13822. {
  13823. sprintf(buf_log_evcomm,
  13824. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13825. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13826. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13827. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13828. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13829. }
  13830. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13831. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13832. {
  13833. sprintf(buf_log_evcomm,
  13834. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13835. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13836. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13837. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13838. }
  13839. else
  13840. {
  13841. break;
  13842. }
  13843. break;
  13844. }
  13845. //-------------------------------------------
  13846. case SessionStopRequest: //53,
  13847. {
  13848. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  13849. {
  13850. Update_V2G_Flow_Status(SessionStopResponse);
  13851. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13852. }
  13853. else
  13854. {
  13855. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  13856. Update_V2G_Flow_Status(Other_Fault);
  13857. }
  13858. req_is_responsed = TRUE;
  13859. break;
  13860. }
  13861. case SessionStopResponse: //54,
  13862. {
  13863. break;
  13864. }
  13865. //-------------------------------------------
  13866. default:
  13867. {
  13868. break;
  13869. }
  13870. }
  13871. }
  13872. }
  13873. /*===========================================================================
  13874. FUNCTION: V2gMsg_Process_iso1_AC
  13875. DESCRIPTION:
  13876. PRE-CONDITION:
  13877. INPUT:
  13878. 1. V2gFlowStatus
  13879. OUTPUT:
  13880. GLOBAL VARIABLES:
  13881. 1. V2gFlowStatus
  13882. =============================================================================*/
  13883. int V2gMsg_Process_iso1_AC(int AcceptFd)
  13884. {
  13885. unsigned char req_is_responsed = FALSE;
  13886. while (req_is_responsed == FALSE)
  13887. {
  13888. //Check if it is in End_Process
  13889. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  13890. {
  13891. break;
  13892. }
  13893. switch(V2gFlowStatus)
  13894. {
  13895. //-------------------------------------------
  13896. case SupportedAppProtocolRequest: //17
  13897. {
  13898. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  13899. {
  13900. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  13901. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  13902. {
  13903. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13904. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  13905. }
  13906. else
  13907. {
  13908. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  13909. Update_V2G_Flow_Status(Other_Fault);
  13910. }
  13911. }
  13912. req_is_responsed = TRUE;
  13913. break;
  13914. }
  13915. case SupportedAppProtocolResponse: //18
  13916. {
  13917. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  13918. {
  13919. Update_V2G_Flow_Status(SessionSetupRequest);
  13920. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13921. }
  13922. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13923. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13924. {
  13925. sprintf(buf_log_evcomm,
  13926. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13927. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13928. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13929. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13930. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13931. }
  13932. else
  13933. {
  13934. break;
  13935. }
  13936. break;
  13937. }
  13938. //-------------------------------------------
  13939. case SessionSetupRequest: //19
  13940. {
  13941. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  13942. {
  13943. Update_V2G_Flow_Status(SessionSetupResponse);
  13944. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13945. }
  13946. else
  13947. {
  13948. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  13949. Update_V2G_Flow_Status(Other_Fault);
  13950. }
  13951. req_is_responsed = TRUE;
  13952. break;
  13953. }
  13954. case SessionSetupResponse: //20
  13955. {
  13956. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  13957. {
  13958. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  13959. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13960. }
  13961. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13962. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13963. {
  13964. sprintf(buf_log_evcomm,
  13965. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13966. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13967. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13968. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13969. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13970. }
  13971. else
  13972. {
  13973. break;
  13974. }
  13975. break;
  13976. }
  13977. //-------------------------------------------
  13978. case ServiceDiscoveryRequest: //21
  13979. {
  13980. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  13981. {
  13982. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  13983. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13984. }
  13985. else
  13986. {
  13987. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  13988. Update_V2G_Flow_Status(Other_Fault);
  13989. }
  13990. req_is_responsed = TRUE;
  13991. break;
  13992. }
  13993. case ServiceDiscoveryResponse: //22
  13994. {
  13995. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  13996. {
  13997. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  13998. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13999. }
  14000. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14001. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14002. {
  14003. sprintf(buf_log_evcomm,
  14004. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14005. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14006. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14007. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14008. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14009. }
  14010. else
  14011. {
  14012. break;
  14013. }
  14014. break;
  14015. }
  14016. //-------------------------------------------
  14017. case ServiceAndPaymentSelectionRequest: //25
  14018. {
  14019. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  14020. {
  14021. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  14022. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14023. }
  14024. else
  14025. {
  14026. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  14027. Update_V2G_Flow_Status(Other_Fault);
  14028. }
  14029. req_is_responsed = TRUE;
  14030. break;
  14031. }
  14032. case ServiceAndPaymentSelectionResponse://26
  14033. {
  14034. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14035. {
  14036. Update_V2G_Flow_Status(AuthorizationRequest);
  14037. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14038. }
  14039. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14040. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14041. {
  14042. sprintf(buf_log_evcomm,
  14043. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14044. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14045. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14046. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14047. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14048. }
  14049. else
  14050. {
  14051. break;
  14052. }
  14053. break;
  14054. }
  14055. //-------------------------------------------
  14056. //case ContractAuthenticationReq:
  14057. case AuthorizationRequest: //29
  14058. {
  14059. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  14060. {
  14061. Update_V2G_Flow_Status(AuthorizationResponse);
  14062. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14063. }
  14064. else
  14065. {
  14066. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14067. Update_V2G_Flow_Status(Other_Fault);
  14068. }
  14069. req_is_responsed = TRUE;
  14070. break;
  14071. }
  14072. case AuthorizationResponse: //30
  14073. {
  14074. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14075. {
  14076. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14077. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  14078. {
  14079. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14080. }
  14081. else
  14082. {
  14083. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14084. Update_V2G_Flow_Status(Other_Fault);
  14085. }
  14086. req_is_responsed = TRUE;
  14087. break;
  14088. }
  14089. //Check for ChargeParameterDiscoveryReq
  14090. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14091. {
  14092. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14093. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  14094. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  14095. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14096. ftime(&SeqStartTime);
  14097. #endif
  14098. }
  14099. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14100. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14101. {
  14102. sprintf(buf_log_evcomm,
  14103. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14104. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14105. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14106. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14107. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14108. }
  14109. else
  14110. {
  14111. break;
  14112. }
  14113. break;
  14114. }
  14115. //-------------------------------------------
  14116. case ChargeParameterDiscoveryRequest: //35
  14117. {
  14118. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14119. {
  14120. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  14121. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14122. }
  14123. else
  14124. {
  14125. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14126. Update_V2G_Flow_Status(Other_Fault);
  14127. }
  14128. req_is_responsed = TRUE;
  14129. break;
  14130. }
  14131. case ChargeParameterDiscoveryResponse: //36
  14132. {
  14133. //STEP 1: Check for Process Timeout
  14134. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14135. ftime(&SeqEndTime);
  14136. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  14137. {
  14138. sprintf(buf_log_evcomm,
  14139. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  14140. DiffTimeb(SeqStartTime, SeqEndTime),
  14141. V2G_SECC_ChargingParameter_Performance_Time);
  14142. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14143. Update_V2G_Flow_Status(Sequence_Timeout);
  14144. break;
  14145. }
  14146. #endif
  14147. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14148. {
  14149. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14150. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14151. {
  14152. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14153. }
  14154. else
  14155. {
  14156. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14157. Update_V2G_Flow_Status(Other_Fault);
  14158. }
  14159. req_is_responsed = TRUE;
  14160. break;
  14161. }
  14162. //STEP 3: Wait for PowerDeliveryReq Message
  14163. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14164. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14165. {
  14166. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  14167. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14168. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14169. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14170. ftime(&SeqStartTime);
  14171. #endif
  14172. break;
  14173. }
  14174. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14175. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14176. {
  14177. sprintf(buf_log_evcomm,
  14178. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14179. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14180. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14181. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14182. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14183. }
  14184. else
  14185. {
  14186. break;
  14187. }
  14188. break;
  14189. }
  14190. //-------------------------------------------
  14191. case PowerDeliveryRequestStart: //41
  14192. {
  14193. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  14194. {
  14195. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  14196. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14197. }
  14198. else
  14199. {
  14200. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  14201. Update_V2G_Flow_Status(Other_Fault);
  14202. }
  14203. req_is_responsed = TRUE;
  14204. break;
  14205. }
  14206. case PowerDeliveryResponsetStart: //42
  14207. {
  14208. //STEP 1: Check for Process Timeout
  14209. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14210. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  14211. {
  14212. ftime(&SeqEndTime);
  14213. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  14214. {
  14215. sprintf(buf_log_evcomm,
  14216. "Wait for ChargingStatusReq Timeout - (%.02lf of %d ms)\n",
  14217. DiffTimeb(SeqStartTime, SeqEndTime),
  14218. 2000);
  14219. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14220. Update_V2G_Flow_Status(Sequence_Timeout);
  14221. }
  14222. break;
  14223. }
  14224. #endif
  14225. //STEP 2: Wait for ChargingStatusReq Message
  14226. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  14227. {
  14228. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14229. Update_V2G_Flow_Status(ChargingStatusRequest);
  14230. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargingStatusReq: energy transfering...");
  14231. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_Start);
  14232. }
  14233. else
  14234. {
  14235. break;
  14236. }
  14237. break;
  14238. }
  14239. //-------------------------------------------
  14240. case ChargingStatusRequest: //43
  14241. {
  14242. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  14243. {
  14244. Update_V2G_Flow_Status(ChargingStatusResponse);
  14245. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14246. }
  14247. else
  14248. {
  14249. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargingStatusRes: fail");
  14250. Update_V2G_Flow_Status(Other_Fault);
  14251. }
  14252. req_is_responsed = TRUE;
  14253. break;
  14254. }
  14255. case ChargingStatusResponse: //44
  14256. {
  14257. //STEP 1: Wait for ChargingStatusReq Message
  14258. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  14259. {
  14260. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14261. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  14262. {
  14263. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14264. }
  14265. else
  14266. {
  14267. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargingStatusRes: fail");
  14268. Update_V2G_Flow_Status(Other_Fault);
  14269. }
  14270. req_is_responsed = TRUE;
  14271. break;
  14272. }
  14273. //STEP 2: Wait for PowerDeliveryReq Message
  14274. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14275. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14276. {
  14277. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14278. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14279. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_End);
  14280. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14281. ftime(&SeqStartTime);
  14282. #endif
  14283. }
  14284. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14285. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14286. {
  14287. sprintf(buf_log_evcomm,
  14288. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14289. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14290. // EVCOMM_SYS_INFO.SequenceError = TRUE;
  14291. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14292. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14293. break;
  14294. }
  14295. else
  14296. {
  14297. break;
  14298. }
  14299. break;
  14300. }
  14301. //-------------------------------------------
  14302. case PowerDeliveryRequestStop: //49
  14303. {
  14304. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  14305. {
  14306. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14307. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14308. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14309. ftime(&SeqStartTime);
  14310. #endif
  14311. }
  14312. else
  14313. {
  14314. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14315. Update_V2G_Flow_Status(Other_Fault);
  14316. }
  14317. req_is_responsed = TRUE;
  14318. break;
  14319. }
  14320. case PowerDeliveryResponseStop: //50
  14321. {
  14322. //STEP 1: Check for Process Timeout
  14323. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14324. ftime(&SeqEndTime);
  14325. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  14326. {
  14327. sprintf(buf_log_evcomm,
  14328. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  14329. DiffTimeb(SeqStartTime, SeqEndTime),
  14330. 2000);
  14331. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14332. Update_V2G_Flow_Status(Sequence_Timeout);
  14333. break;
  14334. }
  14335. #endif
  14336. //STEP 3: Check for SessionStopReq Message
  14337. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  14338. {
  14339. Update_V2G_Flow_Status(SessionStopRequest);
  14340. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14341. }
  14342. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14343. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14344. {
  14345. sprintf(buf_log_evcomm,
  14346. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14347. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14348. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  14349. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14350. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14351. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14352. }
  14353. else
  14354. {
  14355. break;
  14356. }
  14357. break;
  14358. }
  14359. //-------------------------------------------
  14360. case SessionStopRequest: //53
  14361. {
  14362. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  14363. {
  14364. Update_V2G_Flow_Status(SessionStopResponse);
  14365. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14366. }
  14367. else
  14368. {
  14369. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  14370. Update_V2G_Flow_Status(Other_Fault);
  14371. }
  14372. req_is_responsed = TRUE;
  14373. break;
  14374. }
  14375. case SessionStopResponse: //54
  14376. {
  14377. break;
  14378. }
  14379. //-------------------------------------------
  14380. default:
  14381. {
  14382. break;
  14383. }
  14384. }
  14385. }
  14386. }
  14387. /*===========================================================================
  14388. FUNCTION: V2gMsg_Process_iso1
  14389. DESCRIPTION:
  14390. 1. EnergyTransferMode:
  14391. AC_single_phase_core = 0,
  14392. AC_three_phase_core = 1,
  14393. DC_core = 2,
  14394. DC_extended = 3,
  14395. DC_combo_core = 4,
  14396. DC_unique = 5
  14397. iso1EnergyTransferModeType_AC_single_phase_core = 0,
  14398. iso1EnergyTransferModeType_AC_three_phase_core = 1,
  14399. iso1EnergyTransferModeType_DC_core = 2,
  14400. iso1EnergyTransferModeType_DC_extended = 3,
  14401. iso1EnergyTransferModeType_DC_combo_core = 4,
  14402. iso1EnergyTransferModeType_DC_unique = 5
  14403. PRE-CONDITION:
  14404. INPUT:
  14405. 1. V2gFlowStatus
  14406. OUTPUT:
  14407. GLOBAL VARIABLES:
  14408. 1. V2gFlowStatus
  14409. =============================================================================*/
  14410. int V2gMsg_Process_iso1(int AcceptFd, unsigned char EnergyTransferMode)
  14411. {
  14412. switch (EnergyTransferMode)
  14413. {
  14414. case DC_extended:
  14415. {
  14416. V2gMsg_Process_iso1_DC(AcceptFd);
  14417. break;
  14418. }
  14419. case AC_single_phase_core:
  14420. case AC_three_phase_core:
  14421. {
  14422. V2gMsg_Process_iso1_AC(AcceptFd);
  14423. break;
  14424. }
  14425. default:
  14426. {
  14427. sprintf(buf_log_evcomm,
  14428. "[ISO1][Warning]Unexpected EnergyTransferMode(%d)",
  14429. EnergyTransferMode);
  14430. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14431. break;
  14432. }
  14433. }
  14434. }
  14435. /*===========================================================================
  14436. FUNCTION: V2gMsg_Process_iso2_DC
  14437. DESCRIPTION:
  14438. PRE-CONDITION:
  14439. INPUT:
  14440. 1. V2gFlowStatus
  14441. OUTPUT:
  14442. GLOBAL VARIABLES:
  14443. 1. V2gFlowStatus
  14444. =============================================================================*/
  14445. int V2gMsg_Process_iso2_DC(int AcceptFd)
  14446. {
  14447. unsigned char req_is_responsed = FALSE;
  14448. while (req_is_responsed == FALSE)
  14449. {
  14450. //Check if it is in End_Process
  14451. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  14452. {
  14453. break;
  14454. }
  14455. switch(V2gFlowStatus)
  14456. {
  14457. //-------------------------------------------
  14458. case SupportedAppProtocolRequest:
  14459. {
  14460. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  14461. {
  14462. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  14463. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  14464. {
  14465. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14466. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  14467. }
  14468. else
  14469. {
  14470. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  14471. Update_V2G_Flow_Status(Other_Fault);
  14472. }
  14473. }
  14474. req_is_responsed = TRUE;
  14475. break;
  14476. }
  14477. case SupportedAppProtocolResponse:
  14478. {
  14479. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  14480. {
  14481. Update_V2G_Flow_Status(SessionSetupRequest);
  14482. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14483. }
  14484. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14485. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14486. {
  14487. sprintf(buf_log_evcomm,
  14488. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14489. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14490. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14491. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14492. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14493. }
  14494. else
  14495. {
  14496. break;
  14497. }
  14498. break;
  14499. }
  14500. //-------------------------------------------
  14501. case SessionSetupRequest: //19
  14502. {
  14503. if (Proc_iso2_SessionSetupReq(AcceptFd) == 0)
  14504. {
  14505. Update_V2G_Flow_Status(SessionSetupResponse);
  14506. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14507. }
  14508. else
  14509. {
  14510. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  14511. Update_V2G_Flow_Status(Other_Fault);
  14512. }
  14513. req_is_responsed = TRUE;
  14514. break;
  14515. }
  14516. case SessionSetupResponse: //20
  14517. {
  14518. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  14519. {
  14520. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  14521. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14522. }
  14523. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14524. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14525. {
  14526. sprintf(buf_log_evcomm,
  14527. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14528. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14529. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14530. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14531. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14532. }
  14533. else
  14534. {
  14535. break;
  14536. }
  14537. break;
  14538. }
  14539. #if 0
  14540. //-------------------------------------------
  14541. case ServiceDiscoveryRequest: //21
  14542. {
  14543. if (Proc_iso2_ServiceDiscoveryReq(AcceptFd) == 0)
  14544. {
  14545. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  14546. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14547. }
  14548. else
  14549. {
  14550. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  14551. Update_V2G_Flow_Status(Other_Fault);
  14552. }
  14553. req_is_responsed = TRUE;
  14554. break;
  14555. }
  14556. case ServiceDiscoveryResponse: //22
  14557. {
  14558. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  14559. {
  14560. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  14561. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14562. }
  14563. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14564. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14565. {
  14566. sprintf(buf_log_evcomm,
  14567. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14568. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14569. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14570. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14571. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14572. }
  14573. else
  14574. {
  14575. break;
  14576. }
  14577. break;
  14578. }
  14579. //-------------------------------------------
  14580. case ServiceAndPaymentSelectionRequest: //25
  14581. {
  14582. if (Proc_iso2_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  14583. {
  14584. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  14585. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14586. }
  14587. else
  14588. {
  14589. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  14590. Update_V2G_Flow_Status(Other_Fault);
  14591. }
  14592. req_is_responsed = TRUE;
  14593. break;
  14594. }
  14595. case ServiceAndPaymentSelectionResponse: //26
  14596. {
  14597. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14598. {
  14599. Update_V2G_Flow_Status(AuthorizationRequest);
  14600. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14601. }
  14602. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14603. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14604. {
  14605. sprintf(buf_log_evcomm,
  14606. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14607. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14608. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14609. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14610. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14611. }
  14612. else
  14613. {
  14614. break;
  14615. }
  14616. break;
  14617. }
  14618. //-------------------------------------------
  14619. //case ContractAuthenticationReq:
  14620. case AuthorizationRequest: //29
  14621. {
  14622. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  14623. {
  14624. Update_V2G_Flow_Status(AuthorizationResponse);
  14625. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14626. }
  14627. else
  14628. {
  14629. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14630. Update_V2G_Flow_Status(Other_Fault);
  14631. }
  14632. req_is_responsed = TRUE;
  14633. break;
  14634. }
  14635. case AuthorizationResponse: //30
  14636. {
  14637. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14638. {
  14639. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14640. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  14641. {
  14642. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14643. }
  14644. else
  14645. {
  14646. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14647. Update_V2G_Flow_Status(Other_Fault);
  14648. }
  14649. req_is_responsed = TRUE;
  14650. break;
  14651. }
  14652. //Check for ChargeParameterDiscoveryReq
  14653. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14654. {
  14655. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14656. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  14657. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  14658. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14659. ftime(&SeqStartTime);
  14660. #endif
  14661. }
  14662. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14663. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14664. {
  14665. sprintf(buf_log_evcomm,
  14666. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14667. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14668. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14669. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14670. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14671. }
  14672. else
  14673. {
  14674. break;
  14675. }
  14676. break;
  14677. }
  14678. //-------------------------------------------
  14679. case ChargeParameterDiscoveryRequest: //35
  14680. {
  14681. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14682. {
  14683. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  14684. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14685. }
  14686. else
  14687. {
  14688. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14689. Update_V2G_Flow_Status(Other_Fault);
  14690. }
  14691. req_is_responsed = TRUE;
  14692. break;
  14693. }
  14694. case ChargeParameterDiscoveryResponse:
  14695. {
  14696. //STEP 1: Check for Process Timeout
  14697. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14698. ftime(&SeqEndTime);
  14699. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  14700. {
  14701. sprintf(buf_log_evcomm,
  14702. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  14703. DiffTimeb(SeqStartTime, SeqEndTime),
  14704. V2G_SECC_ChargingParameter_Performance_Time);
  14705. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14706. Update_V2G_Flow_Status(Sequence_Timeout);
  14707. break;
  14708. }
  14709. #endif
  14710. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14711. {
  14712. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14713. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14714. {
  14715. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14716. }
  14717. else
  14718. {
  14719. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14720. Update_V2G_Flow_Status(Other_Fault);
  14721. }
  14722. req_is_responsed = TRUE;
  14723. break;
  14724. }
  14725. //STEP 2: Check for CableCheckReq message
  14726. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  14727. {
  14728. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14729. Update_V2G_Flow_Status(CableCheckRequest);
  14730. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  14731. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  14732. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  14733. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14734. ftime(&SeqStartTime);
  14735. #endif
  14736. }
  14737. //STEP 3: Wait for PowerDeliveryReq Message
  14738. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14739. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14740. {
  14741. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14742. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14743. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14744. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14745. ftime(&SeqStartTime);
  14746. #endif
  14747. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  14748. {
  14749. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14750. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14751. }
  14752. else
  14753. {
  14754. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14755. Update_V2G_Flow_Status(Other_Fault);
  14756. }
  14757. break;
  14758. }
  14759. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14760. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14761. {
  14762. sprintf(buf_log_evcomm,
  14763. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14764. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14765. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14766. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14767. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14768. }
  14769. else
  14770. {
  14771. break;
  14772. }
  14773. break;
  14774. }
  14775. //-------------------------------------------
  14776. case CableCheckRequest: //37
  14777. {
  14778. //STEP 3: Execute Cable Check Process
  14779. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  14780. {
  14781. Update_V2G_Flow_Status(CableCheckResponse);
  14782. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14783. }
  14784. else
  14785. {
  14786. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  14787. Update_V2G_Flow_Status(Other_Fault);
  14788. }
  14789. req_is_responsed = TRUE;
  14790. break;
  14791. }
  14792. case CableCheckResponse: //38
  14793. {
  14794. //STEP 1: Check for Process Timeout
  14795. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14796. ftime(&SeqEndTime);
  14797. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  14798. {
  14799. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  14800. sprintf(buf_log_evcomm,
  14801. "CableCheck Timeout - (%.02lf of %d ms)\n",
  14802. DiffTimeb(SeqStartTime, SeqEndTime),
  14803. V2G_SECC_CableCheck_Performance_Time);
  14804. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14805. Update_V2G_Flow_Status(Sequence_Timeout);
  14806. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14807. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  14808. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14809. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14810. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14811. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14812. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  14813. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  14814. break;
  14815. }
  14816. #endif
  14817. //STEP 2: Check for CableCheckReq message
  14818. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  14819. {
  14820. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14821. //STEP 3: Execute Cable Check Process
  14822. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  14823. {
  14824. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14825. }
  14826. else
  14827. {
  14828. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  14829. Update_V2G_Flow_Status(Other_Fault);
  14830. }
  14831. req_is_responsed = TRUE;
  14832. break;
  14833. }
  14834. //STEP 3: Check for PreChargeReq message
  14835. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  14836. {
  14837. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14838. Update_V2G_Flow_Status(PreChargeRequest);
  14839. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  14840. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  14841. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  14842. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14843. ftime(&SeqStartTime);
  14844. #endif
  14845. }
  14846. //STEP 3: Wait for PowerDeliveryReq Message
  14847. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14848. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14849. {
  14850. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14851. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14852. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14853. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14854. ftime(&SeqStartTime);
  14855. #endif
  14856. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  14857. {
  14858. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14859. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14860. }
  14861. else
  14862. {
  14863. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14864. Update_V2G_Flow_Status(Other_Fault);
  14865. }
  14866. break;
  14867. }
  14868. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14869. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14870. {
  14871. sprintf(buf_log_evcomm,
  14872. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14873. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14874. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14875. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14876. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14877. }
  14878. else
  14879. {
  14880. break;
  14881. }
  14882. break;
  14883. }
  14884. //-------------------------------------------
  14885. case PreChargeRequest: //39
  14886. {
  14887. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  14888. {
  14889. Update_V2G_Flow_Status(PreChargeResponse);
  14890. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14891. }
  14892. else
  14893. {
  14894. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  14895. Update_V2G_Flow_Status(Other_Fault);
  14896. }
  14897. req_is_responsed = TRUE;
  14898. break;
  14899. }
  14900. case PreChargeResponse: //40
  14901. {
  14902. //STEP 1: Check for Process Timeout
  14903. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14904. ftime(&SeqEndTime);
  14905. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  14906. {
  14907. sprintf(buf_log_evcomm,
  14908. "Precharge Timeout - (%.02lf of %d ms)\n",
  14909. DiffTimeb(SeqStartTime, SeqEndTime),
  14910. V2G_SECC_PreCharge_Performance_Time);
  14911. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14912. Update_V2G_Flow_Status(Sequence_Timeout);
  14913. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14914. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  14915. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14916. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14917. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14918. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14919. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  14920. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  14921. break;
  14922. }
  14923. #endif
  14924. //STEP 2: Check for PreChargeReq message
  14925. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  14926. {
  14927. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14928. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  14929. {
  14930. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14931. }
  14932. else
  14933. {
  14934. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  14935. Update_V2G_Flow_Status(Other_Fault);
  14936. }
  14937. req_is_responsed = TRUE;
  14938. break;
  14939. }
  14940. //STEP 3: Check for PowerDeliveryReq message
  14941. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14942. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14943. {
  14944. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14945. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  14946. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  14947. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14948. ftime(&SeqStartTime);
  14949. #endif
  14950. }
  14951. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14952. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14953. {
  14954. sprintf(buf_log_evcomm,
  14955. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14956. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14957. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14958. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14959. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14960. }
  14961. else
  14962. {
  14963. break;
  14964. }
  14965. break;
  14966. }
  14967. //-------------------------------------------
  14968. case PowerDeliveryRequestStart: //41
  14969. {
  14970. if (Proc_iso2_PowerDeliveryStartReq(AcceptFd) == 0)
  14971. {
  14972. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  14973. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14974. }
  14975. else
  14976. {
  14977. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  14978. Update_V2G_Flow_Status(Other_Fault);
  14979. }
  14980. req_is_responsed = TRUE;
  14981. break;
  14982. }
  14983. case PowerDeliveryResponsetStart: //42
  14984. {
  14985. //STEP 1: Check for Process Timeout
  14986. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14987. if (ccs_exi_doc_ISO2.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  14988. {
  14989. ftime(&SeqEndTime);
  14990. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  14991. {
  14992. sprintf(buf_log_evcomm,
  14993. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  14994. DiffTimeb(SeqStartTime, SeqEndTime),
  14995. 2000);
  14996. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14997. Update_V2G_Flow_Status(Sequence_Timeout);
  14998. }
  14999. break;
  15000. }
  15001. #endif
  15002. //STEP 2: Wait for CurrentDemandReq Message
  15003. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  15004. {
  15005. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15006. Update_V2G_Flow_Status(CurrentDemandRequest);
  15007. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  15008. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  15009. }
  15010. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15011. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15012. {
  15013. sprintf(buf_log_evcomm,
  15014. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15015. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15016. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15017. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15018. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15019. }
  15020. else
  15021. {
  15022. break;
  15023. }
  15024. break;
  15025. }
  15026. //-------------------------------------------
  15027. case CurrentDemandRequest: //45,
  15028. {
  15029. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  15030. {
  15031. Update_V2G_Flow_Status(CurrentDemandResponse);
  15032. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15033. }
  15034. else
  15035. {
  15036. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  15037. Update_V2G_Flow_Status(Other_Fault);
  15038. }
  15039. req_is_responsed = TRUE;
  15040. break;
  15041. }
  15042. case CurrentDemandResponse: //46,
  15043. {
  15044. //STEP 1: Wait for CurrentDemandReq Message
  15045. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  15046. {
  15047. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15048. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  15049. {
  15050. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15051. }
  15052. else
  15053. {
  15054. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  15055. Update_V2G_Flow_Status(Other_Fault);
  15056. }
  15057. req_is_responsed = TRUE;
  15058. break;
  15059. }
  15060. //STEP 2: Wait for PowerDeliveryReq Message
  15061. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  15062. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  15063. {
  15064. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  15065. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15066. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  15067. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15068. ftime(&SeqStartTime);
  15069. #endif
  15070. }
  15071. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15072. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15073. {
  15074. sprintf(buf_log_evcomm,
  15075. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15076. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15077. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15078. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15079. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15080. }
  15081. else
  15082. {
  15083. break;
  15084. }
  15085. break;
  15086. }
  15087. //-------------------------------------------
  15088. case PowerDeliveryRequestStop: //49,
  15089. {
  15090. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  15091. {
  15092. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  15093. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15094. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15095. ftime(&SeqStartTime);
  15096. #endif
  15097. }
  15098. else
  15099. {
  15100. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  15101. Update_V2G_Flow_Status(Other_Fault);
  15102. }
  15103. req_is_responsed = TRUE;
  15104. break;
  15105. }
  15106. case PowerDeliveryResponseStop: //50,
  15107. {
  15108. //STEP 1: Check for Process Timeout
  15109. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15110. ftime(&SeqEndTime);
  15111. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  15112. {
  15113. sprintf(buf_log_evcomm,
  15114. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  15115. DiffTimeb(SeqStartTime, SeqEndTime),
  15116. 2000);
  15117. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15118. Update_V2G_Flow_Status(Sequence_Timeout);
  15119. break;
  15120. }
  15121. #endif
  15122. //STEP 2: Check for WeldingDetectionReq Message
  15123. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  15124. {
  15125. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15126. Update_V2G_Flow_Status(WeldingDetectionRequest);
  15127. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  15128. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  15129. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15130. ftime(&SeqStartTime);
  15131. #endif
  15132. }
  15133. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  15134. {
  15135. Update_V2G_Flow_Status(SessionStopRequest);
  15136. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15137. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  15138. {
  15139. Update_V2G_Flow_Status(SessionStopResponse);
  15140. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15141. }
  15142. else
  15143. {
  15144. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  15145. Update_V2G_Flow_Status(Other_Fault);
  15146. }
  15147. break;
  15148. }
  15149. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15150. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15151. {
  15152. sprintf(buf_log_evcomm,
  15153. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15154. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15155. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15156. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15157. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15158. }
  15159. else
  15160. {
  15161. break;
  15162. }
  15163. break;
  15164. }
  15165. //-------------------------------------------
  15166. case WeldingDetectionRequest: //51,
  15167. {
  15168. if (Proc_iso2_WeldingDetectionReq(AcceptFd) == 0)
  15169. {
  15170. Update_V2G_Flow_Status(WeldingDetectionResponse);
  15171. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15172. }
  15173. else
  15174. {
  15175. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  15176. Update_V2G_Flow_Status(Other_Fault);
  15177. }
  15178. req_is_responsed = TRUE;
  15179. break;
  15180. }
  15181. case WeldingDetectionResponse: //52,
  15182. {
  15183. //STEP 1: Check for Process Timeout
  15184. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15185. ftime(&SeqEndTime);
  15186. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  15187. {
  15188. sprintf(buf_log_evcomm,
  15189. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  15190. DiffTimeb(SeqStartTime, SeqEndTime),
  15191. V2G_SECC_WeldingDetection_Performance_Time);
  15192. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15193. Update_V2G_Flow_Status(Sequence_Timeout);
  15194. break;
  15195. }
  15196. #endif
  15197. //STEP 2: Check for WeldingDetectionReq Message
  15198. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  15199. {
  15200. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15201. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  15202. {
  15203. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15204. }
  15205. else
  15206. {
  15207. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  15208. Update_V2G_Flow_Status(Other_Fault);
  15209. }
  15210. req_is_responsed = TRUE;
  15211. break;
  15212. }
  15213. //STEP 3: Check for SessionStopReq Message
  15214. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  15215. {
  15216. Update_V2G_Flow_Status(SessionStopRequest);
  15217. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15218. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  15219. }
  15220. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15221. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15222. {
  15223. sprintf(buf_log_evcomm,
  15224. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15225. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15226. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15227. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15228. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15229. }
  15230. else
  15231. {
  15232. break;
  15233. }
  15234. break;
  15235. }
  15236. //-------------------------------------------
  15237. case SessionStopRequest: //53,
  15238. {
  15239. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  15240. {
  15241. Update_V2G_Flow_Status(SessionStopResponse);
  15242. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15243. }
  15244. else
  15245. {
  15246. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  15247. Update_V2G_Flow_Status(Other_Fault);
  15248. }
  15249. req_is_responsed = TRUE;
  15250. break;
  15251. }
  15252. case SessionStopResponse: //54,
  15253. {
  15254. break;
  15255. }
  15256. #endif
  15257. //-------------------------------------------
  15258. default:
  15259. {
  15260. break;
  15261. }
  15262. }
  15263. }
  15264. }
  15265. /*===========================================================================
  15266. FUNCTION: V2gMsg_Process_iso2_AC
  15267. DESCRIPTION:
  15268. PRE-CONDITION:
  15269. INPUT:
  15270. 1. V2gFlowStatus
  15271. OUTPUT:
  15272. GLOBAL VARIABLES:
  15273. 1. V2gFlowStatus
  15274. =============================================================================*/
  15275. int V2gMsg_Process_iso2_AC(int AcceptFd)
  15276. {
  15277. }
  15278. /*===========================================================================
  15279. FUNCTION: V2gMsg_Process_iso2
  15280. DESCRIPTION:
  15281. PRE-CONDITION:
  15282. INPUT:
  15283. 1. V2gFlowStatus
  15284. OUTPUT:
  15285. GLOBAL VARIABLES:
  15286. 1. V2gFlowStatus
  15287. =============================================================================*/
  15288. int V2gMsg_Process_iso2(int AcceptFd, unsigned char EnergyTransferMode)
  15289. {
  15290. switch (EnergyTransferMode)
  15291. {
  15292. case DC_extended:
  15293. {
  15294. V2gMsg_Process_iso2_DC(AcceptFd);
  15295. break;
  15296. }
  15297. case AC_single_phase_core:
  15298. case AC_three_phase_core:
  15299. {
  15300. V2gMsg_Process_iso2_AC(AcceptFd);
  15301. break;
  15302. }
  15303. default:
  15304. {
  15305. sprintf(buf_log_evcomm,
  15306. "[ISO2][Warning]Unexpected EnergyTransferMode(%d)",
  15307. EnergyTransferMode);
  15308. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15309. break;
  15310. }
  15311. }
  15312. }
  15313. /*===========================================================================
  15314. FUNCTION: V2gMsg_Process
  15315. DESCRIPTION:
  15316. PRE-CONDITION:
  15317. INPUT:
  15318. OUTPUT:
  15319. GLOBAL VARIABLES:
  15320. =============================================================================*/
  15321. int V2gMsg_Process(int AcceptFd)
  15322. {
  15323. int errn = 0;
  15324. switch (ShmCcsData->CommProtocol)
  15325. {
  15326. case V2GT_MSG_PROTOCOL_DIN70121: //0
  15327. {
  15328. V2gMsg_Process_din(AcceptFd);
  15329. break;
  15330. }
  15331. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  15332. {
  15333. V2gMsg_Process_iso1(AcceptFd, ShmCcsData->EnergyTransferMode);
  15334. break;
  15335. }
  15336. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  15337. {
  15338. V2gMsg_Process_iso2(AcceptFd, ShmCcsData->EnergyTransferMode);
  15339. break;
  15340. }
  15341. default:
  15342. {
  15343. sprintf(buf_log_evcomm,
  15344. "[Warning]Unexpected CommProtocol(%d)",
  15345. ShmCcsData->CommProtocol);
  15346. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15347. break;
  15348. }
  15349. }
  15350. return errn;
  15351. }
  15352. /*===========================================================================
  15353. FUNCTION: V2gMsg_Rx
  15354. DESCRIPTION:
  15355. PRE-CONDITION:
  15356. INPUT:
  15357. OUTPUT:
  15358. GLOBAL VARIABLES:
  15359. =============================================================================*/
  15360. int V2gMsg_Rx(int AcceptFd)
  15361. {
  15362. int errn = 0;
  15363. unsigned int packet_size = 0;
  15364. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15365. #ifdef SUPPORT_TLS_CONNECTION
  15366. if(EvSecurity == 0)//support security
  15367. {
  15368. packet_size = SSL_read(ssl, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE);
  15369. }
  15370. else
  15371. {
  15372. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  15373. }
  15374. #else
  15375. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  15376. #endif
  15377. //[CAUTION] Everytime recv() is called, it will take a default time to wait for TCP packets.
  15378. //The more time you call recv(), the more time you will waste here.
  15379. //Here it is suggested that response immediatedly once you receive any packets.
  15380. //For configuring the Rx waiting time, please use setsockopt().
  15381. if(packet_size > 0) //[Joseph] If there is no data, ignore. (TBD)
  15382. {
  15383. //DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got TCP V2GTP Message: size = %d Bytes\n", packet_size);
  15384. errn = V2gMsgDecoder(V2gtpMsgRxBuf, packet_size, V2gFlowStatus);
  15385. if (errn < 0)
  15386. {
  15387. sprintf(buf_log_evcomm, "[ERROR]V2gMsgDecoder", errn);
  15388. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15389. }
  15390. }
  15391. return errn;
  15392. }
  15393. /*===========================================================================
  15394. FUNCTION: V2gComm
  15395. DESCRIPTION:
  15396. PRE-CONDITION:
  15397. 1. TCP socket is connected.
  15398. INPUT:
  15399. 1. AcceptFd //TCP Connection ID
  15400. 2. V2gtpMsgRxBuf[] //V2GTP Messages (Header + Payload)
  15401. 3. V2GTP_MSG_RX_BUFFER_SIZE //64*1024 = 65,536 = 65.5K (Bytes)
  15402. OUTPUT:
  15403. GLOBAL VARIABLES:
  15404. 1. V2gtpMsgRxBuf[]
  15405. =============================================================================*/
  15406. int V2gComm(int AcceptFd)
  15407. {
  15408. int errn = 0;
  15409. if (V2gMsg_Rx(AcceptFd) < 0)
  15410. {
  15411. Update_V2G_Flow_Status(Other_Fault);
  15412. errn = -1;
  15413. }
  15414. //following are the response message handling according to status flag
  15415. if (V2gMsg_Process(AcceptFd) < 0)
  15416. {
  15417. errn = -1;
  15418. }
  15419. //Error Check
  15420. //V2G_Error_Monitor();
  15421. return errn;
  15422. }
  15423. /*===========================================================================
  15424. FUNCTION: SdpUdpConnected
  15425. DESCRIPTION:
  15426. PRE-CONDITION:
  15427. INPUT:
  15428. OUTPUT:
  15429. GLOBAL VARIABLES:
  15430. =============================================================================*/
  15431. int SdpUdpConnected()
  15432. {
  15433. int packet_size,Rtn;
  15434. struct sockaddr_in6 ServerAddr,ClientAddr;
  15435. struct V2gtpHeader *header;
  15436. unsigned char *payload;
  15437. if(UdpSock <= 0)
  15438. {
  15439. if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
  15440. {
  15441. SAVE_SYS_LOG_MSG_EVCOMM("SdpUdpConnected: Fail to open UdpSock");
  15442. return 0;
  15443. }
  15444. ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp=UdpSock;
  15445. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  15446. ServerAddr.sin6_family = AF_INET6;
  15447. ServerAddr.sin6_addr = in6addr_any;
  15448. ServerAddr.sin6_port = htons(SdpUdpServerPort);
  15449. if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  15450. {
  15451. sprintf(buf_log_evcomm,
  15452. "SdpUdpConnected: Fail to bind UdpSock(%d)",
  15453. UdpSock);
  15454. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15455. close(UdpSock);
  15456. UdpSock = -1;
  15457. return 0;
  15458. }
  15459. sprintf(buf_log_evcomm, "[UdpSock]opend:%d", UdpSock);
  15460. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15461. sprintf(buf_log_evcomm, "[SDP]Req from EVCC: waiting...(%d)", UdpSock);
  15462. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15463. }
  15464. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15465. memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
  15466. Rtn = sizeof(struct sockaddr_in6);
  15467. packet_size = recvfrom(UdpSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, &Rtn);
  15468. if(packet_size > 0)
  15469. {
  15470. header = (struct V2gtpHeader *) V2gtpMsgRxBuf;
  15471. payload = V2gtpMsgRxBuf+sizeof(struct V2gtpHeader);
  15472. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15473. {
  15474. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got UDP packet_size = %d (Bytes)\n", packet_size);
  15475. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
  15476. DEBUG_PRINTF_EVCOMM_DETAIL("***** Received SDP Packet *****\n");
  15477. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  15478. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  15479. for(Rtn = 0; Rtn < 16; Rtn += 2)
  15480. {
  15481. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  15482. }
  15483. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15484. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n",ClientAddr.sin6_port);
  15485. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n",header->ProtocolVersion);
  15486. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n",header->InverseProtocolVersion);
  15487. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n",htons(header->PayloadType));
  15488. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n",htonl(header->PayloadLength));
  15489. DEBUG_PRINTF_EVCOMM_DETAIL("htons(header->PayloadType)=0x%x\n",htons(header->PayloadType));
  15490. }
  15491. #endif
  15492. if( (header->ProtocolVersion == 0x01) &&
  15493. (header->InverseProtocolVersion == 0xFE) &&
  15494. (htons(header->PayloadType) == V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
  15495. {
  15496. sprintf(buf_log_evcomm, "[SDP][Rx]Req from EVCC: GOT(%d)", UdpSock);
  15497. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15498. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", *(payload + 0));
  15499. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", *(payload + 1));
  15500. #ifdef SUPPORT_TLS_CONNECTION
  15501. EvSecurity= *(payload);
  15502. #endif
  15503. header->PayloadType = htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
  15504. header->PayloadLength = htonl(20); //Fixed Length=20
  15505. memset(payload, 0, 20);
  15506. // MAC address[0:2] + FFFE + MAC address[3:5]
  15507. payload[0] = (IPV6_LINK_LOCAL_PREFIX>>8) & 0xFF;
  15508. payload[1] = IPV6_LINK_LOCAL_PREFIX & 0xFF;
  15509. payload[8 ]= CsuMac[0];
  15510. payload[8] ^= 0x02;// bit 1 should complemented.
  15511. payload[9] = CsuMac[1];
  15512. payload[10] = CsuMac[2];
  15513. payload[11] = 0xFF;
  15514. payload[12] = 0xFE;
  15515. payload[13] = CsuMac[3];
  15516. payload[14] = CsuMac[4];
  15517. payload[15] = CsuMac[5];
  15518. //TCP port
  15519. payload[16] = (EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active>>8) & 0xFF;
  15520. payload[17] = EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active & 0xFF;
  15521. #ifdef SUPPORT_TLS_CONNECTION
  15522. if(EvSecurity == 0)//support security
  15523. payload[18] = SDP_PAYLOAD_SECURITY_TLS; //Security
  15524. else
  15525. payload[18] = SDP_PAYLOAD_SECURITY_NONE; // No Security
  15526. #else
  15527. payload[18] = SDP_PAYLOAD_SECURITY_NONE; //No Security
  15528. #endif
  15529. payload[19] = SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
  15530. //[To-Do] Setup the TCP in advance to receive the coming TCP handshke messages after SDP response.
  15531. Rtn = sendto(UdpSock, V2gtpMsgRxBuf, sizeof(struct V2gtpHeader) + htonl(header->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
  15532. sprintf(buf_log_evcomm, "[SDP][Tx]Res from SECC");
  15533. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15534. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15535. {
  15536. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response SDP Packet *****\n");
  15537. DEBUG_PRINTF_EVCOMM_DETAIL("Send size=%d\n",Rtn);
  15538. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Address=");
  15539. for(Rtn = 0; Rtn < 16; Rtn++)
  15540. {
  15541. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ", ClientAddr.sin6_addr.s6_addr[Rtn]);
  15542. }
  15543. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15544. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Port=%d\n", ClientAddr.sin6_port);
  15545. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n", header->ProtocolVersion);
  15546. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n", header->InverseProtocolVersion);
  15547. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n", htons(header->PayloadType));
  15548. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n", htonl(header->PayloadLength));
  15549. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Ipv6 Address=");
  15550. for(Rtn = 0; Rtn < 16; Rtn++)
  15551. {
  15552. DEBUG_PRINTF_EVCOMM_DETAIL("%02x:",payload[Rtn]);
  15553. }
  15554. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15555. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Port=%d\n", (payload[16]<<8 | payload[17]));
  15556. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", payload[19]);
  15557. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", payload[20]);
  15558. }
  15559. #endif
  15560. if(Rtn >= 28)
  15561. {
  15562. return 1;
  15563. }
  15564. }
  15565. }
  15566. return 0;
  15567. }
  15568. /*===========================================================================
  15569. FUNCTION: V2gTcpConnected
  15570. DESCRIPTION:
  15571. PRE-CONDITION:
  15572. INPUT:
  15573. OUTPUT:
  15574. GLOBAL VARIABLES:
  15575. =============================================================================*/
  15576. int V2gTcpConnected()
  15577. {
  15578. int packet_size,Rtn,AcceptFd;
  15579. struct sockaddr_in6 ServerAddr,ClientAddr;
  15580. if(TcpSock <= 0)
  15581. {
  15582. if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) < 0)
  15583. {
  15584. sprintf(buf_log_evcomm,
  15585. "V2gTcpConnected: Fail to open TcpSock (%s)",
  15586. strerror(errno));
  15587. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15588. usleep(100000); //100ms
  15589. return 0;
  15590. }
  15591. ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp=TcpSock;
  15592. fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
  15593. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]socket set: DONE");
  15594. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  15595. ServerAddr.sin6_family = PF_INET6;
  15596. ServerAddr.sin6_addr = in6addr_any;
  15597. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15598. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 10) + 1);
  15599. //printf("SdpTcpServerPort = %d(DEC)\n", htons(ServerAddr.sin6_port));
  15600. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  15601. {
  15602. sprintf(buf_log_evcomm,
  15603. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  15604. strerror(errno),
  15605. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  15606. );
  15607. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15608. //Change to another TCP port
  15609. /*
  15610. memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
  15611. ServerAddr.sin6_family = PF_INET6;
  15612. ServerAddr.sin6_addr = in6addr_any;
  15613. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 1000) + 1);
  15614. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15615. */
  15616. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  15617. {
  15618. sprintf(buf_log_evcomm,
  15619. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  15620. strerror(errno),
  15621. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  15622. );
  15623. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15624. usleep(100000); //100ms
  15625. close(TcpSock);
  15626. TcpSock = -1;
  15627. return 0;
  15628. }
  15629. }
  15630. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]blid: DONE");
  15631. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]listen: START");
  15632. if(listen(TcpSock, 1) < 0) //only accept one connection
  15633. {
  15634. sprintf(buf_log_evcomm,
  15635. "V2gTcpConnected: Fail to listen TcpSock (%s)",
  15636. strerror(errno));
  15637. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15638. usleep(100000); //100ms
  15639. close(TcpSock);
  15640. TcpSock = -1;
  15641. return 0;
  15642. }
  15643. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]listen: DONE");
  15644. sprintf(buf_log_evcomm, "[TCP]TcpSock: opened(%d), port=%d", TcpSock, htons(ServerAddr.sin6_port));
  15645. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15646. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]accept: START");
  15647. }
  15648. Rtn = sizeof(struct sockaddr_in6);
  15649. if((AcceptFd = accept(TcpSock, (struct sockaddr *)&ClientAddr, &Rtn)) < 0 )
  15650. {
  15651. static BOOL tmp = 0;
  15652. if (tmp = 0)
  15653. {
  15654. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]Wait TCP connection...");
  15655. tmp = 1;
  15656. }
  15657. else
  15658. {
  15659. //DEBUG_PRINTF_EVCOMM_DETAIL(".");
  15660. }
  15661. return 0;
  15662. }
  15663. ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed=AcceptFd;
  15664. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]accept: DONE\n");
  15665. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15666. {
  15667. DEBUG_PRINTF_EVCOMM_DETAIL("\n\nAccept one TCP connection:\n");
  15668. DEBUG_PRINTF_EVCOMM_DETAIL("AcceptFd=%d\n",AcceptFd);
  15669. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  15670. for(Rtn = 0; Rtn < 16; Rtn += 2)
  15671. {
  15672. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:", ClientAddr.sin6_addr.s6_addr[Rtn], ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  15673. }
  15674. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15675. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n", ClientAddr.sin6_port);
  15676. }
  15677. #endif
  15678. #ifdef SUPPORT_TLS_CONNECTION
  15679. /* TCP connection is ready. Do server side SSL connection. */
  15680. if(EvSecurity == 0)//support security
  15681. {
  15682. ssl = SSL_new(ctx);
  15683. SSL_set_fd(ssl, AcceptFd);
  15684. if (SSL_accept(ssl) <= 0)
  15685. {
  15686. //SAVE_SYS_LOG_MSG_EVCOMM("[SSL]SSL_accept Failed");
  15687. //SSL_free(ssl);
  15688. //close(AcceptFd);
  15689. //AcceptFd = -1;
  15690. return 0;
  15691. }
  15692. }
  15693. #endif
  15694. return AcceptFd;
  15695. }
  15696. /*===========================================================================
  15697. FUNCTION: End_Process
  15698. DESCRIPTION:
  15699. PRE-CONDITION:
  15700. 1. <CAUTION> This function could only be used in SeccComm fork2.
  15701. INPUT:
  15702. OUTPUT:
  15703. GLOBAL VARIABLES:
  15704. =============================================================================*/
  15705. int End_Process()
  15706. {
  15707. if(EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  15708. {
  15709. SAVE_SYS_LOG_MSG_EVCOMM("End_Process has been triggered by another event.");
  15710. return -1;
  15711. }
  15712. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]entering...");
  15713. //STEP 1: Ask CSU to Stop
  15714. EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  15715. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  15716. EVCOMM_SYS_INFO.ConnectorLocked = FALSE;
  15717. ShmInternalComm->ChargingPermission = FALSE;
  15718. //Step 2: Close sockets
  15719. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]close sockets...");
  15720. if(RawSock > 0)
  15721. {
  15722. close(RawSock);
  15723. }
  15724. if(UdpSock > 0)
  15725. {
  15726. close(UdpSock);
  15727. }
  15728. if(TcpSock > 0)
  15729. {
  15730. close(TcpSock);
  15731. close(TcpAcceptFd);
  15732. }
  15733. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  15734. if(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp > 0)
  15735. {
  15736. close(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp);
  15737. ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp=0;
  15738. }
  15739. if(ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp > 0)
  15740. {
  15741. close(ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp);
  15742. ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp=0;
  15743. }
  15744. if(ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp > 0)
  15745. {
  15746. close(ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp);
  15747. close(ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed);
  15748. ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp=0;
  15749. ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed=0;
  15750. }
  15751. /*#ifdef SUPPORT_TLS_CONNECTION
  15752. if(EvSecurity == 0)//support security
  15753. {
  15754. SSL_shutdown(ssl);
  15755. SSL_free (ssl);
  15756. }
  15757. SSL_CTX_free (ctx);
  15758. #endif*/
  15759. //STEP 3: Switch to State E
  15760. //SwitchCpStateE(ENABLE);
  15761. //STEP 4: Close tcpdump
  15762. Sniffer_Tcpdump(DISABLE);
  15763. //STEP 5: Keep 100% PWM for 5 seconds
  15764. OutputCpPwmDuty(100);
  15765. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 5");
  15766. sleep(1);
  15767. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 4");
  15768. sleep(1);
  15769. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 3");
  15770. sleep(1);
  15771. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 2");
  15772. sleep(1);
  15773. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 1");
  15774. sleep(1);
  15775. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 0");
  15776. AttenProfileCnt = 0;
  15777. init_appHandEXIDocument(&ccs_handshake);
  15778. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  15779. {
  15780. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]1st sync...");
  15781. system("sync");
  15782. }
  15783. #endif
  15784. //STEP 4: Switch to State E
  15785. //Keep State E for 5 seconds
  15786. #if 0
  15787. SwitchCpStateE(ENABLE); //Set PWM Duty as 0 and set State as E (0V)
  15788. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 5");
  15789. sleep(1);
  15790. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 4");
  15791. sleep(1);
  15792. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 3");
  15793. sleep(1);
  15794. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 2");
  15795. sleep(1);
  15796. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 1");
  15797. sleep(1);
  15798. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 0");
  15799. #endif
  15800. //Reset Memory
  15801. unsigned char SlaveAddress_backup;
  15802. unsigned int matched_backup;
  15803. //unsigned char state_backup;
  15804. SAVE_SYS_LOG_MSG_EVCOMM("[CCS Board]soft reset (closing SeccComm)...");
  15805. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------");
  15806. SAVE_SYS_LOG_MSG_EVCOMM("-- EVCOMM: END --");
  15807. SAVE_SYS_LOG_MSG_EVCOMM("-----------------------------------------\n");
  15808. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  15809. {
  15810. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]2nd sync...");
  15811. system("sync");
  15812. }
  15813. #endif
  15814. // system("sleep 1");
  15815. //Backup CsuComm flags
  15816. SlaveAddress_backup = ShmInternalComm->SlaveAddress;
  15817. matched_backup = CSUCOMMDC_TASK_FLAG.matched;
  15818. //state_backup = Check_V2G_Flow_Status();
  15819. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15820. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15821. memset(&ccs_handshake, 0, sizeof(struct appHandEXIDocument));
  15822. memset(&ccs_exi_doc_DIN, 0, sizeof(struct dinEXIDocument));
  15823. memset(V2GTP_Tx_buf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15824. memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  15825. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  15826. memset(ShmInternalComm, 0, sizeof(struct InternalComm));
  15827. memset(ShmCcsData, 0, sizeof(struct CcsData));
  15828. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress= 0xFF;
  15829. //Resume CsuComm flags
  15830. ShmInternalComm->SlaveAddress = SlaveAddress_backup;
  15831. CSUCOMMDC_TASK_FLAG.matched = matched_backup;
  15832. Sniffer_Candump(DISABLE);
  15833. Sniffer_Candump(ENABLE);
  15834. //memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo)); //EVCOMM_SYS_INFO.End_Process_inused = FALSE;
  15835. //EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  15836. EVCOMM_SYS_INFO.DC_EVSEStatus=EVSE_NotReady;
  15837. //Update_V2G_Flow_Status(state_backup);
  15838. //CP_Detection_Pid = 0;
  15839. //PP_Detection_Pid = 0;
  15840. //Error_Monitor_Pid = 0;
  15841. /* while(CheckConnectorPlugIn() != TRUE)
  15842. {
  15843. sleep(1);
  15844. }*/
  15845. free(V2gtpMsgRxBuf);
  15846. free(V2gtpMsgTxBuf);
  15847. //DetachShareMemory();
  15848. Qca7kPowerReset(); //reset QCA7000 /* +++ 20200808, vern, should disconnected PLC connection after session stop ---*/
  15849. #ifdef AWCCS
  15850. system("killall SeccComm");
  15851. #else
  15852. system("cd /root;./reset_soft.sh");
  15853. #endif
  15854. while(1)
  15855. {
  15856. //wait for CSU configrm
  15857. }
  15858. }
  15859. /*===========================================================================
  15860. FUNCTION: Parameters_Init
  15861. DESCRIPTION:
  15862. PRE-CONDITION:
  15863. INPUT:
  15864. OUTPUT:
  15865. GLOBAL VARIABLES:
  15866. =============================================================================*/
  15867. int Parameters_Init()
  15868. {
  15869. //Step 0: Generate random number
  15870. unsigned int value_random;
  15871. struct timeb time_seed;
  15872. ftime(&time_seed);
  15873. srand(time_seed.millitm);
  15874. //Step 1: Init SDP TCP Port
  15875. value_random = rand();
  15876. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active = (unsigned short)(SdpTcpServerPort + (value_random % 10000) + 1);
  15877. if((EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active <= 49152)||(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active >= 65535))//49152-65535
  15878. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active=59438;
  15879. sprintf(buf_log_evcomm,
  15880. "[Init]TCP Port:OK(%d)",
  15881. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15882. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15883. //Step 2: Init SessionID
  15884. value_random = rand();
  15885. memcpy(&EVCOMM_SYS_INFO.SessionID[0], &value_random, 4);
  15886. value_random = rand();
  15887. memcpy(&EVCOMM_SYS_INFO.SessionID[4], &value_random, 4);
  15888. sprintf(buf_log_evcomm,
  15889. "[Init]SessionID:OK(%02X%02X%02X%02X%02X%02X%02X%02X)",
  15890. EVCOMM_SYS_INFO.SessionID[0],
  15891. EVCOMM_SYS_INFO.SessionID[1],
  15892. EVCOMM_SYS_INFO.SessionID[2],
  15893. EVCOMM_SYS_INFO.SessionID[3],
  15894. EVCOMM_SYS_INFO.SessionID[4],
  15895. EVCOMM_SYS_INFO.SessionID[5],
  15896. EVCOMM_SYS_INFO.SessionID[6],
  15897. EVCOMM_SYS_INFO.SessionID[7]);
  15898. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15899. }
  15900. #ifdef SUPPORT_TLS_CONNECTION
  15901. SSL_CTX *create_sslcontext()
  15902. {
  15903. const SSL_METHOD *method;
  15904. SSL_CTX *ctx;
  15905. // Support only TLSv1.2
  15906. method = TLSv1_2_server_method();
  15907. // Create context
  15908. ctx = SSL_CTX_new(method);
  15909. if (!ctx)
  15910. {
  15911. ERR_print_errors_fp(stderr);
  15912. return NULL;
  15913. }
  15914. return ctx;
  15915. }
  15916. int configure_sslcertkey_file(SSL_CTX *ctx)
  15917. {
  15918. SSL_CTX_set_ecdh_auto(ctx, 1);
  15919. // Load certificate file
  15920. if (SSL_CTX_use_certificate_file(ctx, "/root/cacert.pem", SSL_FILETYPE_PEM) <= 0)
  15921. {
  15922. ERR_print_errors_fp(stderr);
  15923. return -1;
  15924. }
  15925. // Load private key file
  15926. if (SSL_CTX_use_PrivateKey_file(ctx, "/root/cakey.pem", SSL_FILETYPE_PEM) <= 0 )
  15927. {
  15928. ERR_print_errors_fp(stderr);
  15929. return -1;
  15930. }
  15931. return 0;
  15932. }
  15933. #endif
  15934. /*===========================================================================
  15935. FUNCTION: main
  15936. DESCRIPTION:
  15937. PRE-CONDITION:
  15938. INPUT:
  15939. OUTPUT:
  15940. GLOBAL VARIABLES:
  15941. =============================================================================*/
  15942. int main(int argc, char *argv[])
  15943. {
  15944. unsigned char Rtn;
  15945. //Initialization
  15946. if(ShareMemory_Init()==0)
  15947. {
  15948. system("reboot -f");
  15949. sleep(5);
  15950. system("reboot -f");
  15951. }
  15952. memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
  15953. if(RawSock > 0)
  15954. {
  15955. close(RawSock);
  15956. }
  15957. if(UdpSock > 0)
  15958. {
  15959. close(UdpSock);
  15960. }
  15961. if(TcpSock > 0)
  15962. {
  15963. close(TcpSock);
  15964. }
  15965. RawSock = UdpSock = TcpSock = -1;
  15966. Update_V2G_Flow_Status(IDLE);
  15967. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------");
  15968. SAVE_SYS_LOG_MSG_EVCOMM("-- EVCOMM: START --");
  15969. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------\n");
  15970. //Print Linux Kernel Version
  15971. sprintf(buf_log_evcomm, "\nLinux Image SHA1: %s\n", LINUX_IMAGE_VERSION);
  15972. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15973. //Print Hardware Version
  15974. sprintf(buf_log_evcomm, "HW: %s\n", HARDWARE_VERSION);
  15975. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15976. //Print Firmware Version
  15977. sprintf(buf_log_evcomm, "FW: %s\n", FIRMWARE_VERSION);
  15978. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15979. SAVE_SYS_LOG_MSG_EVCOMM("init...");
  15980. //Init V2G TCP/IPv6 packets buffer
  15981. V2gtpMsgRxBuf = (unsigned char *)malloc(V2GTP_MSG_RX_BUFFER_SIZE);
  15982. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15983. V2gtpMsgTxBuf = (unsigned char *)malloc(V2GTP_MSG_TX_BUFFER_SIZE);
  15984. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15985. //Release State E Control
  15986. SwitchCpStateE(DISABLE);
  15987. OutputCpPwmDuty(100);
  15988. //start to detect CP pilot state
  15989. CP_Detection_Pid = 0;
  15990. CP_Detection(); //fork1
  15991. SAVE_SYS_LOG_MSG_EVCOMM("[fork1]CP Detection: ON");
  15992. //start to detect errors
  15993. Error_Monitor(); //fork2
  15994. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Error Monitor: ON");
  15995. //CCS connector type
  15996. sprintf(buf_log_evcomm, "CCS connector type : %s\n", ShmInternalComm->CCSConnectorType > 0? "CCS2":"CCS1" );
  15997. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15998. //start to detect PP
  15999. PP_Detection_Pid = 0;
  16000. #if (PP_PROTECTION_MECHANISM == ENABLE)
  16001. PP_Detection();
  16002. SAVE_SYS_LOG_MSG_EVCOMM("[fork3]PP Detection: ON");
  16003. #else
  16004. SAVE_SYS_LOG_MSG_EVCOMM("[fork3]PP Detection: OFF");
  16005. #endif
  16006. //Init communication parameters
  16007. GetEthMac(QcaInterface, CsuMac);
  16008. AttenProfileCnt = 0;
  16009. init_appHandEXIDocument(&ccs_handshake);
  16010. //Init Energy transfer mode
  16011. //[To-Do] Parsing Model Name
  16012. if(CCS_ENERGY_TRANSFER_MODE<=1)
  16013. {
  16014. if((ShmInternalComm->AC_EVSEModelName[2]=='Y') || (ShmInternalComm->AC_EVSEModelName[2]=='D') || (ShmInternalComm->AC_EVSEModelName[2]=='W'))
  16015. //if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount==3)
  16016. ShmCcsData->EnergyTransferMode = MODE_AC_THREE_PHASE_CORE;
  16017. else
  16018. ShmCcsData->EnergyTransferMode = MODE_AC_SINGLE_PHASE_CORE;
  16019. }
  16020. else
  16021. ShmCcsData->EnergyTransferMode = CCS_ENERGY_TRANSFER_MODE;
  16022. struct ChargingInfoData *ccs;
  16023. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  16024. Parameters_Init();
  16025. Sniffer_Tcpdump(ENABLE);
  16026. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  16027. sleep(1); //wait for tcpdump getting ready
  16028. #endif
  16029. #ifdef SUPPORT_TLS_CONNECTION
  16030. // SSL init
  16031. //SSL_free (ssl);
  16032. //SSL_CTX_free (ctx);
  16033. SSL_load_error_strings();
  16034. OpenSSL_add_ssl_algorithms();
  16035. // Create SSL_CTX
  16036. ctx = create_sslcontext();
  16037. if (ctx == NULL)
  16038. {
  16039. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]create_sslcontext Failed");
  16040. }
  16041. else
  16042. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]create_sslcontext OK");
  16043. // Configure cert and key
  16044. if (configure_sslcertkey_file(ctx) < 0)
  16045. {
  16046. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]configure_sslcertkey_file Failed");
  16047. }
  16048. else
  16049. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]configure_sslcertkey_file OK");
  16050. #endif
  16051. SAVE_SYS_LOG_MSG_EVCOMM("[Init]DONE");
  16052. while(1)
  16053. {
  16054. //DEBUG_PRINTF_EVCOMM_DETAIL("\nV2gFlowStatus = %d\n", V2gFlowStatus);
  16055. //if((ShmInternalComm->ChargingPermission == 0x01) && (CheckConnectorPlugIn() == 1))
  16056. //if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
  16057. //if(ShmInternalComm->ChargingPermission == 0x01)
  16058. //if(CheckConnectorPlugIn() == TRUE)
  16059. if (EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  16060. {
  16061. if(V2gFlowStatus < SLACC_SDP_UDP_Connection)
  16062. {
  16063. SlacComm();
  16064. }
  16065. else if(V2gFlowStatus == SLACC_SDP_UDP_Connection)
  16066. {
  16067. if(SdpUdpConnected() == 1)
  16068. {
  16069. Update_V2G_Flow_Status(SLACC_SDP_TCP_Connection);
  16070. continue;
  16071. }
  16072. SlacComm(); //TC_SECC_VTB_CmSlacMatch_004
  16073. ftime(&SeqEndTime);
  16074. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  16075. {
  16076. sprintf(buf_log_evcomm,
  16077. "Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join (%.02lf of %d ms)\n",
  16078. DiffTimeb(SeqStartTime, SeqEndTime),
  16079. TT_match_join);
  16080. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  16081. Update_V2G_Flow_Status(Sequence_Timeout);
  16082. //Update_ShmStatusCode(); //[To-Do] to be implemented
  16083. //CCS_SECC_TIMEOUT_SLACC_SDP_UDP_TT_match_join (023823)
  16084. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  16085. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  16086. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  16087. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  16088. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  16089. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  16090. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  16091. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  16092. }
  16093. }
  16094. else if(V2gFlowStatus == SLACC_SDP_TCP_Connection)
  16095. {
  16096. if((TcpAcceptFd = V2gTcpConnected()) > 0)
  16097. {
  16098. Update_V2G_Flow_Status(SupportedAppProtocolRequest);
  16099. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  16100. continue;
  16101. }
  16102. SlacComm();
  16103. ftime(&SeqEndTime);
  16104. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  16105. {
  16106. sprintf(buf_log_evcomm,
  16107. "Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join (%.02lf / %d ms)",
  16108. DiffTimeb(SeqStartTime, SeqEndTime),
  16109. TT_match_join);
  16110. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  16111. Update_V2G_Flow_Status(Sequence_Timeout);
  16112. //Update_ShmStatusCode(); //[To-Do] to be implemented
  16113. //CCS_SECC_TIMEOUT_SLACC_SDP_TCP_TT_match_join (023824)
  16114. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  16115. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  16116. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  16117. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  16118. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  16119. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  16120. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  16121. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  16122. }
  16123. }
  16124. else if(V2gFlowStatus <= SessionStopResponse)
  16125. {
  16126. if (V2gComm(TcpAcceptFd) < 0)
  16127. {
  16128. //error occours
  16129. }
  16130. if(V2gFlowStatus == SessionStopResponse)
  16131. {
  16132. if(RawSock > 0)
  16133. {
  16134. close(RawSock);
  16135. }
  16136. if(UdpSock > 0)
  16137. {
  16138. close(UdpSock);
  16139. }
  16140. if(TcpSock > 0)
  16141. {
  16142. close(TcpSock);
  16143. close(TcpAcceptFd);
  16144. }
  16145. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  16146. #ifdef SUPPORT_TLS_CONNECTION
  16147. if(EvSecurity == 0)//support security
  16148. {
  16149. SSL_shutdown(ssl);
  16150. SSL_free (ssl);
  16151. }
  16152. SSL_CTX_free (ctx);
  16153. #endif
  16154. }
  16155. }
  16156. else if (V2gFlowStatus >= Performance_Timeout)
  16157. {
  16158. //End_Process
  16159. if(RawSock > 0)
  16160. {
  16161. close(RawSock);
  16162. }
  16163. if(UdpSock > 0)
  16164. {
  16165. close(UdpSock);
  16166. }
  16167. if(TcpSock > 0)
  16168. {
  16169. close(TcpSock);
  16170. close(TcpAcceptFd);
  16171. }
  16172. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  16173. #ifdef SUPPORT_TLS_CONNECTION
  16174. if(EvSecurity == 0)//support security
  16175. {
  16176. SSL_shutdown(ssl);
  16177. SSL_free (ssl);
  16178. }
  16179. SSL_CTX_free (ctx);
  16180. #endif
  16181. }
  16182. else
  16183. {
  16184. //null
  16185. }
  16186. }
  16187. // printf("V2gFlowStatus=%d, socket=%d,%d,%d\n",V2gFlowStatus,RawSock,UdpSock,TcpSock);
  16188. } //while
  16189. }//main while