SeccComm.c 712 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988
  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. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2455. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  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. sprintf(buf_log_evcomm,
  4307. "SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response (%.02lf of %dms)",
  4308. DiffTimeb(SeqStartTime, SeqEndTime),
  4309. TT_match_response);
  4310. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4311. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4312. //CCS_SECC_TIMEOUT_SLAC_CM_ATTEN_CHAR_RSP (023814):
  4313. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4314. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4315. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4316. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4317. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4318. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4319. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  4320. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4321. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4322. Update_V2G_Flow_Status(Sequence_Timeout);
  4323. return -1;
  4324. }
  4325. break;
  4326. }
  4327. case CM_ATTEN_CHAR_RSP:
  4328. {
  4329. ftime(&SeqEndTime);
  4330. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_session)
  4331. {
  4332. sprintf(buf_log_evcomm,
  4333. "SlacComm: Wait CM_VALIDATE_REQ_1ST or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session (%.02lf of %dms)",
  4334. DiffTimeb(SeqStartTime, SeqEndTime),
  4335. TT_EVSE_match_session);
  4336. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4337. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4338. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_1ST__CM_SLAC_MATCH_REQ (023815):
  4339. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4340. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4341. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4342. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4343. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4344. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4345. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  4346. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4347. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4348. Update_V2G_Flow_Status(Sequence_Timeout);
  4349. return -1;
  4350. }
  4351. break;
  4352. }
  4353. case CM_VALIDATE_CNF:
  4354. {
  4355. ftime(&SeqEndTime);
  4356. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  4357. {
  4358. sprintf(buf_log_evcomm,
  4359. "SlacComm: Wait CM_VALIDATE_REQ_2ND or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence (%.02lf of %dms)",
  4360. DiffTimeb(SeqStartTime, SeqEndTime),
  4361. TT_match_sequence);
  4362. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4363. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4364. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_2ND__CM_SLAC_MATCH_REQ (023819):
  4365. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4366. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4367. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4368. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4369. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4370. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4371. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  4372. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  4373. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4374. Update_V2G_Flow_Status(Sequence_Timeout);
  4375. return -1;
  4376. }
  4377. break;
  4378. }
  4379. case CM_AMP_MAP_CNF:
  4380. case CM_SLAC_MATCH_CNF:
  4381. {
  4382. if(UdpSock > 0)
  4383. {
  4384. close(UdpSock);
  4385. UdpSock = -1;
  4386. }
  4387. if(TcpSock > 0)
  4388. {
  4389. close(TcpSock);
  4390. TcpSock = -1;
  4391. }
  4392. ftime(&SeqStartTime);
  4393. V2gTcpConnected();
  4394. Update_V2G_Flow_Status(SLACC_SDP_UDP_Connection);
  4395. SAVE_SYS_LOG_MSG_EVCOMM("SLAAC,SDP,UDP: connecting...");
  4396. break;
  4397. }
  4398. default:
  4399. {
  4400. break;
  4401. }
  4402. }
  4403. return 0;
  4404. }
  4405. /*===========================================================================
  4406. FUNCTION: V2gMsgDecoder
  4407. DESCRIPTION:
  4408. 1. Decode the V2GTP messages inside "msg" and save the decoded
  4409. messages in ccs_exi_doc_DIN, ccs_exi_doc_ISO1, and ccs_exi_doc_ISO2,
  4410. respectively.
  4411. 2. After decoding, V2gMsg_Process() could then use
  4412. ccs_exi_doc_DIN, ccs_exi_doc_ISO1, or ccs_exi_doc_ISO2
  4413. to deal with the corresponding Response messages, respectively.
  4414. PRE-CONDITION:
  4415. 1. msg_length > 0
  4416. INPUT:
  4417. 1. msg
  4418. 2. msg_length
  4419. OUTPUT:
  4420. 1. ccs_exi_doc_DIN //global variable
  4421. ccs_exi_doc_ISO1
  4422. ccs_exi_doc_ISO2
  4423. 2. v2g_state //Status Flag
  4424. //indicating the V2gMsg_Process_din to proceed
  4425. the next process.
  4426. 3. return value // < 0: ERROR
  4427. // > 0: Message Type
  4428. GLOBAL VARIABLES:
  4429. =============================================================================*/
  4430. int V2gMsgDecoder(unsigned char *msg, unsigned int msg_length, unsigned int v2g_state)
  4431. {
  4432. int errn = 0;
  4433. //Checking the minimum Header size requirement
  4434. if(msg_length < V2GTP_MSG_HEADER_LENGTH) //The minimum requirement should be 8-byte header.
  4435. {
  4436. errn = -1;
  4437. return errn;
  4438. }
  4439. //Decode the 1st V2GMSG: AppProtocol
  4440. if(v2g_state == SupportedAppProtocolRequest) //17
  4441. {
  4442. if (errn = API_V2GMSG_EXI_Decoder_AppProtocol(msg, msg_length, &ccs_handshake) < 0)
  4443. {
  4444. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: SupportedAppProtocolRequest()\n", errn);
  4445. }
  4446. else //decoded successfully.
  4447. {
  4448. //PRINT_XML_DOC_supportedAppProtocolReq(&ccs_handshake);
  4449. }
  4450. }
  4451. //Decode the subsequent V2GMSG (DIN 70121, ISO 15118-2, ISO 15118-20)
  4452. else if(v2g_state > SupportedAppProtocolRequest && v2g_state <= SessionStopResponse)
  4453. {
  4454. //Decoding according to its own protocol
  4455. switch (ShmCcsData->CommProtocol)
  4456. {
  4457. case V2GT_MSG_PROTOCOL_DIN70121: //0
  4458. {
  4459. //DIN
  4460. if(errn = API_V2GMSG_EXI_Decoder_DIN(msg, msg_length, &ccs_exi_doc_DIN) < 0)
  4461. {
  4462. sprintf(buf_log_evcomm,
  4463. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_DIN()",
  4464. errn);
  4465. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4466. }
  4467. break;
  4468. }
  4469. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  4470. {
  4471. //ISO1
  4472. if(errn = API_V2GMSG_EXI_Decoder_ISO1(msg, msg_length, &ccs_exi_doc_ISO1) < 0)
  4473. {
  4474. sprintf(buf_log_evcomm,
  4475. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO1()",
  4476. errn);
  4477. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4478. }
  4479. break;
  4480. }
  4481. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  4482. {
  4483. //ISO2
  4484. if(errn = API_V2GMSG_EXI_Decoder_ISO2(msg, msg_length, &ccs_exi_doc_ISO2) < 0)
  4485. {
  4486. sprintf(buf_log_evcomm,
  4487. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO2()",
  4488. errn);
  4489. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4490. }
  4491. break;
  4492. }
  4493. default:
  4494. break;
  4495. }
  4496. }
  4497. else
  4498. {
  4499. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: Unexpected v2g_state\n", errn);
  4500. errn = -1;
  4501. }
  4502. return errn;
  4503. }
  4504. /*===========================================================================
  4505. FUNCTION: encode_din_V2GTP_stream
  4506. DESCRIPTION:
  4507. PRE-CONDITION:
  4508. INPUT:
  4509. OUTPUT:
  4510. GLOBAL VARIABLES:
  4511. =============================================================================*/
  4512. int encode_din_V2GTP_stream(bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4513. {
  4514. int errn = 0;
  4515. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4516. errn = encode_dinExiDocument(v2g_tx_stream, ccs_exi_doc_DIN);
  4517. if (errn == 0)
  4518. {
  4519. //successfully encoded
  4520. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4521. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4522. if (errn != 0)
  4523. {
  4524. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4525. }
  4526. }
  4527. else
  4528. {
  4529. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]encode_dinExiDocument(): %d (DEC)\n", errn);
  4530. }
  4531. return errn;
  4532. }
  4533. /*===========================================================================
  4534. FUNCTION: encode_iso1_V2GTP_stream
  4535. DESCRIPTION:
  4536. PRE-CONDITION:
  4537. INPUT:
  4538. OUTPUT:
  4539. GLOBAL VARIABLES:
  4540. =============================================================================*/
  4541. int encode_iso1_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4542. {
  4543. int errn = 0;
  4544. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4545. errn = encode_iso1ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO1);
  4546. if (errn == 0)
  4547. {
  4548. //successfully encoded
  4549. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4550. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4551. if (errn != 0)
  4552. {
  4553. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4554. }
  4555. }
  4556. else
  4557. {
  4558. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]encode_iso1ExiDocument(): %d (DEC)\n", errn);
  4559. }
  4560. return errn;
  4561. }
  4562. /*===========================================================================
  4563. FUNCTION: encode_iso2_V2GTP_stream
  4564. DESCRIPTION:
  4565. PRE-CONDITION:
  4566. INPUT:
  4567. OUTPUT:
  4568. GLOBAL VARIABLES:
  4569. =============================================================================*/
  4570. int encode_iso2_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4571. {
  4572. int errn = 0;
  4573. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4574. errn = encode_iso2ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO2);
  4575. if (errn == 0)
  4576. {
  4577. //successfully encoded
  4578. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4579. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4580. if (errn != 0)
  4581. {
  4582. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4583. }
  4584. }
  4585. else
  4586. {
  4587. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]encode_iso2ExiDocument(): %d (DEC)\n", errn);
  4588. }
  4589. return errn;
  4590. }
  4591. /*===========================================================================
  4592. FUNCTION: send_encoded_din_V2GTP_Stream
  4593. DESCRIPTION:
  4594. PRE-CONDITION:
  4595. INPUT:
  4596. OUTPUT:
  4597. GLOBAL VARIABLES:
  4598. =============================================================================*/
  4599. int send_encoded_din_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4600. {
  4601. int errn = 0;
  4602. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4603. errn = encode_din_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_DIN);
  4604. // STEP 2: =========== Send Response Packet ===========
  4605. int rtn = 0;
  4606. #ifdef SUPPORT_TLS_CONNECTION
  4607. if(EvSecurity == 0)//support security
  4608. {
  4609. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4610. }
  4611. else
  4612. {
  4613. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4614. }
  4615. #else
  4616. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4617. #endif
  4618. if (rtn == v2g_tx_stream->size)
  4619. {
  4620. /*
  4621. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_din_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4622. rtn, v2g_tx_stream->size);
  4623. */
  4624. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4625. }
  4626. else if (rtn >= 0)
  4627. {
  4628. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_din_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4629. rtn, v2g_tx_stream->size);
  4630. }
  4631. else
  4632. {
  4633. errn = rtn;
  4634. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_din_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4635. }
  4636. //STEP 3: ========= Reset V2G MSG Flags ==========
  4637. init_dinBodyType(&ccs_exi_doc_DIN->V2G_Message.Body);
  4638. return errn;
  4639. }
  4640. /*===========================================================================
  4641. FUNCTION: send_encoded_iso1_V2GTP_Stream
  4642. DESCRIPTION:
  4643. PRE-CONDITION:
  4644. INPUT:
  4645. OUTPUT:
  4646. GLOBAL VARIABLES:
  4647. =============================================================================*/
  4648. int send_encoded_iso1_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4649. {
  4650. int errn = 0;
  4651. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4652. errn = encode_iso1_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO1);
  4653. // STEP 2: =========== Send Response Packet ===========
  4654. int rtn = 0;
  4655. #ifdef SUPPORT_TLS_CONNECTION
  4656. if(EvSecurity == 0)//support security
  4657. {
  4658. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4659. }
  4660. else
  4661. {
  4662. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4663. }
  4664. #else
  4665. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4666. #endif
  4667. if (rtn == v2g_tx_stream->size)
  4668. {
  4669. /*
  4670. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso1_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4671. rtn, v2g_tx_stream->size);
  4672. */
  4673. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4674. }
  4675. else if (rtn >= 0)
  4676. {
  4677. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso1_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4678. rtn, v2g_tx_stream->size);
  4679. }
  4680. else
  4681. {
  4682. errn = rtn;
  4683. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso1_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4684. }
  4685. //STEP 3: ========= Reset V2G MSG Flags ==========
  4686. init_iso1BodyType(&ccs_exi_doc_ISO1->V2G_Message.Body);
  4687. return errn;
  4688. }
  4689. /*===========================================================================
  4690. FUNCTION: send_encoded_iso2_V2GTP_Stream
  4691. DESCRIPTION:
  4692. PRE-CONDITION:
  4693. INPUT:
  4694. OUTPUT:
  4695. GLOBAL VARIABLES:
  4696. =============================================================================*/
  4697. int send_encoded_iso2_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4698. {
  4699. int errn = 0;
  4700. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4701. errn = encode_iso2_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO2);
  4702. // STEP 2: =========== Send Response Packet ===========
  4703. int rtn = 0;
  4704. #ifdef SUPPORT_TLS_CONNECTION
  4705. if(EvSecurity == 0)//support security
  4706. {
  4707. rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
  4708. }
  4709. else
  4710. {
  4711. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4712. }
  4713. #else
  4714. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4715. #endif
  4716. if (rtn == v2g_tx_stream->size)
  4717. {
  4718. /*
  4719. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso2_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4720. rtn, v2g_tx_stream->size);
  4721. */
  4722. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4723. }
  4724. else if (rtn >= 0)
  4725. {
  4726. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso2_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4727. rtn, v2g_tx_stream->size);
  4728. }
  4729. else
  4730. {
  4731. errn = rtn;
  4732. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso2_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4733. }
  4734. //STEP 3: ========= Reset V2G MSG Flags ==========
  4735. init_iso2BodyType(&ccs_exi_doc_ISO2->V2G_Message.Body);
  4736. return errn;
  4737. }
  4738. /*===========================================================================
  4739. FUNCTION: Check_din_V2G_Rx_MSG_SessionID
  4740. DESCRIPTION:
  4741. PRE-CONDITION:
  4742. INPUT:
  4743. OUTPUT:
  4744. GLOBAL VARIABLES:
  4745. =============================================================================*/
  4746. int Check_din_V2G_Rx_MSG_SessionID(struct dinEXIDocument *exi_doc_DIN)
  4747. {
  4748. int i = 0;
  4749. int leng = 0;
  4750. int errn = 0;
  4751. leng = exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen;
  4752. //Step 1: Check SessionID Length
  4753. if (leng != 8) //8-byte
  4754. {
  4755. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4756. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4757. errn = -1;
  4758. }
  4759. else
  4760. {
  4761. //Step 2-1: Check SessionID content
  4762. for (i = 0; i < leng; i++)
  4763. {
  4764. if (exi_doc_DIN->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4765. {
  4766. errn = -2;
  4767. break;
  4768. }
  4769. }
  4770. }
  4771. //Step 2-2: Print Incorrect ID
  4772. if (errn == -2) //incorrect ID
  4773. {
  4774. sprintf(buf_log_evcomm,
  4775. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4776. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[0],
  4777. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[1],
  4778. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[2],
  4779. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[3],
  4780. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[4],
  4781. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[5],
  4782. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[6],
  4783. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[7],
  4784. EVCOMM_SYS_INFO.SessionID[0],
  4785. EVCOMM_SYS_INFO.SessionID[1],
  4786. EVCOMM_SYS_INFO.SessionID[2],
  4787. EVCOMM_SYS_INFO.SessionID[3],
  4788. EVCOMM_SYS_INFO.SessionID[4],
  4789. EVCOMM_SYS_INFO.SessionID[5],
  4790. EVCOMM_SYS_INFO.SessionID[6],
  4791. EVCOMM_SYS_INFO.SessionID[7]
  4792. );
  4793. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4794. }
  4795. //Step 3: Correct SessionID for Res Message
  4796. if (errn != 0)
  4797. {
  4798. exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen = 8;
  4799. memset(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, 0, 8);
  4800. memcpy(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4801. }
  4802. return errn;
  4803. }
  4804. /*===========================================================================
  4805. FUNCTION: Check_iso1_V2G_Rx_MSG_SessionID
  4806. DESCRIPTION:
  4807. PRE-CONDITION:
  4808. INPUT:
  4809. OUTPUT:
  4810. GLOBAL VARIABLES:
  4811. =============================================================================*/
  4812. int Check_iso1_V2G_Rx_MSG_SessionID(struct iso1EXIDocument *exi_doc_ISO1)
  4813. {
  4814. int i = 0;
  4815. int leng = 0;
  4816. int errn = 0;
  4817. leng = exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen;
  4818. //Step 1: Check SessionID Length
  4819. if (leng != 8) //8-byte
  4820. {
  4821. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4822. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4823. errn = -1;
  4824. }
  4825. else
  4826. {
  4827. //Step 2-1: Check SessionID content
  4828. for (i = 0; i < leng; i++)
  4829. {
  4830. if (exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4831. {
  4832. errn = -2;
  4833. break;
  4834. }
  4835. }
  4836. }
  4837. //Step 2-2: Print Incorrect ID
  4838. if (errn == -2) //incorrect ID
  4839. {
  4840. sprintf(buf_log_evcomm,
  4841. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4842. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[0],
  4843. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[1],
  4844. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[2],
  4845. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[3],
  4846. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[4],
  4847. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[5],
  4848. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[6],
  4849. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[7],
  4850. EVCOMM_SYS_INFO.SessionID[0],
  4851. EVCOMM_SYS_INFO.SessionID[1],
  4852. EVCOMM_SYS_INFO.SessionID[2],
  4853. EVCOMM_SYS_INFO.SessionID[3],
  4854. EVCOMM_SYS_INFO.SessionID[4],
  4855. EVCOMM_SYS_INFO.SessionID[5],
  4856. EVCOMM_SYS_INFO.SessionID[6],
  4857. EVCOMM_SYS_INFO.SessionID[7]
  4858. );
  4859. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4860. }
  4861. //Step 3: Correct SessionID for Res Message
  4862. if (errn != 0)
  4863. {
  4864. exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen = 8;
  4865. memset(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, 0, 8);
  4866. memcpy(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4867. }
  4868. return errn;
  4869. }
  4870. /*===========================================================================
  4871. FUNCTION: Check_iso2_V2G_Rx_MSG_SessionID
  4872. DESCRIPTION:
  4873. PRE-CONDITION:
  4874. INPUT:
  4875. OUTPUT:
  4876. GLOBAL VARIABLES:
  4877. =============================================================================*/
  4878. int Check_iso2_V2G_Rx_MSG_SessionID(struct iso2EXIDocument *exi_doc_ISO2)
  4879. {
  4880. int i = 0;
  4881. int leng = 0;
  4882. int errn = 0;
  4883. leng = exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen;
  4884. //Step 1: Check SessionID Length
  4885. if (leng != 8) //8-byte
  4886. {
  4887. sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4888. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4889. errn = -1;
  4890. }
  4891. else
  4892. {
  4893. //Step 2-1: Check SessionID content
  4894. for (i = 0; i < leng; i++)
  4895. {
  4896. if (exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4897. {
  4898. errn = -2;
  4899. break;
  4900. }
  4901. }
  4902. }
  4903. //Step 2-2: Print Incorrect ID
  4904. if (errn == -2) //incorrect ID
  4905. {
  4906. sprintf(buf_log_evcomm,
  4907. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4908. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[0],
  4909. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[1],
  4910. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[2],
  4911. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[3],
  4912. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[4],
  4913. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[5],
  4914. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[6],
  4915. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[7],
  4916. EVCOMM_SYS_INFO.SessionID[0],
  4917. EVCOMM_SYS_INFO.SessionID[1],
  4918. EVCOMM_SYS_INFO.SessionID[2],
  4919. EVCOMM_SYS_INFO.SessionID[3],
  4920. EVCOMM_SYS_INFO.SessionID[4],
  4921. EVCOMM_SYS_INFO.SessionID[5],
  4922. EVCOMM_SYS_INFO.SessionID[6],
  4923. EVCOMM_SYS_INFO.SessionID[7]
  4924. );
  4925. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4926. }
  4927. //Step 3: Correct SessionID for Res Message
  4928. if (errn != 0)
  4929. {
  4930. exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen = 8;
  4931. memset(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, 0, 8);
  4932. memcpy(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4933. }
  4934. return errn;
  4935. }
  4936. /*===========================================================================
  4937. FUNCTION: GetSchemaID_of_Protocol
  4938. DESCRIPTION:
  4939. 1. Get the SchemaID accroding to the input target
  4940. *V2GT_MSG_PROTOCOL_DIN70121: choose DIN 70121
  4941. *V2GT_MSG_PROTOCOL_ISO15118_2014: choose ISO 15118-2 (ed1)
  4942. *V2GT_MSG_PROTOCOL_ISO15118_2018: choose ISO 15118-20 (ed2)
  4943. *V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY: choose the one with the highest priority
  4944. 2. [To-do] Checking Major and Minor version
  4945. 3. The parsing method will not support those private protocols,
  4946. such as "usr:tesla...," since "tesla" is 5 bytes but "din" and "iso" are 3 bytes.
  4947. 4. [To-do] If the target is selected as DIN," but there is no DIN.
  4948. However, if EV and EVSE all support ISO, how to use ISO instead?
  4949. PRE-CONDITION:
  4950. INPUT:
  4951. 1. target: target protocol
  4952. OUTPUT:
  4953. 1. id: SchemaID of selected protocol by EVSE
  4954. 2. ShmCcsData->CommProtocol (selected protocol)
  4955. 3. SupportedAppProtocol_result
  4956. (1) appHandresponseCodeType_OK_SuccessfulNegotiation = 0,
  4957. (2) appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation = 1,
  4958. (3) appHandresponseCodeType_Failed_NoNegotiation = 2
  4959. GLOBAL VARIABLES:
  4960. 1. ccs_handshake
  4961. 2. ShmCcsData
  4962. =============================================================================*/
  4963. int GetSchemaID_of_Protocol(unsigned char target)
  4964. {
  4965. int i = 0;
  4966. int ii = 0;
  4967. int id = 0;
  4968. unsigned char tmp = 0;
  4969. unsigned char pri = 20; //priority = 1(highest)~20(lowerest)
  4970. char num[10];
  4971. //struct CCS_ProtocolNamespacestructCharacters pro;
  4972. //Choose the 1st protocol as default.
  4973. //id = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  4974. id = -1;
  4975. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4976. for(i = 0; i < CCS_HANDSHAKE_PROTOCOLS.arrayLen; i++)
  4977. {
  4978. //Checking for <ProtocolNamespace>urn:din:70121:2012:MsgDef</ProtocolNamespace>
  4979. //[To-Do] Ignoring the priority from EV and force DIN 70121 as our only option. (for temp)
  4980. //[CAUTION] The parsing method will not support those private protocols, such as "usr:tesla..."
  4981. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[8];
  4982. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[9];
  4983. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[10];
  4984. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[11];
  4985. num[4] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[12];
  4986. num[5] = '\0';
  4987. if (atoi(num) == 70121)
  4988. {
  4989. sprintf(buf_log_evcomm,
  4990. "[GetSchemaID_of_Protocol]supported(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  4991. (i+1),
  4992. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4993. atoi(num),
  4994. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4995. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4996. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4997. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4998. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  4999. #ifdef AWCCS
  5000. continue;
  5001. #endif
  5002. if (target == V2GT_MSG_PROTOCOL_DIN70121)
  5003. {
  5004. sprintf(buf_log_evcomm,
  5005. "[GetSchemaID_of_Protocol]selected(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  5006. (i+1),
  5007. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5008. atoi(num),
  5009. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5010. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5011. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5012. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5013. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5014. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == DIN_SPEC_70121_2012_VersionNumberMajor)
  5015. {
  5016. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == DIN_SPEC_70121_2012_VersionNumberMinor)
  5017. {
  5018. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5019. }
  5020. else
  5021. { //[TC_SECC_VTB_SupportedAppProtocol_005]
  5022. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5023. }
  5024. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5025. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  5026. return id;
  5027. }
  5028. else
  5029. {
  5030. //keep looking for the suitable protocol
  5031. }
  5032. }
  5033. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5034. {
  5035. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5036. {
  5037. ii = i;
  5038. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5039. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5040. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  5041. }
  5042. else
  5043. {
  5044. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5045. }
  5046. }
  5047. else
  5048. {
  5049. //null
  5050. }
  5051. }
  5052. else if (atoi(num) == 15118)
  5053. {
  5054. //urn:din:70121:2012:MsgDef
  5055. //urn:iso:15118:2:2013:MsgDef
  5056. memset(num, 0, sizeof(num));
  5057. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[16];
  5058. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[17];
  5059. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[18];
  5060. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[19];
  5061. num[4] = '\0';
  5062. if (atoi(num) < 2018 && atoi(num) >= 2010)
  5063. {
  5064. sprintf(buf_log_evcomm,
  5065. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-2(ed1,%d:v%d.%d;id=%d,pri=%d)",
  5066. (i+1),
  5067. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5068. atoi(num),
  5069. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5070. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5071. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5072. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5073. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5074. if (target == V2GT_MSG_PROTOCOL_ISO15118_2014)
  5075. {
  5076. sprintf(buf_log_evcomm,
  5077. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-2,ed1(%d:v%d.%d;id=%d,pri=%d)",
  5078. (i+1),
  5079. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5080. atoi(num),
  5081. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5082. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5083. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5084. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5085. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5086. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO1_15118_2013_VersionNumberMajor)
  5087. {
  5088. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO1_15118_2013_VersionNumberMinor)
  5089. {
  5090. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5091. }
  5092. else
  5093. {
  5094. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5095. }
  5096. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5097. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  5098. return id;
  5099. }
  5100. else
  5101. {
  5102. //keep looking for the suitable protocol
  5103. }
  5104. }
  5105. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5106. {
  5107. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5108. {
  5109. ii = i;
  5110. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5111. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5112. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  5113. }
  5114. else
  5115. {
  5116. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5117. }
  5118. }
  5119. else
  5120. {
  5121. //null
  5122. }
  5123. }
  5124. else if (atoi(num) >= 2018 && atoi(num) <= 2100) // >= 2018
  5125. {
  5126. sprintf(buf_log_evcomm,
  5127. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-20(ed2,%d:v%d.%d;id=%d,pri=%d)",
  5128. (i+1),
  5129. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5130. atoi(num),
  5131. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5132. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5133. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5134. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5135. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5136. if (target == V2GT_MSG_PROTOCOL_ISO15118_2018)
  5137. {
  5138. sprintf(buf_log_evcomm,
  5139. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-20,ed2(%d:v%d.%d;id=%d,pri=%d)",
  5140. (i+1),
  5141. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5142. atoi(num),
  5143. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5144. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5145. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5146. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5147. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5148. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO2_15118_2018_VersionNumberMajor)
  5149. {
  5150. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO2_15118_2018_VersionNumberMinor)
  5151. {
  5152. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5153. }
  5154. else
  5155. {
  5156. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  5157. }
  5158. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5159. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  5160. return id;
  5161. }
  5162. else
  5163. {
  5164. //keep looking for the suitable protocol
  5165. }
  5166. }
  5167. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  5168. {
  5169. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  5170. {
  5171. ii = i;
  5172. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  5173. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  5174. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  5175. }
  5176. else
  5177. {
  5178. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  5179. }
  5180. }
  5181. else
  5182. {
  5183. //null
  5184. }
  5185. }
  5186. else
  5187. {
  5188. //Unexpected Year
  5189. sprintf(buf_log_evcomm,
  5190. "[GetSchemaID_of_Protocol]unsupported(%d-th/%d): ISO 15118-X(unexpected year:%d,v%d.%d),id=%d,pri=%d",
  5191. (i+1),
  5192. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5193. atoi(num),
  5194. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5195. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5196. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5197. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5198. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5199. //return -1;
  5200. }
  5201. }
  5202. else
  5203. {
  5204. sprintf(buf_log_evcomm,
  5205. "[GetSchemaID_of_Protocol]unsupported protocol(%d-th/%d)(%d:v%d.%d;id=%d,pri=%d)",
  5206. (i+1),
  5207. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5208. atoi(num),
  5209. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5210. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5211. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5212. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5213. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5214. //return -1;
  5215. }
  5216. }
  5217. //The final result of highest priority protocol
  5218. sprintf(buf_log_evcomm,
  5219. "[GetSchemaID_of_Protocol]selected(%d-th/%d): pro=%d(0:DIN,1:ISO1,2:ISO2);id=%d,pri=%d",
  5220. (ii+1),
  5221. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5222. ShmCcsData->CommProtocol,
  5223. id,
  5224. pri);
  5225. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5226. if (id < 0)
  5227. {
  5228. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_Failed_NoNegotiation;
  5229. }
  5230. return id;
  5231. }
  5232. /*===========================================================================
  5233. FUNCTION: Proc_supportedAppProtocolRes
  5234. DESCRIPTION:
  5235. PRE-CONDITION:
  5236. INPUT:
  5237. OUTPUT:
  5238. GLOBAL VARIABLES:
  5239. =============================================================================*/
  5240. int Proc_supportedAppProtocolRes(int AcceptFd)
  5241. {
  5242. int errn = 0;
  5243. bitstream_t v2g_tx_stream;
  5244. static struct ChargingInfoData *sys;
  5245. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5246. //STEP 1: =========== Setting the Response Message ===========
  5247. init_appHandEXIDocument(&ccs_handshake);
  5248. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5249. ccs_handshake.supportedAppProtocolRes_isUsed = 1u;
  5250. //select the 1st one as the default
  5251. ccs_handshake.supportedAppProtocolRes.SchemaID = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  5252. ccs_handshake.supportedAppProtocolRes.SchemaID_isUsed = 1u;
  5253. int id = 0;
  5254. /*+++ 20200808, vern, support both DIN and ISO +++*/
  5255. id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_PREFERENCE); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5256. //id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5257. /*--- 20200808, vern, support both DIN and ISO ---*/
  5258. ccs_handshake.supportedAppProtocolRes.ResponseCode = EVCOMM_SYS_INFO.SupportedAppProtocol_result; //updating the response code
  5259. if (id < 0)
  5260. {
  5261. sprintf(buf_log_evcomm,
  5262. "[Error]No avalible CCS protocol (id = %d, preference = %d)",
  5263. id,
  5264. V2GT_MSG_PROTOCOL_PREFERENCE);
  5265. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5266. }
  5267. else
  5268. {
  5269. //selected SchemaID
  5270. ccs_handshake.supportedAppProtocolRes.SchemaID = (unsigned char) id;
  5271. }
  5272. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  5273. {
  5274. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_supportedAppProtocolRes]EVSE_Shutdown => End_Process");
  5275. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5276. errn = -1;
  5277. }
  5278. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5279. {
  5280. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_supportedAppProtocolRes]EVSE_EmergencyShutdown => End_Process");
  5281. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5282. errn = -1;
  5283. }
  5284. else
  5285. {
  5286. //null
  5287. }
  5288. //Check for Permission Changing from TRUE to FALSE
  5289. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5290. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5291. ShmInternalComm->ChargingPermission == FALSE)
  5292. {
  5293. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][supportedAppProtocolRes]Permission OFF");
  5294. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5295. //errn = -1;
  5296. }
  5297. #if (CP_PROTECTION_MECHANISM == ENABLE)
  5298. {
  5299. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  5300. {
  5301. //Detect for CP State should be 9V with 5% PWM or 100%PWM (State B1, B2)
  5302. if (sys->CpState != 2 && sys->CpState != 3) //State B1, B2
  5303. {
  5304. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5305. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5306. Update_V2G_Flow_Status(Other_Fault);
  5307. sprintf(buf_log_evcomm,
  5308. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5309. sys->CpState,
  5310. sys->CpVoltage);
  5311. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5312. }
  5313. }
  5314. #else
  5315. {
  5316. //Detect for CP State should be 9V (State B)
  5317. if (sys->CpState != 3) //B2
  5318. {
  5319. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5320. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5321. Update_V2G_Flow_Status(Other_Fault);
  5322. sprintf(buf_log_evcomm,
  5323. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5324. sys->CpState,
  5325. sys->CpVoltage);
  5326. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5327. }
  5328. }
  5329. #endif
  5330. }
  5331. #endif
  5332. //STEP 2: =========== Encode into EXI ===========
  5333. if (errn = API_V2GMSG_EXI_Encoder_AppProtocol(&ccs_handshake, &v2g_tx_stream) !=0)
  5334. {
  5335. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Error]API_V2GMSG_EXI_Encoder_AppProtocol\n");
  5336. return errn;
  5337. }
  5338. //STEP 3: =========== Send Response Packet ===========
  5339. int Rtn = 0;
  5340. #ifdef SUPPORT_TLS_CONNECTION
  5341. if(EvSecurity == 0)//support security
  5342. {
  5343. Rtn = SSL_write(ssl, v2g_tx_stream.data, v2g_tx_stream.size);
  5344. }
  5345. else
  5346. {
  5347. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5348. }
  5349. #else
  5350. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5351. #endif
  5352. //Rtn = send(6, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5353. DEBUG_PRINTF_EVCOMM_DETAIL("Send V2GTP Packet Size = %d, Rtn = %d (Bytes, DEC)\n", v2g_tx_stream.size, Rtn);
  5354. if (Rtn < 0)
  5355. {
  5356. return Rtn;
  5357. }
  5358. //STEP 4: =========== Save into Share Memory =========
  5359. //[Joseph, To-Do] Adding a mechanism to choose DIN 70121 as our 1st priority. (for multiple protocols)
  5360. //STEP 5: =========== Updating the Flow State Flag =========
  5361. if (id < 0)
  5362. {
  5363. errn = -1;
  5364. }
  5365. //STEP 6: =========== Reset Flags ============
  5366. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  5367. init_appHandEXIDocument(&ccs_handshake);
  5368. return errn;
  5369. }
  5370. /*===========================================================================
  5371. FUNCTION: Proc_supportedAppProtocolReq
  5372. DESCRIPTION:
  5373. PRE-CONDITION:
  5374. INPUT:
  5375. OUTPUT:
  5376. GLOBAL VARIABLES:
  5377. =============================================================================*/
  5378. int Proc_supportedAppProtocolReq(int AcceptFd)
  5379. {
  5380. //[Joseph, To-Do] analysis on Req message and choose the prefered protocol
  5381. //Default: DIN 70121 (find SchemaID)
  5382. int errn = 0;
  5383. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]supportedAppProtocolReq");
  5384. SHM_Save_din_supportedAppProtocolReq(ShmCcsData, &ccs_handshake, ShmSysConfigAndInfo);
  5385. errn = Proc_supportedAppProtocolRes(AcceptFd);
  5386. if (errn == 0)
  5387. {
  5388. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]supportedAppProtocolRes");
  5389. }
  5390. else
  5391. {
  5392. DEBUG_PRINTF_EVCOMM_DETAIL("[Error]Proc_supportedAppProtocolRes(): %d (DEC)\n", errn);
  5393. }
  5394. return errn;
  5395. }
  5396. /*===========================================================================
  5397. FUNCTION: Proc_din_SessionSetupRes
  5398. DESCRIPTION:
  5399. PRE-CONDITION:
  5400. INPUT:
  5401. OUTPUT:
  5402. GLOBAL VARIABLES:
  5403. =============================================================================*/
  5404. int Proc_din_SessionSetupRes(int AcceptFd)
  5405. {
  5406. int i = 0;
  5407. int errn = 0;
  5408. bitstream_t v2g_tx_stream;
  5409. static struct ChargingInfoData *sys;
  5410. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5411. size_t pos = 0;
  5412. v2g_tx_stream.pos = &pos;
  5413. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5414. v2g_tx_stream.data = V2GTP_Tx_buf;
  5415. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5416. init_dinSessionSetupResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes);
  5417. // ====== [BODY (1/2) ResponseCode ======
  5418. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5419. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_OK_NewSessionEstablished;
  5420. //[HEADER] Assign Res SessionID
  5421. ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytesLen = 8;
  5422. memset(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, 0, 8);
  5423. memcpy(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5424. //Check for SequenceError
  5425. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5426. {
  5427. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError;
  5428. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5429. errn = -1;
  5430. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5431. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5432. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5433. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5434. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5435. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5436. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5437. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5438. }
  5439. //#if PARAMETER_NORMAL_MODE == ENABLE
  5440. //SHM_Read_din_V2GMSG_Header(&ccs_exi_doc_DIN, ShmCcsData);
  5441. //#endif
  5442. //Detect for CP State should be 9V (State B)
  5443. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5444. {
  5445. #if CP_PROTECTION_MECHANISM == ENABLE
  5446. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5447. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5448. Update_V2G_Flow_Status(Other_Fault);
  5449. errn = -1;
  5450. sprintf(buf_log_evcomm,
  5451. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5452. sys->CpState);
  5453. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5454. #else
  5455. sprintf(buf_log_evcomm,
  5456. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5457. sys->CpState);
  5458. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5459. #endif
  5460. }
  5461. //Check for shutdown commands from EVSE(DC Main Board)
  5462. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5463. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5464. {
  5465. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5466. sprintf(buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5467. EVSE_Shutdown,
  5468. EVSE_EmergencyShutdown,
  5469. sys->DC_EVSEStatus);
  5470. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5471. errn = -1;
  5472. }
  5473. else if (sys->DC_EVSEStatus == EVSE_Shutdown/* ||
  5474. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5475. {
  5476. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5477. sprintf(buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5478. EVSE_Shutdown,
  5479. EVSE_EmergencyShutdown,
  5480. sys->DC_EVSEStatus);
  5481. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5482. //errn = -1;
  5483. }
  5484. //Check for Permission Changing from TRUE to FALSE
  5485. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5486. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5487. ShmInternalComm->ChargingPermission == FALSE)
  5488. {
  5489. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][SessionSetupRes]Permission OFF");
  5490. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5491. errn = -1;
  5492. }
  5493. // ====== [BODY (2/3) EVSEID ======
  5494. //EVSEID = all zero
  5495. memset(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes, 0, sizeof(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes));
  5496. //vern, should be encode by SN
  5497. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytesLen = 1; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5498. // ====== [BODY (3/3) DateTimeNow ======
  5499. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow_isUsed = 1u;
  5500. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5501. #if PARAMETER_NORMAL_MODE == ENABLE
  5502. ///////////SHM_Read_din_SessionSetupRes(&ccs_exi_doc_DIN, ShmCcsData);
  5503. #endif
  5504. // ============ Encode and Send Response Message ===========
  5505. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5506. {
  5507. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_SessionSetupRes][Error]Tx encoded msg error");
  5508. errn = -1;
  5509. }
  5510. return errn;
  5511. }
  5512. /*===========================================================================
  5513. FUNCTION: Proc_iso1_SessionSetupRes
  5514. DESCRIPTION:
  5515. PRE-CONDITION:
  5516. INPUT:
  5517. OUTPUT:
  5518. GLOBAL VARIABLES:
  5519. =============================================================================*/
  5520. int Proc_iso1_SessionSetupRes(int AcceptFd)
  5521. {
  5522. int i = 0;
  5523. int errn = 0;
  5524. bitstream_t v2g_tx_stream;
  5525. static struct ChargingInfoData *sys;
  5526. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5527. size_t pos = 0;
  5528. v2g_tx_stream.pos = &pos;
  5529. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5530. v2g_tx_stream.data = V2GTP_Tx_buf;
  5531. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5532. init_iso1SessionSetupResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes);
  5533. // ====== [BODY (1/2) ResponseCode ======
  5534. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5535. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_OK_NewSessionEstablished;
  5536. //[HEADER] Assign Res SessionID
  5537. ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytesLen = 8;
  5538. memset(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, 0, 8);
  5539. memcpy(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5540. //Check for SequenceError
  5541. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5542. {
  5543. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5544. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5545. errn = -1;
  5546. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5547. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5548. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5549. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5550. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5551. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5552. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5553. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5554. }
  5555. //#if PARAMETER_NORMAL_MODE == ENABLE
  5556. //SHM_Read_iso1_V2GMSG_Header(&ccs_exi_doc_ISO1, ShmCcsData);
  5557. //#endif
  5558. //Detect for CP State should be 9V (State B)
  5559. //if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2 //Benz already CP=4
  5560. if ((sys->CpState < 2) ||(sys->CpState > 5)) //State B1, B2 //Benz already CP=4
  5561. {
  5562. #if CP_PROTECTION_MECHANISM == ENABLE
  5563. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5564. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5565. Update_V2G_Flow_Status(Other_Fault);
  5566. errn = -1;
  5567. sprintf(buf_log_evcomm,
  5568. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5569. sys->CpState);
  5570. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5571. #else
  5572. sprintf(buf_log_evcomm,
  5573. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5574. sys->CpState);
  5575. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5576. #endif
  5577. }
  5578. //Check for shutdown commands from EVSE(DC Main Board)
  5579. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5580. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5581. {
  5582. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5583. sprintf(buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5584. EVSE_Shutdown,
  5585. EVSE_EmergencyShutdown,
  5586. sys->DC_EVSEStatus);
  5587. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5588. errn = -1;
  5589. }
  5590. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  5591. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5592. {
  5593. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5594. sprintf(buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5595. EVSE_Shutdown,
  5596. EVSE_EmergencyShutdown,
  5597. sys->DC_EVSEStatus);
  5598. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5599. // errn = -1;
  5600. }
  5601. //Check for Permission Changing from TRUE to FALSE
  5602. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5603. ShmInternalComm->ChargingPermission == FALSE)
  5604. {
  5605. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][SessionSetupRes]Permission OFF");
  5606. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5607. //errn = -1;
  5608. }
  5609. // ====== [BODY (2/3) EVSEID ======
  5610. //EVSEID = all zero
  5611. memset(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5612. /*+++ 20200808, vern, set default EVSEID +++*/
  5613. //vern, should be encoded by SN
  5614. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[0]='Z';
  5615. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[1]='Z';
  5616. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[2]='0';
  5617. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[3]='0';
  5618. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[4]='0';
  5619. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[5]='0';
  5620. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[6]='0';
  5621. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 7; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5622. /*--- 20200808, vern, set default EVSEID ---*/
  5623. // ====== [BODY (3/3) DateTimeNow ======
  5624. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5625. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5626. #if PARAMETER_NORMAL_MODE == ENABLE
  5627. ///////////SHM_Read_iso1_SessionSetupRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5628. #endif
  5629. // ============ Encode and Send Response Message ===========
  5630. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5631. {
  5632. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_SessionSetupRes][Error]Tx encoded msg error");
  5633. errn = -1;
  5634. }
  5635. return errn;
  5636. }
  5637. /*===========================================================================
  5638. FUNCTION: Proc_iso2_SessionSetupRes
  5639. DESCRIPTION:
  5640. PRE-CONDITION:
  5641. INPUT:
  5642. OUTPUT:
  5643. GLOBAL VARIABLES:
  5644. =============================================================================*/
  5645. int Proc_iso2_SessionSetupRes(int AcceptFd)
  5646. {
  5647. int i = 0;
  5648. int errn = 0;
  5649. bitstream_t v2g_tx_stream;
  5650. static struct ChargingInfoData *sys;
  5651. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5652. size_t pos = 0;
  5653. v2g_tx_stream.pos = &pos;
  5654. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5655. v2g_tx_stream.data = V2GTP_Tx_buf;
  5656. init_iso2BodyType(&ccs_exi_doc_ISO2.V2G_Message.Body);
  5657. init_iso2SessionSetupResType(&ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes);
  5658. // ====== [BODY (1/2) ResponseCode ======
  5659. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5660. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_OK_NewSessionEstablished;
  5661. //[HEADER] Assign Res SessionID
  5662. ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytesLen = 8;
  5663. memset(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, 0, 8);
  5664. memcpy(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5665. //Check for SequenceError
  5666. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5667. {
  5668. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5669. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5670. errn = -1;
  5671. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5672. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5673. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5674. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5675. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5676. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5677. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5678. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5679. }
  5680. //#if PARAMETER_NORMAL_MODE == ENABLE
  5681. //SHM_Read_iso2_V2GMSG_Header(&ccs_exi_doc_ISO2, ShmCcsData);
  5682. //#endif
  5683. //Detect for CP State should be 9V (State B)
  5684. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5685. {
  5686. #if CP_PROTECTION_MECHANISM == ENABLE
  5687. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5688. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5689. Update_V2G_Flow_Status(Other_Fault);
  5690. errn = -1;
  5691. sprintf(buf_log_evcomm,
  5692. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d)",
  5693. sys->CpState);
  5694. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5695. #else
  5696. sprintf(buf_log_evcomm,
  5697. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d): ignored",
  5698. sys->CpState);
  5699. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5700. #endif
  5701. }
  5702. //Check for shutdown commands from EVSE(DC Main Board)
  5703. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5704. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5705. {
  5706. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5707. sprintf(buf_log_evcomm, "[Proc_iso2_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5708. EVSE_Shutdown,
  5709. EVSE_EmergencyShutdown,
  5710. sys->DC_EVSEStatus);
  5711. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5712. errn = -1;
  5713. }
  5714. //Check for Permission Changing from TRUE to FALSE
  5715. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5716. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5717. ShmInternalComm->ChargingPermission == FALSE)
  5718. {
  5719. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO2][SessionSetupRes]Permission OFF");
  5720. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5721. errn = -1;
  5722. }
  5723. // ====== [BODY (2/3) EVSEID ======
  5724. //EVSEID = all zero
  5725. memset(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5726. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5727. // ====== [BODY (3/3) DateTimeNow ======
  5728. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5729. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5730. #if PARAMETER_NORMAL_MODE == ENABLE
  5731. ///////////SHM_Read_iso2_SessionSetupRes(&ccs_exi_doc_ISO2, ShmCcsData);
  5732. #endif
  5733. // ============ Encode and Send Response Message ===========
  5734. if (send_encoded_iso2_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO2) != 0)
  5735. {
  5736. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso2_SessionSetupRes][Error]Tx encoded msg error");
  5737. errn = -1;
  5738. }
  5739. return errn;
  5740. }
  5741. /*===========================================================================
  5742. FUNCTION: Proc_din_SessionSetupReq
  5743. DESCRIPTION:
  5744. PRE-CONDITION:
  5745. INPUT:
  5746. OUTPUT:
  5747. GLOBAL VARIABLES:
  5748. 2. ccs_exi_doc_DIN
  5749. =============================================================================*/
  5750. int Proc_din_SessionSetupReq(int AcceptFd)
  5751. {
  5752. int errn = 0;
  5753. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_din_SessionSetupReq]Got SessionSetupReq\n");
  5754. //Print the decoded XML Document
  5755. PRINT_XML_DOC_DIN_SessionSetupReq(&ccs_exi_doc_DIN);
  5756. //Save into Share Memory
  5757. SHM_Save_din_SessionSetupReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5758. errn = Proc_din_SessionSetupRes(AcceptFd);
  5759. if (errn == 0)
  5760. {
  5761. //successfully send response.
  5762. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]SessionSetupRes");
  5763. }
  5764. else
  5765. {
  5766. sprintf(buf_log_evcomm,
  5767. "[Error]Proc_din_SessionSetupRes(): %d (DEC)",
  5768. errn);
  5769. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5770. }
  5771. return errn;
  5772. }
  5773. /*===========================================================================
  5774. FUNCTION: Proc_iso1_SessionSetupReq
  5775. DESCRIPTION:
  5776. PRE-CONDITION:
  5777. INPUT:
  5778. OUTPUT:
  5779. GLOBAL VARIABLES:
  5780. 2. ccs_exi_doc_ISO1
  5781. =============================================================================*/
  5782. int Proc_iso1_SessionSetupReq(int AcceptFd)
  5783. {
  5784. int errn = 0;
  5785. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso1_SessionSetupReq]Got SessionSetupReq\n");
  5786. //Print the decoded XML Document
  5787. PRINT_XML_DOC_ISO1_SessionSetupReq(&ccs_exi_doc_ISO1);
  5788. //Save into Share Memory
  5789. SHM_Save_iso1_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5790. errn = Proc_iso1_SessionSetupRes(AcceptFd);
  5791. if (errn == 0)
  5792. {
  5793. //successfully send response.
  5794. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]SessionSetupRes");
  5795. }
  5796. else
  5797. {
  5798. sprintf(buf_log_evcomm,
  5799. "[Error]Proc_iso1_SessionSetupRes(): %d (DEC)",
  5800. errn);
  5801. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5802. }
  5803. return errn;
  5804. }
  5805. /*===========================================================================
  5806. FUNCTION: Proc_iso2_SessionSetupReq
  5807. DESCRIPTION:
  5808. PRE-CONDITION:
  5809. INPUT:
  5810. OUTPUT:
  5811. GLOBAL VARIABLES:
  5812. 2. ccs_exi_doc_ISO2
  5813. =============================================================================*/
  5814. int Proc_iso2_SessionSetupReq(int AcceptFd)
  5815. {
  5816. int errn = 0;
  5817. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso2_SessionSetupReq]Got SessionSetupReq\n");
  5818. //Print the decoded XML Document
  5819. PRINT_XML_DOC_ISO2_SessionSetupReq(&ccs_exi_doc_ISO2);
  5820. //Save into Share Memory
  5821. SHM_Save_iso2_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO2, ShmSysConfigAndInfo);
  5822. errn = Proc_iso2_SessionSetupRes(AcceptFd);
  5823. if (errn == 0)
  5824. {
  5825. //successfully send response.
  5826. SAVE_SYS_LOG_MSG_EVCOMM("[ISO2][V2G][Tx]SessionSetupRes");
  5827. }
  5828. else
  5829. {
  5830. sprintf(buf_log_evcomm,
  5831. "[Error]Proc_iso2_SessionSetupRes(): %d (DEC)",
  5832. errn);
  5833. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5834. }
  5835. return errn;
  5836. }
  5837. /*===========================================================================
  5838. FUNCTION: Proc_din_ServiceDiscoveryRes
  5839. DESCRIPTION:
  5840. PRE-CONDITION:
  5841. INPUT:
  5842. OUTPUT:
  5843. GLOBAL VARIABLES:
  5844. =============================================================================*/
  5845. int Proc_din_ServiceDiscoveryRes(int AcceptFd)
  5846. {
  5847. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5848. //if it is not the same, the packet should be ignored.
  5849. int i = 0;
  5850. int errn = 0;
  5851. bitstream_t v2g_tx_stream;
  5852. struct ChargingInfoData *sys;
  5853. struct ServiceDiscoveryRequest_DIN70121 *req;
  5854. struct ServiceDiscoveryResponse_DIN70121 *res;
  5855. size_t pos = 0;
  5856. v2g_tx_stream.pos = &pos;
  5857. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5858. v2g_tx_stream.data = V2GTP_Tx_buf;
  5859. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5860. req = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryRequest;
  5861. res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5862. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5863. init_dinServiceDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes);
  5864. //[1/4] Response Code
  5865. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5866. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_OK;
  5867. //[HEADER] Check Req SessionID
  5868. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5869. {
  5870. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5871. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  5872. errn = -1;
  5873. }
  5874. //Check for SequenceError
  5875. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5876. {
  5877. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5878. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5879. errn = -1;
  5880. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5881. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5882. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5883. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5884. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5885. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5886. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5887. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5888. }
  5889. //Detect for CP State should be 9V (State B)
  5890. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5891. {
  5892. #if CP_PROTECTION_MECHANISM == ENABLE
  5893. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5894. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5895. Update_V2G_Flow_Status(Other_Fault);
  5896. errn = -1;
  5897. sprintf(buf_log_evcomm,
  5898. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  5899. sys->CpState);
  5900. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5901. #else
  5902. sprintf(buf_log_evcomm,
  5903. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5904. sys->CpState);
  5905. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  5906. #endif
  5907. }
  5908. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  5909. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  5910. {
  5911. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5912. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5913. // errn = -1;
  5914. }
  5915. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  5916. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5917. {
  5918. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5919. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5920. errn = -1;
  5921. }
  5922. //Check for Permission Changing from TRUE to FALSE
  5923. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5924. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  5925. ShmInternalComm->ChargingPermission == FALSE)
  5926. {
  5927. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ServiceDiscoveryRes]Permission OFF");
  5928. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5929. // errn = -1;
  5930. }
  5931. //[2/4] PaymentOptions
  5932. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.arrayLen = 1u;
  5933. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.array[0] = dinpaymentOptionType_ExternalPayment; //1
  5934. //[3/4] Charge Service
  5935. res->ChargeService_DIN70121.Services.ServiceTag.ServiceID = 1;
  5936. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceID = (unsigned short) res->ChargeService_DIN70121.Services.ServiceTag.ServiceID;
  5937. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceCategory = dinserviceCategoryType_EVCharging;
  5938. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5939. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.EnergyTransferType = dinEVSESupportedEnergyTransferType_DC_extended;
  5940. //[4/4] Service List (null, not be uesed for now.)
  5941. //#if PARAMETER_NORMAL_MODE == ENABLE
  5942. ///////////////SHM_Read_din_ServiceDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  5943. //#endif
  5944. // ============ Encode and Send Response Message ===========
  5945. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5946. {
  5947. errn = -1;
  5948. }
  5949. return errn;
  5950. }
  5951. /*===========================================================================
  5952. FUNCTION: Proc_iso1_ServiceDiscoveryRes
  5953. DESCRIPTION:
  5954. PRE-CONDITION:
  5955. INPUT:
  5956. OUTPUT:
  5957. GLOBAL VARIABLES:
  5958. =============================================================================*/
  5959. int Proc_iso1_ServiceDiscoveryRes(int AcceptFd)
  5960. {
  5961. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5962. //if it is not the same, the packet should be ignored.
  5963. int i = 0;
  5964. int errn = 0;
  5965. bitstream_t v2g_tx_stream;
  5966. struct ChargingInfoData *sys;
  5967. struct ServiceDiscoveryRequest_ISO15118_2014 *req;
  5968. struct ServiceDiscoveryResponse_ISO15118_2014 *res;
  5969. size_t pos = 0;
  5970. v2g_tx_stream.pos = &pos;
  5971. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5972. v2g_tx_stream.data = V2GTP_Tx_buf;
  5973. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5974. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryRequest;
  5975. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  5976. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5977. init_iso1ServiceDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes);
  5978. //[1/4] Response Code
  5979. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5980. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_OK;
  5981. //[HEADER] Check Req SessionID
  5982. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  5983. {
  5984. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  5985. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  5986. errn = -1;
  5987. }
  5988. //Check for SequenceError
  5989. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5990. {
  5991. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5992. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  5993. errn = -1;
  5994. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5995. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5996. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5997. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5998. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5999. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6000. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6001. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6002. }
  6003. //Detect for CP State should be 9V (State B)
  6004. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6005. {
  6006. #if CP_PROTECTION_MECHANISM == ENABLE
  6007. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6008. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6009. Update_V2G_Flow_Status(Other_Fault);
  6010. errn = -1;
  6011. sprintf(buf_log_evcomm,
  6012. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  6013. sys->CpState);
  6014. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6015. #else
  6016. sprintf(buf_log_evcomm,
  6017. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  6018. sys->CpState);
  6019. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6020. #endif
  6021. }
  6022. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6023. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6024. {
  6025. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6026. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  6027. errn = -1;
  6028. }
  6029. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6030. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6031. {
  6032. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6033. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  6034. // errn = -1;
  6035. }
  6036. //Check for Permission Changing from TRUE to FALSE
  6037. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6038. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6039. ShmInternalComm->ChargingPermission == FALSE)
  6040. {
  6041. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ServiceDiscoveryRes]Permission OFF");
  6042. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  6043. // errn = -1;
  6044. }
  6045. //[2/4] PaymentOptionList
  6046. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 1u;
  6047. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = iso1paymentOptionType_ExternalPayment; //1
  6048. #ifdef SUPPORT_ISO15118_PnC
  6049. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 2u;
  6050. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[1] = iso1paymentOptionType_Contract; //0
  6051. #endif
  6052. //[3/4] Charge Service
  6053. res->ChargeService.Services.ServiceID = 1;
  6054. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = (unsigned short) res->ChargeService.Services.ServiceID;
  6055. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1;
  6056. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = strlen("AC_DC_Charging");//AC_Charging
  6057. writeStringToEXIString("AC_DC_Charging", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters);
  6058. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = iso1serviceCategoryType_EVCharging;
  6059. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1;
  6060. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 1u; //[ISO1] max = 6
  6061. switch (ShmCcsData->EnergyTransferMode)
  6062. {
  6063. case DC_extended:
  6064. {
  6065. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  6066. break;
  6067. }
  6068. case AC_single_phase_core:
  6069. {
  6070. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_single_phase_core;
  6071. break;
  6072. }
  6073. case AC_three_phase_core:
  6074. {
  6075. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_three_phase_core;
  6076. break;
  6077. }
  6078. default:
  6079. {
  6080. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  6081. sprintf(buf_log_evcomm,
  6082. "[ISO1][ServiceDiscoveryRes][Warning]unexpected EnergyTransferMode(%d)",
  6083. ShmCcsData->EnergyTransferMode);
  6084. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6085. break;
  6086. }
  6087. }
  6088. //[4/4] Service List
  6089. i=0;
  6090. #ifdef SUPPORT_ISO15118_PnC
  6091. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
  6092. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen=i;
  6093. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceID = 2;
  6094. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName_isUsed = 1;
  6095. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen = strlen("Certificate");
  6096. writeStringToEXIString("Certificate", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters);
  6097. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory = iso1serviceCategoryType_ContractCertificate;
  6098. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].FreeService = 0;
  6099. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen++;
  6100. i++;
  6101. #endif
  6102. #ifdef SUPPORT_ISO15118_VAS
  6103. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
  6104. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen=i;
  6105. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceID = 3;
  6106. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName_isUsed = 1;
  6107. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen = strlen("InternetAccess");
  6108. writeStringToEXIString("InternetAccess", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters);
  6109. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory = iso1serviceCategoryType_Internet;
  6110. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].FreeService = 0;
  6111. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen++;
  6112. i++;
  6113. #endif
  6114. // ============ Encode and Send Response Message ===========
  6115. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6116. {
  6117. errn = -1;
  6118. }
  6119. return errn;
  6120. }
  6121. /*===========================================================================
  6122. FUNCTION: Proc_iso1_ServiceDetailReq
  6123. DESCRIPTION:
  6124. PRE-CONDITION:
  6125. INPUT:
  6126. OUTPUT:
  6127. GLOBAL VARIABLES:
  6128. =============================================================================*/
  6129. int Proc_iso1_ServiceDetailReq(int AcceptFd)
  6130. {
  6131. int errn = 0;
  6132. //Save into Share Memory
  6133. SHM_Save_iso1_ServiceDetailReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6134. errn = Proc_iso1_ServiceDetailRes(AcceptFd);
  6135. if (errn == 0)
  6136. {
  6137. //send response successfully.
  6138. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceDetailRes");
  6139. }
  6140. else
  6141. {
  6142. sprintf(buf_log_evcomm,
  6143. "[Error][SeccComm][Proc_iso1_ServiceDetailReq]Proc_iso1_ServiceDetailRes(): %d (DEC)",
  6144. errn
  6145. );
  6146. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6147. }
  6148. return errn;
  6149. }
  6150. /*===========================================================================
  6151. FUNCTION: Proc_iso1_ServiceDetailRes
  6152. DESCRIPTION:
  6153. PRE-CONDITION:
  6154. INPUT:
  6155. OUTPUT:
  6156. GLOBAL VARIABLES:
  6157. =============================================================================*/
  6158. int Proc_iso1_ServiceDetailRes(int AcceptFd)
  6159. {
  6160. int i = 0;
  6161. int errn = 0;
  6162. bitstream_t v2g_tx_stream;
  6163. struct ChargingInfoData *sys;
  6164. struct ServiceDetailRequest_ISO15118_2014 *req;
  6165. struct ServiceDetailResponse_ISO15118_2014 *res;
  6166. size_t pos = 0;
  6167. v2g_tx_stream.pos = &pos;
  6168. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6169. v2g_tx_stream.data = V2GTP_Tx_buf;
  6170. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6171. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDetailRequest;
  6172. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDetailResponse;
  6173. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6174. init_iso1ServiceDetailResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes);
  6175. //[1/4] Response Code
  6176. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes_isUsed = 1u;
  6177. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_OK;
  6178. //[HEADER] Check Req SessionID
  6179. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6180. {
  6181. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6182. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6183. errn = -1;
  6184. }
  6185. //Check for SequenceError
  6186. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6187. {
  6188. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6189. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6190. errn = -1;
  6191. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6192. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6193. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6194. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6195. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6196. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6197. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6198. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6199. }
  6200. //Detect for CP State should be 9V (State B)
  6201. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6202. {
  6203. #if CP_PROTECTION_MECHANISM == ENABLE
  6204. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6205. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6206. Update_V2G_Flow_Status(Other_Fault);
  6207. errn = -1;
  6208. sprintf(buf_log_evcomm,
  6209. "[ServiceDetailRes]Emergency Stop by CP Error (%d)",
  6210. sys->CpState);
  6211. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6212. #else
  6213. sprintf(buf_log_evcomm,
  6214. "[ServiceDetailRes]Emergency Stop by CP Error (%d): ignored",
  6215. sys->CpState);
  6216. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6217. #endif
  6218. }
  6219. if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6220. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6221. {
  6222. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6223. SAVE_SYS_LOG_MSG_EVCOMM("[ServiceDetailRes]shutdown by EVSE");
  6224. errn = -1;
  6225. }
  6226. else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6227. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6228. {
  6229. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6230. SAVE_SYS_LOG_MSG_EVCOMM("[ServiceDetailRes]shutdown by EVSE");
  6231. // errn = -1;
  6232. }
  6233. //Check for Permission Changing from TRUE to FALSE
  6234. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6235. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6236. ShmInternalComm->ChargingPermission == FALSE)
  6237. {
  6238. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ServiceDetailRes]Permission OFF");
  6239. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
  6240. // errn = -1;
  6241. }
  6242. switch (req->ServiceID)
  6243. {
  6244. #ifdef SUPPORT_ISO15118_PnC
  6245. case 2:
  6246. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6247. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1;
  6248. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 2;//Installation(1), Update(2)
  6249. //=============Set ParameterSet===================
  6250. {
  6251. unsigned char ServiceName[16];
  6252. for(int j=0;j<ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen;j++)
  6253. {
  6254. memset(ServiceName,0,sizeof(ServiceName));
  6255. switch (j)
  6256. {
  6257. case 0://ftp with port 20
  6258. strcpy(ServiceName,"Installation");
  6259. break;
  6260. case 1://ftp with port 21
  6261. strcpy(ServiceName,"Update");
  6262. break;
  6263. default:
  6264. break;
  6265. }
  6266. if(strlen(ServiceName)>0)
  6267. {
  6268. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].ParameterSetID=j+1;
  6269. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.arrayLen=1;//Service
  6270. //Name= Protocol
  6271. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.charactersLen= strlen("Service");
  6272. writeStringToEXIString("Service", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.characters);
  6273. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue_isUsed=1;
  6274. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.charactersLen=strlen(ServiceName);
  6275. writeStringToEXIString(ServiceName, ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.characters);
  6276. }
  6277. else
  6278. break;
  6279. }//for
  6280. }
  6281. break;
  6282. #endif
  6283. #ifdef SUPPORT_ISO15118_VAS
  6284. case 3:
  6285. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6286. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1;
  6287. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 4;//ftp(1), ftp(2), http(3), https(4)
  6288. //=============Set ParameterSet===================
  6289. {
  6290. unsigned char ProtocolName[16];
  6291. int ProtocolPort;
  6292. for(int j=0;j<ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen;j++)
  6293. {
  6294. memset(ProtocolName,0,sizeof(ProtocolName));
  6295. switch (j)
  6296. {
  6297. case 0://ftp with port 20
  6298. strcpy(ProtocolName,"ftp");
  6299. ProtocolPort=20;
  6300. break;
  6301. case 1://ftp with port 21
  6302. strcpy(ProtocolName,"ftp");
  6303. ProtocolPort=21;
  6304. break;
  6305. case 2://http with port 80
  6306. strcpy(ProtocolName,"http");
  6307. ProtocolPort=80;
  6308. break;
  6309. case 3://https with port 443
  6310. strcpy(ProtocolName,"https");
  6311. ProtocolPort=443;
  6312. break;
  6313. default:
  6314. break;
  6315. }
  6316. if(strlen(ProtocolName)>0)
  6317. {
  6318. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].ParameterSetID=j+1;
  6319. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.arrayLen=2;//protocol and port
  6320. //Name= Protocol
  6321. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6322. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.characters);
  6323. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue_isUsed=1;
  6324. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.charactersLen=strlen(ProtocolName);
  6325. writeStringToEXIString(ProtocolName, ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.characters);
  6326. //Name= Port
  6327. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].Name.charactersLen= strlen("Port");
  6328. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].Name.characters);
  6329. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].intValue_isUsed=1;
  6330. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].intValue=ProtocolPort;
  6331. }
  6332. else
  6333. break;
  6334. }//for
  6335. }
  6336. /*
  6337. //=============http,ParameterSetID=3===================
  6338. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].ParameterSetID=3;//http
  6339. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.arrayLen=2;//protocol and port
  6340. //Name= Protocol, value= "HTTP"
  6341. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6342. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters);
  6343. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue_isUsed=1;
  6344. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue.charactersLen=strlen("http");
  6345. writeStringToEXIString("http", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue.characters);
  6346. //Name= Port, value= 80
  6347. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.charactersLen= strlen("Port");
  6348. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.characters);
  6349. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].intValue_isUsed=1;
  6350. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].intValue=80;
  6351. //==================https,ParameterSetID=4=====================
  6352. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].ParameterSetID=4;//https
  6353. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.arrayLen=2;//protocol and port
  6354. //Name= Protocol, value= "HTTP"
  6355. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.charactersLen= strlen("Protocol");
  6356. writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters);
  6357. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue_isUsed=1;
  6358. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue.charactersLen=strlen("https");
  6359. writeStringToEXIString("https", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue.characters);
  6360. //Name= Port, value= 443
  6361. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].Name.charactersLen= strlen("Port");
  6362. writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].Name.characters);
  6363. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].intValue_isUsed=1;
  6364. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].intValue=443;
  6365. */
  6366. break;
  6367. #endif
  6368. default:
  6369. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
  6370. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 0;
  6371. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_ServiceIDInvalid;
  6372. break;
  6373. }
  6374. // ============ Encode and Send Response Message ===========
  6375. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6376. {
  6377. errn = -1;
  6378. }
  6379. return errn;
  6380. }
  6381. /*===========================================================================
  6382. FUNCTION: Proc_din_ServiceDiscoveryReq
  6383. DESCRIPTION:
  6384. PRE-CONDITION:
  6385. INPUT:
  6386. OUTPUT:
  6387. GLOBAL VARIABLES:
  6388. =============================================================================*/
  6389. int Proc_din_ServiceDiscoveryReq(int AcceptFd)
  6390. {
  6391. int errn = 0;
  6392. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  6393. //Print the decoded XML Document
  6394. PRINT_XML_DOC_DIN_ServiceDiscoveryReq(&ccs_exi_doc_DIN);
  6395. //Save into Share Memory
  6396. SHM_Save_din_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6397. errn = Proc_din_ServiceDiscoveryRes(AcceptFd);
  6398. if (errn == 0)
  6399. {
  6400. //send response successfully.
  6401. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ServiceDiscoveryRes");
  6402. }
  6403. else
  6404. {
  6405. sprintf(buf_log_evcomm,
  6406. "[Error][SeccComm][Proc_din_ServiceDiscoveryReq]Proc_din_ServiceDiscoveryRes(): %d (DEC)",
  6407. errn
  6408. );
  6409. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6410. }
  6411. return errn;
  6412. }
  6413. /*===========================================================================
  6414. FUNCTION: Proc_iso1_ServiceDiscoveryReq
  6415. DESCRIPTION:
  6416. PRE-CONDITION:
  6417. INPUT:
  6418. OUTPUT:
  6419. GLOBAL VARIABLES:
  6420. =============================================================================*/
  6421. int Proc_iso1_ServiceDiscoveryReq(int AcceptFd)
  6422. {
  6423. int errn = 0;
  6424. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  6425. //Print the decoded XML Document
  6426. PRINT_XML_DOC_ISO1_ServiceDiscoveryReq(&ccs_exi_doc_ISO1);
  6427. //Save into Share Memory
  6428. SHM_Save_iso1_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6429. errn = Proc_iso1_ServiceDiscoveryRes(AcceptFd);
  6430. if (errn == 0)
  6431. {
  6432. //send response successfully.
  6433. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceDiscoveryRes");
  6434. }
  6435. else
  6436. {
  6437. sprintf(buf_log_evcomm,
  6438. "[Error][SeccComm][Proc_iso1_ServiceDiscoveryReq]Proc_iso1_ServiceDiscoveryRes(): %d (DEC)",
  6439. errn
  6440. );
  6441. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6442. }
  6443. return errn;
  6444. }
  6445. /*===========================================================================
  6446. FUNCTION: Proc_din_ServiceAndPaymentSelectionRes
  6447. DESCRIPTION:
  6448. PRE-CONDITION:
  6449. INPUT:
  6450. OUTPUT:
  6451. GLOBAL VARIABLES:
  6452. =============================================================================*/
  6453. int Proc_din_ServiceAndPaymentSelectionRes(int AcceptFd)
  6454. {
  6455. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6456. //if it is not the same, the packet should be ignored.
  6457. int i = 0;
  6458. int errn = 0;
  6459. bitstream_t v2g_tx_stream;
  6460. struct ServiceAndPaymentSelectionRequest_DIN70121 *req;
  6461. struct ServiceAndPaymentSelectionResponse_DIN70121 *res;
  6462. struct ServiceDiscoveryResponse_DIN70121 *sd_res;
  6463. struct ChargingInfoData *sys;
  6464. size_t pos = 0;
  6465. v2g_tx_stream.pos = &pos;
  6466. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6467. v2g_tx_stream.data = V2GTP_Tx_buf;
  6468. req = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionRequest;
  6469. res = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionResponse;
  6470. sd_res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  6471. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6472. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6473. init_dinServicePaymentSelectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes);
  6474. //[1/1] Response Code
  6475. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes_isUsed = 1u;
  6476. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_OK;
  6477. //[HEADER] Check Req SessionID
  6478. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6479. {
  6480. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6481. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6482. errn = -1;
  6483. }
  6484. //Check for SequenceError
  6485. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6486. {
  6487. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6488. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6489. errn = -1;
  6490. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6491. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6492. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6493. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6494. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6495. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6496. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6497. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6498. }
  6499. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  6500. if (req->SelectedPaymentOption != dinpaymentOptionType_ExternalPayment) //1
  6501. {
  6502. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_PaymentSelectionInvalid;
  6503. sprintf(buf_log_evcomm,
  6504. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6505. req->SelectedPaymentOption);
  6506. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6507. errn = -1;
  6508. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6509. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6510. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6511. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6512. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6513. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6514. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6515. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6516. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6517. }
  6518. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  6519. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService_DIN70121.Services.ServiceTag.ServiceID)
  6520. {
  6521. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_ServiceSelectionInvalid; //8
  6522. sprintf(buf_log_evcomm,
  6523. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6524. req->SelectedServiceList.SelectedService[0].ServiceID);
  6525. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6526. errn = -1;
  6527. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6528. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6529. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6530. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6531. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6532. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6533. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6534. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6535. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6536. }
  6537. //Detect for CP State should be 9V (State B)
  6538. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6539. {
  6540. #if CP_PROTECTION_MECHANISM == ENABLE
  6541. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6542. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6543. Update_V2G_Flow_Status(Other_Fault);
  6544. errn = -1;
  6545. sprintf(buf_log_evcomm,
  6546. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6547. sys->CpState);
  6548. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6549. #else
  6550. sprintf(buf_log_evcomm,
  6551. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6552. sys->CpState);
  6553. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6554. #endif
  6555. }
  6556. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6557. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6558. {
  6559. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6560. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6561. // errn = -1;
  6562. }
  6563. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6564. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6565. {
  6566. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6567. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6568. errn = -1;
  6569. }
  6570. //Check for Permission Changing from TRUE to FALSE
  6571. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6572. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6573. ShmInternalComm->ChargingPermission == FALSE)
  6574. {
  6575. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ServicePaymentSelectionRes]Permission OFF");
  6576. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6577. //errn = -1;
  6578. }
  6579. // ============ Encode and Send Response Message ===========
  6580. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6581. {
  6582. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6583. errn = -1;
  6584. }
  6585. return errn;
  6586. }
  6587. /*===========================================================================
  6588. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionRes
  6589. DESCRIPTION:
  6590. PRE-CONDITION:
  6591. INPUT:
  6592. OUTPUT:
  6593. GLOBAL VARIABLES:
  6594. =============================================================================*/
  6595. int Proc_iso1_ServiceAndPaymentSelectionRes(int AcceptFd)
  6596. {
  6597. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6598. //if it is not the same, the packet should be ignored.
  6599. int i = 0;
  6600. int errn = 0;
  6601. bitstream_t v2g_tx_stream;
  6602. struct ServiceAndPaymentSelectionRequest_ISO15118_2014 *req;
  6603. struct ServiceAndPaymentSelectionResponse_ISO15118_2014 *res;
  6604. struct ServiceDiscoveryResponse_ISO15118_2014 *sd_res;
  6605. static struct ChargingInfoData *sys;
  6606. size_t pos = 0;
  6607. v2g_tx_stream.pos = &pos;
  6608. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6609. v2g_tx_stream.data = V2GTP_Tx_buf;
  6610. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionRequest;
  6611. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionResponse;
  6612. sd_res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  6613. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6614. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6615. init_iso1PaymentServiceSelectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes);
  6616. //[1/1] Response Code
  6617. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes_isUsed = 1u;
  6618. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_OK;
  6619. //[HEADER] Check Req SessionID
  6620. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6621. {
  6622. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6623. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6624. errn = -1;
  6625. }
  6626. //Check for SequenceError
  6627. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6628. {
  6629. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6630. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6631. errn = -1;
  6632. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6633. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6634. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6635. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6636. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6637. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6638. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6639. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6640. }
  6641. #ifdef SUPPORT_ISO15118_PnC
  6642. if (req->SelectedPaymentOption > iso1paymentOptionType_ExternalPayment) //1
  6643. {
  6644. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  6645. sprintf(buf_log_evcomm,
  6646. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6647. req->SelectedPaymentOption);
  6648. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6649. errn = -1;
  6650. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6651. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6652. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6653. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6654. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6655. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6656. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6657. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6658. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6659. }
  6660. #else
  6661. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  6662. if (req->SelectedPaymentOption != iso1paymentOptionType_ExternalPayment) //1
  6663. {
  6664. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  6665. sprintf(buf_log_evcomm,
  6666. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6667. req->SelectedPaymentOption);
  6668. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6669. errn = -1;
  6670. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6671. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6672. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6673. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6674. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6675. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6676. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6677. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6678. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6679. }
  6680. #endif
  6681. for(i=0;i<req->SelectedServiceList.SelectedServiceLen;i++)
  6682. {
  6683. switch(req->SelectedServiceList.SelectedService[i].ServiceID)
  6684. {
  6685. case 1:
  6686. break;
  6687. case 2:
  6688. #ifndef SUPPORT_ISO15118_PnC
  6689. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6690. sprintf(buf_log_evcomm,
  6691. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6692. req->SelectedServiceList.SelectedService[0].ServiceID);
  6693. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6694. errn = -1;
  6695. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6696. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6697. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6698. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6699. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6700. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6701. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6702. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6703. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6704. #endif
  6705. break;
  6706. case 3:
  6707. #ifndef SUPPORT_ISO15118_VAS
  6708. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6709. sprintf(buf_log_evcomm,
  6710. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6711. req->SelectedServiceList.SelectedService[0].ServiceID);
  6712. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6713. errn = -1;
  6714. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6715. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6716. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6717. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6718. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6719. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6720. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6721. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6722. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6723. #endif
  6724. break;
  6725. default:
  6726. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6727. sprintf(buf_log_evcomm,
  6728. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6729. req->SelectedServiceList.SelectedService[0].ServiceID);
  6730. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6731. errn = -1;
  6732. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6733. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6734. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6735. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6736. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6737. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6738. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6739. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6740. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6741. break;
  6742. }
  6743. }
  6744. //Detect for CP State should be 9V (State B)
  6745. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6746. {
  6747. #if CP_PROTECTION_MECHANISM == ENABLE
  6748. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6749. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6750. Update_V2G_Flow_Status(Other_Fault);
  6751. errn = -1;
  6752. sprintf(buf_log_evcomm,
  6753. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6754. sys->CpState);
  6755. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6756. #else
  6757. sprintf(buf_log_evcomm,
  6758. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6759. sys->CpState);
  6760. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6761. #endif
  6762. }
  6763. if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
  6764. sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
  6765. {
  6766. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6767. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6768. //errn = -1;
  6769. }
  6770. else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
  6771. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6772. {
  6773. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6774. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6775. errn = -1;
  6776. }
  6777. //Check for Permission Changing from TRUE to FALSE
  6778. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6779. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6780. ShmInternalComm->ChargingPermission == FALSE)
  6781. {
  6782. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][PaymentServiceSelectionRes]Permission OFF");
  6783. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6784. // errn = -1;
  6785. }
  6786. // ============ Encode and Send Response Message ===========
  6787. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6788. {
  6789. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6790. errn = -1;
  6791. }
  6792. return errn;
  6793. }
  6794. /*===========================================================================
  6795. FUNCTION: Proc_din_ServiceAndPaymentSelectionReq
  6796. DESCRIPTION:
  6797. PRE-CONDITION:
  6798. INPUT:
  6799. OUTPUT:
  6800. GLOBAL VARIABLES:
  6801. =============================================================================*/
  6802. int Proc_din_ServiceAndPaymentSelectionReq(int AcceptFd)
  6803. {
  6804. int errn = 0;
  6805. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_din_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6806. //Print the decoded XML Document
  6807. PRINT_XML_DOC_DIN_ServiceAndPaymentSelectionReq(&ccs_exi_doc_DIN);
  6808. //Save into Share Memory
  6809. SHM_Save_din_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6810. errn = Proc_din_ServiceAndPaymentSelectionRes(AcceptFd);
  6811. if (errn == 0)
  6812. {
  6813. //send response successfully.
  6814. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ServiceAndPaymentSelectionRes");
  6815. }
  6816. else
  6817. {
  6818. sprintf(buf_log_evcomm,
  6819. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6820. errn);
  6821. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6822. }
  6823. return errn;
  6824. }
  6825. /*===========================================================================
  6826. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionReq
  6827. DESCRIPTION:
  6828. PRE-CONDITION:
  6829. INPUT:
  6830. OUTPUT:
  6831. GLOBAL VARIABLES:
  6832. =============================================================================*/
  6833. int Proc_iso1_ServiceAndPaymentSelectionReq(int AcceptFd)
  6834. {
  6835. int errn = 0;
  6836. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6837. //Print the decoded XML Document
  6838. PRINT_XML_DOC_ISO1_ServiceAndPaymentSelectionReq(&ccs_exi_doc_ISO1);
  6839. //Save into Share Memory
  6840. SHM_Save_iso1_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6841. errn = Proc_iso1_ServiceAndPaymentSelectionRes(AcceptFd);
  6842. if (errn == 0)
  6843. {
  6844. //send response successfully.
  6845. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceAndPaymentSelectionRes");
  6846. }
  6847. else
  6848. {
  6849. sprintf(buf_log_evcomm,
  6850. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6851. errn);
  6852. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6853. }
  6854. return errn;
  6855. }
  6856. /*===========================================================================
  6857. FUNCTION: Proc_din_ContractAuthenticationRes
  6858. DESCRIPTION:
  6859. PRE-CONDITION:
  6860. INPUT:
  6861. OUTPUT:
  6862. GLOBAL VARIABLES:
  6863. =============================================================================*/
  6864. int Proc_din_ContractAuthenticationRes(int AcceptFd)
  6865. {
  6866. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6867. //if it is not the same, the packet should be ignored.
  6868. int i = 0;
  6869. int errn = 0;
  6870. bitstream_t v2g_tx_stream;
  6871. static struct ChargingInfoData *sys;
  6872. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6873. size_t pos = 0;
  6874. v2g_tx_stream.pos = &pos;
  6875. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6876. v2g_tx_stream.data = V2GTP_Tx_buf;
  6877. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6878. init_dinContractAuthenticationResType(&ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes);
  6879. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes_isUsed = 1u;
  6880. //[BODY (1/2)] ResponseCode
  6881. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_OK;
  6882. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6883. //[HEADER] Check Req SessionID
  6884. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6885. {
  6886. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6887. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  6888. errn = -1;
  6889. }
  6890. //Check for SequenceError
  6891. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6892. {
  6893. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6894. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  6895. errn = -1;
  6896. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6897. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6898. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6899. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6900. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6901. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6902. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6903. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6904. }
  6905. //Detect for CP State should be 9V (State B)
  6906. #if CP_PROTECTION_MECHANISM == ENABLE
  6907. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6908. {
  6909. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6910. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6911. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6912. Update_V2G_Flow_Status(Other_Fault);
  6913. errn = -1;
  6914. sprintf(buf_log_evcomm,
  6915. "[Proc_din_ContractAuthenticationRes]Emergency Stop by CP Error (%d)",
  6916. sys->CpState);
  6917. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  6918. }
  6919. #endif
  6920. //Check for CSU command of "Stop by EVSE"
  6921. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6922. {
  6923. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6924. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6925. // errn = -1;
  6926. }
  6927. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6928. {
  6929. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6930. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6931. errn = -1;
  6932. }
  6933. //[BODY (2/2)] EVSEProcessing
  6934. if(ShmInternalComm->ChargingPermission == TRUE)
  6935. {
  6936. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6937. SAVE_SYS_LOG_MSG_EVCOMM("CSU Permission: OK");
  6938. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6939. {
  6940. //Set PWM as 5% (for SLAC first case)
  6941. SAVE_SYS_LOG_MSG_EVCOMM("Set PWM as 5%%");
  6942. SwitchCpStateE(DISABLE);
  6943. OutputCpPwmDuty(5);
  6944. }
  6945. #endif
  6946. }
  6947. //Check for Permission Changing from TRUE to FALSE
  6948. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6949. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  6950. ShmInternalComm->ChargingPermission == FALSE)
  6951. {
  6952. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ContractAuthenticationRes]Permission OFF");
  6953. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6954. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6955. // errn = -1;
  6956. }
  6957. #if PARAMETER_NORMAL_MODE == ENABLE
  6958. ////////////SHM_Read_din_ContractAuthenticationRes(&ccs_exi_doc_DIN, ShmCcsData);
  6959. #endif
  6960. // ============ Encode and Send Response Message ===========
  6961. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6962. {
  6963. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6964. errn = -1;
  6965. }
  6966. return errn;
  6967. }
  6968. /*===========================================================================
  6969. FUNCTION: Proc_iso1_AuthorizationRes
  6970. DESCRIPTION:
  6971. PRE-CONDITION:
  6972. INPUT:
  6973. OUTPUT:
  6974. GLOBAL VARIABLES:
  6975. =============================================================================*/
  6976. int Proc_iso1_AuthorizationRes(int AcceptFd)
  6977. {
  6978. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6979. //if it is not the same, the packet should be ignored.
  6980. int i = 0;
  6981. int errn = 0;
  6982. bitstream_t v2g_tx_stream;
  6983. static struct ChargingInfoData *sys;
  6984. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6985. size_t pos = 0;
  6986. v2g_tx_stream.pos = &pos;
  6987. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6988. v2g_tx_stream.data = V2GTP_Tx_buf;
  6989. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6990. init_iso1AuthorizationResType(&ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes);
  6991. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes_isUsed = 1u;
  6992. //[BODY (1/2)] ResponseCode
  6993. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_OK;
  6994. /*+++ 20200808, vern, EVSEProcessing should be waiting for Customer during authrization +++*/
  6995. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction; //0
  6996. /*--- 20200808, vern, should be waiting for Customer during authrization ---*/
  6997. //[HEADER] Check Req SessionID
  6998. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6999. {
  7000. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7001. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7002. errn = -1;
  7003. }
  7004. //Check for SequenceError
  7005. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7006. {
  7007. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7008. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7009. errn = -1;
  7010. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7011. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7012. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7013. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7014. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7015. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7016. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7017. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7018. }
  7019. //Detect for CP State should be 9V (State B)
  7020. #if CP_PROTECTION_MECHANISM == ENABLE
  7021. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  7022. {
  7023. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED;
  7024. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7025. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7026. Update_V2G_Flow_Status(Other_Fault);
  7027. errn = -1;
  7028. sprintf(buf_log_evcomm,
  7029. "[Proc_iso1_AuthorizationRes]Emergency Stop by CP Error (%d)",
  7030. sys->CpState);
  7031. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7032. }
  7033. #endif
  7034. //Check for CSU command of "Stop by EVSE"
  7035. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7036. {
  7037. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7038. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7039. //errn = -1;
  7040. }
  7041. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7042. {
  7043. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7044. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7045. errn = -1;
  7046. }
  7047. //[BODY (2/2)] EVSEProcessing
  7048. //Check for Permission from CSU
  7049. if(ShmInternalComm->ChargingPermission == TRUE)
  7050. {
  7051. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7052. SAVE_SYS_LOG_MSG_EVCOMM("CSU Permission: OK");
  7053. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  7054. {
  7055. //Set PWM as 5% (for SLAC first case)
  7056. SAVE_SYS_LOG_MSG_EVCOMM("Set PWM as 5%%");
  7057. SwitchCpStateE(DISABLE);
  7058. OutputCpPwmDuty(5);
  7059. }
  7060. #endif
  7061. }
  7062. //Check for Permission Changing from TRUE to FALSE
  7063. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  7064. if (ShmInternalComm->ChargingPermission_pre >=1 &&
  7065. ShmInternalComm->ChargingPermission == FALSE)
  7066. {
  7067. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][AuthorizationRes]Permission OFF");
  7068. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  7069. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  7070. // errn = -1;
  7071. }
  7072. #if PARAMETER_NORMAL_MODE == ENABLE
  7073. ////////////SHM_Read_iso1_AuthorizationRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7074. #endif
  7075. // ============ Encode and Send Response Message ===========
  7076. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7077. {
  7078. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7079. errn = -1;
  7080. }
  7081. return errn;
  7082. }
  7083. /*===========================================================================
  7084. FUNCTION: Proc_din_ContractAuthenticationReq
  7085. DESCRIPTION:
  7086. PRE-CONDITION:
  7087. INPUT:
  7088. OUTPUT:
  7089. GLOBAL VARIABLES:
  7090. =============================================================================*/
  7091. int Proc_din_ContractAuthenticationReq(int AcceptFd)
  7092. {
  7093. int errn = 0;
  7094. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ContractAuthenticationReq]Got Proc_din_ContractAuthenticationReq\n");
  7095. //Print the decoded XML Document
  7096. PRINT_XML_DOC_DIN_ContractAuthenticationReq(&ccs_exi_doc_DIN);
  7097. //Save into Share Memory
  7098. SHM_Save_din_ContractAuthenticationReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7099. errn = Proc_din_ContractAuthenticationRes(AcceptFd);
  7100. if (errn == 0)
  7101. {
  7102. //send response successfully.
  7103. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ContractAuthenticationRes");
  7104. }
  7105. else
  7106. {
  7107. sprintf(buf_log_evcomm,
  7108. "[Error][SeccComm][Proc_din_ContractAuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  7109. errn);
  7110. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7111. }
  7112. return errn;
  7113. }
  7114. /*===========================================================================
  7115. FUNCTION: Proc_iso1_AuthenticationReq
  7116. DESCRIPTION:
  7117. PRE-CONDITION:
  7118. INPUT:
  7119. OUTPUT:
  7120. GLOBAL VARIABLES:
  7121. =============================================================================*/
  7122. int Proc_iso1_AuthenticationReq(int AcceptFd)
  7123. {
  7124. int errn = 0;
  7125. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_AuthenticationReq]Got AuthorizationReq\n");
  7126. //Print the decoded XML Document
  7127. PRINT_XML_DOC_ISO1_AuthorizationReq(&ccs_exi_doc_ISO1);
  7128. //Save into Share Memory
  7129. SHM_Save_iso1_AuthorizationReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7130. errn = Proc_iso1_AuthorizationRes(AcceptFd);
  7131. if (errn == 0)
  7132. {
  7133. //send response successfully.
  7134. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]AuthorizationRes");
  7135. }
  7136. else
  7137. {
  7138. sprintf(buf_log_evcomm,
  7139. "[Error][SeccComm][Proc_iso1_AuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  7140. errn);
  7141. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7142. }
  7143. return errn;
  7144. }
  7145. /*===========================================================================
  7146. FUNCTION: SHM_Init_dinDC_EVSEStatusType
  7147. DESCRIPTION:
  7148. PRE-CONDITION:
  7149. INPUT:
  7150. 1. in
  7151. OUTPUT:
  7152. 2. out
  7153. GLOBAL VARIABLES:
  7154. =============================================================================*/
  7155. void SHM_Init_dinDC_EVSEStatusType(struct DC_EVSEStatusType_DIN70121 *in)
  7156. {
  7157. in->EVSEIsolationStatus = dinisolationLevelType_Valid;
  7158. // dinisolationLevelType_Invalid = 0,
  7159. // dinisolationLevelType_Valid = 1, (default)
  7160. // dinisolationLevelType_Warning = 2,
  7161. // dinisolationLevelType_Fault = 3
  7162. in->EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7163. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7164. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1, (default)
  7165. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7166. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7167. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7168. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7169. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7170. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7171. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7172. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7173. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7174. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7175. in->EVSENotification = dinEVSENotificationType_None;
  7176. // dinEVSENotificationType_None = 0, (default)
  7177. // dinEVSENotificationType_StopCharging = 1,
  7178. // dinEVSENotificationType_ReNegotiation = 2
  7179. }
  7180. /*===========================================================================
  7181. FUNCTION: SHM_Save_dinPhysicalValueType
  7182. DESCRIPTION:
  7183. PRE-CONDITION:
  7184. INPUT:
  7185. OUTPUT:
  7186. GLOBAL VARIABLES:
  7187. =============================================================================*/
  7188. void SHM_Save_dinPhysicalValueType(struct PhysicalValueType_DIN70121 *obj, short value, int multiplier, unsigned char unit)
  7189. {
  7190. obj->Value = value;
  7191. obj->Multiplier = multiplier;
  7192. obj->Unit =unit;
  7193. }
  7194. /*===========================================================================
  7195. FUNCTION: SHM_Init_din_ChargeParameterDiscoveryRes
  7196. DESCRIPTION:
  7197. PRE-CONDITION:
  7198. INPUT:
  7199. 1. shm_ccs
  7200. OUTPUT:
  7201. 2. shm_ccs
  7202. GLOBAL VARIABLES:
  7203. =============================================================================*/
  7204. void SHM_Init_din_ChargeParameterDiscoveryRes(struct CcsData *shm_ccs)
  7205. {
  7206. struct ChargeParameterDiscoveryResponse_DIN70121 *in;
  7207. in = &shm_ccs->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  7208. //----- [BODY (1/5)] ResponseCode -----
  7209. in->ResponseCode = dinresponseCodeType_OK;
  7210. //----- [BODY (2/5)] EVSEProcessing -----
  7211. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  7212. // dinEVSEProcessingType_Finished = 0,
  7213. // dinEVSEProcessingType_Ongoing = 1
  7214. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7215. //be fixed in another function.
  7216. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7217. //ignore, since DIN doesn't support AC
  7218. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7219. struct DC_EVSEChargeParameterType_DIN70121 *in_para;
  7220. in_para = &in->DC_EVSEChargeParameter;
  7221. //DC_EVSEStatus
  7222. SHM_Init_dinDC_EVSEStatusType(&in_para->DC_EVSEStatus);
  7223. in_para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7224. short value = 0; int multiplier = 0; unsigned char unit = 0;
  7225. //EVSEMaximumCurrentLimit
  7226. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  7227. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumCurrentLimit, value, multiplier, unit);
  7228. //EVSEMaximumPowerLimit
  7229. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  7230. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumPowerLimit, value, multiplier, unit);
  7231. //EVSEMaximumVoltageLimit
  7232. value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  7233. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumVoltageLimit, value, multiplier, unit);
  7234. //EVSEMinimumVoltageLimit
  7235. value = 1500; multiplier = -1; unit = V_DIN70121; //150V
  7236. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumVoltageLimit, value, multiplier, unit);
  7237. //EVSEMinimumCurrentLimit
  7238. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  7239. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumCurrentLimit, value, multiplier, unit);
  7240. //EVSECurrentRegulationTolerance
  7241. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  7242. SHM_Save_dinPhysicalValueType(&in_para->EVSECurrentRegulationTolerance, value, multiplier, unit);
  7243. //EVSEPeakCurrentRipple
  7244. value = 2; multiplier = -1; unit = A_DIN70121; //0.2A
  7245. SHM_Save_dinPhysicalValueType(&in_para->EVSEPeakCurrentRipple, value, multiplier, unit);
  7246. //EVSEEnergyToBeDelivered (optional)
  7247. //SHM_Save_dinPhysicalValueType(&out_para->EVSEEnergyToBeDelivered, &in_para->EVSEEnergyToBeDelivered);
  7248. }
  7249. /*===========================================================================
  7250. FUNCTION: Sudo_Parameter_din_ChargeParameterDiscoveryRes
  7251. DESCRIPTION:
  7252. PRE-CONDITION:
  7253. INPUT:
  7254. OUTPUT:
  7255. GLOBAL VARIABLES:
  7256. =============================================================================*/
  7257. void Sudo_Parameter_din_ChargeParameterDiscoveryRes()
  7258. {
  7259. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7260. init_dinChargeParameterDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes);
  7261. ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  7262. //----- [BODY (1/5)] ResponseCode -----
  7263. struct dinChargeParameterDiscoveryResType *res;
  7264. res = &ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes;
  7265. res->ResponseCode = dinresponseCodeType_OK;
  7266. //----- [BODY (2/5)] EVSEProcessing -----
  7267. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  7268. // dinEVSEProcessingType_Finished = 0,
  7269. // dinEVSEProcessingType_Ongoing = 1
  7270. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7271. res->SAScheduleList_isUsed = 1u;
  7272. struct dinSAScheduleListType *list;
  7273. list = &res->SAScheduleList;
  7274. //
  7275. list->SAScheduleTuple.arrayLen = 1;
  7276. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  7277. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleID = 0;
  7278. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  7279. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  7280. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  7281. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  7282. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  7283. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  7284. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  7285. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  7286. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  7287. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7288. //ignore, since DIN doesn't support AC
  7289. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7290. res->DC_EVSEChargeParameter_isUsed = 1u;
  7291. struct dinDC_EVSEChargeParameterType *para;
  7292. para = &res->DC_EVSEChargeParameter;
  7293. //DC_EVSEStatus
  7294. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7295. para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7296. // dinisolationLevelType_Invalid = 0,
  7297. // dinisolationLevelType_Valid = 1,
  7298. // dinisolationLevelType_Warning = 2,
  7299. // dinisolationLevelType_Fault = 3
  7300. para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7301. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7302. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7303. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7304. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7305. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7306. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7307. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7308. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7309. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7310. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7311. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7312. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7313. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7314. para->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  7315. // dinEVSENotificationType_None = 0,
  7316. // dinEVSENotificationType_StopCharging = 1,
  7317. // dinEVSENotificationType_ReNegotiation = 2
  7318. //EVSEMaximumCurrentLimit
  7319. para->EVSEMaximumCurrentLimit.Value = 2400;
  7320. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  7321. para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  7322. para->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  7323. // dinunitSymbolType_h = 0,
  7324. // dinunitSymbolType_m = 1,
  7325. // dinunitSymbolType_s = 2,
  7326. // dinunitSymbolType_A = 3,
  7327. // dinunitSymbolType_Ah = 4,
  7328. // dinunitSymbolType_V = 5,
  7329. // dinunitSymbolType_VA = 6,
  7330. // dinunitSymbolType_W = 7,
  7331. // dinunitSymbolType_W_s = 8,
  7332. // dinunitSymbolType_Wh = 9
  7333. //EVSEMaximumPowerLimit
  7334. para->EVSEMaximumPowerLimit.Value = 6000;
  7335. para->EVSEMaximumPowerLimit.Multiplier = 1;
  7336. para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  7337. para->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  7338. //EVSEMaximumVoltageLimit
  7339. para->EVSEMaximumVoltageLimit.Value = 7500;
  7340. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  7341. para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  7342. para->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  7343. //EVSEMinimumVoltageLimit
  7344. para->EVSEMinimumVoltageLimit.Value = 1500;
  7345. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  7346. para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  7347. para->EVSEMinimumVoltageLimit.Unit = dinunitSymbolType_V;
  7348. //EVSEMinimumCurrentLimit
  7349. para->EVSEMinimumCurrentLimit.Value = 20;
  7350. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  7351. para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  7352. para->EVSEMinimumCurrentLimit.Unit = dinunitSymbolType_A;
  7353. //EVSECurrentRegulationTolerance_isUsed
  7354. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  7355. //EVSECurrentRegulationTolerance
  7356. para->EVSECurrentRegulationTolerance.Value = 10;
  7357. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  7358. para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  7359. para->EVSECurrentRegulationTolerance.Unit = dinunitSymbolType_A;
  7360. //EVSEEnergyToBeDelivered_isUsed
  7361. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  7362. //EVSEPeakCurrentRipple
  7363. para->EVSEPeakCurrentRipple.Value = 2;
  7364. para->EVSEPeakCurrentRipple.Multiplier = -1;
  7365. para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  7366. para->EVSEPeakCurrentRipple.Unit = dinunitSymbolType_A;
  7367. //EVSEEnergyToBeDelivered (optional)
  7368. /*
  7369. para->EVSEEnergyToBeDelivered.Value = 360;
  7370. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  7371. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  7372. para->EVSEEnergyToBeDelivered.Unit = dinunitSymbolType_Wh;
  7373. */
  7374. }
  7375. /*===========================================================================
  7376. FUNCTION: Sudo_Parameter_iso1_ChargeParameterDiscoveryRes
  7377. DESCRIPTION:
  7378. PRE-CONDITION:
  7379. INPUT:
  7380. OUTPUT:
  7381. GLOBAL VARIABLES:
  7382. =============================================================================*/
  7383. void Sudo_Parameter_iso1_ChargeParameterDiscoveryRes()
  7384. {
  7385. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  7386. init_iso1ChargeParameterDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes);
  7387. ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  7388. //----- [BODY (1/5)] ResponseCode -----
  7389. struct iso1ChargeParameterDiscoveryResType *res;
  7390. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes;
  7391. res->ResponseCode = iso1responseCodeType_OK;
  7392. //----- [BODY (2/5)] EVSEProcessing -----
  7393. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7394. // iso1EVSEProcessingType_Finished = 0,
  7395. // iso1EVSEProcessingType_Ongoing = 1
  7396. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  7397. res->SAScheduleList_isUsed = 1u;
  7398. struct iso1SAScheduleListType *list;
  7399. list = &res->SAScheduleList;
  7400. //
  7401. list->SAScheduleTuple.arrayLen = 1;
  7402. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  7403. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  7404. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  7405. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  7406. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  7407. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  7408. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  7409. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  7410. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  7411. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  7412. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  7413. //ignore, since our ISO1 doesn't support AC, yet
  7414. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  7415. res->DC_EVSEChargeParameter_isUsed = 1u;
  7416. struct iso1DC_EVSEChargeParameterType *para;
  7417. para = &res->DC_EVSEChargeParameter;
  7418. //DC_EVSEStatus
  7419. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7420. para->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7421. // iso1isolationLevelType_Invalid = 0,
  7422. // iso1isolationLevelType_Valid = 1,
  7423. // iso1isolationLevelType_Warning = 2,
  7424. // iso1isolationLevelType_Fault = 3
  7425. para->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7426. // iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7427. // iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  7428. // iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7429. // iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7430. // iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7431. // iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7432. // iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7433. // iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  7434. // iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  7435. // iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  7436. // iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  7437. // iso1DC_EVSEStatusCodeType_Reserved_C = 11
  7438. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7439. para->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  7440. // iso1EVSENotificationType_None = 0,
  7441. // iso1EVSENotificationType_StopCharging = 1,
  7442. // iso1EVSENotificationType_ReNegotiation = 2
  7443. //EVSEMaximumCurrentLimit
  7444. para->EVSEMaximumCurrentLimit.Value = 2400;
  7445. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  7446. //para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  7447. para->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  7448. //iso1unitSymbolType_h = 0,
  7449. //iso1unitSymbolType_m = 1,
  7450. //iso1unitSymbolType_s = 2,
  7451. //iso1unitSymbolType_A = 3,
  7452. //iso1unitSymbolType_V = 4,
  7453. //iso1unitSymbolType_W = 5,
  7454. //iso1unitSymbolType_Wh = 6
  7455. //EVSEMaximumPowerLimit
  7456. para->EVSEMaximumPowerLimit.Value = 6000;
  7457. para->EVSEMaximumPowerLimit.Multiplier = 1;
  7458. //para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  7459. para->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  7460. //EVSEMaximumVoltageLimit
  7461. para->EVSEMaximumVoltageLimit.Value = 7500;
  7462. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  7463. //para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  7464. para->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  7465. //EVSEMinimumVoltageLimit
  7466. para->EVSEMinimumVoltageLimit.Value = 1500;
  7467. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  7468. //para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  7469. para->EVSEMinimumVoltageLimit.Unit = iso1unitSymbolType_V;
  7470. //EVSEMinimumCurrentLimit
  7471. para->EVSEMinimumCurrentLimit.Value = 20;
  7472. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  7473. //para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  7474. para->EVSEMinimumCurrentLimit.Unit = iso1unitSymbolType_A;
  7475. //EVSECurrentRegulationTolerance_isUsed
  7476. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  7477. //EVSECurrentRegulationTolerance
  7478. para->EVSECurrentRegulationTolerance.Value = 10;
  7479. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  7480. //para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  7481. para->EVSECurrentRegulationTolerance.Unit = iso1unitSymbolType_A;
  7482. //EVSEEnergyToBeDelivered_isUsed
  7483. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  7484. //EVSEPeakCurrentRipple
  7485. para->EVSEPeakCurrentRipple.Value = 2;
  7486. para->EVSEPeakCurrentRipple.Multiplier = -1;
  7487. //para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  7488. para->EVSEPeakCurrentRipple.Unit = iso1unitSymbolType_A;
  7489. //EVSEEnergyToBeDelivered (optional)
  7490. /*
  7491. para->EVSEEnergyToBeDelivered.Value = 360;
  7492. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  7493. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  7494. para->EVSEEnergyToBeDelivered.Unit = iso1unitSymbolType_Wh;
  7495. */
  7496. }
  7497. /*===========================================================================
  7498. FUNCTION: Proc_din_ChargeParameterDiscoveryRes
  7499. DESCRIPTION:
  7500. PRE-CONDITION:
  7501. INPUT:
  7502. OUTPUT:
  7503. GLOBAL VARIABLES:
  7504. =============================================================================*/
  7505. int Proc_din_ChargeParameterDiscoveryRes(int AcceptFd)
  7506. {
  7507. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7508. //if it is not the same, the packet should be ignored.
  7509. //STEP 1: ============ Initialize ============
  7510. int errn = 0;
  7511. bitstream_t v2g_tx_stream;
  7512. struct ChargeParameterDiscoveryResponse_DIN70121 *res;
  7513. struct ChargeParameterDiscoveryRequest_DIN70121 *req;
  7514. struct DC_EVSEChargeParameterType_DIN70121 *dc_para;
  7515. struct ChargingInfoData *sys;
  7516. size_t pos = 0;
  7517. v2g_tx_stream.pos = &pos;
  7518. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7519. v2g_tx_stream.data = V2GTP_Tx_buf;
  7520. res = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  7521. req = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest;
  7522. dc_para = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  7523. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7524. res->ResponseCode = OK_DIN70121;
  7525. res->EVSEProcessing = Ongoing_DIN70121;
  7526. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready; //1
  7527. //[HEADER] Check Req SessionID
  7528. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  7529. {
  7530. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  7531. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7532. errn = -1;
  7533. }
  7534. //Check for SequenceError
  7535. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7536. {
  7537. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  7538. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7539. errn = -1;
  7540. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7541. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7542. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7543. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7544. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7545. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7546. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7547. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7548. }
  7549. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  7550. if ( (sys->EvBatteryMaxCurrent < 0) ||
  7551. (sys->EvBatteryMaxVoltage<150)
  7552. )
  7553. {
  7554. sprintf(buf_log_evcomm,
  7555. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  7556. sys->EvBatteryMaxCurrent);
  7557. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7558. res->ResponseCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  7559. res->EVSEProcessing = Finished_DIN70121;
  7560. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7561. errn = -1;
  7562. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7563. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  7564. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7565. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7566. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7567. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7568. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7569. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  7570. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7571. }
  7572. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  7573. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  7574. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  7575. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  7576. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumVoltageLimit, 1500, V_DIN70121); //150V
  7577. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumCurrentLimit, MIN_SUPPORTED_CURRENT*10, A_DIN70121); //1A
  7578. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSECurrentRegulationTolerance, 10, A_DIN70121); //1A
  7579. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEPeakCurrentRipple, 2, A_DIN70121); //0.2A
  7580. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEEnergyToBeDelivered, 0, WH_DIN70121); //optional
  7581. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  7582. if (sys->EvBatteryMaxVoltage <= 500)
  7583. {
  7584. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  7585. }
  7586. #endif
  7587. //for test with Tesla Model 3, 10A
  7588. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_DIN70121); //10A, for testing with Tesla Model 3
  7589. //Check for EnergyTransferMode [TC_SECC_VTB_ChargeParameterDiscovery_004]
  7590. if (req->EVRequestedEnergyTransferType != dinEVSESupportedEnergyTransferType_DC_extended)
  7591. {
  7592. sprintf(buf_log_evcomm,
  7593. "[ERROR]Wrong EVRequestedEnergyTransferType(%d,%d)",
  7594. req->EVRequestedEnergyTransferType,
  7595. dinEVSESupportedEnergyTransferType_DC_extended);
  7596. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7597. res->ResponseCode = FAILED_WrongEnergyTransferType_DIN70121;
  7598. res->EVSEProcessing = Finished_DIN70121;
  7599. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7600. errn = -1;
  7601. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7602. Update_V2G_Flow_Status(Other_Fault);
  7603. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7604. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  7605. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7606. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7607. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7608. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7609. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7610. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  7611. }
  7612. //Check for CSU command of "Stop by EVSE"
  7613. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7614. {
  7615. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7616. res->ResponseCode = FAILED_DIN70121;
  7617. res->EVSEProcessing = Finished_DIN70121;
  7618. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7619. // errn = -1;
  7620. }
  7621. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7622. {
  7623. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7624. res->ResponseCode = FAILED_DIN70121;
  7625. res->EVSEProcessing = Finished_DIN70121;
  7626. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7627. errn = -1;
  7628. }
  7629. //Detect for CP State should be 9V (State B)
  7630. #if CP_PROTECTION_MECHANISM == ENABLE
  7631. if (sys->CpState != 3) //State B1, B2
  7632. {
  7633. res->ResponseCode = FAILED_DIN70121;
  7634. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7635. res->EVSEProcessing = Finished_DIN70121;
  7636. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7637. Update_V2G_Flow_Status(Other_Fault);
  7638. errn = -1;
  7639. sprintf(buf_log_evcomm,
  7640. "[Proc_din_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7641. sys->CpState,
  7642. sys->CpVoltage);
  7643. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7644. }
  7645. #endif
  7646. //Check for Permission from CSU
  7647. if (ShmInternalComm->ChargingPermission == TRUE)
  7648. {
  7649. res->EVSEProcessing = Finished_DIN70121;
  7650. }
  7651. //Check for Permission Off
  7652. if (ShmInternalComm->ChargingPermission == FALSE)
  7653. {
  7654. SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ChargeParameterDiscoveryRes]Permission OFF");
  7655. res->ResponseCode = FAILED_DIN70121;
  7656. res->EVSEProcessing = Finished_DIN70121;
  7657. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7658. // errn = -1;
  7659. }
  7660. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7661. #if PARAMETER_NORMAL_MODE == ENABLE
  7662. SHM_Read_din_ChargeParameterDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  7663. #else
  7664. Sudo_Parameter_din_ChargeParameterDiscoveryRes();
  7665. #endif
  7666. //STEP 4: ============ Encode and Send Response Message ===========
  7667. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  7668. {
  7669. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7670. errn = -1;
  7671. }
  7672. //STPE 5: ============ Update Flags ============
  7673. return errn;
  7674. }
  7675. /*===========================================================================
  7676. FUNCTION: Proc_iso1_ChargeParameterDiscoveryRes
  7677. DESCRIPTION:
  7678. PRE-CONDITION:
  7679. INPUT:
  7680. OUTPUT:
  7681. GLOBAL VARIABLES:
  7682. =============================================================================*/
  7683. int Proc_iso1_ChargeParameterDiscoveryRes(int AcceptFd)
  7684. {
  7685. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7686. //if it is not the same, the packet should be ignored.
  7687. //STEP 1: ============ Initialize ============
  7688. int errn = 0;
  7689. bitstream_t v2g_tx_stream;
  7690. struct ChargeParameterDiscoveryResponse_ISO15118_2014 *res;
  7691. struct ChargeParameterDiscoveryRequest_ISO15118_2014 *req;
  7692. struct DC_EVSEChargeParameterType_ISO15118_2014 *dc_para;
  7693. struct AC_EVSEChargeParameterType_ISO15118_2014 *ac_para;
  7694. struct ChargingInfoData *sys;
  7695. size_t pos = 0;
  7696. v2g_tx_stream.pos = &pos;
  7697. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7698. v2g_tx_stream.data = V2GTP_Tx_buf;
  7699. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse;
  7700. req = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest;
  7701. dc_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  7702. ac_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.AC_EVSEChargeParameter;
  7703. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7704. res->ResponseCode = OK_ISO15118_2014;
  7705. /*+++ 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery +++*/
  7706. res->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7707. /*--- 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery ---*/
  7708. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; //1
  7709. ac_para->AC_EVSEStatus.RCD = ShmInternalComm->AC_RcdStatus; //0:no error, 1:error
  7710. ac_para->AC_EVSEStatus.NotificationMaxDelay = 0; //unit: 1s
  7711. ac_para->AC_EVSEStatus.EVSENotification = ShmInternalComm->AC_EVSENotification; //0:none, 1:StopCharging, 2:RenNgotiation
  7712. //[HEADER] Check Req SessionID
  7713. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7714. {
  7715. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7716. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  7717. errn = -1;
  7718. }
  7719. //Check for SequenceError
  7720. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7721. {
  7722. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7723. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  7724. errn = -1;
  7725. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7726. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7727. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7728. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7729. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7730. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7731. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7732. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7733. }
  7734. /* printf("req->RequestedEnergyTransferMode=%d\n",req->RequestedEnergyTransferMode);
  7735. printf("req->AC_EVChargeParameter.DepartureTime=%d\n",req->AC_EVChargeParameter.DepartureTime);
  7736. printf("req->AC_EVChargeParameter.EAmount.Multiplier=%d\n",req->AC_EVChargeParameter.EAmount.Multiplier);
  7737. printf("req->AC_EVChargeParameter.EAmount.Unit=%d\n",req->AC_EVChargeParameter.EAmount.Unit);
  7738. printf("req->AC_EVChargeParameter.EAmount.Value=%d\n",req->AC_EVChargeParameter.EAmount.Value);
  7739. printf("req->AC_EVChargeParameter.EVMaxVoltage.Multiplier=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Multiplier);
  7740. printf("req->AC_EVChargeParameter.EVMaxVoltage.Unit=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Unit);
  7741. printf("req->AC_EVChargeParameter.EVMaxVoltage.Value=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Value);
  7742. printf("req->AC_EVChargeParameter.EVMaxCurrent.Multiplier=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Multiplier);
  7743. printf("req->AC_EVChargeParameter.EVMaxCurrent.Unit=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Unit);
  7744. printf("req->AC_EVChargeParameter.EVMaxCurrent.Value=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Value);
  7745. printf("req->AC_EVChargeParameter.EVMinCurrent.Multiplier=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Multiplier);
  7746. printf("req->AC_EVChargeParameter.EVMinCurrent.Unit=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Unit);
  7747. printf("req->AC_EVChargeParameter.EVMinCurrent.Value=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Value);*/
  7748. if(req->RequestedEnergyTransferMode <= 1)//0 for 1P, 1 for 3P
  7749. {
  7750. //AC parameters
  7751. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]AC charging");
  7752. //AC
  7753. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSENominalVoltage, (int) (sys->AC_EVSENominalVoltage * 10), V_ISO15118_2014);
  7754. //SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7755. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (ShmInternalComm->AC_EVSEMaxCurrent * 10), A_ISO15118_2014);
  7756. }
  7757. else
  7758. {
  7759. //DC parameters
  7760. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]DC charging");
  7761. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  7762. /*+++ 20200808, vern, should check the voltage and current to see if the range of battery parameter is accepted by charger ---*/
  7763. if ((sys->EvBatteryMaxCurrent < 0) ||(sys->EvBatteryMaxVoltage<150))
  7764. {
  7765. sprintf(buf_log_evcomm,
  7766. "[ERROR]EvBatteryMaxCurrent/MaxVolatge is mismatch(current=%.02f, voltage=%.02f) => End_Process",
  7767. sys->EvBatteryMaxCurrent,sys->EvBatteryMaxVoltage);
  7768. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7769. res->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  7770. res->EVSEProcessing = Finished_ISO15118_2014;
  7771. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7772. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7773. errn = -1;
  7774. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7775. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  7776. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7777. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7778. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7779. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7780. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7781. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  7782. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7783. }
  7784. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  7785. //DC
  7786. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  7787. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7788. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  7789. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumVoltageLimit, 1500, V_ISO15118_2014); //150V
  7790. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumCurrentLimit, MIN_SUPPORTED_CURRENT*10, A_ISO15118_2014); //1A
  7791. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSECurrentRegulationTolerance, 10, A_ISO15118_2014); //1A
  7792. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEPeakCurrentRipple, 2, A_ISO15118_2014); //0.2A
  7793. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEEnergyToBeDelivered, 0, Wh_ISO15118_2014); //optional
  7794. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  7795. if (sys->EvBatteryMaxVoltage <= 500)
  7796. {
  7797. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  7798. }
  7799. #endif
  7800. //Check for CSU command of "Stop by EVSE"
  7801. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7802. {
  7803. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7804. res->ResponseCode = FAILED_ISO15118_2014;
  7805. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7806. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7807. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7808. // errn = -1;
  7809. }
  7810. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7811. {
  7812. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7813. res->ResponseCode = FAILED_ISO15118_2014;
  7814. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7815. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7816. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7817. errn = -1;
  7818. }
  7819. //Detect for CP State should be 9V (State B)
  7820. #if CP_PROTECTION_MECHANISM == ENABLE
  7821. if (sys->CpState != 3) //State B1, B2
  7822. {
  7823. res->ResponseCode = FAILED_ISO15118_2014;
  7824. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7825. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7826. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7827. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7828. Update_V2G_Flow_Status(Other_Fault);
  7829. errn = -1;
  7830. sprintf(buf_log_evcomm,
  7831. "[Proc_iso1_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7832. sys->CpState,
  7833. sys->CpVoltage);
  7834. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7835. }
  7836. #endif
  7837. }
  7838. //for test with Tesla Model 3, 10A
  7839. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_ISO15118_2014); //10A, for testing with Tesla Model 3
  7840. //Check for EnergyTransferMode
  7841. if (req->RequestedEnergyTransferMode != ShmCcsData->EnergyTransferMode) //[CAUTION] Their table should be kept as the same.
  7842. {
  7843. sprintf(buf_log_evcomm,
  7844. "[ERROR]Unmatched RequestedEnergyTransferMode(%d,%d)",
  7845. req->RequestedEnergyTransferMode,
  7846. ShmCcsData->EnergyTransferMode);
  7847. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7848. res->ResponseCode = FAILED_WrongEnergyTransferMode_ISO15118_2014;
  7849. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7850. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7851. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7852. errn = -1;
  7853. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7854. Update_V2G_Flow_Status(Other_Fault);
  7855. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7856. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  7857. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7858. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7859. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7860. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7861. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7862. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  7863. }
  7864. //Check for Permission from CSU
  7865. if(ShmInternalComm->ChargingPermission == TRUE)
  7866. {
  7867. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7868. }
  7869. //Check for Permission Off
  7870. if (ShmInternalComm->ChargingPermission == FALSE)
  7871. {
  7872. SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ChargeParameterDiscoveryRes]Permission OFF");
  7873. res->ResponseCode = FAILED_ISO15118_2014;
  7874. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7875. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7876. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7877. // errn = -1;
  7878. }
  7879. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7880. #if PARAMETER_NORMAL_MODE == ENABLE
  7881. SHM_Read_iso1_ChargeParameterDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7882. #else
  7883. Sudo_Parameter_iso1_ChargeParameterDiscoveryRes();
  7884. #endif
  7885. //STEP 4: ============ Encode and Send Response Message ===========
  7886. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7887. {
  7888. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7889. errn = -1;
  7890. }
  7891. //STPE 5: ============ Update Flags ============
  7892. return errn;
  7893. }
  7894. /*===========================================================================
  7895. FUNCTION: Proc_din_ChargeParameterDiscoveryReq
  7896. DESCRIPTION:
  7897. PRE-CONDITION:
  7898. INPUT:
  7899. OUTPUT:
  7900. GLOBAL VARIABLES:
  7901. =============================================================================*/
  7902. int Proc_din_ChargeParameterDiscoveryReq(int AcceptFd)
  7903. {
  7904. int errn = 0;
  7905. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7906. //ftime(&SeqStartTime);
  7907. //Print the decoded XML Document
  7908. PRINT_XML_DOC_DIN_ChargeParameterDiscoveryReq(&ccs_exi_doc_DIN);
  7909. //Save into Share Memory
  7910. SHM_Save_din_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7911. //Check for EV Error Code
  7912. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7913. errn = Proc_din_ChargeParameterDiscoveryRes(AcceptFd);
  7914. //ftime(&SeqEndTime);
  7915. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7916. if ( errn == 0)
  7917. {
  7918. //send response successfully.
  7919. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ChargeParameterDiscoveryRes");
  7920. }
  7921. else
  7922. {
  7923. sprintf(buf_log_evcomm,
  7924. "[Error][DIN][ChargeParameterDiscoveryRes]%d (DEC)",
  7925. errn);
  7926. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7927. }
  7928. return errn;
  7929. }
  7930. /*===========================================================================
  7931. FUNCTION: Proc_iso1_ChargeParameterDiscoveryReq
  7932. DESCRIPTION:
  7933. PRE-CONDITION:
  7934. INPUT:
  7935. OUTPUT:
  7936. GLOBAL VARIABLES:
  7937. =============================================================================*/
  7938. int Proc_iso1_ChargeParameterDiscoveryReq(int AcceptFd)
  7939. {
  7940. int errn = 0;
  7941. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7942. //ftime(&SeqStartTime);
  7943. //Print the decoded XML Document
  7944. PRINT_XML_DOC_ISO1_ChargeParameterDiscoveryReq(&ccs_exi_doc_ISO1);
  7945. //Save into Share Memory
  7946. SHM_Save_iso1_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7947. //Check for EV Error Code
  7948. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7949. errn = Proc_iso1_ChargeParameterDiscoveryRes(AcceptFd);
  7950. //ftime(&SeqEndTime);
  7951. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7952. if (errn == 0)
  7953. {
  7954. //send response successfully.
  7955. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ChargeParameterDiscoveryRes");
  7956. }
  7957. else
  7958. {
  7959. sprintf(buf_log_evcomm,
  7960. "[Error][ISO1][ChargeParameterDiscoveryRes]%d (DEC)",
  7961. errn);
  7962. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  7963. }
  7964. return errn;
  7965. }
  7966. /*===========================================================================
  7967. FUNCTION: SHM_Init_din_CableCheckRes
  7968. DESCRIPTION:
  7969. PRE-CONDITION:
  7970. INPUT:
  7971. 1. shm_ccs
  7972. OUTPUT:
  7973. 1. shm_ccs
  7974. GLOBAL VARIABLES:
  7975. =============================================================================*/
  7976. void SHM_Init_din_CableCheckRes(struct CcsData *shm_ccs)
  7977. {
  7978. struct CableCheckResponse_DIN70121 *in;
  7979. in = &shm_ccs->V2GMessage_DIN70121.CableCheckResponse;
  7980. //----- [BODY (1/3)] ResponseCode -----
  7981. in->ResponseCode = dinresponseCodeType_OK;
  7982. //----- [BODY (2/3)] EVSEProcessing -----
  7983. //in->EVSEProcessing = dinEVSEProcessingType_Finished; //for test
  7984. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //default
  7985. // dinEVSEProcessingType_Finished = 0,
  7986. // dinEVSEProcessingType_Ongoing = 1
  7987. //----- [BODY (3/3)] DC_EVSEStatus -----
  7988. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7989. in->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0 (default)
  7990. // dinisolationLevelType_Invalid = 0,
  7991. // dinisolationLevelType_Valid = 1, (default)
  7992. // dinisolationLevelType_Warning = 2,
  7993. // dinisolationLevelType_Fault = 3
  7994. }
  7995. /*===========================================================================
  7996. FUNCTION: Sudo_Parameter_din_CableCheckRes
  7997. DESCRIPTION:
  7998. PRE-CONDITION:
  7999. INPUT:
  8000. OUTPUT:
  8001. GLOBAL VARIABLES:
  8002. =============================================================================*/
  8003. void Sudo_Parameter_din_CableCheckRes()
  8004. {
  8005. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8006. init_dinCableCheckResType(&ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes);
  8007. ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  8008. //----- [BODY (1/3)] ResponseCode -----
  8009. struct dinCableCheckResType *res;
  8010. res = &ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes;
  8011. res->ResponseCode = dinresponseCodeType_OK;
  8012. //----- [BODY (2/3)] EVSEProcessing -----
  8013. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  8014. // dinEVSEProcessingType_Finished = 0,
  8015. // dinEVSEProcessingType_Ongoing = 1
  8016. //----- [BODY (3/3)] DC_EVSEStatus -----
  8017. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8018. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8019. // dinisolationLevelType_Invalid = 0,
  8020. // dinisolationLevelType_Valid = 1,
  8021. // dinisolationLevelType_Warning = 2,
  8022. // dinisolationLevelType_Fault = 3
  8023. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8024. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8025. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8026. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8027. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8028. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8029. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8030. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8031. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8032. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8033. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8034. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8035. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8036. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8037. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8038. // dinEVSENotificationType_None = 0,
  8039. // dinEVSENotificationType_StopCharging = 1,
  8040. // dinEVSENotificationType_ReNegotiation = 2
  8041. }
  8042. /*===========================================================================
  8043. FUNCTION: Sudo_Parameter_iso1_CableCheckRes
  8044. DESCRIPTION:
  8045. PRE-CONDITION:
  8046. INPUT:
  8047. OUTPUT:
  8048. GLOBAL VARIABLES:
  8049. =============================================================================*/
  8050. void Sudo_Parameter_iso1_CableCheckRes()
  8051. {
  8052. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8053. init_iso1CableCheckResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes);
  8054. ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  8055. //----- [BODY (1/3)] ResponseCode -----
  8056. struct iso1CableCheckResType *res;
  8057. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes;
  8058. res->ResponseCode = iso1responseCodeType_OK;
  8059. //----- [BODY (2/3)] EVSEProcessing -----
  8060. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  8061. //iso1EVSEProcessingType_Finished = 0,
  8062. //iso1EVSEProcessingType_Ongoing = 1,
  8063. //iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction = 2
  8064. //----- [BODY (3/3)] DC_EVSEStatus -----
  8065. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8066. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8067. //iso1isolationLevelType_Invalid = 0,
  8068. //iso1isolationLevelType_Valid = 1,
  8069. //iso1isolationLevelType_Warning = 2,
  8070. //iso1isolationLevelType_Fault = 3,
  8071. //iso1isolationLevelType_No_IMD = 4
  8072. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8073. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8074. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8075. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8076. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8077. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8078. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8079. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8080. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8081. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8082. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8083. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8084. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8085. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8086. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8087. //iso1EVSENotificationType_None = 0,
  8088. //iso1EVSENotificationType_StopCharging = 1,
  8089. //iso1EVSENotificationType_ReNegotiation = 2
  8090. }
  8091. /*===========================================================================
  8092. FUNCTION: Proc_din_CableCheckRes
  8093. DESCRIPTION:
  8094. PRE-CONDITION:
  8095. INPUT:
  8096. OUTPUT:
  8097. GLOBAL VARIABLES:
  8098. =============================================================================*/
  8099. int Proc_din_CableCheckRes(int AcceptFd)
  8100. {
  8101. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8102. //if it is not the same, the packet should be ignored.
  8103. //STEP 1: ============ Initialize ============
  8104. int i = 0;
  8105. int errn = 0;
  8106. bitstream_t v2g_tx_stream;
  8107. static struct CableCheckResponse_DIN70121 *cab;
  8108. static struct ChargingInfoData *sys;
  8109. size_t pos = 0;
  8110. v2g_tx_stream.pos = &pos;
  8111. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8112. v2g_tx_stream.data = V2GTP_Tx_buf;
  8113. cab = &ShmCcsData->V2GMessage_DIN70121.CableCheckResponse;
  8114. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8115. cab->ResponseCode = OK_DIN70121;
  8116. cab->cnt++;
  8117. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  8118. sys->CpState,
  8119. sys->CpVoltage,
  8120. sys->PresentChargingVoltage,
  8121. sys->IsolationStatus,
  8122. cab->EVSEProcessing);
  8123. //[HEADER] Check Req SessionID
  8124. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8125. {
  8126. cab->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8127. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8128. errn = -1;
  8129. }
  8130. //Check for SequenceError
  8131. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8132. {
  8133. cab->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8134. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8135. errn = -1;
  8136. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8137. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8138. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8139. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8140. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8141. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8142. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8143. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8144. }
  8145. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8146. if (sys->IsolationStatus == GFD_Invalid) //0: on going
  8147. {
  8148. //For PSU
  8149. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  8150. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  8151. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8152. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive; //4
  8153. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  8154. }
  8155. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2: warning
  8156. {
  8157. //For PSU
  8158. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8159. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8160. if (sys->PresentChargingVoltage < 60) // < 60V
  8161. {
  8162. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  8163. sprintf(buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  8164. sys->PresentChargingVoltage,
  8165. sys->IsolationStatus);
  8166. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8167. //IsolationStatus
  8168. if (sys->IsolationStatus == GFD_Valid)
  8169. {
  8170. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8171. }
  8172. else if (sys->IsolationStatus == GFD_Warning)
  8173. {
  8174. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning;
  8175. }
  8176. else
  8177. {
  8178. sprintf(buf_log_evcomm,
  8179. "[WARNING]unexpected IsolationStatus(%d)",
  8180. sys->IsolationStatus);
  8181. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8182. }
  8183. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8184. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8185. }
  8186. else
  8187. {
  8188. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8189. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8190. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  8191. }
  8192. }
  8193. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8194. {
  8195. //For PSU
  8196. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8197. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8198. cab->ResponseCode = FAILED_DIN70121;
  8199. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8200. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  8201. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8202. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]IsolationStatus = 3 (fault)");
  8203. errn = -1;
  8204. }
  8205. else
  8206. {
  8207. //For PSU
  8208. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8209. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8210. cab->ResponseCode = FAILED_DIN70121;
  8211. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8212. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  8213. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8214. sprintf(buf_log_evcomm,
  8215. "[Proc_din_CableCheckRes]Undefined Isolation Status(%d)",
  8216. sys->IsolationStatus);
  8217. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8218. }
  8219. //Check for CSU command of "Stop by EVSE"
  8220. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8221. {
  8222. cab->ResponseCode = FAILED_DIN70121;
  8223. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8224. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8225. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8226. // errn = -1;
  8227. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]EVSE_Shutdown");
  8228. }
  8229. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8230. {
  8231. cab->ResponseCode = FAILED_DIN70121;
  8232. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  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_EmergencyShutdown");
  8237. }
  8238. else if (ShmInternalComm->ChargingPermission == FALSE)
  8239. {
  8240. cab->ResponseCode = FAILED_DIN70121;
  8241. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8242. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8243. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  8244. // errn = -1;
  8245. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_CableCheckRes]ChargingPermission = FALSE");
  8246. }
  8247. else
  8248. {
  8249. //null
  8250. }
  8251. //Response to CP Error
  8252. #if CP_PROTECTION_MECHANISM == ENABLE
  8253. //#if 1
  8254. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  8255. {
  8256. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8257. {
  8258. cab->ResponseCode = FAILED_DIN70121;
  8259. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8260. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8261. Update_V2G_Flow_Status(Other_Fault);
  8262. errn = -1;
  8263. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8264. //CCS_SECC_CP_State_Error (023889)
  8265. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8266. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8267. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8268. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8269. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8270. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8271. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8272. sprintf(buf_log_evcomm,
  8273. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  8274. sys->CpState,
  8275. sys->CpVoltage,
  8276. cab->cnt
  8277. );
  8278. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8279. //cab->cnt = 0;
  8280. }
  8281. }
  8282. #endif
  8283. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8284. #if PARAMETER_NORMAL_MODE == ENABLE
  8285. SHM_Read_din_CableCheckRes(&ccs_exi_doc_DIN, ShmCcsData);
  8286. #else
  8287. Sudo_Parameter_din_CableCheckRes();
  8288. #endif
  8289. //STEP 4: ============ Encode and Send Response Message ===========
  8290. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8291. {
  8292. errn = -1;
  8293. }
  8294. //STEP 5: ============ Update Flags ===========
  8295. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  8296. return errn;
  8297. }
  8298. /*===========================================================================
  8299. FUNCTION: Proc_iso1_CableCheckRes
  8300. DESCRIPTION:
  8301. PRE-CONDITION:
  8302. INPUT:
  8303. OUTPUT:
  8304. GLOBAL VARIABLES:
  8305. =============================================================================*/
  8306. int Proc_iso1_CableCheckRes(int AcceptFd)
  8307. {
  8308. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8309. //if it is not the same, the packet should be ignored.
  8310. //STEP 1: ============ Initialize ============
  8311. int i = 0;
  8312. int errn = 0;
  8313. bitstream_t v2g_tx_stream;
  8314. static struct CableCheckResponse_ISO15118_2014 *cab;
  8315. static struct ChargingInfoData *sys;
  8316. size_t pos = 0;
  8317. v2g_tx_stream.pos = &pos;
  8318. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8319. v2g_tx_stream.data = V2GTP_Tx_buf;
  8320. cab = &ShmCcsData->V2GMessage_ISO15118_2014.CableCheckResponse;
  8321. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8322. cab->ResponseCode = OK_ISO15118_2014;
  8323. cab->cnt++;
  8324. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  8325. sys->CpState,
  8326. sys->CpVoltage,
  8327. sys->PresentChargingVoltage,
  8328. sys->IsolationStatus,
  8329. cab->EVSEProcessing);
  8330. //[HEADER] Check Req SessionID
  8331. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8332. {
  8333. cab->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8334. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8335. errn = -1;
  8336. }
  8337. //Check for SequenceError
  8338. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8339. {
  8340. cab->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8341. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8342. errn = -1;
  8343. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8344. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8345. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8346. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8347. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8348. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8349. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8350. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8351. }
  8352. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8353. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  8354. {
  8355. //For PSU
  8356. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  8357. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  8358. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8359. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8360. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  8361. }
  8362. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2:waring
  8363. {
  8364. //For PSU
  8365. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8366. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8367. if (sys->PresentChargingVoltage < 60) // < 60V
  8368. {
  8369. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  8370. sprintf(buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  8371. sys->PresentChargingVoltage,
  8372. sys->IsolationStatus);
  8373. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8374. //IsolationStatus
  8375. if (sys->IsolationStatus == GFD_Valid)
  8376. {
  8377. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8378. }
  8379. else if (sys->IsolationStatus == GFD_Warning)
  8380. {
  8381. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning;
  8382. }
  8383. else
  8384. {
  8385. sprintf(buf_log_evcomm,
  8386. "[WARNING]unexpected IsolationStatus(%d)",
  8387. sys->IsolationStatus);
  8388. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8389. }
  8390. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8391. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8392. }
  8393. else
  8394. {
  8395. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8396. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  8397. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  8398. }
  8399. }
  8400. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8401. {
  8402. //For PSU
  8403. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8404. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8405. cab->ResponseCode = FAILED_ISO15118_2014;
  8406. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8407. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  8408. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8409. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]IsolationStatus = 3 (fault)");
  8410. errn = -1;
  8411. }
  8412. //else if (sys->IsolationStatus == GFD_No_IMD){} //only for ISO15118
  8413. else
  8414. {
  8415. //For PSU
  8416. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  8417. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  8418. cab->ResponseCode = FAILED_ISO15118_2014;
  8419. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8420. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  8421. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8422. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]Undefined Isolation Status.");
  8423. }
  8424. //Check for CSU command of "Stop by EVSE"
  8425. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8426. {
  8427. cab->ResponseCode = FAILED_ISO15118_2014;
  8428. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8429. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8430. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8431. // errn = -1;
  8432. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]EVSE_Shutdown");
  8433. }
  8434. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8435. {
  8436. cab->ResponseCode = FAILED_ISO15118_2014;
  8437. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  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_EmergencyShutdown");
  8442. }
  8443. else if (ShmInternalComm->ChargingPermission == FALSE)
  8444. {
  8445. cab->ResponseCode = FAILED_ISO15118_2014;
  8446. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8447. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8448. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  8449. // errn = -1;
  8450. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_CableCheckRes]ChargingPermission = FALSE");
  8451. }
  8452. else
  8453. {
  8454. //null
  8455. }
  8456. //Response to CP Error
  8457. #if CP_PROTECTION_MECHANISM == ENABLE
  8458. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  8459. {
  8460. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8461. {
  8462. cab->ResponseCode = FAILED_ISO15118_2014;
  8463. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8464. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8465. Update_V2G_Flow_Status(Other_Fault);
  8466. errn = -1;
  8467. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8468. //CCS_SECC_CP_State_Error (023889)
  8469. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8470. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8471. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8472. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8473. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8474. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8475. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8476. sprintf(buf_log_evcomm,
  8477. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  8478. sys->CpState,
  8479. sys->CpVoltage,
  8480. cab->cnt
  8481. );
  8482. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8483. //cab->cnt = 0;
  8484. }
  8485. }
  8486. #endif
  8487. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8488. #if PARAMETER_NORMAL_MODE == ENABLE
  8489. SHM_Read_iso1_CableCheckRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8490. #else
  8491. Sudo_Parameter_iso1_CableCheckRes();
  8492. #endif
  8493. //STEP 4: ============ Encode and Send Response Message ===========
  8494. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8495. {
  8496. errn = -1;
  8497. }
  8498. //STEP 5: ============ Update Flags ===========
  8499. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  8500. return errn;
  8501. }
  8502. /*===========================================================================
  8503. FUNCTION: Proc_din_CableCheckReq
  8504. DESCRIPTION:
  8505. PRE-CONDITION:
  8506. INPUT:
  8507. OUTPUT:
  8508. GLOBAL VARIABLES:
  8509. =============================================================================*/
  8510. int Proc_din_CableCheckReq(int AcceptFd)
  8511. {
  8512. int errn = 0;
  8513. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckReq] Got CableCheckReq\n");
  8514. //Print the decoded XML Document
  8515. PRINT_XML_DOC_DIN_CableCheckReq(&ccs_exi_doc_DIN);
  8516. //Save into Share Memory
  8517. SHM_Save_din_CableCheckReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8518. //Check for EV Error Code
  8519. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CableCheckRequest.DC_EVStatus.EVErrorCode);
  8520. errn = Proc_din_CableCheckRes(AcceptFd);
  8521. if (errn == 0)
  8522. {
  8523. //send response successfully.
  8524. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]CableCheckRes");
  8525. }
  8526. else
  8527. {
  8528. sprintf(buf_log_evcomm,
  8529. "[Error][SeccComm][Proc_din_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  8530. errn);
  8531. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8532. }
  8533. return errn;
  8534. }
  8535. /*===========================================================================
  8536. FUNCTION: Proc_iso1_CableCheckReq
  8537. DESCRIPTION:
  8538. PRE-CONDITION:
  8539. INPUT:
  8540. OUTPUT:
  8541. GLOBAL VARIABLES:
  8542. =============================================================================*/
  8543. int Proc_iso1_CableCheckReq(int AcceptFd)
  8544. {
  8545. int errn = 0;
  8546. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckReq] Got CableCheckReq");
  8547. //Print the decoded XML Document
  8548. PRINT_XML_DOC_ISO1_CableCheckReq(&ccs_exi_doc_ISO1);
  8549. //Save into Share Memory
  8550. SHM_Save_iso1_CableCheckReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8551. //Check for EV Error Code
  8552. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CableCheckRequest.DC_EVStatus.EVErrorCode);
  8553. errn = Proc_iso1_CableCheckRes(AcceptFd);
  8554. if (errn == 0)
  8555. {
  8556. //send response successfully.
  8557. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]CableCheckRes");
  8558. }
  8559. else
  8560. {
  8561. sprintf(buf_log_evcomm,
  8562. "[Error][SeccComm][Proc_iso1_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  8563. errn);
  8564. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8565. }
  8566. return errn;
  8567. }
  8568. /*===========================================================================
  8569. FUNCTION: SHM_Init_din_PreChargeRes
  8570. DESCRIPTION:
  8571. PRE-CONDITION:
  8572. INPUT:
  8573. 1. shm_ccs
  8574. OUTPUT:
  8575. 1. shm_ccs
  8576. GLOBAL VARIABLES:
  8577. =============================================================================*/
  8578. void SHM_Init_din_PreChargeRes(struct CcsData *shm_ccs)
  8579. {
  8580. struct PreChargeResponse_DIN70121 *in;
  8581. in = &shm_ccs->V2GMessage_DIN70121.PreChargeResponse;
  8582. //----- [BODY (1/3)] ResponseCode -----
  8583. in->ResponseCode = dinresponseCodeType_OK;
  8584. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8585. short value = 0; int multiplier = 0; unsigned char unit = 0;
  8586. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for Test
  8587. value = 0; multiplier = 0; unit = V_DIN70121; //waiting for CsuComm to update V to fit EV Target
  8588. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  8589. //----- [BODY (3/3)] DC_EVSEStatus -----
  8590. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8591. }
  8592. /*===========================================================================
  8593. FUNCTION: Sudo_Parameter_din_PreChargeRes
  8594. DESCRIPTION:
  8595. PRE-CONDITION:
  8596. INPUT:
  8597. OUTPUT:
  8598. GLOBAL VARIABLES:
  8599. =============================================================================*/
  8600. void Sudo_Parameter_din_PreChargeRes()
  8601. {
  8602. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8603. init_dinPreChargeResType(&ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes);
  8604. ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  8605. //----- [BODY (1/3)] ResponseCode -----
  8606. struct dinPreChargeResType *res;
  8607. res = &ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes;
  8608. res->ResponseCode = dinresponseCodeType_OK;
  8609. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8610. res->EVSEPresentVoltage.Value = 3820;
  8611. res->EVSEPresentVoltage.Multiplier = -1;
  8612. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8613. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  8614. // dinunitSymbolType_h = 0,
  8615. // dinunitSymbolType_m = 1,
  8616. // dinunitSymbolType_s = 2,
  8617. // dinunitSymbolType_A = 3,
  8618. // dinunitSymbolType_Ah = 4,
  8619. // dinunitSymbolType_V = 5,
  8620. // dinunitSymbolType_VA = 6,
  8621. // dinunitSymbolType_W = 7,
  8622. // dinunitSymbolType_W_s = 8,
  8623. // dinunitSymbolType_Wh = 9
  8624. //----- [BODY (3/3)] DC_EVSEStatus -----
  8625. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8626. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8627. // dinisolationLevelType_Invalid = 0,
  8628. // dinisolationLevelType_Valid = 1,
  8629. // dinisolationLevelType_Warning = 2,
  8630. // dinisolationLevelType_Fault = 3
  8631. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8632. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8633. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8634. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8635. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8636. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8637. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8638. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8639. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8640. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8641. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8642. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8643. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8644. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8645. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8646. // dinEVSENotificationType_None = 0,
  8647. // dinEVSENotificationType_StopCharging = 1,
  8648. // dinEVSENotificationType_ReNegotiation = 2
  8649. }
  8650. /*===========================================================================
  8651. FUNCTION: Sudo_Parameter_iso1_PreChargeRes
  8652. DESCRIPTION:
  8653. PRE-CONDITION:
  8654. INPUT:
  8655. OUTPUT:
  8656. GLOBAL VARIABLES:
  8657. =============================================================================*/
  8658. void Sudo_Parameter_iso1_PreChargeRes()
  8659. {
  8660. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8661. init_iso1PreChargeResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes);
  8662. ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  8663. //----- [BODY (1/3)] ResponseCode -----
  8664. struct iso1PreChargeResType *res;
  8665. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes;
  8666. res->ResponseCode = iso1responseCodeType_OK;
  8667. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8668. res->EVSEPresentVoltage.Value = 3820;
  8669. res->EVSEPresentVoltage.Multiplier = -1;
  8670. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8671. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  8672. //iso1unitSymbolType_h = 0,
  8673. //iso1unitSymbolType_m = 1,
  8674. //iso1unitSymbolType_s = 2,
  8675. //iso1unitSymbolType_A = 3,
  8676. //iso1unitSymbolType_V = 4,
  8677. //iso1unitSymbolType_W = 5,
  8678. //iso1unitSymbolType_Wh = 6
  8679. //----- [BODY (3/3)] DC_EVSEStatus -----
  8680. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8681. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8682. //iso1isolationLevelType_Invalid = 0,
  8683. //iso1isolationLevelType_Valid = 1,
  8684. //iso1isolationLevelType_Warning = 2,
  8685. //iso1isolationLevelType_Fault = 3,
  8686. //iso1isolationLevelType_No_IMD = 4
  8687. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8688. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8689. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8690. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8691. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8692. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8693. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8694. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8695. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8696. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8697. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8698. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8699. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8700. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8701. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8702. //iso1EVSENotificationType_None = 0,
  8703. //iso1EVSENotificationType_StopCharging = 1,
  8704. //iso1EVSENotificationType_ReNegotiation = 2
  8705. }
  8706. /*===========================================================================
  8707. FUNCTION: Proc_din_PreChargeRes
  8708. DESCRIPTION:
  8709. PRE-CONDITION:
  8710. INPUT:
  8711. OUTPUT:
  8712. GLOBAL VARIABLES:
  8713. =============================================================================*/
  8714. int Proc_din_PreChargeRes(int AcceptFd)
  8715. {
  8716. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8717. //if it is not the same, the packet should be ignored.
  8718. //STEP 1: ============ Initialize ============
  8719. int i = 0;
  8720. int errn = 0;
  8721. bitstream_t v2g_tx_stream;
  8722. static struct PreChargeResponse_DIN70121 *pre;
  8723. static struct ChargingInfoData *sys;
  8724. size_t pos = 0;
  8725. v2g_tx_stream.pos = &pos;
  8726. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8727. v2g_tx_stream.data = V2GTP_Tx_buf;
  8728. pre = &ShmCcsData->V2GMessage_DIN70121.PreChargeResponse;
  8729. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8730. pre->ResponseCode = OK_DIN70121;
  8731. //EVSE Status Code
  8732. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8733. //[HEADER] Check Req SessionID
  8734. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8735. {
  8736. pre->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8737. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8738. errn = -1;
  8739. }
  8740. //Check for SequenceError
  8741. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8742. {
  8743. pre->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8744. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8745. errn = -1;
  8746. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8747. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8748. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8749. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8750. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8751. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8752. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8753. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8754. }
  8755. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8756. SAVE_PhysicalValueType_DIN70121(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  8757. //Isolation Status
  8758. if (sys->IsolationStatus == GFD_Invalid) //0: invalid
  8759. {
  8760. #if 0
  8761. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  8762. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8763. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8764. Update_V2G_Flow_Status(Other_Fault);
  8765. errn = -1;
  8766. sprintf(buf_log_evcomm, "[Error][Proc_din_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8767. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8768. #else
  8769. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8770. #endif
  8771. }
  8772. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8773. {
  8774. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8775. }
  8776. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  8777. {
  8778. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  8779. }
  8780. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8781. {
  8782. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8783. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8784. pre->ResponseCode = FAILED_DIN70121;
  8785. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8786. errn = -1;
  8787. }
  8788. else //GFD_No_IMD or other unexpected status
  8789. {
  8790. pre->ResponseCode = FAILED_DIN70121;
  8791. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8792. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8793. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8794. Update_V2G_Flow_Status(Other_Fault);
  8795. errn = -1;
  8796. sprintf(buf_log_evcomm,
  8797. "[Error][Proc_din_PreChargeRes]IsolationStatus = %d (undefined)",
  8798. sys->IsolationStatus);
  8799. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8800. }
  8801. //Check for CSU command of "Stop by EVSE"
  8802. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8803. {
  8804. //Check for Alarm Code: CCS GFD trip (012235)
  8805. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8806. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8807. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8808. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8809. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8810. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8811. {
  8812. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  8813. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8814. }
  8815. else
  8816. {
  8817. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]EVSE_Shutdown");
  8818. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8819. }
  8820. pre->ResponseCode = FAILED_DIN70121;
  8821. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8822. errn = -1;
  8823. }
  8824. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8825. {
  8826. //Check for Alarm Code: CCS GFD trip (012235)
  8827. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8828. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8829. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8830. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8831. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8832. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8833. {
  8834. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  8835. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8836. }
  8837. else
  8838. {
  8839. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]EVSE_EmergencyShutdown");
  8840. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8841. }
  8842. pre->ResponseCode = FAILED_DIN70121;
  8843. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8844. errn = -1;
  8845. }
  8846. else if (ShmInternalComm->ChargingPermission == FALSE)
  8847. {
  8848. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]ChargingPermission = FALSE");
  8849. pre->ResponseCode = FAILED_DIN70121;
  8850. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8851. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8852. errn = -1;
  8853. }
  8854. else
  8855. {
  8856. //null
  8857. }
  8858. //Response to CP Error
  8859. #if CP_PROTECTION_MECHANISM == ENABLE
  8860. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8861. {
  8862. pre->ResponseCode = FAILED_DIN70121;
  8863. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8864. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8865. Update_V2G_Flow_Status(Other_Fault);
  8866. errn = -1;
  8867. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8868. //CCS_SECC_CP_State_Error (023889)
  8869. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8870. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8871. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8872. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8873. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8874. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8875. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8876. sprintf(buf_log_evcomm,
  8877. "[Error][Proc_din_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8878. sys->CpState,
  8879. sys->CpVoltage
  8880. );
  8881. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8882. }
  8883. #endif
  8884. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8885. #if PARAMETER_NORMAL_MODE == ENABLE
  8886. SHM_Read_din_PreChargeRes(&ccs_exi_doc_DIN, ShmCcsData);
  8887. #else
  8888. Sudo_Parameter_din_PreChargeRes();
  8889. #endif
  8890. //STEP 4: ============ Encode and Send Response Message ===========
  8891. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8892. {
  8893. SAVE_SYS_LOG_MSG_EVCOMM("[Error][send_encoded_din_V2GTP_Stream]:Tx encoded msg error");
  8894. errn = -1;
  8895. }
  8896. //STEP 5: ============ Update Flags ===========
  8897. return errn;
  8898. }
  8899. /*===========================================================================
  8900. FUNCTION: Proc_iso1_PreChargeRes
  8901. DESCRIPTION:
  8902. PRE-CONDITION:
  8903. INPUT:
  8904. OUTPUT:
  8905. GLOBAL VARIABLES:
  8906. =============================================================================*/
  8907. int Proc_iso1_PreChargeRes(int AcceptFd)
  8908. {
  8909. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8910. //if it is not the same, the packet should be ignored.
  8911. //STEP 1: ============ Initialize ============
  8912. int i = 0;
  8913. int errn = 0;
  8914. bitstream_t v2g_tx_stream;
  8915. static struct PreChargeResponse_ISO15118_2014 *pre;
  8916. static struct ChargingInfoData *sys;
  8917. size_t pos = 0;
  8918. v2g_tx_stream.pos = &pos;
  8919. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8920. v2g_tx_stream.data = V2GTP_Tx_buf;
  8921. pre = &ShmCcsData->V2GMessage_ISO15118_2014.PreChargeResponse;
  8922. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8923. pre->ResponseCode = OK_ISO15118_2014;
  8924. //EVSE Status Code
  8925. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8926. //[HEADER] Check Req SessionID
  8927. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8928. {
  8929. pre->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8930. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  8931. errn = -1;
  8932. }
  8933. //Check for SequenceError
  8934. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8935. {
  8936. pre->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8937. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  8938. errn = -1;
  8939. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8940. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8941. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8942. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8943. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8944. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8945. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8946. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8947. }
  8948. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8949. SAVE_PhysicalValueType_ISO15118_2014(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  8950. //Isolation Status
  8951. if (sys->IsolationStatus == GFD_Invalid) //0: invalid(on going)
  8952. {
  8953. #if 0
  8954. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  8955. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8956. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8957. // Update_V2G_Flow_Status(Other_Fault);
  8958. // errn = -1;
  8959. sprintf(buf_log_evcomm, "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8960. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8961. #else
  8962. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8963. #endif
  8964. }
  8965. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8966. {
  8967. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8968. }
  8969. else if (sys->IsolationStatus == GFD_Warning) //2: waring
  8970. {
  8971. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //1
  8972. }
  8973. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8974. {
  8975. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8976. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8977. pre->ResponseCode = FAILED_ISO15118_2014;
  8978. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8979. errn = -1;
  8980. }
  8981. else
  8982. {
  8983. pre->ResponseCode = FAILED_ISO15118_2014;
  8984. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8985. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8986. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8987. Update_V2G_Flow_Status(Other_Fault);
  8988. errn = -1;
  8989. sprintf(buf_log_evcomm,
  8990. "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d (undefined)",
  8991. sys->IsolationStatus);
  8992. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  8993. }
  8994. //Check for CSU command of "Stop by EVSE"
  8995. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8996. {
  8997. //Check for Alarm Code: CCS GFD trip (012235)
  8998. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8999. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9000. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9001. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9002. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9003. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9004. {
  9005. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  9006. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9007. }
  9008. else
  9009. {
  9010. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]EVSE_Shutdown");
  9011. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9012. }
  9013. pre->ResponseCode = FAILED_ISO15118_2014;
  9014. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9015. // errn = -1;
  9016. }
  9017. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9018. {
  9019. //Check for Alarm Code: CCS GFD trip (012235)
  9020. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9021. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9022. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9023. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9024. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9025. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9026. {
  9027. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9028. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9029. }
  9030. else
  9031. {
  9032. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]EVSE_EmergencyShutdown");
  9033. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9034. }
  9035. pre->ResponseCode = FAILED_ISO15118_2014;
  9036. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9037. errn = -1;
  9038. }
  9039. else if (ShmInternalComm->ChargingPermission == FALSE)
  9040. {
  9041. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]ChargingPermission = FALSE");
  9042. pre->ResponseCode = FAILED_ISO15118_2014;
  9043. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9044. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9045. // errn = -1;
  9046. }
  9047. else
  9048. {
  9049. //null
  9050. }
  9051. //Response to CP Error
  9052. #if CP_PROTECTION_MECHANISM == ENABLE
  9053. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9054. {
  9055. pre->ResponseCode = FAILED_ISO15118_2014;
  9056. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9057. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9058. Update_V2G_Flow_Status(Other_Fault);
  9059. errn = -1;
  9060. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9061. //CCS_SECC_CP_State_Error (023889)
  9062. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9063. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9064. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9065. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9066. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9067. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9068. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9069. sprintf(buf_log_evcomm,
  9070. "[Error][Proc_iso1_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  9071. sys->CpState,
  9072. sys->CpVoltage
  9073. );
  9074. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9075. }
  9076. #endif
  9077. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9078. #if PARAMETER_NORMAL_MODE == ENABLE
  9079. SHM_Read_iso1_PreChargeRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9080. #else
  9081. Sudo_Parameter_iso1_PreChargeRes();
  9082. #endif
  9083. //STEP 4: ============ Encode and Send Response Message ===========
  9084. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9085. {
  9086. SAVE_SYS_LOG_MSG_EVCOMM("[Error][send_encoded_iso1_V2GTP_Stream]:Tx encoded msg error");
  9087. errn = -1;
  9088. }
  9089. //STEP 5: ============ Update Flags ===========
  9090. return errn;
  9091. }
  9092. /*===========================================================================
  9093. FUNCTION: Proc_din_PreChargeReq
  9094. DESCRIPTION:
  9095. PRE-CONDITION:
  9096. INPUT:
  9097. OUTPUT:
  9098. GLOBAL VARIABLES:
  9099. =============================================================================*/
  9100. int Proc_din_PreChargeReq(int AcceptFd)
  9101. {
  9102. int errn = 0;
  9103. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PreChargeReq] Got PreChargeReq");
  9104. //Print the decoded XML Document
  9105. PRINT_XML_DOC_DIN_PreChargeReq(&ccs_exi_doc_DIN);
  9106. //Save into Share Memory
  9107. SHM_Save_din_PreChargeReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9108. //Check for EV Error Code
  9109. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PreChargeRequest.DC_EVStatus.EVErrorCode);
  9110. errn = Proc_din_PreChargeRes(AcceptFd);
  9111. if (errn == 0)
  9112. {
  9113. //send response successfully.
  9114. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PreChargeRes");
  9115. }
  9116. else
  9117. {
  9118. sprintf(buf_log_evcomm,
  9119. "[Error][SeccComm][Proc_din_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  9120. errn);
  9121. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9122. }
  9123. return errn;
  9124. }
  9125. /*===========================================================================
  9126. FUNCTION: Proc_iso1_PreChargeReq
  9127. DESCRIPTION:
  9128. PRE-CONDITION:
  9129. INPUT:
  9130. OUTPUT:
  9131. GLOBAL VARIABLES:
  9132. =============================================================================*/
  9133. int Proc_iso1_PreChargeReq(int AcceptFd)
  9134. {
  9135. int errn = 0;
  9136. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PreChargeReq] Got PreChargeReq");
  9137. //Print the decoded XML Document
  9138. PRINT_XML_DOC_ISO1_PreChargeReq(&ccs_exi_doc_ISO1);
  9139. //Save into Share Memory
  9140. SHM_Save_iso1_PreChargeReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9141. //Check for EV Error Code
  9142. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PreChargeRequest.DC_EVStatus.EVErrorCode);
  9143. errn = Proc_iso1_PreChargeRes(AcceptFd);
  9144. if (errn == 0)
  9145. {
  9146. //send response successfully.
  9147. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PreChargeRes");
  9148. }
  9149. else
  9150. {
  9151. sprintf(buf_log_evcomm,
  9152. "[Error][SeccComm][Proc_iso1_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  9153. errn);
  9154. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9155. }
  9156. return errn;
  9157. }
  9158. /*===========================================================================
  9159. FUNCTION: SHM_Init_din_PowerDeliveryRes
  9160. DESCRIPTION:
  9161. PRE-CONDITION:
  9162. INPUT:
  9163. 1. shm_ccs
  9164. OUTPUT:
  9165. 1. shm_ccs
  9166. GLOBAL VARIABLES:
  9167. =============================================================================*/
  9168. void SHM_Init_din_PowerDeliveryRes(struct CcsData *shm_ccs)
  9169. {
  9170. struct PowerDeliveryResponse_DIN70121 *in;
  9171. in = &shm_ccs->V2GMessage_DIN70121.PowerDeliveryResponse;
  9172. //----- [BODY (1/3)] ResponseCode -----
  9173. in->ResponseCode = dinresponseCodeType_OK;
  9174. //----- [BODY (2/3)] AC_EVSEStatus -----
  9175. //ignore, since DIN 70121 doesn't support AC, yet.
  9176. //----- [BODY (2/3)] DC_EVSEStatus -----
  9177. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  9178. }
  9179. /*===========================================================================
  9180. FUNCTION: Sudo_Parameter_din_PowerDeliveryRes
  9181. DESCRIPTION:
  9182. PRE-CONDITION:
  9183. INPUT:
  9184. OUTPUT:
  9185. GLOBAL VARIABLES:
  9186. =============================================================================*/
  9187. void Sudo_Parameter_din_PowerDeliveryRes()
  9188. {
  9189. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  9190. init_dinPowerDeliveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes);
  9191. ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  9192. //----- [BODY (1/3)] ResponseCode -----
  9193. struct dinPowerDeliveryResType *res;
  9194. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9195. res->ResponseCode = dinresponseCodeType_OK;
  9196. //----- [BODY (2/3)] AC_EVSEStatus -----
  9197. //ignore, since DIN 70121 doesn't support AC, yet.
  9198. //----- [BODY (2/3)] DC_EVSEStatus -----
  9199. res->DC_EVSEStatus_isUsed = 1u;
  9200. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9201. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  9202. // dinisolationLevelType_Invalid = 0,
  9203. // dinisolationLevelType_Valid = 1,
  9204. // dinisolationLevelType_Warning = 2,
  9205. // dinisolationLevelType_Fault = 3
  9206. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9207. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9208. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  9209. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9210. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9211. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9212. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9213. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9214. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  9215. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  9216. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  9217. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  9218. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  9219. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9220. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  9221. // dinEVSENotificationType_None = 0,
  9222. // dinEVSENotificationType_StopCharging = 1,
  9223. // dinEVSENotificationType_ReNegotiation = 2
  9224. }
  9225. /*===========================================================================
  9226. FUNCTION: Sudo_Parameter_iso1_PowerDeliveryRes
  9227. DESCRIPTION:
  9228. PRE-CONDITION:
  9229. INPUT:
  9230. OUTPUT:
  9231. GLOBAL VARIABLES:
  9232. =============================================================================*/
  9233. void Sudo_Parameter_iso1_PowerDeliveryRes()
  9234. {
  9235. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9236. init_iso1PowerDeliveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes);
  9237. ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  9238. //----- [BODY (1/3)] ResponseCode -----
  9239. struct iso1PowerDeliveryResType *res;
  9240. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  9241. res->ResponseCode = iso1responseCodeType_OK;
  9242. //----- [BODY (2/3)] AC_EVSEStatus -----
  9243. //ignore, since our ISO1 70121 doesn't support AC, yet.
  9244. //----- [BODY (2/3)] DC_EVSEStatus -----
  9245. res->DC_EVSEStatus_isUsed = 1u;
  9246. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9247. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  9248. //iso1isolationLevelType_Invalid = 0,
  9249. //iso1isolationLevelType_Valid = 1,
  9250. //iso1isolationLevelType_Warning = 2,
  9251. //iso1isolationLevelType_Fault = 3,
  9252. //iso1isolationLevelType_No_IMD = 4
  9253. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9254. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9255. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  9256. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9257. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9258. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9259. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9260. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9261. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  9262. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  9263. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  9264. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  9265. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  9266. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9267. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9268. //iso1EVSENotificationType_None = 0,
  9269. //iso1EVSENotificationType_StopCharging = 1,
  9270. //iso1EVSENotificationType_ReNegotiation = 2
  9271. }
  9272. /*===========================================================================
  9273. FUNCTION: Proc_din_PowerDeliveryStartRes
  9274. DESCRIPTION:
  9275. PRE-CONDITION:
  9276. INPUT:
  9277. OUTPUT:
  9278. GLOBAL VARIABLES:
  9279. =============================================================================*/
  9280. int Proc_din_PowerDeliveryStartRes(int AcceptFd)
  9281. {
  9282. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9283. //if it is not the same, the packet should be ignored.
  9284. //STEP 1: ============ Initialize ============
  9285. int i = 0;
  9286. int errn = 0;
  9287. bitstream_t v2g_tx_stream;
  9288. struct dinPowerDeliveryResType *res;
  9289. struct ChargingInfoData *sys;
  9290. size_t pos = 0;
  9291. v2g_tx_stream.pos = &pos;
  9292. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9293. v2g_tx_stream.data = V2GTP_Tx_buf;
  9294. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9295. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9296. res->ResponseCode = OK_DIN70121;
  9297. //[HEADER] Check Req SessionID
  9298. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9299. {
  9300. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  9301. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  9302. errn = -1;
  9303. }
  9304. //Check for SequenceError
  9305. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9306. {
  9307. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  9308. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  9309. errn = -1;
  9310. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9311. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9312. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9313. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9314. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9315. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9316. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9317. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9318. }
  9319. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9320. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9321. #if PARAMETER_NORMAL_MODE == ENABLE
  9322. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  9323. #else
  9324. Sudo_Parameter_din_PowerDeliveryRes();
  9325. #endif
  9326. //EVSE Status Code
  9327. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  9328. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9329. //Check for CSU command of "Stop by EVSE"
  9330. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9331. {
  9332. //res->ResponseCode = FAILED_DIN70121;
  9333. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9334. }
  9335. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9336. {
  9337. //res->ResponseCode = FAILED_DIN70121;
  9338. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9339. errn = -1;
  9340. }
  9341. else if (ShmInternalComm->ChargingPermission == FALSE)
  9342. {
  9343. //res->ResponseCode = FAILED_DIN70121;
  9344. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9345. }
  9346. //STEP 4: ============ Encode and Send Response Message ===========
  9347. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9348. {
  9349. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PowerDeliveryStartRes][Error]Tx encoded msg error");
  9350. errn = -1;
  9351. }
  9352. //STEP 5: ============ Update Flags ===========
  9353. return errn;
  9354. }
  9355. /*===========================================================================
  9356. FUNCTION: Proc_iso1_PowerDeliveryStartRes
  9357. DESCRIPTION:
  9358. PRE-CONDITION:
  9359. INPUT:
  9360. OUTPUT:
  9361. GLOBAL VARIABLES:
  9362. =============================================================================*/
  9363. int Proc_iso1_PowerDeliveryStartRes(int AcceptFd)
  9364. {
  9365. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9366. //if it is not the same, the packet should be ignored.
  9367. //STEP 1: ============ Initialize ============
  9368. int i = 0;
  9369. int errn = 0;
  9370. bitstream_t v2g_tx_stream;
  9371. struct iso1PowerDeliveryResType *res;
  9372. struct ChargingInfoData *sys;
  9373. size_t pos = 0;
  9374. v2g_tx_stream.pos = &pos;
  9375. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9376. v2g_tx_stream.data = V2GTP_Tx_buf;
  9377. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  9378. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9379. res->ResponseCode = OK_ISO15118_2014;
  9380. //[HEADER] Check Req SessionID
  9381. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9382. {
  9383. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9384. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  9385. errn = -1;
  9386. }
  9387. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9388. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9389. #if PARAMETER_NORMAL_MODE == ENABLE
  9390. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9391. #else
  9392. Sudo_Parameter_iso1_PowerDeliveryRes();
  9393. #endif
  9394. //EVSE Status Code
  9395. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  9396. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9397. //Check for CSU command of "Stop by EVSE"
  9398. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9399. {
  9400. //res->ResponseCode = FAILED_ISO15118_2014;
  9401. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9402. }
  9403. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9404. {
  9405. //res->ResponseCode = FAILED_ISO15118_2014;
  9406. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9407. errn = -1;
  9408. }
  9409. else if (ShmInternalComm->ChargingPermission == FALSE)
  9410. {
  9411. //res->ResponseCode = FAILED_ISO15118_2014;
  9412. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9413. }
  9414. //STEP 4: ============ Encode and Send Response Message ===========
  9415. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9416. {
  9417. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PowerDeliveryStartRes][Error]Tx encoded msg error");
  9418. errn = -1;
  9419. }
  9420. //STEP 5: ============ Update Flags ===========
  9421. return errn;
  9422. }
  9423. /*===========================================================================
  9424. FUNCTION: Proc_din_PowerDeliveryStartReq
  9425. DESCRIPTION:
  9426. PRE-CONDITION:
  9427. INPUT:
  9428. OUTPUT:
  9429. GLOBAL VARIABLES:
  9430. =============================================================================*/
  9431. int Proc_din_PowerDeliveryStartReq(int AcceptFd)
  9432. {
  9433. int errn = 0;
  9434. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryStartReq");
  9435. //Print the decoded XML Document
  9436. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  9437. //Save into Share Memory
  9438. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9439. //Check for EV Error Code
  9440. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  9441. errn = Proc_din_PowerDeliveryStartRes(AcceptFd);
  9442. if (errn == 0)
  9443. {
  9444. //send response successfully.
  9445. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PowerDeliveryStartRes");
  9446. }
  9447. else
  9448. {
  9449. sprintf(buf_log_evcomm,
  9450. "[Error][Proc_din_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  9451. errn);
  9452. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9453. }
  9454. return errn;
  9455. }
  9456. /*===========================================================================
  9457. FUNCTION: Proc_iso1_PowerDeliveryStartReq
  9458. DESCRIPTION:
  9459. PRE-CONDITION:
  9460. INPUT:
  9461. OUTPUT:
  9462. GLOBAL VARIABLES:
  9463. =============================================================================*/
  9464. int Proc_iso1_PowerDeliveryStartReq(int AcceptFd)
  9465. {
  9466. int errn = 0;
  9467. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryStartReq");
  9468. //Print the decoded XML Document
  9469. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  9470. //Save into Share Memory
  9471. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9472. //Check for EV Error Code
  9473. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  9474. errn = Proc_iso1_PowerDeliveryStartRes(AcceptFd);
  9475. if (errn == 0)
  9476. {
  9477. //send response successfully.
  9478. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PowerDeliveryStartRes");
  9479. }
  9480. else
  9481. {
  9482. sprintf(buf_log_evcomm,
  9483. "[Error][Proc_iso1_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  9484. errn);
  9485. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9486. }
  9487. return errn;
  9488. }
  9489. /*===========================================================================
  9490. FUNCTION: SHM_Init_din_CurrentDemandRes
  9491. DESCRIPTION:
  9492. PRE-CONDITION:
  9493. INPUT:
  9494. 1. shm_ccs
  9495. OUTPUT:
  9496. 1. shm_ccs
  9497. GLOBAL VARIABLES:
  9498. =============================================================================*/
  9499. void SHM_Init_din_CurrentDemandRes(struct CcsData *shm_ccs)
  9500. {
  9501. struct CurrentDemandResponse_DIN70121 *in;
  9502. in = &shm_ccs->V2GMessage_DIN70121.CurrentDemandResponse;
  9503. //----- [BODY (1/10)] ResponseCode -----
  9504. in->ResponseCode = dinresponseCodeType_OK;
  9505. //----- [BODY (2/10)] DC_EVSEStatus -----
  9506. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  9507. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9508. short value = 0; int multiplier = 0; unsigned char unit = 0;
  9509. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  9510. value = 0; multiplier = 0; unit = V_DIN70121;
  9511. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  9512. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9513. //value = 600; multiplier = -1; unit = A_DIN70121; //60A, for test only.
  9514. value = 0; multiplier = 0; unit = A_DIN70121;
  9515. SHM_Save_dinPhysicalValueType(&in->EVSEPresentCurrent, value, multiplier, unit);
  9516. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9517. in->EVSECurrentLimitAchieved = FALSE;
  9518. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9519. in->EVSEVoltageLimitAchieved = FALSE;
  9520. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9521. in->EVSEPowerLimitAchieved = FALSE;
  9522. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9523. //value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  9524. value = 5000; multiplier = -1; unit = V_DIN70121; //500V
  9525. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumVoltageLimit, value, multiplier, unit);
  9526. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9527. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  9528. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumCurrentLimit, value, multiplier, unit);
  9529. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9530. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  9531. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumPowerLimit, value, multiplier, unit);
  9532. }
  9533. /*===========================================================================
  9534. FUNCTION: Sudo_Parameter_din_CurrentDemandRes
  9535. DESCRIPTION:
  9536. PRE-CONDITION:
  9537. INPUT:
  9538. OUTPUT:
  9539. GLOBAL VARIABLES:
  9540. =============================================================================*/
  9541. void Sudo_Parameter_din_CurrentDemandRes()
  9542. {
  9543. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  9544. init_dinCurrentDemandResType(&ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes);
  9545. ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  9546. //----- [BODY (1/10)] ResponseCode -----
  9547. struct dinCurrentDemandResType *res;
  9548. res = &ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes;
  9549. res->ResponseCode = dinresponseCodeType_OK;
  9550. //----- [BODY (2/10)] DC_EVSEStatus -----
  9551. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9552. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  9553. // dinisolationLevelType_Invalid = 0,
  9554. // dinisolationLevelType_Valid = 1,
  9555. // dinisolationLevelType_Warning = 2,
  9556. // dinisolationLevelType_Fault = 3
  9557. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9558. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9559. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  9560. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9561. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9562. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9563. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9564. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9565. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  9566. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  9567. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  9568. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  9569. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  9570. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9571. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  9572. // dinEVSENotificationType_None = 0,
  9573. // dinEVSENotificationType_StopCharging = 1,
  9574. // dinEVSENotificationType_ReNegotiation = 2
  9575. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9576. res->EVSEPresentVoltage.Value = 3820;
  9577. res->EVSEPresentVoltage.Multiplier = -1;
  9578. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  9579. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  9580. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9581. res->EVSEPresentCurrent.Value = 1200;
  9582. res->EVSEPresentCurrent.Multiplier = -1;
  9583. res->EVSEPresentCurrent.Unit_isUsed = 1u;
  9584. res->EVSEPresentCurrent.Unit = dinunitSymbolType_A;
  9585. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9586. res->EVSECurrentLimitAchieved = 0;
  9587. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9588. res->EVSEVoltageLimitAchieved = 0;
  9589. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9590. res->EVSEPowerLimitAchieved = 0;
  9591. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9592. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  9593. res->EVSEMaximumVoltageLimit.Value = 7500;
  9594. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  9595. res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  9596. res->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  9597. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9598. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  9599. res->EVSEMaximumCurrentLimit.Value = 1200;
  9600. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  9601. res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  9602. res->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  9603. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9604. res->EVSEMaximumPowerLimit_isUsed = 1u;
  9605. res->EVSEMaximumPowerLimit.Value = 6000;
  9606. res->EVSEMaximumPowerLimit.Multiplier = 1;
  9607. res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  9608. res->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  9609. }
  9610. /*===========================================================================
  9611. FUNCTION: Sudo_Parameter_iso1_CurrentDemandRes
  9612. DESCRIPTION:
  9613. PRE-CONDITION:
  9614. INPUT:
  9615. OUTPUT:
  9616. GLOBAL VARIABLES:
  9617. =============================================================================*/
  9618. void Sudo_Parameter_iso1_CurrentDemandRes()
  9619. {
  9620. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9621. init_iso1CurrentDemandResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes);
  9622. ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  9623. //----- [BODY (1/10)] ResponseCode -----
  9624. struct iso1CurrentDemandResType *res;
  9625. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes;
  9626. res->ResponseCode = iso1responseCodeType_OK;
  9627. //----- [BODY (2/10)] DC_EVSEStatus -----
  9628. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9629. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  9630. //iso1isolationLevelType_Invalid = 0,
  9631. //iso1isolationLevelType_Valid = 1,
  9632. //iso1isolationLevelType_Warning = 2,
  9633. //iso1isolationLevelType_Fault = 3,
  9634. //iso1isolationLevelType_No_IMD = 4
  9635. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9636. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9637. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  9638. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  9639. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  9640. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  9641. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  9642. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  9643. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  9644. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  9645. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  9646. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  9647. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  9648. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9649. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9650. //iso1EVSENotificationType_None = 0,
  9651. //iso1EVSENotificationType_StopCharging = 1,
  9652. //iso1EVSENotificationType_ReNegotiation = 2
  9653. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9654. res->EVSEPresentVoltage.Value = 3820;
  9655. res->EVSEPresentVoltage.Multiplier = -1;
  9656. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  9657. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  9658. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9659. res->EVSEPresentCurrent.Value = 1200;
  9660. res->EVSEPresentCurrent.Multiplier = -1;
  9661. //res->EVSEPresentCurrent.Unit_isUsed = 1u;
  9662. res->EVSEPresentCurrent.Unit = iso1unitSymbolType_A;
  9663. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9664. res->EVSECurrentLimitAchieved = 0;
  9665. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9666. res->EVSEVoltageLimitAchieved = 0;
  9667. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9668. res->EVSEPowerLimitAchieved = 0;
  9669. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9670. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  9671. res->EVSEMaximumVoltageLimit.Value = 7500;
  9672. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  9673. //res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  9674. res->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  9675. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9676. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  9677. res->EVSEMaximumCurrentLimit.Value = 1200;
  9678. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  9679. //res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  9680. res->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  9681. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9682. res->EVSEMaximumPowerLimit_isUsed = 1u;
  9683. res->EVSEMaximumPowerLimit.Value = 6000;
  9684. res->EVSEMaximumPowerLimit.Multiplier = 1;
  9685. //res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  9686. res->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  9687. }
  9688. /*===========================================================================
  9689. FUNCTION: Sudo_Parameter_iso1_ChargingStatusRes
  9690. DESCRIPTION:
  9691. PRE-CONDITION:
  9692. INPUT:
  9693. OUTPUT:
  9694. GLOBAL VARIABLES:
  9695. =============================================================================*/
  9696. void Sudo_Parameter_iso1_ChargingStatusRes()
  9697. {
  9698. int i = 0;
  9699. struct iso1ChargingStatusResType *res;
  9700. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9701. init_iso1ChargingStatusResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes);
  9702. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes;
  9703. ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes_isUsed = 1u;
  9704. //----- [BODY (1/10)] ResponseCode -----
  9705. res->ResponseCode = OK_ISO15118_2014;
  9706. //----- [BODY (2/10)] AC_EVSEStatus -----
  9707. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9708. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  9709. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9710. // iso1EVSENotificationType_None = 0,
  9711. // iso1EVSENotificationType_StopCharging = 1,
  9712. // iso1EVSENotificationType_ReNegotiation = 2
  9713. //----- [BODY (3/10)] EVSEMaxCurrent -----
  9714. res->EVSEMaxCurrent_isUsed = 1u;
  9715. res->EVSEMaxCurrent.Value = 32;
  9716. res->EVSEMaxCurrent.Multiplier = 0;
  9717. res->EVSEMaxCurrent.Unit = iso1unitSymbolType_A;
  9718. //----- [BODY (4/10)] SAScheduleTupleID -----
  9719. res->SAScheduleTupleID = 0;
  9720. //----- [BODY (5/10)] EVSEID -----
  9721. res->EVSEID.charactersLen = 37;
  9722. memset(res->EVSEID.characters, 0, sizeof(res->EVSEID.characters));
  9723. //sprintf(res->EVSEID.characters, CCS_AC_EVSEID);
  9724. //----- [BODY (6/10)] MeterInfo -----
  9725. res->MeterInfo_isUsed = 1u;
  9726. memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  9727. memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  9728. //[MeterInfo][1/5] MeterID
  9729. //sprintf(res->MeterInfo.MeterID , CCS_AC_METER_ID);
  9730. //[MeterInfo][2/5] SigMeterReading (optional)
  9731. //sprintf(res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  9732. //[MeterInfo][3/5] MeterStatus (optional)
  9733. res->MeterInfo.MeterStatus = 0;
  9734. //[MeterInfo][4/5] MeterReading (optional)
  9735. res->MeterInfo.MeterReading = 12345;
  9736. //[MeterInfo][5/5] TMeter (optional)
  9737. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  9738. //----- [BODY (7/10)] ReceiptRequired -----
  9739. res->ReceiptRequired_isUsed = 1u;
  9740. res->ReceiptRequired = FALSE; //optional
  9741. }
  9742. /*===========================================================================
  9743. FUNCTION: Check_EVErrorCode
  9744. DESCRIPTION:
  9745. PRE-CONDITION:
  9746. INPUT:
  9747. OUTPUT:
  9748. GLOBAL VARIABLES:
  9749. =============================================================================*/
  9750. void Check_EVErrorCode(int code)
  9751. {
  9752. struct ChargingInfoData *sys;
  9753. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9754. if (code != NO_ERROR) //NO_ERROR = 0
  9755. {
  9756. //Asking CSU to Stop
  9757. switch (code)
  9758. {
  9759. /*case dinDC_EVErrorCodeType_NO_ERROR: // = 0,
  9760. {
  9761. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(NO_ERROR)");
  9762. break;
  9763. }*/
  9764. case dinDC_EVErrorCodeType_FAILED_RESSTemperatureInhibit: // = 1,
  9765. { //023737
  9766. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9767. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9768. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9769. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9770. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9771. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  9772. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_RESSTemperatureInhibit)");
  9773. break;
  9774. }
  9775. case dinDC_EVErrorCodeType_FAILED_EVShiftPosition: // = 2,
  9776. {//023738
  9777. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9778. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9779. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9780. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9781. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9782. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9783. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_EVShiftPosition)");
  9784. break;
  9785. }
  9786. case dinDC_EVErrorCodeType_FAILED_ChargerConnectorLockFault: // = 3,
  9787. {
  9788. //023739
  9789. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9790. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9791. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9792. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9793. ShmStatusCodeData->PresentStatusCode[0][4] = 3;
  9794. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9795. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(ChargerConnectorLockFault)");
  9796. break;
  9797. }
  9798. case dinDC_EVErrorCodeType_FAILED_EVRESSMalfunction: // = 4,
  9799. {
  9800. //023740
  9801. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9802. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9803. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9804. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9805. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9806. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  9807. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_EVRESSMalfunction)");
  9808. break;
  9809. }
  9810. case dinDC_EVErrorCodeType_FAILED_ChargingCurrentdifferential: // = 5,
  9811. {
  9812. //023741
  9813. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9814. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9815. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9816. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9817. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9818. ShmStatusCodeData->PresentStatusCode[0][5] = 1;
  9819. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingCurrentdifferential)");
  9820. break;
  9821. }
  9822. case dinDC_EVErrorCodeType_FAILED_ChargingVoltageOutOfRange: // = 6,
  9823. {
  9824. //023742
  9825. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9826. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9827. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9828. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9829. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9830. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  9831. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingVoltageOutOfRange)");
  9832. break;
  9833. }
  9834. case dinDC_EVErrorCodeType_Reserved_A: // = 7,
  9835. {
  9836. //023983
  9837. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9838. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9839. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9840. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9841. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9842. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9843. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_A)");
  9844. break;
  9845. }
  9846. case dinDC_EVErrorCodeType_Reserved_B: // = 8,
  9847. {
  9848. //023983
  9849. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9850. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9851. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9852. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9853. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9854. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9855. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_B)");
  9856. break;
  9857. }
  9858. case dinDC_EVErrorCodeType_Reserved_C: // = 9,
  9859. {
  9860. //023983
  9861. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9862. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9863. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9864. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9865. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9866. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9867. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_C)");
  9868. break;
  9869. }
  9870. case dinDC_EVErrorCodeType_FAILED_ChargingSystemIncompatibility:// = 10,
  9871. {
  9872. //023743
  9873. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9874. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9875. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9876. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9877. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9878. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9879. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingSystemIncompatibility)");
  9880. break;
  9881. }
  9882. case dinDC_EVErrorCodeType_NoData: // = 11
  9883. {
  9884. //023746
  9885. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9886. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9887. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9888. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9889. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  9890. ShmStatusCodeData->PresentStatusCode[0][5] = 6;
  9891. DEBUG_PRINTF_EXI_ENGINE_DETAIL("(NoData)");
  9892. break;
  9893. }
  9894. default:
  9895. {
  9896. if(sys->EvBatterySoc==100)
  9897. {
  9898. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9899. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9900. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9901. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9902. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9903. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9904. }
  9905. else
  9906. {
  9907. //023983
  9908. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9909. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9910. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9911. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9912. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9913. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9914. }
  9915. DEBUG_PRINTF_EXI_ENGINE_DETAIL("([WARNING] Unexpected din EVErrorCode)");
  9916. break;
  9917. }
  9918. }
  9919. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9920. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9921. //Update_V2G_Flow_Status(Other_Fault);
  9922. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  9923. sprintf(buf_log_evcomm,
  9924. "Stop by EV (EVErrorCode = %d (DEC))",
  9925. code);
  9926. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9927. }
  9928. else
  9929. {
  9930. if(Check_V2G_Flow_Status()>=49)
  9931. {
  9932. if((sys->EvBatterySoc==100)||(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.ChargingComplete))
  9933. {
  9934. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9935. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9936. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9937. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9938. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9939. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9940. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  9941. sprintf(buf_log_evcomm,
  9942. "Check_EVErrorCode => Stop by EV (EVErrorCode = %d (023979))",
  9943. code);
  9944. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9945. }
  9946. else if(ShmStatusCodeData->PresentStatusCode[0][1] ==0)
  9947. {
  9948. if(!( (ShmInternalComm->ChargingPermission == FALSE)||
  9949. (sys->DC_EVSEStatus == EVSE_Shutdown)||
  9950. (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)))
  9951. {
  9952. //023983
  9953. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9954. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9955. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9956. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  9957. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9958. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  9959. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9960. sprintf(buf_log_evcomm,
  9961. "Check_EVErrorCode => Stop by EV (EVErrorCode = %d (023983))",
  9962. code);
  9963. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  9964. }
  9965. }
  9966. }
  9967. }
  9968. }
  9969. /*===========================================================================
  9970. FUNCTION: Proc_din_CurrentDemandRes
  9971. DESCRIPTION:
  9972. PRE-CONDITION:
  9973. INPUT:
  9974. OUTPUT:
  9975. GLOBAL VARIABLES:
  9976. =============================================================================*/
  9977. int Proc_din_CurrentDemandRes(int AcceptFd)
  9978. {
  9979. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9980. //if it is not the same, the packet should be ignored.
  9981. //STEP 1: ============ Initialize ============
  9982. int i = 0;
  9983. int errn = 0;
  9984. bitstream_t v2g_tx_stream;
  9985. static struct CurrentDemandResponse_DIN70121 *cur;
  9986. static struct ChargingInfoData *sys;
  9987. static int EVSE_max_current;
  9988. int tmp = 0;
  9989. size_t pos = 0;
  9990. v2g_tx_stream.pos = &pos;
  9991. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9992. v2g_tx_stream.data = V2GTP_Tx_buf;
  9993. cur = &ShmCcsData->V2GMessage_DIN70121.CurrentDemandResponse;
  9994. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9995. cur->ResponseCode = OK_DIN70121;
  9996. //EVSE Status Code
  9997. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9998. //[HEADER] Check Req SessionID
  9999. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10000. {
  10001. cur->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10002. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10003. errn = -1;
  10004. }
  10005. //Check for SequenceError
  10006. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10007. {
  10008. cur->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10009. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10010. errn = -1;
  10011. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10012. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10013. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10014. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10015. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10016. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10017. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10018. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10019. }
  10020. //Check for negative EvBatteryMaxCurrent
  10021. if (sys->EvBatteryMaxCurrent < 0)
  10022. {
  10023. sprintf(buf_log_evcomm,
  10024. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  10025. sys->EvBatteryMaxCurrent);
  10026. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10027. cur->DC_EVSEStatus.EVSEStatusCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  10028. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10029. errn = -1;
  10030. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10031. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  10032. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10033. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10034. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10035. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10036. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  10037. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  10038. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10039. }
  10040. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10041. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_DIN70121);
  10042. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  10043. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  10044. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  10045. #endif
  10046. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  10047. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  10048. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  10049. if (sys->EvBatteryMaxVoltage <= 500)
  10050. {
  10051. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  10052. }
  10053. #endif
  10054. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  10055. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  10056. {
  10057. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  10058. //[To-Do] Limit is achieved flag
  10059. }
  10060. //Isolation Status
  10061. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  10062. {
  10063. #if 0
  10064. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  10065. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10066. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10067. sprintf(buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  10068. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10069. //Update_V2G_Flow_Status(Other_Fault);
  10070. //errn = -1;
  10071. #else
  10072. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10073. #endif
  10074. }
  10075. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10076. {
  10077. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10078. }
  10079. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10080. {
  10081. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10082. }
  10083. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10084. {
  10085. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10086. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10087. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10088. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_CurrentDemandRes]GFD_Fault => Emergency Shutdown");
  10089. Update_V2G_Flow_Status(Other_Fault);
  10090. errn = -1;
  10091. }
  10092. else //GFD_No_IMD or other unexpected status
  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. sprintf(buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10098. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10099. Update_V2G_Flow_Status(Other_Fault);
  10100. errn = -1;
  10101. }
  10102. //For testing with Tesla Model 3
  10103. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  10104. //[CAUTION][To-Do] Decresement of Current is not implemented.
  10105. //SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, 10, A_DIN70121);
  10106. if (sys->EvBatterytargetCurrent <= 0)
  10107. {
  10108. EVSE_max_current = 50; //10A
  10109. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  10110. /*
  10111. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10112. sys->PresentChargingCurrent,
  10113. sys->EvBatterytargetCurrent,
  10114. EVSE_max_current,
  10115. cur->EVSEMaximumCurrentLimit.Value
  10116. );
  10117. */
  10118. }
  10119. else //1A
  10120. {
  10121. /*
  10122. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10123. sys->PresentChargingCurrent,
  10124. sys->EvBatterytargetCurrent,
  10125. EVSE_max_current,
  10126. cur->EVSEMaximumCurrentLimit.Value
  10127. );
  10128. */
  10129. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  10130. {
  10131. tmp = EVSE_max_current + 50; //10A
  10132. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  10133. {
  10134. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  10135. EVSE_max_current = tmp;
  10136. }
  10137. else
  10138. {
  10139. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  10140. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  10141. }
  10142. }
  10143. }
  10144. #endif
  10145. //Check for CSU command of "Stop by EVSE"
  10146. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10147. {
  10148. //Check for Alarm Code: CCS GFD trip (012235)
  10149. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10150. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10151. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10152. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10153. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10154. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10155. {
  10156. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  10157. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  10158. }
  10159. else
  10160. {
  10161. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE_Shutdown");
  10162. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10163. }
  10164. //cur->ResponseCode = FAILED_DIN70121;
  10165. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10166. //errn = -1;
  10167. }
  10168. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10169. {
  10170. //Check for Alarm Code: CCS GFD trip (012235)
  10171. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10172. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10173. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10174. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10175. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10176. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10177. {
  10178. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  10179. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  10180. }
  10181. else
  10182. {
  10183. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  10184. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10185. }
  10186. //cur->ResponseCode = FAILED_DIN70121;
  10187. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10188. errn = -1;
  10189. }
  10190. else if (ShmInternalComm->ChargingPermission == FALSE)
  10191. {
  10192. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]Permission OFF");
  10193. //cur->ResponseCode = FAILED_DIN70121;
  10194. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10195. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10196. //errn = -1;
  10197. }
  10198. else
  10199. {
  10200. //null
  10201. }
  10202. //Response to CP Error
  10203. #if CP_PROTECTION_MECHANISM == ENABLE
  10204. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10205. {
  10206. if(sys->CpState <= 1)
  10207. {
  10208. cur->ResponseCode = FAILED_DIN70121;
  10209. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10210. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10211. Update_V2G_Flow_Status(Other_Fault);
  10212. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10213. //CCS_SECC_CP_State_Error (023889)
  10214. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10215. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10216. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10217. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10218. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10219. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10220. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10221. sprintf(buf_log_evcomm,
  10222. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  10223. sys->CpState,
  10224. sys->CpVoltage);
  10225. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10226. }
  10227. else
  10228. {
  10229. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE Normal Stop");
  10230. //cur->ResponseCode = FAILED_DIN70121;
  10231. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10232. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10233. //errn = -1;
  10234. }
  10235. }
  10236. #endif
  10237. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10238. #if PARAMETER_NORMAL_MODE == ENABLE
  10239. SHM_Read_din_CurrentDemandRes(&ccs_exi_doc_DIN, ShmCcsData);
  10240. #else
  10241. Sudo_Parameter_din_CurrentDemandRes();
  10242. #endif
  10243. //STEP 4: ============ Encode and Send Response Message ===========
  10244. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10245. {
  10246. errn = -1;
  10247. }
  10248. //STEP 5: ============ Update Flags ===========
  10249. return errn;
  10250. }
  10251. /*===========================================================================
  10252. FUNCTION: Proc_iso1_CurrentDemandRes
  10253. DESCRIPTION:
  10254. PRE-CONDITION:
  10255. INPUT:
  10256. OUTPUT:
  10257. GLOBAL VARIABLES:
  10258. =============================================================================*/
  10259. int Proc_iso1_CurrentDemandRes(int AcceptFd)
  10260. {
  10261. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10262. //if it is not the same, the packet should be ignored.
  10263. //STEP 1: ============ Initialize ============
  10264. int i = 0;
  10265. int errn = 0;
  10266. bitstream_t v2g_tx_stream;
  10267. static struct CurrentDemandResponse_ISO15118_2014 *cur;
  10268. static struct ChargingInfoData *sys;
  10269. static int EVSE_max_current;
  10270. int tmp = 0;
  10271. size_t pos = 0;
  10272. v2g_tx_stream.pos = &pos;
  10273. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10274. v2g_tx_stream.data = V2GTP_Tx_buf;
  10275. cur = &ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandResponse;
  10276. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10277. cur->ResponseCode = OK_ISO15118_2014;
  10278. //EVSE Status Code
  10279. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10280. //[HEADER] Check Req SessionID
  10281. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10282. {
  10283. cur->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10284. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10285. errn = -1;
  10286. }
  10287. //Check for SequenceError
  10288. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10289. {
  10290. cur->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10291. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10292. errn = -1;
  10293. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10294. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10295. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10296. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10297. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10298. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10299. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10300. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10301. }
  10302. //Check for negative EvBatteryMaxCurrent
  10303. if (sys->EvBatteryMaxCurrent < 0)
  10304. {
  10305. sprintf(buf_log_evcomm,
  10306. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  10307. sys->EvBatteryMaxCurrent);
  10308. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10309. cur->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  10310. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10311. errn = -1;
  10312. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10313. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  10314. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10315. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10316. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10317. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10318. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  10319. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  10320. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10321. }
  10322. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10323. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_ISO15118_2014);
  10324. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  10325. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  10326. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  10327. #endif
  10328. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  10329. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  10330. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  10331. if (sys->EvBatteryMaxVoltage <= 500)
  10332. {
  10333. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  10334. }
  10335. #endif
  10336. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  10337. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  10338. {
  10339. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  10340. //[To-Do] Limit is achieved flag
  10341. }
  10342. //Isolation Status
  10343. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  10344. {
  10345. #if 0
  10346. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  10347. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10348. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10349. sprintf(buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  10350. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10351. // Update_V2G_Flow_Status(Other_Fault);
  10352. //errn = -1;
  10353. #else
  10354. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10355. #endif
  10356. }
  10357. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10358. {
  10359. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10360. }
  10361. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10362. {
  10363. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //2
  10364. }
  10365. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10366. {
  10367. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10368. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10369. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10370. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_CurrentDemandRes]GFD_Fault => EmergencyShutdown");
  10371. Update_V2G_Flow_Status(Other_Fault);
  10372. errn = -1;
  10373. }
  10374. else
  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. sprintf(buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10380. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10381. Update_V2G_Flow_Status(Other_Fault);
  10382. errn = -1;
  10383. }
  10384. //For testing with Tesla Model 3
  10385. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  10386. //[CAUTION][To-Do] Decresement of Current is not implemented.
  10387. //SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, 10, A_ISO15118_2014);
  10388. if (sys->EvBatterytargetCurrent <= 0)
  10389. {
  10390. EVSE_max_current = 50; //10A
  10391. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  10392. /*
  10393. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10394. sys->PresentChargingCurrent,
  10395. sys->EvBatterytargetCurrent,
  10396. EVSE_max_current,
  10397. cur->EVSEMaximumCurrentLimit.Value
  10398. );
  10399. */
  10400. }
  10401. else //1A
  10402. {
  10403. /*
  10404. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  10405. sys->PresentChargingCurrent,
  10406. sys->EvBatterytargetCurrent,
  10407. EVSE_max_current,
  10408. cur->EVSEMaximumCurrentLimit.Value
  10409. );
  10410. */
  10411. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  10412. {
  10413. tmp = EVSE_max_current + 50; //10A
  10414. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  10415. {
  10416. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  10417. EVSE_max_current = tmp;
  10418. }
  10419. else
  10420. {
  10421. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  10422. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  10423. }
  10424. }
  10425. }
  10426. #endif
  10427. //Check for CSU command of "Stop by EVSE"
  10428. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10429. {
  10430. //Check for Alarm Code: CCS GFD trip (012235)
  10431. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10432. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10433. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10434. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10435. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10436. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10437. {
  10438. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  10439. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  10440. }
  10441. else
  10442. {
  10443. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE_Shutdown");
  10444. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10445. }
  10446. //cur->ResponseCode = FAILED_ISO15118_2014;
  10447. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10448. //errn = -1;
  10449. }
  10450. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10451. {
  10452. //Check for Alarm Code: CCS GFD trip (012235)
  10453. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  10454. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  10455. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  10456. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  10457. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  10458. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  10459. {
  10460. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  10461. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  10462. }
  10463. else
  10464. {
  10465. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  10466. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10467. }
  10468. //cur->ResponseCode = FAILED_ISO15118_2014;
  10469. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10470. errn = -1;
  10471. }
  10472. else if (ShmInternalComm->ChargingPermission == FALSE)
  10473. {
  10474. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]Permission OFF");
  10475. //cur->ResponseCode = FAILED_ISO15118_2014;
  10476. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10477. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10478. //errn = -1;
  10479. }
  10480. else
  10481. {
  10482. //null
  10483. }
  10484. //Response to CP Error
  10485. #if CP_PROTECTION_MECHANISM == ENABLE
  10486. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10487. {
  10488. if(sys->CpState <= 1)
  10489. {
  10490. cur->ResponseCode = FAILED_ISO15118_2014;
  10491. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10492. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10493. Update_V2G_Flow_Status(Other_Fault);
  10494. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10495. //CCS_SECC_CP_State_Error (023889)
  10496. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10497. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10498. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10499. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10500. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10501. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10502. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10503. sprintf(buf_log_evcomm,
  10504. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  10505. sys->CpState,
  10506. sys->CpVoltage);
  10507. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10508. }
  10509. else
  10510. {
  10511. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE Normal Stop");
  10512. //cur->ResponseCode = FAILED_ISO15118_2014;
  10513. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  10514. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10515. }
  10516. }
  10517. #endif
  10518. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10519. #if PARAMETER_NORMAL_MODE == ENABLE
  10520. SHM_Read_iso1_CurrentDemandRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10521. #else
  10522. Sudo_Parameter_iso1_CurrentDemandRes();
  10523. #endif
  10524. //STEP 4: ============ Encode and Send Response Message ===========
  10525. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10526. {
  10527. errn = -1;
  10528. }
  10529. //STEP 5: ============ Update Flags ===========
  10530. return errn;
  10531. }
  10532. /*===========================================================================
  10533. FUNCTION: Proc_iso1_ChargingStatusRes
  10534. DESCRIPTION:
  10535. PRE-CONDITION:
  10536. INPUT:
  10537. OUTPUT:
  10538. GLOBAL VARIABLES:
  10539. =============================================================================*/
  10540. int Proc_iso1_ChargingStatusRes(int AcceptFd)
  10541. {
  10542. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10543. //if it is not the same, the packet should be ignored.
  10544. //STEP 1: ============ Initialize ============
  10545. int i = 0;
  10546. int errn = 0;
  10547. bitstream_t v2g_tx_stream;
  10548. static struct ChargingStatusResponse_ISO15118_2014 *res;
  10549. static struct ChargingInfoData *sys;
  10550. size_t pos = 0;
  10551. v2g_tx_stream.pos = &pos;
  10552. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10553. v2g_tx_stream.data = V2GTP_Tx_buf;
  10554. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargingStatusResponse;
  10555. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10556. //Init
  10557. res->ResponseCode = OK_ISO15118_2014;
  10558. res->ReceiptRequired = FALSE; //optional
  10559. res->SAScheduleTupleID = 1;
  10560. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  10561. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  10562. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  10563. // iso1EVSENotificationType_None = 0,
  10564. // iso1EVSENotificationType_StopCharging = 1,
  10565. // iso1EVSENotificationType_ReNegotiation = 2
  10566. //[HEADER] Check Req SessionID
  10567. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10568. {
  10569. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10570. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10571. errn = -1;
  10572. }
  10573. //Check for SequenceError
  10574. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10575. {
  10576. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10577. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10578. errn = -1;
  10579. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10580. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10581. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10582. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10583. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10584. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10585. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10586. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10587. }
  10588. //EVSE ID
  10589. memset(res->EVSEID, 0, sizeof(res->EVSEID));
  10590. res->EVSEID[0]='Z';
  10591. res->EVSEID[1]='Z';
  10592. res->EVSEID[2]='0';
  10593. res->EVSEID[3]='0';
  10594. res->EVSEID[4]='0';
  10595. res->EVSEID[5]='0';
  10596. res->EVSEID[6]='0';
  10597. //sprintf(res->EVSEID, CCS_AC_EVSEID);
  10598. //[MeterInfo][0/5] init
  10599. //memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  10600. //memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  10601. //[MeterInfo][1/5] MeterID
  10602. strcpy(res->MeterInfo.MeterID , ShmSysConfigAndInfo->SysConfig.SerialNumber);
  10603. //[MeterInfo][2/5] SigMeterReading (optional)
  10604. //sprintf(res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  10605. //[MeterInfo][3/5] MeterStatus (optional)
  10606. res->MeterInfo.MeterStatus = 1;
  10607. //[MeterInfo][4/5] MeterReading (optional)
  10608. res->MeterInfo.MeterReading = ShmInternalComm->AC_MeterReadingValue;//Wh
  10609. //[MeterInfo][5/5] TMeter (optional)
  10610. res->MeterInfo.TMeter = time(NULL); //Unix Time Stamp format
  10611. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10612. SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  10613. //Isolation Status (RCD)
  10614. if (ShmInternalComm->AC_RcdStatus == 1) //RCD tripped,Isolation is invalid
  10615. {
  10616. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  10617. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10618. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10619. sprintf(buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d", sys->IsolationStatus);
  10620. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10621. Update_V2G_Flow_Status(Other_Fault);
  10622. errn = -1;
  10623. }
  10624. if (ShmInternalComm->ChargingPermission == FALSE)
  10625. {
  10626. //res->ResponseCode = FAILED_ISO15118_2014;
  10627. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10628. sprintf(buf_log_evcomm, "[ISO1][ChargingStatusRes]ChargingPermission = FALSE");
  10629. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10630. //errn = -1;
  10631. }
  10632. //Response to CP Error
  10633. //#if CP_PROTECTION_MECHANISM == ENABLE
  10634. #if 1
  10635. // if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  10636. if ((sys->CpState < 3) || (sys->CpState > 5)) //State C (6V), D (3V)
  10637. {
  10638. res->ResponseCode = FAILED_ISO15118_2014;
  10639. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  10640. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10641. Update_V2G_Flow_Status(Other_Fault);
  10642. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10643. //CCS_SECC_CP_State_Error (023889)
  10644. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10645. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10646. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10647. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  10648. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  10649. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  10650. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  10651. sprintf(buf_log_evcomm,
  10652. "[ChargingStatus]Emergency Stop by CP Error (%d, %.02f V)",
  10653. sys->CpState,
  10654. sys->CpVoltage);
  10655. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10656. }
  10657. #endif
  10658. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10659. #if PARAMETER_NORMAL_MODE == ENABLE
  10660. SHM_Read_iso1_ChargingStatusRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10661. #else
  10662. Sudo_Parameter_iso1_ChargingStatusRes();
  10663. #endif
  10664. //STEP 4: ============ Encode and Send Response Message ===========
  10665. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10666. {
  10667. errn = -1;
  10668. }
  10669. //STEP 5: ============ Update Flags ===========
  10670. return errn;
  10671. }
  10672. /*===========================================================================
  10673. FUNCTION: Proc_din_CurrentDemandReq
  10674. DESCRIPTION:
  10675. PRE-CONDITION:
  10676. INPUT:
  10677. OUTPUT:
  10678. GLOBAL VARIABLES:
  10679. =============================================================================*/
  10680. int Proc_din_CurrentDemandReq(int AcceptFd)
  10681. {
  10682. int errn = 0;
  10683. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CurrentDemandReq] Got CurrentDemandReq\n");
  10684. //Print the decoded XML Document
  10685. PRINT_XML_DOC_DIN_CurrentDemandReq(&ccs_exi_doc_DIN);
  10686. //Save into Share Memory
  10687. SHM_Save_din_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10688. //Check for EV Error Code
  10689. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  10690. errn = Proc_din_CurrentDemandRes(AcceptFd);
  10691. if (errn == 0)
  10692. {
  10693. //Response is sent successfully.
  10694. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]CurrentDemandRes");
  10695. }
  10696. else
  10697. {
  10698. sprintf(buf_log_evcomm,
  10699. "[DIN][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  10700. errn);
  10701. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10702. }
  10703. return errn;
  10704. }
  10705. /*===========================================================================
  10706. FUNCTION: Proc_iso1_CurrentDemandReq
  10707. DESCRIPTION:
  10708. PRE-CONDITION:
  10709. INPUT:
  10710. OUTPUT:
  10711. GLOBAL VARIABLES:
  10712. =============================================================================*/
  10713. int Proc_iso1_CurrentDemandReq(int AcceptFd)
  10714. {
  10715. int errn = 0;
  10716. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CurrentDemandReq] Got CurrentDemandReq\n");
  10717. //Print the decoded XML Document
  10718. PRINT_XML_DOC_ISO1_CurrentDemandReq(&ccs_exi_doc_ISO1);
  10719. //Save into Share Memory
  10720. SHM_Save_iso1_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10721. //Check for EV Error Code
  10722. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  10723. errn = Proc_iso1_CurrentDemandRes(AcceptFd);
  10724. if (errn == 0)
  10725. {
  10726. //Response is sent successfully.
  10727. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]CurrentDemandRes");
  10728. }
  10729. else
  10730. {
  10731. sprintf(buf_log_evcomm,
  10732. "[ISO1][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  10733. errn);
  10734. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10735. }
  10736. return errn;
  10737. }
  10738. /*===========================================================================
  10739. FUNCTION: Proc_iso1_ChargingStatusReq
  10740. DESCRIPTION:
  10741. PRE-CONDITION:
  10742. INPUT:
  10743. OUTPUT:
  10744. GLOBAL VARIABLES:
  10745. =============================================================================*/
  10746. int Proc_iso1_ChargingStatusReq(int AcceptFd)
  10747. {
  10748. int errn = 0;
  10749. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargingStatusReq] Got ChargingStatusReq\n");
  10750. //Print the decoded XML Document
  10751. PRINT_XML_DOC_ISO1_ChargingStatusReq(&ccs_exi_doc_ISO1);
  10752. //Save into Share Memory
  10753. SHM_Save_iso1_ChargingStatusReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10754. //Check for EV Error Code
  10755. //no content in ISO1
  10756. errn = Proc_iso1_ChargingStatusRes(AcceptFd);
  10757. if (errn == 0)
  10758. {
  10759. //Response is sent successfully.
  10760. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ChargingStatusRes");
  10761. }
  10762. else
  10763. {
  10764. sprintf(buf_log_evcomm,
  10765. "[ISO1][Error][ChargingStatusReq]ChargingStatusRes: fail(%d,DEC)",
  10766. errn);
  10767. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10768. }
  10769. return errn;
  10770. }
  10771. /*===========================================================================
  10772. FUNCTION: Proc_din_PowerDeliveryStopRes
  10773. DESCRIPTION:
  10774. PRE-CONDITION:
  10775. INPUT:
  10776. OUTPUT:
  10777. GLOBAL VARIABLES:
  10778. =============================================================================*/
  10779. int Proc_din_PowerDeliveryStopRes(int AcceptFd)
  10780. {
  10781. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10782. //if it is not the same, the packet should be ignored.
  10783. //STEP 1: ============ Initialize ============
  10784. int i = 0;
  10785. int errn = 0;
  10786. bitstream_t v2g_tx_stream;
  10787. struct dinPowerDeliveryResType *res;
  10788. struct ChargingInfoData *sys;
  10789. size_t pos = 0;
  10790. v2g_tx_stream.pos = &pos;
  10791. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10792. v2g_tx_stream.data = V2GTP_Tx_buf;
  10793. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  10794. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10795. res->ResponseCode = OK_DIN70121;
  10796. //[HEADER] Check Req SessionID
  10797. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10798. {
  10799. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10800. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10801. errn = -1;
  10802. }
  10803. //Check for SequenceError
  10804. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10805. {
  10806. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10807. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10808. errn = -1;
  10809. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10810. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10811. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10812. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10813. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10814. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10815. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10816. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10817. }
  10818. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10819. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10820. #if PARAMETER_NORMAL_MODE == ENABLE
  10821. ShmCcsData->V2GMessage_DIN70121.PowerDeliveryResponse.DC_EVSEStatus.EVSEStatusCode = EVSE_NotReady;
  10822. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  10823. #else
  10824. Sudo_Parameter_din_PreChargeRes();
  10825. #endif
  10826. //EVSE Status Code
  10827. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10828. //Check for CSU command of "Stop by EVSE"
  10829. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10830. {
  10831. //res->ResponseCode = FAILED_DIN70121;
  10832. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10833. }
  10834. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10835. {
  10836. //res->ResponseCode = FAILED_DIN70121;
  10837. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10838. errn = -1;
  10839. }
  10840. else if (ShmInternalComm->ChargingPermission == FALSE)
  10841. {
  10842. //res->ResponseCode = FAILED_DIN70121;
  10843. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10844. }
  10845. //STEP 4: ============ Encode and Send Response Message ===========
  10846. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10847. {
  10848. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PowerDeliveryStopRes][Error]Tx encoded msg error");
  10849. errn = -1;
  10850. }
  10851. //STEP 5: ============ Update Flags ===========
  10852. return errn;
  10853. }
  10854. /*===========================================================================
  10855. FUNCTION: Proc_iso1_PowerDeliveryStopRes
  10856. DESCRIPTION:
  10857. PRE-CONDITION:
  10858. INPUT:
  10859. OUTPUT:
  10860. GLOBAL VARIABLES:
  10861. =============================================================================*/
  10862. int Proc_iso1_PowerDeliveryStopRes(int AcceptFd)
  10863. {
  10864. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10865. //if it is not the same, the packet should be ignored.
  10866. //STEP 1: ============ Initialize ============
  10867. int i = 0;
  10868. int errn = 0;
  10869. bitstream_t v2g_tx_stream;
  10870. struct iso1PowerDeliveryResType *res;
  10871. struct ChargingInfoData *sys;
  10872. size_t pos = 0;
  10873. v2g_tx_stream.pos = &pos;
  10874. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10875. v2g_tx_stream.data = V2GTP_Tx_buf;
  10876. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  10877. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10878. res->ResponseCode = OK_ISO15118_2014;
  10879. //[HEADER] Check Req SessionID
  10880. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10881. {
  10882. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10883. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  10884. errn = -1;
  10885. }
  10886. //Check for SequenceError
  10887. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10888. {
  10889. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10890. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  10891. errn = -1;
  10892. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10893. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10894. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10895. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10896. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10897. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10898. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10899. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10900. }
  10901. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10902. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10903. #if PARAMETER_NORMAL_MODE == ENABLE
  10904. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  10905. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryResponse.DC_EVSEStatus.DC_EVSEStatusCode = EVSE_NotReady;
  10906. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10907. #else
  10908. Sudo_Parameter_iso1_PreChargeRes();
  10909. #endif
  10910. //EVSE Status Code
  10911. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10912. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1 /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10913. //Check for CSU command of "Stop by EVSE"
  10914. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10915. {
  10916. //res->ResponseCode = FAILED_ISO15118_2014;
  10917. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10918. }
  10919. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10920. {
  10921. //res->ResponseCode = FAILED_ISO15118_2014;
  10922. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10923. errn = -1;
  10924. }
  10925. else if (ShmInternalComm->ChargingPermission == FALSE)
  10926. {
  10927. //res->ResponseCode = FAILED_ISO15118_2014;
  10928. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10929. }
  10930. //STEP 4: ============ Encode and Send Response Message ===========
  10931. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10932. {
  10933. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PowerDeliveryStopRes][Error]Tx encoded msg error");
  10934. errn = -1;
  10935. }
  10936. //STEP 5: ============ Update Flags ===========
  10937. return errn;
  10938. }
  10939. /*===========================================================================
  10940. FUNCTION: Proc_din_PowerDeliveryStopReq
  10941. DESCRIPTION:
  10942. PRE-CONDITION:
  10943. INPUT:
  10944. OUTPUT:
  10945. GLOBAL VARIABLES:
  10946. =============================================================================*/
  10947. int Proc_din_PowerDeliveryStopReq(int AcceptFd)
  10948. {
  10949. int errn = 0;
  10950. struct ChargingInfoData *sys;
  10951. //Request CSU to STOP
  10952. //This should be reponsed as soon as possible once this message is received.
  10953. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10954. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  10955. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  10956. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd)\n");
  10957. //Print the decoded XML Document
  10958. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  10959. //Save into Share Memory
  10960. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10961. //Check for EV Error Code
  10962. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  10963. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10964. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  10965. usleep(1500000); //1.5 seconds
  10966. //sleep(1); //1 second
  10967. errn = Proc_din_PowerDeliveryStopRes(AcceptFd);
  10968. if (errn == 0)
  10969. {
  10970. //send response successfully.
  10971. SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PowerDeliveryRes (2nd)\n");
  10972. }
  10973. else
  10974. {
  10975. sprintf(buf_log_evcomm,
  10976. "[Error][SeccComm][Proc_din_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  10977. errn);
  10978. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  10979. }
  10980. return errn;
  10981. }
  10982. /*===========================================================================
  10983. FUNCTION: Proc_iso1_PowerDeliveryStopReq
  10984. DESCRIPTION:
  10985. PRE-CONDITION:
  10986. INPUT:
  10987. OUTPUT:
  10988. GLOBAL VARIABLES:
  10989. =============================================================================*/
  10990. int Proc_iso1_PowerDeliveryStopReq(int AcceptFd)
  10991. {
  10992. int errn = 0;
  10993. struct ChargingInfoData *sys;
  10994. //Request CSU to STOP
  10995. //This should be reponsed as soon as possible once this message is received.
  10996. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10997. //Print the decoded XML Document
  10998. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  10999. //Save into Share Memory
  11000. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11001. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  11002. {
  11003. //CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11004. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  11005. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  11006. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11007. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd-Stop)\n");
  11008. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  11009. usleep(1500000); //1.5 seconds
  11010. //sleep(1); //1 second
  11011. }
  11012. else
  11013. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd-Renegotiation)\n");
  11014. //Check for EV Error Code
  11015. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  11016. errn = Proc_iso1_PowerDeliveryStopRes(AcceptFd);
  11017. if (errn == 0)
  11018. {
  11019. //send response successfully.
  11020. SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PowerDeliveryRes (2nd-stop)");
  11021. }
  11022. else
  11023. {
  11024. sprintf(buf_log_evcomm,
  11025. "[Error][SeccComm][Proc_iso1_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  11026. errn);
  11027. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11028. }
  11029. return errn;
  11030. }
  11031. /*===========================================================================
  11032. FUNCTION: SHM_Init_din_WeldingDetectionRes
  11033. DESCRIPTION:
  11034. PRE-CONDITION:
  11035. INPUT:
  11036. 1. shm_ccs
  11037. OUTPUT:
  11038. 1. shm_ccs
  11039. GLOBAL VARIABLES:
  11040. =============================================================================*/
  11041. void SHM_Init_din_WeldingDetectionRes(struct CcsData *shm_ccs)
  11042. {
  11043. struct WeldingDetectionResponse_DIN70121 *in;
  11044. in = &shm_ccs->V2GMessage_DIN70121.WeldingDetectionResponse;
  11045. //----- [BODY (1/3)] ResponseCode -----
  11046. in->ResponseCode = dinresponseCodeType_OK;
  11047. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11048. short value = 0; int multiplier = 0; unsigned char unit = 0;
  11049. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  11050. value = 0; multiplier = 0; unit = V_DIN70121;
  11051. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  11052. //----- [BODY (3/3)] DC_EVSEStatus -----
  11053. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  11054. }
  11055. /*===========================================================================
  11056. FUNCTION: Sudo_Parameter_din_WeldingDetectionRes
  11057. DESCRIPTION:
  11058. PRE-CONDITION:
  11059. INPUT:
  11060. OUTPUT:
  11061. GLOBAL VARIABLES:
  11062. =============================================================================*/
  11063. void Sudo_Parameter_din_WeldingDetectionRes()
  11064. {
  11065. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  11066. init_dinWeldingDetectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes);
  11067. ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  11068. //----- [BODY (1/3)] ResponseCode -----
  11069. struct dinWeldingDetectionResType *res;
  11070. res = &ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes;
  11071. res->ResponseCode = dinresponseCodeType_OK;
  11072. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11073. res->EVSEPresentVoltage.Value = 3820;
  11074. res->EVSEPresentVoltage.Multiplier = -1;
  11075. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  11076. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  11077. // dinunitSymbolType_h = 0,
  11078. // dinunitSymbolType_m = 1,
  11079. // dinunitSymbolType_s = 2,
  11080. // dinunitSymbolType_A = 3,
  11081. // dinunitSymbolType_Ah = 4,
  11082. // dinunitSymbolType_V = 5,
  11083. // dinunitSymbolType_VA = 6,
  11084. // dinunitSymbolType_W = 7,
  11085. // dinunitSymbolType_W_s = 8,
  11086. // dinunitSymbolType_Wh = 9
  11087. //----- [BODY (3/3)] DC_EVSEStatus -----
  11088. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  11089. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  11090. // dinisolationLevelType_Invalid = 0,
  11091. // dinisolationLevelType_Valid = 1,
  11092. // dinisolationLevelType_Warning = 2,
  11093. // dinisolationLevelType_Fault = 3
  11094. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  11095. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  11096. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  11097. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  11098. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  11099. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  11100. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  11101. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  11102. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  11103. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  11104. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  11105. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  11106. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  11107. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  11108. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  11109. // dinEVSENotificationType_None = 0,
  11110. // dinEVSENotificationType_StopCharging = 1,
  11111. // dinEVSENotificationType_ReNegotiation = 2
  11112. }
  11113. /*===========================================================================
  11114. FUNCTION: Sudo_Parameter_iso1_WeldingDetectionRes
  11115. DESCRIPTION:
  11116. PRE-CONDITION:
  11117. INPUT:
  11118. OUTPUT:
  11119. GLOBAL VARIABLES:
  11120. =============================================================================*/
  11121. void Sudo_Parameter_iso1_WeldingDetectionRes()
  11122. {
  11123. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  11124. init_iso1WeldingDetectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes);
  11125. ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  11126. //----- [BODY (1/3)] ResponseCode -----
  11127. struct iso1WeldingDetectionResType *res;
  11128. res = &ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes;
  11129. res->ResponseCode = iso1responseCodeType_OK;
  11130. //----- [BODY (2/3)] EVSEPresentVoltage -----
  11131. res->EVSEPresentVoltage.Value = 3820;
  11132. res->EVSEPresentVoltage.Multiplier = -1;
  11133. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  11134. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  11135. //iso1unitSymbolType_h = 0,
  11136. //iso1unitSymbolType_m = 1,
  11137. //iso1unitSymbolType_s = 2,
  11138. //iso1unitSymbolType_A = 3,
  11139. //iso1unitSymbolType_V = 4,
  11140. //iso1unitSymbolType_W = 5,
  11141. //iso1unitSymbolType_Wh = 6
  11142. //----- [BODY (3/3)] DC_EVSEStatus -----
  11143. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  11144. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  11145. //iso1isolationLevelType_Invalid = 0,
  11146. //iso1isolationLevelType_Valid = 1,
  11147. //iso1isolationLevelType_Warning = 2,
  11148. //iso1isolationLevelType_Fault = 3,
  11149. //iso1isolationLevelType_No_IMD = 4
  11150. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11151. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  11152. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  11153. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  11154. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  11155. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  11156. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  11157. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  11158. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  11159. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  11160. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  11161. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  11162. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  11163. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  11164. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  11165. //iso1EVSENotificationType_None = 0,
  11166. //iso1EVSENotificationType_StopCharging = 1,
  11167. //iso1EVSENotificationType_ReNegotiation = 2
  11168. }
  11169. /*===========================================================================
  11170. FUNCTION: Proc_din_WeldingDetectionRes
  11171. DESCRIPTION:
  11172. PRE-CONDITION:
  11173. INPUT:
  11174. OUTPUT:
  11175. GLOBAL VARIABLES:
  11176. =============================================================================*/
  11177. int Proc_din_WeldingDetectionRes(int AcceptFd)
  11178. {
  11179. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11180. //if it is not the same, the packet should be ignored.
  11181. //STEP 1: ============ Initialize ============
  11182. int i = 0;
  11183. int errn = 0;
  11184. bitstream_t v2g_tx_stream;
  11185. static struct WeldingDetectionResponse_DIN70121 *wel;
  11186. static struct ChargingInfoData *sys;
  11187. size_t pos = 0;
  11188. v2g_tx_stream.pos = &pos;
  11189. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11190. v2g_tx_stream.data = V2GTP_Tx_buf;
  11191. wel = &ShmCcsData->V2GMessage_DIN70121.WeldingDetectionResponse;
  11192. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11193. wel->ResponseCode = OK_DIN70121;
  11194. //[HEADER] Check Req SessionID
  11195. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  11196. {
  11197. wel->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  11198. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11199. errn = -1;
  11200. }
  11201. //Check for SequenceError
  11202. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11203. {
  11204. wel->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  11205. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11206. errn = -1;
  11207. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11208. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11209. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11210. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11211. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11212. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11213. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11214. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11215. }
  11216. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11217. SAVE_PhysicalValueType_DIN70121(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  11218. //EVSE Status Code
  11219. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  11220. //Check for CSU command of "Stop by EVSE"
  11221. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  11222. {
  11223. //wel->ResponseCode = FAILED_DIN70121;
  11224. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  11225. }
  11226. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  11227. {
  11228. //wel->ResponseCode = FAILED_DIN70121;
  11229. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11230. errn = -1;
  11231. }
  11232. else if (ShmInternalComm->ChargingPermission == FALSE)
  11233. {
  11234. //wel->ResponseCode = FAILED_DIN70121;
  11235. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  11236. }
  11237. //Isolation Status
  11238. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  11239. {
  11240. // wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  11241. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  11242. //wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11243. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11244. sprintf(buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  11245. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11246. //Update_V2G_Flow_Status(Other_Fault);
  11247. // errn = -1;
  11248. }
  11249. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  11250. {
  11251. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  11252. }
  11253. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  11254. {
  11255. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  11256. }
  11257. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  11258. {
  11259. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  11260. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11261. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11262. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_WeldingDetectionRes]GFD_Fault => Emergency Shutdown");
  11263. Update_V2G_Flow_Status(Other_Fault);
  11264. errn = -1;
  11265. }
  11266. else //GFD_No_IMD or other unexpected status
  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. sprintf(buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  11272. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11273. Update_V2G_Flow_Status(Other_Fault);
  11274. errn = -1;
  11275. }
  11276. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11277. #if PARAMETER_NORMAL_MODE == ENABLE
  11278. SHM_Read_din_WeldingDetectionRes(&ccs_exi_doc_DIN, ShmCcsData);
  11279. #else
  11280. Sudo_Parameter_din_WeldingDetectionRes();
  11281. #endif
  11282. //STEP 4: ============ Encode and Send Response Message ===========
  11283. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  11284. {
  11285. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_WeldingDetectionRes][Error]Tx encoded msg error");
  11286. errn = -1;
  11287. }
  11288. //STEP 5: ============ Update Flags ===========
  11289. return errn;
  11290. }
  11291. /*===========================================================================
  11292. FUNCTION: Proc_iso1_WeldingDetectionRes
  11293. DESCRIPTION:
  11294. PRE-CONDITION:
  11295. INPUT:
  11296. OUTPUT:
  11297. GLOBAL VARIABLES:
  11298. =============================================================================*/
  11299. int Proc_iso1_WeldingDetectionRes(int AcceptFd)
  11300. {
  11301. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11302. //if it is not the same, the packet should be ignored.
  11303. //STEP 1: ============ Initialize ============
  11304. int i = 0;
  11305. int errn = 0;
  11306. bitstream_t v2g_tx_stream;
  11307. static struct WeldingDetectionResponse_ISO15118_2014 *wel;
  11308. static struct ChargingInfoData *sys;
  11309. size_t pos = 0;
  11310. v2g_tx_stream.pos = &pos;
  11311. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11312. v2g_tx_stream.data = V2GTP_Tx_buf;
  11313. wel = &ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionResponse;
  11314. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11315. wel->ResponseCode = OK_ISO15118_2014;
  11316. //[HEADER] Check Req SessionID
  11317. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  11318. {
  11319. wel->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  11320. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11321. errn = -1;
  11322. }
  11323. //Check for SequenceError
  11324. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11325. {
  11326. wel->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  11327. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11328. errn = -1;
  11329. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11330. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11331. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11332. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11333. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11334. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11335. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11336. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11337. }
  11338. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11339. SAVE_PhysicalValueType_ISO15118_2014(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  11340. //EVSE Status Code
  11341. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11342. //Check for CSU command of "Stop by EVSE"
  11343. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  11344. {
  11345. //wel->ResponseCode = FAILED_ISO15118_2014;
  11346. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11347. }
  11348. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  11349. {
  11350. //wel->ResponseCode = FAILED_ISO15118_2014;
  11351. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11352. errn = -1;
  11353. }
  11354. else if (ShmInternalComm->ChargingPermission == FALSE)
  11355. {
  11356. //wel->ResponseCode = FAILED_ISO15118_2014;
  11357. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  11358. }
  11359. //Isolation Status
  11360. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  11361. {
  11362. //wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  11363. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  11364. // wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11365. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11366. sprintf(buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  11367. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11368. // Update_V2G_Flow_Status(Other_Fault);
  11369. // errn = -1;
  11370. }
  11371. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  11372. {
  11373. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  11374. }
  11375. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  11376. {
  11377. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  11378. }
  11379. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  11380. {
  11381. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  11382. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  11383. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11384. SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_WeldingDetectionRes]GFD_Fault => EmergencyShutdown");
  11385. Update_V2G_Flow_Status(Other_Fault);
  11386. errn = -1;
  11387. }
  11388. else
  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. sprintf(buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  11394. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11395. Update_V2G_Flow_Status(Other_Fault);
  11396. errn = -1;
  11397. }
  11398. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11399. #if PARAMETER_NORMAL_MODE == ENABLE
  11400. SHM_Read_iso1_WeldingDetectionRes(&ccs_exi_doc_ISO1, ShmCcsData);
  11401. #else
  11402. Sudo_Parameter_iso1_WeldingDetectionRes();
  11403. #endif
  11404. //STEP 4: ============ Encode and Send Response Message ===========
  11405. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  11406. {
  11407. SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_WeldingDetectionRes][Error]Tx encoded msg error");
  11408. errn = -1;
  11409. }
  11410. //STEP 5: ============ Update Flags ===========
  11411. return errn;
  11412. }
  11413. /*===========================================================================
  11414. FUNCTION: Proc_din_WeldingDetectionReq
  11415. DESCRIPTION:
  11416. PRE-CONDITION:
  11417. INPUT:
  11418. OUTPUT:
  11419. GLOBAL VARIABLES:
  11420. =============================================================================*/
  11421. int Proc_din_WeldingDetectionReq(int AcceptFd)
  11422. {
  11423. int errn = 0;
  11424. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_WeldingDetectionReq] Got WeldingDetectionReq\n");
  11425. //Print the decoded XML Document
  11426. PRINT_XML_DOC_DIN_WeldingDetectionReq(&ccs_exi_doc_DIN);
  11427. //Save into Share Memory
  11428. SHM_Save_din_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  11429. //Check for EV Error Code
  11430. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  11431. errn = Proc_din_WeldingDetectionRes(AcceptFd);
  11432. if (errn == 0)
  11433. {
  11434. //send response successfully.
  11435. //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]WeldingDetectionRes");
  11436. }
  11437. else
  11438. {
  11439. sprintf(buf_log_evcomm,
  11440. "[Error][SeccComm][Proc_din_WeldingDetectionReq]Proc_din_WeldingDetectionRes(): %d (DEC)",
  11441. errn);
  11442. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11443. }
  11444. return errn;
  11445. }
  11446. /*===========================================================================
  11447. FUNCTION: Proc_iso1_WeldingDetectionReq
  11448. DESCRIPTION:
  11449. PRE-CONDITION:
  11450. INPUT:
  11451. OUTPUT:
  11452. GLOBAL VARIABLES:
  11453. =============================================================================*/
  11454. int Proc_iso1_WeldingDetectionReq(int AcceptFd)
  11455. {
  11456. int errn = 0;
  11457. //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_WeldingDetectionReq] Got WeldingDetectionReq\n");
  11458. //Print the decoded XML Document
  11459. PRINT_XML_DOC_ISO1_WeldingDetectionReq(&ccs_exi_doc_ISO1);
  11460. //Save into Share Memory
  11461. SHM_Save_iso1_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11462. //Check for EV Error Code
  11463. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  11464. errn = Proc_iso1_WeldingDetectionRes(AcceptFd);
  11465. if (errn == 0)
  11466. {
  11467. //send response successfully.
  11468. //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]WeldingDetectionRes");
  11469. }
  11470. else
  11471. {
  11472. sprintf(buf_log_evcomm,
  11473. "[Error][SeccComm][Proc_iso1_WeldingDetectionReq]Proc_iso1_WeldingDetectionRes(): %d (DEC)",
  11474. errn);
  11475. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11476. }
  11477. return errn;
  11478. }
  11479. /*===========================================================================
  11480. FUNCTION: SHM_Init_din_SessionStopRes
  11481. DESCRIPTION:
  11482. PRE-CONDITION:
  11483. INPUT:
  11484. 1. shm_ccs
  11485. OUTPUT:
  11486. 1. shm_ccs
  11487. GLOBAL VARIABLES:
  11488. =============================================================================*/
  11489. void SHM_Init_din_SessionStopRes(struct CcsData *shm_ccs)
  11490. {
  11491. struct SessionStopResponse_DIN70121 *in;
  11492. in = &shm_ccs->V2GMessage_DIN70121.SessionStopResponse;
  11493. //----- [BODY (1/3)] ResponseCode -----
  11494. in->ResponseCode = dinresponseCodeType_OK;
  11495. }
  11496. /*===========================================================================
  11497. FUNCTION: Sudo_Parameter_din_SessionStopRes
  11498. DESCRIPTION:
  11499. PRE-CONDITION:
  11500. INPUT:
  11501. OUTPUT:
  11502. GLOBAL VARIABLES:
  11503. =============================================================================*/
  11504. void Sudo_Parameter_din_SessionStopRes()
  11505. {
  11506. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  11507. init_dinSessionStopResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes);
  11508. ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  11509. //----- [BODY (1/3)] ResponseCode -----
  11510. struct dinSessionStopResType *res;
  11511. res = &ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes;
  11512. res->ResponseCode = dinresponseCodeType_OK;
  11513. }
  11514. /*===========================================================================
  11515. FUNCTION: Sudo_Parameter_iso1_SessionStopRes
  11516. DESCRIPTION:
  11517. PRE-CONDITION:
  11518. INPUT:
  11519. OUTPUT:
  11520. GLOBAL VARIABLES:
  11521. =============================================================================*/
  11522. void Sudo_Parameter_iso1_SessionStopRes()
  11523. {
  11524. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  11525. init_iso1SessionStopResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes);
  11526. ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  11527. //----- [BODY (1/3)] ResponseCode -----
  11528. struct iso1SessionStopResType *res;
  11529. res = &ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes;
  11530. res->ResponseCode = iso1responseCodeType_OK;
  11531. }
  11532. /*===========================================================================
  11533. FUNCTION: Proc_din_SessionStopRes
  11534. DESCRIPTION:
  11535. PRE-CONDITION:
  11536. INPUT:
  11537. OUTPUT:
  11538. GLOBAL VARIABLES:
  11539. =============================================================================*/
  11540. int Proc_din_SessionStopRes(int AcceptFd)
  11541. {
  11542. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11543. //if it is not the same, the packet should be ignored.
  11544. //STEP 1: ============ Initialize ============
  11545. int i = 0;
  11546. int errn = 0;
  11547. bitstream_t v2g_tx_stream;
  11548. struct SessionStopResponse_DIN70121 *stp;
  11549. struct ChargingInfoData *sys;
  11550. size_t pos = 0;
  11551. v2g_tx_stream.pos = &pos;
  11552. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11553. v2g_tx_stream.data = V2GTP_Tx_buf;
  11554. stp = &ShmCcsData->V2GMessage_DIN70121.SessionStopResponse;
  11555. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11556. stp->ResponseCode = OK_DIN70121;
  11557. //[HEADER] Check Req SessionID
  11558. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  11559. {
  11560. stp->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  11561. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11562. errn = -1;
  11563. }
  11564. //Check for SequenceError
  11565. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11566. {
  11567. stp->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  11568. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11569. errn = -1;
  11570. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11571. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11572. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11573. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11574. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11575. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11576. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11577. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11578. }
  11579. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11580. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11581. #if PARAMETER_NORMAL_MODE == ENABLE
  11582. SHM_Read_din_SessionStopRes(&ccs_exi_doc_DIN, ShmCcsData);
  11583. #else
  11584. Sudo_Parameter_din_SessionStopRes();
  11585. #endif
  11586. //STEP 4: ============ Encode and Send Response Message ===========
  11587. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  11588. {
  11589. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes: fail");
  11590. errn = -1;
  11591. }
  11592. else
  11593. {
  11594. //send response successfully.
  11595. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes");
  11596. }
  11597. //STEP 5: ============ Update Flags ===========
  11598. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  11599. //Once this is set, the CSU should
  11600. // =========== Annouce to CSU [To-Be Implemented]=============
  11601. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  11602. // =========== Re-initialized [To-Be Implemented]=============
  11603. //Keep 5% PWM for 2 seconds
  11604. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 2");
  11605. sleep(1);
  11606. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 1");
  11607. sleep(1);
  11608. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 0");
  11609. OutputCpPwmDuty(100);
  11610. //[To-Do] Reset All Share memory
  11611. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  11612. //system("reboot -f");
  11613. //sleep(5);
  11614. //system("reboot -f");
  11615. return errn;
  11616. }
  11617. /*===========================================================================
  11618. FUNCTION: Proc_iso1_SessionStopRes
  11619. DESCRIPTION:
  11620. PRE-CONDITION:
  11621. INPUT:
  11622. OUTPUT:
  11623. GLOBAL VARIABLES:
  11624. =============================================================================*/
  11625. int Proc_iso1_SessionStopRes(int AcceptFd)
  11626. {
  11627. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  11628. //if it is not the same, the packet should be ignored.
  11629. //STEP 1: ============ Initialize ============
  11630. int i = 0;
  11631. int errn = 0;
  11632. bitstream_t v2g_tx_stream;
  11633. struct SessionStopResponse_ISO15118_2014 *stp;
  11634. struct ChargingInfoData *sys;
  11635. size_t pos = 0;
  11636. v2g_tx_stream.pos = &pos;
  11637. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  11638. v2g_tx_stream.data = V2GTP_Tx_buf;
  11639. stp = &ShmCcsData->V2GMessage_ISO15118_2014.SessionStopResponse;
  11640. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  11641. stp->ResponseCode = OK_ISO15118_2014;
  11642. //[HEADER] Check Req SessionID
  11643. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  11644. {
  11645. stp->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  11646. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
  11647. errn = -1;
  11648. }
  11649. //Check for SequenceError
  11650. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  11651. {
  11652. stp->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  11653. SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
  11654. errn = -1;
  11655. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11656. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  11657. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11658. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11659. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11660. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  11661. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11662. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  11663. }
  11664. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  11665. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  11666. #if PARAMETER_NORMAL_MODE == ENABLE
  11667. SHM_Read_iso1_SessionStopRes(&ccs_exi_doc_ISO1, ShmCcsData);
  11668. #else
  11669. Sudo_Parameter_iso1_SessionStopRes();
  11670. #endif
  11671. //STEP 4: ============ Encode and Send Response Message ===========
  11672. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  11673. {
  11674. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes: fail");
  11675. errn = -1;
  11676. }
  11677. else
  11678. {
  11679. //send response successfully.
  11680. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes");
  11681. }
  11682. //STEP 5: ============ Update Flags ===========
  11683. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  11684. //Once this is set, the CSU should
  11685. // =========== Annouce to CSU [To-Be Implemented]=============
  11686. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  11687. // =========== Re-initialized [To-Be Implemented]=============
  11688. //Keep 5% PWM for 2 seconds
  11689. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 2");
  11690. sleep(1);
  11691. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 1");
  11692. sleep(1);
  11693. SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 0");
  11694. OutputCpPwmDuty(100);
  11695. //[To-Do] Reset All Share memory
  11696. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  11697. //system("reboot -f");
  11698. //sleep(5);
  11699. //system("reboot -f");
  11700. return errn;
  11701. }
  11702. /*===========================================================================
  11703. FUNCTION: Proc_din_SessionStopReq
  11704. DESCRIPTION:
  11705. PRE-CONDITION:
  11706. INPUT:
  11707. OUTPUT:
  11708. GLOBAL VARIABLES:
  11709. =============================================================================*/
  11710. int Proc_din_SessionStopReq(int AcceptFd)
  11711. {
  11712. int errn = 0;
  11713. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]SessionStopReq");
  11714. //Print the decoded XML Document
  11715. PRINT_XML_DOC_DIN_SessionStopReq(&ccs_exi_doc_DIN);
  11716. //Save into Share Memory
  11717. SHM_Save_din_SessionStopReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  11718. errn = Proc_din_SessionStopRes(AcceptFd);
  11719. if (errn == 0)
  11720. {
  11721. //send response successfully.
  11722. }
  11723. else
  11724. {
  11725. sprintf(buf_log_evcomm,
  11726. "[Error][SeccComm][Proc_din_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  11727. errn);
  11728. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11729. }
  11730. return errn;
  11731. }
  11732. /*===========================================================================
  11733. FUNCTION: Proc_iso1_SessionStopReq
  11734. DESCRIPTION:
  11735. PRE-CONDITION:
  11736. INPUT:
  11737. OUTPUT:
  11738. GLOBAL VARIABLES:
  11739. =============================================================================*/
  11740. int Proc_iso1_SessionStopReq(int AcceptFd)
  11741. {
  11742. int errn = 0;
  11743. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]SessionStopReq");
  11744. //Print the decoded XML Document
  11745. PRINT_XML_DOC_ISO1_SessionStopReq(&ccs_exi_doc_ISO1);
  11746. //Save into Share Memory
  11747. SHM_Save_iso1_SessionStopReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  11748. errn = Proc_iso1_SessionStopRes(AcceptFd);
  11749. if (errn == 0)
  11750. {
  11751. //send response successfully.
  11752. }
  11753. else
  11754. {
  11755. sprintf(buf_log_evcomm,
  11756. "[Error][SeccComm][Proc_iso1_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  11757. errn);
  11758. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  11759. }
  11760. return errn;
  11761. }
  11762. /*===========================================================================
  11763. FUNCTION: V2gMsg_Process_din
  11764. DESCRIPTION:
  11765. PRE-CONDITION:
  11766. INPUT:
  11767. 1. V2gFlowStatus
  11768. OUTPUT:
  11769. GLOBAL VARIABLES:
  11770. 1. V2gFlowStatus
  11771. =============================================================================*/
  11772. int V2gMsg_Process_din(int AcceptFd)
  11773. {
  11774. unsigned char req_is_responsed = FALSE;
  11775. while (req_is_responsed == FALSE)
  11776. {
  11777. //Check if it is in End_Process
  11778. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  11779. {
  11780. break;
  11781. }
  11782. switch(V2gFlowStatus)
  11783. {
  11784. //-------------------------------------------
  11785. case SupportedAppProtocolRequest:
  11786. {
  11787. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  11788. {
  11789. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  11790. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  11791. {
  11792. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11793. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  11794. }
  11795. else
  11796. {
  11797. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  11798. Update_V2G_Flow_Status(Other_Fault);
  11799. }
  11800. }
  11801. req_is_responsed = TRUE;
  11802. break;
  11803. }
  11804. case SupportedAppProtocolResponse:
  11805. {
  11806. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  11807. {
  11808. Update_V2G_Flow_Status(SessionSetupRequest);
  11809. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11810. }
  11811. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11812. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11813. {
  11814. sprintf(buf_log_evcomm,
  11815. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11816. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11817. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11818. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11819. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11820. }
  11821. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11822. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11823. {
  11824. sprintf(buf_log_evcomm,
  11825. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11826. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11827. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11828. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11829. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11830. {
  11831. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11832. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11833. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11834. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11835. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11836. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11837. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11838. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11839. }
  11840. }
  11841. else
  11842. {
  11843. break;
  11844. }
  11845. break;
  11846. }
  11847. //-------------------------------------------
  11848. case SessionSetupRequest: //19
  11849. {
  11850. if (Proc_din_SessionSetupReq(AcceptFd) == 0)
  11851. {
  11852. Update_V2G_Flow_Status(SessionSetupResponse);
  11853. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11854. }
  11855. else
  11856. {
  11857. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  11858. Update_V2G_Flow_Status(Other_Fault);
  11859. }
  11860. req_is_responsed = TRUE;
  11861. break;
  11862. }
  11863. case SessionSetupResponse: //20
  11864. {
  11865. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  11866. {
  11867. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  11868. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11869. }
  11870. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11871. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11872. {
  11873. sprintf(buf_log_evcomm,
  11874. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11875. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11876. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11877. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11878. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11879. }
  11880. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11881. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11882. {
  11883. sprintf(buf_log_evcomm,
  11884. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11885. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11886. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11887. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11888. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11889. {
  11890. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11891. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11892. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11893. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11894. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11895. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11896. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11897. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11898. }
  11899. }
  11900. else
  11901. {
  11902. break;
  11903. }
  11904. break;
  11905. }
  11906. //-------------------------------------------
  11907. case ServiceDiscoveryRequest: //21
  11908. {
  11909. if (Proc_din_ServiceDiscoveryReq(AcceptFd) == 0)
  11910. {
  11911. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  11912. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11913. }
  11914. else
  11915. {
  11916. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  11917. Update_V2G_Flow_Status(Other_Fault);
  11918. }
  11919. req_is_responsed = TRUE;
  11920. break;
  11921. }
  11922. case ServiceDiscoveryResponse: //22
  11923. {
  11924. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  11925. {
  11926. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  11927. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11928. }
  11929. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11930. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11931. {
  11932. sprintf(buf_log_evcomm,
  11933. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11934. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11935. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11936. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11937. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11938. }
  11939. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11940. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11941. {
  11942. sprintf(buf_log_evcomm,
  11943. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  11944. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11945. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11946. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11947. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  11948. {
  11949. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11950. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11951. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11952. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  11953. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  11954. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  11955. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  11956. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  11957. }
  11958. }
  11959. else
  11960. {
  11961. break;
  11962. }
  11963. break;
  11964. }
  11965. //-------------------------------------------
  11966. case ServiceAndPaymentSelectionRequest: //25
  11967. {
  11968. if (Proc_din_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  11969. {
  11970. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  11971. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11972. }
  11973. else
  11974. {
  11975. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  11976. Update_V2G_Flow_Status(Other_Fault);
  11977. }
  11978. req_is_responsed = TRUE;
  11979. break;
  11980. }
  11981. case ServiceAndPaymentSelectionResponse: //26
  11982. {
  11983. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11984. {
  11985. Update_V2G_Flow_Status(AuthorizationRequest);
  11986. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11987. }
  11988. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11989. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  11990. {
  11991. sprintf(buf_log_evcomm,
  11992. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11993. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11994. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11995. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11996. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11997. }
  11998. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  11999. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12000. {
  12001. sprintf(buf_log_evcomm,
  12002. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12003. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12004. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12005. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12006. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12007. {
  12008. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12009. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12010. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12011. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12012. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12013. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12014. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12015. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12016. }
  12017. }
  12018. else
  12019. {
  12020. break;
  12021. }
  12022. break;
  12023. }
  12024. //-------------------------------------------
  12025. //case ContractAuthenticationReq:
  12026. case AuthorizationRequest: //29
  12027. {
  12028. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  12029. {
  12030. Update_V2G_Flow_Status(AuthorizationResponse);
  12031. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12032. }
  12033. else
  12034. {
  12035. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  12036. Update_V2G_Flow_Status(Other_Fault);
  12037. }
  12038. req_is_responsed = TRUE;
  12039. break;
  12040. }
  12041. case AuthorizationResponse: //30
  12042. {
  12043. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12044. {
  12045. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12046. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  12047. {
  12048. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12049. }
  12050. else
  12051. {
  12052. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  12053. Update_V2G_Flow_Status(Other_Fault);
  12054. }
  12055. req_is_responsed = TRUE;
  12056. break;
  12057. }
  12058. //Check for ChargeParameterDiscoveryReq
  12059. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12060. {
  12061. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12062. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  12063. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  12064. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12065. ftime(&SeqStartTime);
  12066. #endif
  12067. }
  12068. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12069. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12070. {
  12071. sprintf(buf_log_evcomm,
  12072. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12073. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12074. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12075. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12076. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12077. }
  12078. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12079. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12080. {
  12081. sprintf(buf_log_evcomm,
  12082. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12083. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12084. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12085. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12086. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12087. {
  12088. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12089. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12090. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12091. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12092. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12093. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12094. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12095. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12096. }
  12097. }
  12098. else
  12099. {
  12100. break;
  12101. }
  12102. break;
  12103. }
  12104. //-------------------------------------------
  12105. case ChargeParameterDiscoveryRequest: //35
  12106. {
  12107. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12108. {
  12109. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  12110. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12111. }
  12112. else
  12113. {
  12114. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  12115. Update_V2G_Flow_Status(Other_Fault);
  12116. }
  12117. req_is_responsed = TRUE;
  12118. break;
  12119. }
  12120. case ChargeParameterDiscoveryResponse:
  12121. {
  12122. //STEP 1: Check for Process Timeout
  12123. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12124. ftime(&SeqEndTime);
  12125. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  12126. {
  12127. sprintf(buf_log_evcomm,
  12128. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  12129. DiffTimeb(SeqStartTime, SeqEndTime),
  12130. V2G_SECC_ChargingParameter_Performance_Time);
  12131. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12132. Update_V2G_Flow_Status(Sequence_Timeout);
  12133. break;
  12134. }
  12135. #endif
  12136. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12137. {
  12138. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12139. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12140. {
  12141. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12142. }
  12143. else
  12144. {
  12145. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  12146. Update_V2G_Flow_Status(Other_Fault);
  12147. }
  12148. req_is_responsed = TRUE;
  12149. break;
  12150. }
  12151. //STEP 2: Check for CableCheckReq message
  12152. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  12153. {
  12154. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12155. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  12156. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  12157. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  12158. Update_V2G_Flow_Status(CableCheckRequest);
  12159. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12160. ftime(&SeqStartTime);
  12161. #endif
  12162. }
  12163. //STEP 3: Wait for PowerDeliveryReq Message
  12164. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12165. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12166. {
  12167. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12168. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12169. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12170. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12171. ftime(&SeqStartTime);
  12172. #endif
  12173. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12174. {
  12175. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12176. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12177. }
  12178. else
  12179. {
  12180. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12181. Update_V2G_Flow_Status(Other_Fault);
  12182. }
  12183. break;
  12184. }
  12185. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12186. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12187. {
  12188. sprintf(buf_log_evcomm,
  12189. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12190. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12191. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12192. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12193. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12194. }
  12195. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12196. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12197. {
  12198. sprintf(buf_log_evcomm,
  12199. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12200. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12201. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12202. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12203. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12204. {
  12205. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12206. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12207. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12208. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12209. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12210. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12211. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12212. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12213. }
  12214. }
  12215. else
  12216. {
  12217. break;
  12218. }
  12219. break;
  12220. }
  12221. //-------------------------------------------
  12222. case CableCheckRequest: //37
  12223. {
  12224. //STEP 3: Execute Cable Check Process
  12225. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  12226. {
  12227. Update_V2G_Flow_Status(CableCheckResponse);
  12228. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12229. }
  12230. else
  12231. {
  12232. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  12233. Update_V2G_Flow_Status(Other_Fault);
  12234. }
  12235. req_is_responsed = TRUE;
  12236. break;
  12237. }
  12238. case CableCheckResponse: //38
  12239. {
  12240. //STEP 1: Check for Process Timeout
  12241. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12242. ftime(&SeqEndTime);
  12243. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  12244. {
  12245. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  12246. sprintf(buf_log_evcomm,
  12247. "CableCheck Timeout - (%.02lf of %d ms)\n",
  12248. DiffTimeb(SeqStartTime, SeqEndTime),
  12249. V2G_SECC_CableCheck_Performance_Time);
  12250. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12251. Update_V2G_Flow_Status(Sequence_Timeout);
  12252. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12253. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  12254. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12255. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12256. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12257. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12258. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  12259. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  12260. break;
  12261. }
  12262. #endif
  12263. //STEP 2: Check for CableCheckReq message
  12264. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  12265. {
  12266. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12267. //STEP 3: Execute Cable Check Process
  12268. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  12269. {
  12270. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12271. }
  12272. else
  12273. {
  12274. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  12275. Update_V2G_Flow_Status(Other_Fault);
  12276. }
  12277. req_is_responsed = TRUE;
  12278. break;
  12279. }
  12280. //STEP 3: Check for PreChargeReq message
  12281. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12282. {
  12283. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12284. Update_V2G_Flow_Status(PreChargeRequest);
  12285. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  12286. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  12287. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  12288. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12289. ftime(&SeqStartTime);
  12290. #endif
  12291. }
  12292. //STEP 3: Wait for PowerDeliveryReq Message
  12293. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12294. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12295. {
  12296. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12297. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12298. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12299. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12300. ftime(&SeqStartTime);
  12301. #endif
  12302. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12303. {
  12304. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12305. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12306. }
  12307. else
  12308. {
  12309. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12310. Update_V2G_Flow_Status(Other_Fault);
  12311. }
  12312. break;
  12313. }
  12314. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12315. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12316. {
  12317. sprintf(buf_log_evcomm,
  12318. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12319. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12320. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12321. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12322. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12323. }
  12324. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12325. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12326. {
  12327. sprintf(buf_log_evcomm,
  12328. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12329. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12330. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12331. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12332. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12333. {
  12334. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12335. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12336. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12337. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12338. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12339. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12340. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12341. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12342. }
  12343. }
  12344. else
  12345. {
  12346. break;
  12347. }
  12348. break;
  12349. }
  12350. //-------------------------------------------
  12351. case PreChargeRequest: //39
  12352. {
  12353. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  12354. {
  12355. Update_V2G_Flow_Status(PreChargeResponse);
  12356. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12357. }
  12358. else
  12359. {
  12360. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  12361. Update_V2G_Flow_Status(Other_Fault);
  12362. }
  12363. req_is_responsed = TRUE;
  12364. break;
  12365. }
  12366. case PreChargeResponse: //40
  12367. {
  12368. //STEP 1: Check for Process Timeout
  12369. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12370. ftime(&SeqEndTime);
  12371. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  12372. {
  12373. sprintf(buf_log_evcomm,
  12374. "Precharge Timeout - (%.02lf of %d ms)\n",
  12375. DiffTimeb(SeqStartTime, SeqEndTime),
  12376. V2G_SECC_PreCharge_Performance_Time);
  12377. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12378. Update_V2G_Flow_Status(Sequence_Timeout);
  12379. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12380. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  12381. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12382. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12383. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12384. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12385. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  12386. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  12387. break;
  12388. }
  12389. #endif
  12390. //STEP 2: Check for PreChargeReq message
  12391. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12392. {
  12393. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12394. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  12395. {
  12396. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12397. }
  12398. else
  12399. {
  12400. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  12401. Update_V2G_Flow_Status(Other_Fault);
  12402. }
  12403. req_is_responsed = TRUE;
  12404. break;
  12405. }
  12406. //STEP 3: Check for PowerDeliveryReq message
  12407. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12408. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12409. {
  12410. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12411. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  12412. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  12413. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12414. ftime(&SeqStartTime);
  12415. #endif
  12416. }
  12417. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12418. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12419. {
  12420. sprintf(buf_log_evcomm,
  12421. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12422. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12423. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12424. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12425. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12426. }
  12427. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12428. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12429. {
  12430. sprintf(buf_log_evcomm,
  12431. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12432. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12433. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12434. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12435. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12436. {
  12437. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12438. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12439. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12440. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12441. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12442. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12443. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12444. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12445. }
  12446. }
  12447. else
  12448. {
  12449. break;
  12450. }
  12451. break;
  12452. }
  12453. //-------------------------------------------
  12454. case PowerDeliveryRequestStart: //41
  12455. {
  12456. if (Proc_din_PowerDeliveryStartReq(AcceptFd) == 0)
  12457. {
  12458. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  12459. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12460. }
  12461. else
  12462. {
  12463. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  12464. Update_V2G_Flow_Status(Other_Fault);
  12465. }
  12466. req_is_responsed = TRUE;
  12467. break;
  12468. }
  12469. case PowerDeliveryResponsetStart: //42
  12470. {
  12471. //STEP 1: Check for Process Timeout
  12472. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12473. if (ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12474. {
  12475. ftime(&SeqEndTime);
  12476. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12477. {
  12478. sprintf(buf_log_evcomm,
  12479. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  12480. DiffTimeb(SeqStartTime, SeqEndTime),
  12481. 2000);
  12482. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12483. Update_V2G_Flow_Status(Sequence_Timeout);
  12484. }
  12485. break;
  12486. }
  12487. #endif
  12488. //STEP 2: Wait for CurrentDemandReq Message
  12489. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12490. {
  12491. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12492. Update_V2G_Flow_Status(CurrentDemandRequest);
  12493. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  12494. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  12495. }
  12496. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12497. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12498. {
  12499. sprintf(buf_log_evcomm,
  12500. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12501. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12502. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12503. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12504. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12505. }
  12506. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12507. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12508. {
  12509. sprintf(buf_log_evcomm,
  12510. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12511. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12512. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12513. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12514. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12515. {
  12516. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12517. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12518. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12519. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12520. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12521. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12522. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12523. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12524. }
  12525. }
  12526. else
  12527. {
  12528. break;
  12529. }
  12530. break;
  12531. }
  12532. //-------------------------------------------
  12533. case CurrentDemandRequest: //45,
  12534. {
  12535. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  12536. {
  12537. Update_V2G_Flow_Status(CurrentDemandResponse);
  12538. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12539. }
  12540. else
  12541. {
  12542. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  12543. Update_V2G_Flow_Status(Other_Fault);
  12544. }
  12545. req_is_responsed = TRUE;
  12546. break;
  12547. }
  12548. case CurrentDemandResponse: //46,
  12549. {
  12550. //STEP 1: Wait for CurrentDemandReq Message
  12551. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12552. {
  12553. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12554. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  12555. {
  12556. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12557. }
  12558. else
  12559. {
  12560. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  12561. Update_V2G_Flow_Status(Other_Fault);
  12562. }
  12563. req_is_responsed = TRUE;
  12564. break;
  12565. }
  12566. //STEP 2: Wait for PowerDeliveryReq Message
  12567. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12568. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12569. {
  12570. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12571. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12572. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  12573. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12574. {
  12575. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12576. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12577. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12578. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12579. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12580. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12581. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12582. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12583. }
  12584. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12585. ftime(&SeqStartTime);
  12586. #endif
  12587. }
  12588. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12589. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12590. {
  12591. sprintf(buf_log_evcomm,
  12592. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12593. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12594. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12595. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12596. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12597. }
  12598. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12599. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12600. {
  12601. sprintf(buf_log_evcomm,
  12602. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12603. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12604. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12605. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12606. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12607. {
  12608. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12609. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12610. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12611. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12612. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12613. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12614. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12615. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12616. }
  12617. }
  12618. else
  12619. {
  12620. break;
  12621. }
  12622. break;
  12623. }
  12624. //-------------------------------------------
  12625. case PowerDeliveryRequestStop: //49,
  12626. {
  12627. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  12628. {
  12629. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12630. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12631. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12632. ftime(&SeqStartTime);
  12633. #endif
  12634. }
  12635. else
  12636. {
  12637. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  12638. Update_V2G_Flow_Status(Other_Fault);
  12639. }
  12640. req_is_responsed = TRUE;
  12641. break;
  12642. }
  12643. case PowerDeliveryResponseStop: //50,
  12644. {
  12645. //STEP 1: Check for Process Timeout
  12646. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12647. ftime(&SeqEndTime);
  12648. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12649. {
  12650. sprintf(buf_log_evcomm,
  12651. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12652. DiffTimeb(SeqStartTime, SeqEndTime),
  12653. 2000);
  12654. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12655. Update_V2G_Flow_Status(Sequence_Timeout);
  12656. break;
  12657. }
  12658. #endif
  12659. //STEP 2: Check for WeldingDetectionReq Message
  12660. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12661. {
  12662. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12663. Update_V2G_Flow_Status(WeldingDetectionRequest);
  12664. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  12665. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  12666. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12667. ftime(&SeqStartTime);
  12668. #endif
  12669. }
  12670. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12671. {
  12672. Update_V2G_Flow_Status(SessionStopRequest);
  12673. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12674. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  12675. {
  12676. Update_V2G_Flow_Status(SessionStopResponse);
  12677. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12678. }
  12679. else
  12680. {
  12681. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  12682. Update_V2G_Flow_Status(Other_Fault);
  12683. }
  12684. break;
  12685. }
  12686. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12687. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12688. {
  12689. sprintf(buf_log_evcomm,
  12690. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12691. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12692. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12693. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12694. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12695. }
  12696. else
  12697. {
  12698. break;
  12699. }
  12700. break;
  12701. }
  12702. //-------------------------------------------
  12703. case WeldingDetectionRequest: //51,
  12704. {
  12705. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  12706. {
  12707. Update_V2G_Flow_Status(WeldingDetectionResponse);
  12708. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12709. }
  12710. else
  12711. {
  12712. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  12713. Update_V2G_Flow_Status(Other_Fault);
  12714. }
  12715. req_is_responsed = TRUE;
  12716. break;
  12717. }
  12718. case WeldingDetectionResponse: //52,
  12719. {
  12720. //STEP 1: Check for Process Timeout
  12721. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12722. ftime(&SeqEndTime);
  12723. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  12724. {
  12725. sprintf(buf_log_evcomm,
  12726. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12727. DiffTimeb(SeqStartTime, SeqEndTime),
  12728. V2G_SECC_WeldingDetection_Performance_Time);
  12729. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  12730. Update_V2G_Flow_Status(Sequence_Timeout);
  12731. break;
  12732. }
  12733. #endif
  12734. //STEP 2: Check for WeldingDetectionReq Message
  12735. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12736. {
  12737. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12738. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  12739. {
  12740. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12741. }
  12742. else
  12743. {
  12744. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  12745. Update_V2G_Flow_Status(Other_Fault);
  12746. }
  12747. req_is_responsed = TRUE;
  12748. break;
  12749. }
  12750. //STEP 3: Check for SessionStopReq Message
  12751. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12752. {
  12753. Update_V2G_Flow_Status(SessionStopRequest);
  12754. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12755. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  12756. }
  12757. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12758. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12759. {
  12760. sprintf(buf_log_evcomm,
  12761. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12762. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12763. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12764. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12765. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12766. }
  12767. else
  12768. {
  12769. break;
  12770. }
  12771. break;
  12772. }
  12773. //-------------------------------------------
  12774. case SessionStopRequest: //53,
  12775. {
  12776. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  12777. {
  12778. Update_V2G_Flow_Status(SessionStopResponse);
  12779. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12780. }
  12781. else
  12782. {
  12783. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  12784. Update_V2G_Flow_Status(Other_Fault);
  12785. }
  12786. req_is_responsed = TRUE;
  12787. break;
  12788. }
  12789. case SessionStopResponse: //54,
  12790. {
  12791. break;
  12792. }
  12793. //-------------------------------------------
  12794. default:
  12795. {
  12796. break;
  12797. }
  12798. }
  12799. }
  12800. }
  12801. /*===========================================================================
  12802. FUNCTION: V2gMsg_Process_iso1_DC
  12803. DESCRIPTION:
  12804. PRE-CONDITION:
  12805. INPUT:
  12806. 1. V2gFlowStatus
  12807. OUTPUT:
  12808. GLOBAL VARIABLES:
  12809. 1. V2gFlowStatus
  12810. =============================================================================*/
  12811. int V2gMsg_Process_iso1_DC(int AcceptFd)
  12812. {
  12813. unsigned char req_is_responsed = FALSE;
  12814. while (req_is_responsed == FALSE)
  12815. {
  12816. //Check if it is in End_Process
  12817. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  12818. {
  12819. break;
  12820. }
  12821. switch(V2gFlowStatus)
  12822. {
  12823. //-------------------------------------------
  12824. case SupportedAppProtocolRequest:
  12825. {
  12826. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  12827. {
  12828. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  12829. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  12830. {
  12831. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12832. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  12833. }
  12834. else
  12835. {
  12836. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  12837. Update_V2G_Flow_Status(Other_Fault);
  12838. }
  12839. }
  12840. req_is_responsed = TRUE;
  12841. break;
  12842. }
  12843. case SupportedAppProtocolResponse:
  12844. {
  12845. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  12846. {
  12847. Update_V2G_Flow_Status(SessionSetupRequest);
  12848. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12849. }
  12850. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12851. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12852. {
  12853. sprintf(buf_log_evcomm,
  12854. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12855. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12856. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12857. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12858. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12859. }
  12860. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12861. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12862. {
  12863. sprintf(buf_log_evcomm,
  12864. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12865. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12866. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12867. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12868. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12869. {
  12870. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12871. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12872. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12873. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12874. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12875. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12876. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12877. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12878. }
  12879. }
  12880. else
  12881. {
  12882. break;
  12883. }
  12884. break;
  12885. }
  12886. //-------------------------------------------
  12887. case SessionSetupRequest: //19
  12888. {
  12889. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  12890. {
  12891. Update_V2G_Flow_Status(SessionSetupResponse);
  12892. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12893. }
  12894. else
  12895. {
  12896. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  12897. Update_V2G_Flow_Status(Other_Fault);
  12898. }
  12899. req_is_responsed = TRUE;
  12900. break;
  12901. }
  12902. case SessionSetupResponse: //20
  12903. {
  12904. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  12905. {
  12906. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  12907. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12908. }
  12909. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12910. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12911. {
  12912. sprintf(buf_log_evcomm,
  12913. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12914. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12915. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12916. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12917. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12918. }
  12919. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12920. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12921. {
  12922. sprintf(buf_log_evcomm,
  12923. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12924. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12925. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12926. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12927. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12928. {
  12929. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12930. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12931. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12932. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12933. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12934. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12935. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12936. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12937. }
  12938. }
  12939. else
  12940. {
  12941. break;
  12942. }
  12943. break;
  12944. }
  12945. //-------------------------------------------
  12946. case ServiceDiscoveryRequest: //21
  12947. {
  12948. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  12949. {
  12950. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  12951. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12952. }
  12953. else
  12954. {
  12955. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  12956. Update_V2G_Flow_Status(Other_Fault);
  12957. }
  12958. req_is_responsed = TRUE;
  12959. break;
  12960. }
  12961. case ServiceDiscoveryResponse: //22
  12962. {
  12963. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  12964. {
  12965. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  12966. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12967. }
  12968. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12969. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  12970. {
  12971. sprintf(buf_log_evcomm,
  12972. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12973. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12974. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12975. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12976. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12977. }
  12978. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  12979. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12980. {
  12981. sprintf(buf_log_evcomm,
  12982. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  12983. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12984. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12985. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12986. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  12987. {
  12988. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12989. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12990. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12991. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  12992. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  12993. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  12994. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  12995. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  12996. }
  12997. }
  12998. else
  12999. {
  13000. break;
  13001. }
  13002. break;
  13003. }
  13004. //-------------------------------------------
  13005. case ServiceAndPaymentSelectionRequest: //25
  13006. {
  13007. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  13008. {
  13009. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  13010. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13011. }
  13012. else
  13013. {
  13014. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  13015. Update_V2G_Flow_Status(Other_Fault);
  13016. }
  13017. req_is_responsed = TRUE;
  13018. break;
  13019. }
  13020. case ServiceAndPaymentSelectionResponse: //26
  13021. {
  13022. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13023. {
  13024. Update_V2G_Flow_Status(AuthorizationRequest);
  13025. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13026. }
  13027. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13028. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13029. {
  13030. sprintf(buf_log_evcomm,
  13031. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13032. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13033. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13034. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13035. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13036. }
  13037. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13038. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13039. {
  13040. sprintf(buf_log_evcomm,
  13041. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13042. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13043. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13044. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13045. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13046. {
  13047. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13048. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13049. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13050. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13051. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13052. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13053. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13054. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13055. }
  13056. }
  13057. else
  13058. {
  13059. break;
  13060. }
  13061. break;
  13062. }
  13063. //-------------------------------------------
  13064. //case ContractAuthenticationReq:
  13065. case AuthorizationRequest: //29
  13066. {
  13067. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  13068. {
  13069. Update_V2G_Flow_Status(AuthorizationResponse);
  13070. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13071. }
  13072. else
  13073. {
  13074. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  13075. Update_V2G_Flow_Status(Other_Fault);
  13076. }
  13077. req_is_responsed = TRUE;
  13078. break;
  13079. }
  13080. case AuthorizationResponse: //30
  13081. {
  13082. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13083. {
  13084. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13085. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  13086. {
  13087. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13088. }
  13089. else
  13090. {
  13091. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  13092. Update_V2G_Flow_Status(Other_Fault);
  13093. }
  13094. req_is_responsed = TRUE;
  13095. break;
  13096. }
  13097. //Check for ChargeParameterDiscoveryReq
  13098. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13099. {
  13100. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13101. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  13102. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  13103. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13104. ftime(&SeqStartTime);
  13105. #endif
  13106. }
  13107. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13108. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13109. {
  13110. sprintf(buf_log_evcomm,
  13111. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13112. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13113. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13114. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13115. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13116. }
  13117. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13118. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13119. {
  13120. sprintf(buf_log_evcomm,
  13121. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13122. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13123. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13124. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13125. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13126. {
  13127. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13128. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13129. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13130. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13131. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13132. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13133. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13134. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13135. }
  13136. }
  13137. else
  13138. {
  13139. break;
  13140. }
  13141. break;
  13142. }
  13143. //-------------------------------------------
  13144. case ChargeParameterDiscoveryRequest: //35
  13145. {
  13146. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13147. {
  13148. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  13149. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13150. }
  13151. else
  13152. {
  13153. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  13154. Update_V2G_Flow_Status(Other_Fault);
  13155. }
  13156. req_is_responsed = TRUE;
  13157. break;
  13158. }
  13159. case ChargeParameterDiscoveryResponse:
  13160. {
  13161. //STEP 1: Check for Process Timeout
  13162. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13163. ftime(&SeqEndTime);
  13164. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  13165. {
  13166. sprintf(buf_log_evcomm,
  13167. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  13168. DiffTimeb(SeqStartTime, SeqEndTime),
  13169. V2G_SECC_ChargingParameter_Performance_Time);
  13170. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13171. Update_V2G_Flow_Status(Sequence_Timeout);
  13172. break;
  13173. }
  13174. #endif
  13175. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13176. {
  13177. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13178. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13179. {
  13180. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13181. }
  13182. else
  13183. {
  13184. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  13185. Update_V2G_Flow_Status(Other_Fault);
  13186. }
  13187. req_is_responsed = TRUE;
  13188. break;
  13189. }
  13190. //STEP 2: Check for CableCheckReq message
  13191. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13192. {
  13193. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13194. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  13195. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  13196. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13197. Update_V2G_Flow_Status(CableCheckRequest);
  13198. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13199. ftime(&SeqStartTime);
  13200. #endif
  13201. }
  13202. //STEP 3: Wait for PowerDeliveryReq Message
  13203. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13204. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13205. {
  13206. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13207. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13208. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13209. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13210. ftime(&SeqStartTime);
  13211. #endif
  13212. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13213. {
  13214. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13215. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13216. }
  13217. else
  13218. {
  13219. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13220. Update_V2G_Flow_Status(Other_Fault);
  13221. }
  13222. break;
  13223. }
  13224. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13225. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13226. {
  13227. sprintf(buf_log_evcomm,
  13228. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13229. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13230. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13231. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13232. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13233. }
  13234. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13235. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13236. {
  13237. sprintf(buf_log_evcomm,
  13238. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13239. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13240. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13241. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13242. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13243. {
  13244. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13245. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13246. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13247. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13248. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13249. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13250. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13251. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13252. }
  13253. }
  13254. else
  13255. {
  13256. break;
  13257. }
  13258. break;
  13259. }
  13260. //-------------------------------------------
  13261. case CableCheckRequest: //37
  13262. {
  13263. //STEP 3: Execute Cable Check Process
  13264. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  13265. {
  13266. Update_V2G_Flow_Status(CableCheckResponse);
  13267. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13268. }
  13269. else
  13270. {
  13271. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  13272. Update_V2G_Flow_Status(Other_Fault);
  13273. }
  13274. req_is_responsed = TRUE;
  13275. break;
  13276. }
  13277. case CableCheckResponse: //38
  13278. {
  13279. //STEP 1: Check for Process Timeout
  13280. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13281. ftime(&SeqEndTime);
  13282. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  13283. {
  13284. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  13285. sprintf(buf_log_evcomm,
  13286. "CableCheck Timeout - (%.02lf of %d ms)\n",
  13287. DiffTimeb(SeqStartTime, SeqEndTime),
  13288. V2G_SECC_CableCheck_Performance_Time);
  13289. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13290. Update_V2G_Flow_Status(Sequence_Timeout);
  13291. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13292. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  13293. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13294. {
  13295. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13296. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13297. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13298. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13299. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13300. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13301. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13302. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13303. }
  13304. break;
  13305. }
  13306. #endif
  13307. //STEP 2: Check for CableCheckReq message
  13308. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13309. {
  13310. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13311. //STEP 3: Execute Cable Check Process
  13312. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  13313. {
  13314. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13315. }
  13316. else
  13317. {
  13318. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  13319. Update_V2G_Flow_Status(Other_Fault);
  13320. }
  13321. req_is_responsed = TRUE;
  13322. break;
  13323. }
  13324. //STEP 3: Check for PreChargeReq message
  13325. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13326. {
  13327. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13328. Update_V2G_Flow_Status(PreChargeRequest);
  13329. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  13330. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13331. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  13332. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13333. ftime(&SeqStartTime);
  13334. #endif
  13335. }
  13336. //STEP 3: Wait for PowerDeliveryReq Message
  13337. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13338. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13339. {
  13340. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13341. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13342. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13343. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13344. ftime(&SeqStartTime);
  13345. #endif
  13346. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13347. {
  13348. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13349. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13350. }
  13351. else
  13352. {
  13353. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13354. Update_V2G_Flow_Status(Other_Fault);
  13355. }
  13356. break;
  13357. }
  13358. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13359. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13360. {
  13361. sprintf(buf_log_evcomm,
  13362. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13363. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13364. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13365. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13366. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13367. }
  13368. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13369. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13370. {
  13371. sprintf(buf_log_evcomm,
  13372. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13373. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13374. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13375. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13376. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13377. {
  13378. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13379. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13380. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13381. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13382. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13383. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13384. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13385. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13386. }
  13387. }
  13388. else
  13389. {
  13390. break;
  13391. }
  13392. break;
  13393. }
  13394. //-------------------------------------------
  13395. case PreChargeRequest: //39
  13396. {
  13397. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  13398. {
  13399. Update_V2G_Flow_Status(PreChargeResponse);
  13400. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13401. }
  13402. else
  13403. {
  13404. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  13405. Update_V2G_Flow_Status(Other_Fault);
  13406. }
  13407. req_is_responsed = TRUE;
  13408. break;
  13409. }
  13410. case PreChargeResponse: //40
  13411. {
  13412. //STEP 1: Check for Process Timeout
  13413. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13414. ftime(&SeqEndTime);
  13415. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  13416. {
  13417. sprintf(buf_log_evcomm,
  13418. "Precharge Timeout - (%.02lf of %d ms)\n",
  13419. DiffTimeb(SeqStartTime, SeqEndTime),
  13420. V2G_SECC_PreCharge_Performance_Time);
  13421. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13422. Update_V2G_Flow_Status(Sequence_Timeout);
  13423. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13424. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  13425. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13426. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13427. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13428. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13429. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  13430. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  13431. break;
  13432. }
  13433. #endif
  13434. //STEP 2: Check for PreChargeReq message
  13435. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13436. {
  13437. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13438. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  13439. {
  13440. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13441. }
  13442. else
  13443. {
  13444. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  13445. Update_V2G_Flow_Status(Other_Fault);
  13446. }
  13447. req_is_responsed = TRUE;
  13448. break;
  13449. }
  13450. //STEP 3: Check for PowerDeliveryReq message
  13451. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13452. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13453. {
  13454. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13455. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  13456. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  13457. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13458. ftime(&SeqStartTime);
  13459. #endif
  13460. }
  13461. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13462. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13463. {
  13464. sprintf(buf_log_evcomm,
  13465. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13466. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13467. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13468. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13469. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13470. }
  13471. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13472. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13473. {
  13474. sprintf(buf_log_evcomm,
  13475. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13476. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13477. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13478. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13479. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13480. {
  13481. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13482. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13483. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13484. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13485. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13486. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13487. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13488. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13489. }
  13490. }
  13491. else
  13492. {
  13493. break;
  13494. }
  13495. break;
  13496. }
  13497. //-------------------------------------------
  13498. case PowerDeliveryRequestStart: //41
  13499. {
  13500. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  13501. {
  13502. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  13503. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13504. }
  13505. else
  13506. {
  13507. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  13508. Update_V2G_Flow_Status(Other_Fault);
  13509. }
  13510. req_is_responsed = TRUE;
  13511. break;
  13512. }
  13513. case PowerDeliveryResponsetStart: //42
  13514. {
  13515. //STEP 1: Check for Process Timeout
  13516. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13517. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  13518. {
  13519. ftime(&SeqEndTime);
  13520. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  13521. {
  13522. sprintf(buf_log_evcomm,
  13523. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  13524. DiffTimeb(SeqStartTime, SeqEndTime),
  13525. 2000);
  13526. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13527. Update_V2G_Flow_Status(Sequence_Timeout);
  13528. }
  13529. break;
  13530. }
  13531. #endif
  13532. //STEP 2: Wait for CurrentDemandReq Message
  13533. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13534. {
  13535. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13536. Update_V2G_Flow_Status(CurrentDemandRequest);
  13537. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  13538. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  13539. }
  13540. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13541. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13542. {
  13543. sprintf(buf_log_evcomm,
  13544. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13545. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13546. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13547. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13548. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13549. }
  13550. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13551. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13552. {
  13553. sprintf(buf_log_evcomm,
  13554. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13555. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13556. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13557. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13558. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13559. {
  13560. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13561. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13562. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13563. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13564. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13565. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13566. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13567. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13568. }
  13569. }
  13570. else
  13571. {
  13572. break;
  13573. }
  13574. break;
  13575. }
  13576. //-------------------------------------------
  13577. case CurrentDemandRequest: //45,
  13578. {
  13579. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  13580. {
  13581. Update_V2G_Flow_Status(CurrentDemandResponse);
  13582. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13583. }
  13584. else
  13585. {
  13586. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  13587. Update_V2G_Flow_Status(Other_Fault);
  13588. }
  13589. req_is_responsed = TRUE;
  13590. break;
  13591. }
  13592. case CurrentDemandResponse: //46,
  13593. {
  13594. //STEP 1: Wait for CurrentDemandReq Message
  13595. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13596. {
  13597. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13598. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  13599. {
  13600. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13601. }
  13602. else
  13603. {
  13604. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  13605. Update_V2G_Flow_Status(Other_Fault);
  13606. }
  13607. req_is_responsed = TRUE;
  13608. break;
  13609. }
  13610. //STEP 2: Wait for PowerDeliveryReq Message
  13611. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13612. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13613. {
  13614. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13615. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13616. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  13617. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13618. ftime(&SeqStartTime);
  13619. #endif
  13620. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13621. {
  13622. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13623. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13624. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13625. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13626. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13627. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13628. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13629. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13630. }
  13631. }
  13632. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13633. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13634. {
  13635. sprintf(buf_log_evcomm,
  13636. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13637. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13638. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13639. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13640. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13641. }
  13642. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13643. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13644. {
  13645. sprintf(buf_log_evcomm,
  13646. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13647. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13648. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13649. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13650. if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
  13651. {
  13652. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13653. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13654. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13655. ShmStatusCodeData->PresentStatusCode[0][3] = 9;
  13656. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  13657. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  13658. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  13659. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  13660. }
  13661. }
  13662. else
  13663. {
  13664. break;
  13665. }
  13666. break;
  13667. }
  13668. //-------------------------------------------
  13669. case PowerDeliveryRequestStop: //49,
  13670. {
  13671. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  13672. {
  13673. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13674. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13675. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13676. ftime(&SeqStartTime);
  13677. #endif
  13678. }
  13679. else
  13680. {
  13681. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  13682. Update_V2G_Flow_Status(Other_Fault);
  13683. }
  13684. req_is_responsed = TRUE;
  13685. break;
  13686. }
  13687. case PowerDeliveryResponseStop: //50,
  13688. {
  13689. //STEP 1: Check for Process Timeout
  13690. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13691. ftime(&SeqEndTime);
  13692. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  13693. {
  13694. sprintf(buf_log_evcomm,
  13695. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13696. DiffTimeb(SeqStartTime, SeqEndTime),
  13697. 2000);
  13698. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13699. Update_V2G_Flow_Status(Sequence_Timeout);
  13700. break;
  13701. }
  13702. #endif
  13703. //STEP 2: Check for WeldingDetectionReq Message
  13704. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13705. {
  13706. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13707. Update_V2G_Flow_Status(WeldingDetectionRequest);
  13708. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  13709. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  13710. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13711. ftime(&SeqStartTime);
  13712. #endif
  13713. }
  13714. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13715. {
  13716. Update_V2G_Flow_Status(SessionStopRequest);
  13717. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13718. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  13719. {
  13720. Update_V2G_Flow_Status(SessionStopResponse);
  13721. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13722. }
  13723. else
  13724. {
  13725. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  13726. Update_V2G_Flow_Status(Other_Fault);
  13727. }
  13728. break;
  13729. }
  13730. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13731. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13732. {
  13733. sprintf(buf_log_evcomm,
  13734. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13735. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13736. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  13737. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13738. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13739. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13740. }
  13741. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13742. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13743. {
  13744. sprintf(buf_log_evcomm,
  13745. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13746. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13747. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13748. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13749. }
  13750. else
  13751. {
  13752. break;
  13753. }
  13754. break;
  13755. }
  13756. //-------------------------------------------
  13757. case WeldingDetectionRequest: //51,
  13758. {
  13759. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13760. {
  13761. Update_V2G_Flow_Status(WeldingDetectionResponse);
  13762. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13763. }
  13764. else
  13765. {
  13766. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  13767. Update_V2G_Flow_Status(Other_Fault);
  13768. }
  13769. req_is_responsed = TRUE;
  13770. break;
  13771. }
  13772. case WeldingDetectionResponse: //52,
  13773. {
  13774. //STEP 1: Check for Process Timeout
  13775. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13776. ftime(&SeqEndTime);
  13777. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  13778. {
  13779. sprintf(buf_log_evcomm,
  13780. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13781. DiffTimeb(SeqStartTime, SeqEndTime),
  13782. V2G_SECC_WeldingDetection_Performance_Time);
  13783. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  13784. Update_V2G_Flow_Status(Sequence_Timeout);
  13785. break;
  13786. }
  13787. #endif
  13788. //STEP 2: Check for WeldingDetectionReq Message
  13789. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13790. {
  13791. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13792. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13793. {
  13794. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13795. }
  13796. else
  13797. {
  13798. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  13799. Update_V2G_Flow_Status(Other_Fault);
  13800. }
  13801. req_is_responsed = TRUE;
  13802. break;
  13803. }
  13804. //STEP 3: Check for SessionStopReq Message
  13805. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13806. {
  13807. Update_V2G_Flow_Status(SessionStopRequest);
  13808. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13809. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  13810. }
  13811. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13812. EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
  13813. {
  13814. sprintf(buf_log_evcomm,
  13815. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13816. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13817. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13818. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13819. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13820. }
  13821. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
  13822. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13823. {
  13824. sprintf(buf_log_evcomm,
  13825. "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
  13826. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13827. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13828. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13829. }
  13830. else
  13831. {
  13832. break;
  13833. }
  13834. break;
  13835. }
  13836. //-------------------------------------------
  13837. case SessionStopRequest: //53,
  13838. {
  13839. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  13840. {
  13841. Update_V2G_Flow_Status(SessionStopResponse);
  13842. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13843. }
  13844. else
  13845. {
  13846. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  13847. Update_V2G_Flow_Status(Other_Fault);
  13848. }
  13849. req_is_responsed = TRUE;
  13850. break;
  13851. }
  13852. case SessionStopResponse: //54,
  13853. {
  13854. break;
  13855. }
  13856. //-------------------------------------------
  13857. default:
  13858. {
  13859. break;
  13860. }
  13861. }
  13862. }
  13863. }
  13864. /*===========================================================================
  13865. FUNCTION: V2gMsg_Process_iso1_AC
  13866. DESCRIPTION:
  13867. PRE-CONDITION:
  13868. INPUT:
  13869. 1. V2gFlowStatus
  13870. OUTPUT:
  13871. GLOBAL VARIABLES:
  13872. 1. V2gFlowStatus
  13873. =============================================================================*/
  13874. int V2gMsg_Process_iso1_AC(int AcceptFd)
  13875. {
  13876. unsigned char req_is_responsed = FALSE;
  13877. while (req_is_responsed == FALSE)
  13878. {
  13879. //Check if it is in End_Process
  13880. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  13881. {
  13882. break;
  13883. }
  13884. switch(V2gFlowStatus)
  13885. {
  13886. //-------------------------------------------
  13887. case SupportedAppProtocolRequest: //17
  13888. {
  13889. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  13890. {
  13891. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  13892. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  13893. {
  13894. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13895. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  13896. }
  13897. else
  13898. {
  13899. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  13900. Update_V2G_Flow_Status(Other_Fault);
  13901. }
  13902. }
  13903. req_is_responsed = TRUE;
  13904. break;
  13905. }
  13906. case SupportedAppProtocolResponse: //18
  13907. {
  13908. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  13909. {
  13910. Update_V2G_Flow_Status(SessionSetupRequest);
  13911. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13912. }
  13913. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13914. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13915. {
  13916. sprintf(buf_log_evcomm,
  13917. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13918. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13919. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13920. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13921. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13922. }
  13923. else
  13924. {
  13925. break;
  13926. }
  13927. break;
  13928. }
  13929. //-------------------------------------------
  13930. case SessionSetupRequest: //19
  13931. {
  13932. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  13933. {
  13934. Update_V2G_Flow_Status(SessionSetupResponse);
  13935. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13936. }
  13937. else
  13938. {
  13939. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  13940. Update_V2G_Flow_Status(Other_Fault);
  13941. }
  13942. req_is_responsed = TRUE;
  13943. break;
  13944. }
  13945. case SessionSetupResponse: //20
  13946. {
  13947. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  13948. {
  13949. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  13950. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13951. }
  13952. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13953. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13954. {
  13955. sprintf(buf_log_evcomm,
  13956. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13957. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13958. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13959. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13960. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13961. }
  13962. else
  13963. {
  13964. break;
  13965. }
  13966. break;
  13967. }
  13968. //-------------------------------------------
  13969. case ServiceDiscoveryRequest: //21
  13970. {
  13971. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  13972. {
  13973. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  13974. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13975. }
  13976. else
  13977. {
  13978. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  13979. Update_V2G_Flow_Status(Other_Fault);
  13980. }
  13981. req_is_responsed = TRUE;
  13982. break;
  13983. }
  13984. case ServiceDiscoveryResponse: //22
  13985. {
  13986. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  13987. {
  13988. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  13989. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13990. }
  13991. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13992. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13993. {
  13994. sprintf(buf_log_evcomm,
  13995. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13996. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13997. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13998. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13999. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14000. }
  14001. else
  14002. {
  14003. break;
  14004. }
  14005. break;
  14006. }
  14007. //-------------------------------------------
  14008. case ServiceAndPaymentSelectionRequest: //25
  14009. {
  14010. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  14011. {
  14012. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  14013. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14014. }
  14015. else
  14016. {
  14017. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  14018. Update_V2G_Flow_Status(Other_Fault);
  14019. }
  14020. req_is_responsed = TRUE;
  14021. break;
  14022. }
  14023. case ServiceAndPaymentSelectionResponse://26
  14024. {
  14025. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14026. {
  14027. Update_V2G_Flow_Status(AuthorizationRequest);
  14028. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14029. }
  14030. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14031. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14032. {
  14033. sprintf(buf_log_evcomm,
  14034. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14035. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14036. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14037. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14038. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14039. }
  14040. else
  14041. {
  14042. break;
  14043. }
  14044. break;
  14045. }
  14046. //-------------------------------------------
  14047. //case ContractAuthenticationReq:
  14048. case AuthorizationRequest: //29
  14049. {
  14050. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  14051. {
  14052. Update_V2G_Flow_Status(AuthorizationResponse);
  14053. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14054. }
  14055. else
  14056. {
  14057. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14058. Update_V2G_Flow_Status(Other_Fault);
  14059. }
  14060. req_is_responsed = TRUE;
  14061. break;
  14062. }
  14063. case AuthorizationResponse: //30
  14064. {
  14065. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14066. {
  14067. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14068. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  14069. {
  14070. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14071. }
  14072. else
  14073. {
  14074. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14075. Update_V2G_Flow_Status(Other_Fault);
  14076. }
  14077. req_is_responsed = TRUE;
  14078. break;
  14079. }
  14080. //Check for ChargeParameterDiscoveryReq
  14081. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14082. {
  14083. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14084. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  14085. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  14086. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14087. ftime(&SeqStartTime);
  14088. #endif
  14089. }
  14090. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14091. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14092. {
  14093. sprintf(buf_log_evcomm,
  14094. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14095. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14096. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14097. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14098. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14099. }
  14100. else
  14101. {
  14102. break;
  14103. }
  14104. break;
  14105. }
  14106. //-------------------------------------------
  14107. case ChargeParameterDiscoveryRequest: //35
  14108. {
  14109. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14110. {
  14111. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  14112. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14113. }
  14114. else
  14115. {
  14116. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14117. Update_V2G_Flow_Status(Other_Fault);
  14118. }
  14119. req_is_responsed = TRUE;
  14120. break;
  14121. }
  14122. case ChargeParameterDiscoveryResponse: //36
  14123. {
  14124. //STEP 1: Check for Process Timeout
  14125. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14126. ftime(&SeqEndTime);
  14127. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  14128. {
  14129. sprintf(buf_log_evcomm,
  14130. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  14131. DiffTimeb(SeqStartTime, SeqEndTime),
  14132. V2G_SECC_ChargingParameter_Performance_Time);
  14133. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14134. Update_V2G_Flow_Status(Sequence_Timeout);
  14135. break;
  14136. }
  14137. #endif
  14138. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14139. {
  14140. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14141. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14142. {
  14143. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14144. }
  14145. else
  14146. {
  14147. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14148. Update_V2G_Flow_Status(Other_Fault);
  14149. }
  14150. req_is_responsed = TRUE;
  14151. break;
  14152. }
  14153. //STEP 3: Wait for PowerDeliveryReq Message
  14154. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14155. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14156. {
  14157. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  14158. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14159. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14160. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14161. ftime(&SeqStartTime);
  14162. #endif
  14163. break;
  14164. }
  14165. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14166. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14167. {
  14168. sprintf(buf_log_evcomm,
  14169. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14170. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14171. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14172. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14173. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14174. }
  14175. else
  14176. {
  14177. break;
  14178. }
  14179. break;
  14180. }
  14181. //-------------------------------------------
  14182. case PowerDeliveryRequestStart: //41
  14183. {
  14184. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  14185. {
  14186. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  14187. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14188. }
  14189. else
  14190. {
  14191. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  14192. Update_V2G_Flow_Status(Other_Fault);
  14193. }
  14194. req_is_responsed = TRUE;
  14195. break;
  14196. }
  14197. case PowerDeliveryResponsetStart: //42
  14198. {
  14199. //STEP 1: Check for Process Timeout
  14200. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14201. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  14202. {
  14203. ftime(&SeqEndTime);
  14204. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  14205. {
  14206. sprintf(buf_log_evcomm,
  14207. "Wait for ChargingStatusReq Timeout - (%.02lf of %d ms)\n",
  14208. DiffTimeb(SeqStartTime, SeqEndTime),
  14209. 2000);
  14210. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14211. Update_V2G_Flow_Status(Sequence_Timeout);
  14212. }
  14213. break;
  14214. }
  14215. #endif
  14216. //STEP 2: Wait for ChargingStatusReq Message
  14217. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  14218. {
  14219. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14220. Update_V2G_Flow_Status(ChargingStatusRequest);
  14221. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargingStatusReq: energy transfering...");
  14222. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_Start);
  14223. }
  14224. else
  14225. {
  14226. break;
  14227. }
  14228. break;
  14229. }
  14230. //-------------------------------------------
  14231. case ChargingStatusRequest: //43
  14232. {
  14233. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  14234. {
  14235. Update_V2G_Flow_Status(ChargingStatusResponse);
  14236. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14237. }
  14238. else
  14239. {
  14240. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargingStatusRes: fail");
  14241. Update_V2G_Flow_Status(Other_Fault);
  14242. }
  14243. req_is_responsed = TRUE;
  14244. break;
  14245. }
  14246. case ChargingStatusResponse: //44
  14247. {
  14248. //STEP 1: Wait for ChargingStatusReq Message
  14249. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  14250. {
  14251. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14252. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  14253. {
  14254. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14255. }
  14256. else
  14257. {
  14258. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargingStatusRes: fail");
  14259. Update_V2G_Flow_Status(Other_Fault);
  14260. }
  14261. req_is_responsed = TRUE;
  14262. break;
  14263. }
  14264. //STEP 2: Wait for PowerDeliveryReq Message
  14265. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14266. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14267. {
  14268. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14269. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14270. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_End);
  14271. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14272. ftime(&SeqStartTime);
  14273. #endif
  14274. }
  14275. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14276. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14277. {
  14278. sprintf(buf_log_evcomm,
  14279. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14280. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14281. // EVCOMM_SYS_INFO.SequenceError = TRUE;
  14282. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14283. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14284. break;
  14285. }
  14286. else
  14287. {
  14288. break;
  14289. }
  14290. break;
  14291. }
  14292. //-------------------------------------------
  14293. case PowerDeliveryRequestStop: //49
  14294. {
  14295. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  14296. {
  14297. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14298. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14299. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14300. ftime(&SeqStartTime);
  14301. #endif
  14302. }
  14303. else
  14304. {
  14305. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14306. Update_V2G_Flow_Status(Other_Fault);
  14307. }
  14308. req_is_responsed = TRUE;
  14309. break;
  14310. }
  14311. case PowerDeliveryResponseStop: //50
  14312. {
  14313. //STEP 1: Check for Process Timeout
  14314. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14315. ftime(&SeqEndTime);
  14316. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  14317. {
  14318. sprintf(buf_log_evcomm,
  14319. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  14320. DiffTimeb(SeqStartTime, SeqEndTime),
  14321. 2000);
  14322. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14323. Update_V2G_Flow_Status(Sequence_Timeout);
  14324. break;
  14325. }
  14326. #endif
  14327. //STEP 3: Check for SessionStopReq Message
  14328. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  14329. {
  14330. Update_V2G_Flow_Status(SessionStopRequest);
  14331. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14332. }
  14333. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14334. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14335. {
  14336. sprintf(buf_log_evcomm,
  14337. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14338. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14339. if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
  14340. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14341. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14342. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14343. }
  14344. else
  14345. {
  14346. break;
  14347. }
  14348. break;
  14349. }
  14350. //-------------------------------------------
  14351. case SessionStopRequest: //53
  14352. {
  14353. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  14354. {
  14355. Update_V2G_Flow_Status(SessionStopResponse);
  14356. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14357. }
  14358. else
  14359. {
  14360. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  14361. Update_V2G_Flow_Status(Other_Fault);
  14362. }
  14363. req_is_responsed = TRUE;
  14364. break;
  14365. }
  14366. case SessionStopResponse: //54
  14367. {
  14368. break;
  14369. }
  14370. //-------------------------------------------
  14371. default:
  14372. {
  14373. break;
  14374. }
  14375. }
  14376. }
  14377. }
  14378. /*===========================================================================
  14379. FUNCTION: V2gMsg_Process_iso1
  14380. DESCRIPTION:
  14381. 1. EnergyTransferMode:
  14382. AC_single_phase_core = 0,
  14383. AC_three_phase_core = 1,
  14384. DC_core = 2,
  14385. DC_extended = 3,
  14386. DC_combo_core = 4,
  14387. DC_unique = 5
  14388. iso1EnergyTransferModeType_AC_single_phase_core = 0,
  14389. iso1EnergyTransferModeType_AC_three_phase_core = 1,
  14390. iso1EnergyTransferModeType_DC_core = 2,
  14391. iso1EnergyTransferModeType_DC_extended = 3,
  14392. iso1EnergyTransferModeType_DC_combo_core = 4,
  14393. iso1EnergyTransferModeType_DC_unique = 5
  14394. PRE-CONDITION:
  14395. INPUT:
  14396. 1. V2gFlowStatus
  14397. OUTPUT:
  14398. GLOBAL VARIABLES:
  14399. 1. V2gFlowStatus
  14400. =============================================================================*/
  14401. int V2gMsg_Process_iso1(int AcceptFd, unsigned char EnergyTransferMode)
  14402. {
  14403. switch (EnergyTransferMode)
  14404. {
  14405. case DC_extended:
  14406. {
  14407. V2gMsg_Process_iso1_DC(AcceptFd);
  14408. break;
  14409. }
  14410. case AC_single_phase_core:
  14411. case AC_three_phase_core:
  14412. {
  14413. V2gMsg_Process_iso1_AC(AcceptFd);
  14414. break;
  14415. }
  14416. default:
  14417. {
  14418. sprintf(buf_log_evcomm,
  14419. "[ISO1][Warning]Unexpected EnergyTransferMode(%d)",
  14420. EnergyTransferMode);
  14421. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14422. break;
  14423. }
  14424. }
  14425. }
  14426. /*===========================================================================
  14427. FUNCTION: V2gMsg_Process_iso2_DC
  14428. DESCRIPTION:
  14429. PRE-CONDITION:
  14430. INPUT:
  14431. 1. V2gFlowStatus
  14432. OUTPUT:
  14433. GLOBAL VARIABLES:
  14434. 1. V2gFlowStatus
  14435. =============================================================================*/
  14436. int V2gMsg_Process_iso2_DC(int AcceptFd)
  14437. {
  14438. unsigned char req_is_responsed = FALSE;
  14439. while (req_is_responsed == FALSE)
  14440. {
  14441. //Check if it is in End_Process
  14442. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  14443. {
  14444. break;
  14445. }
  14446. switch(V2gFlowStatus)
  14447. {
  14448. //-------------------------------------------
  14449. case SupportedAppProtocolRequest:
  14450. {
  14451. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  14452. {
  14453. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  14454. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  14455. {
  14456. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14457. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  14458. }
  14459. else
  14460. {
  14461. SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
  14462. Update_V2G_Flow_Status(Other_Fault);
  14463. }
  14464. }
  14465. req_is_responsed = TRUE;
  14466. break;
  14467. }
  14468. case SupportedAppProtocolResponse:
  14469. {
  14470. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  14471. {
  14472. Update_V2G_Flow_Status(SessionSetupRequest);
  14473. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14474. }
  14475. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14476. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14477. {
  14478. sprintf(buf_log_evcomm,
  14479. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14480. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14481. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14482. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14483. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14484. }
  14485. else
  14486. {
  14487. break;
  14488. }
  14489. break;
  14490. }
  14491. //-------------------------------------------
  14492. case SessionSetupRequest: //19
  14493. {
  14494. if (Proc_iso2_SessionSetupReq(AcceptFd) == 0)
  14495. {
  14496. Update_V2G_Flow_Status(SessionSetupResponse);
  14497. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14498. }
  14499. else
  14500. {
  14501. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
  14502. Update_V2G_Flow_Status(Other_Fault);
  14503. }
  14504. req_is_responsed = TRUE;
  14505. break;
  14506. }
  14507. case SessionSetupResponse: //20
  14508. {
  14509. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  14510. {
  14511. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  14512. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14513. }
  14514. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14515. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14516. {
  14517. sprintf(buf_log_evcomm,
  14518. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14519. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14520. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14521. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14522. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14523. }
  14524. else
  14525. {
  14526. break;
  14527. }
  14528. break;
  14529. }
  14530. #if 0
  14531. //-------------------------------------------
  14532. case ServiceDiscoveryRequest: //21
  14533. {
  14534. if (Proc_iso2_ServiceDiscoveryReq(AcceptFd) == 0)
  14535. {
  14536. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  14537. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14538. }
  14539. else
  14540. {
  14541. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
  14542. Update_V2G_Flow_Status(Other_Fault);
  14543. }
  14544. req_is_responsed = TRUE;
  14545. break;
  14546. }
  14547. case ServiceDiscoveryResponse: //22
  14548. {
  14549. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  14550. {
  14551. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  14552. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14553. }
  14554. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14555. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14556. {
  14557. sprintf(buf_log_evcomm,
  14558. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14559. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14560. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14561. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14562. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14563. }
  14564. else
  14565. {
  14566. break;
  14567. }
  14568. break;
  14569. }
  14570. //-------------------------------------------
  14571. case ServiceAndPaymentSelectionRequest: //25
  14572. {
  14573. if (Proc_iso2_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  14574. {
  14575. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  14576. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14577. }
  14578. else
  14579. {
  14580. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
  14581. Update_V2G_Flow_Status(Other_Fault);
  14582. }
  14583. req_is_responsed = TRUE;
  14584. break;
  14585. }
  14586. case ServiceAndPaymentSelectionResponse: //26
  14587. {
  14588. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14589. {
  14590. Update_V2G_Flow_Status(AuthorizationRequest);
  14591. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14592. }
  14593. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14594. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14595. {
  14596. sprintf(buf_log_evcomm,
  14597. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14598. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14599. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14600. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14601. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14602. }
  14603. else
  14604. {
  14605. break;
  14606. }
  14607. break;
  14608. }
  14609. //-------------------------------------------
  14610. //case ContractAuthenticationReq:
  14611. case AuthorizationRequest: //29
  14612. {
  14613. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  14614. {
  14615. Update_V2G_Flow_Status(AuthorizationResponse);
  14616. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14617. }
  14618. else
  14619. {
  14620. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14621. Update_V2G_Flow_Status(Other_Fault);
  14622. }
  14623. req_is_responsed = TRUE;
  14624. break;
  14625. }
  14626. case AuthorizationResponse: //30
  14627. {
  14628. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  14629. {
  14630. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14631. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  14632. {
  14633. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14634. }
  14635. else
  14636. {
  14637. SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
  14638. Update_V2G_Flow_Status(Other_Fault);
  14639. }
  14640. req_is_responsed = TRUE;
  14641. break;
  14642. }
  14643. //Check for ChargeParameterDiscoveryReq
  14644. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14645. {
  14646. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14647. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  14648. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  14649. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14650. ftime(&SeqStartTime);
  14651. #endif
  14652. }
  14653. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14654. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14655. {
  14656. sprintf(buf_log_evcomm,
  14657. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14658. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14659. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14660. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14661. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14662. }
  14663. else
  14664. {
  14665. break;
  14666. }
  14667. break;
  14668. }
  14669. //-------------------------------------------
  14670. case ChargeParameterDiscoveryRequest: //35
  14671. {
  14672. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14673. {
  14674. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  14675. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14676. }
  14677. else
  14678. {
  14679. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14680. Update_V2G_Flow_Status(Other_Fault);
  14681. }
  14682. req_is_responsed = TRUE;
  14683. break;
  14684. }
  14685. case ChargeParameterDiscoveryResponse:
  14686. {
  14687. //STEP 1: Check for Process Timeout
  14688. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14689. ftime(&SeqEndTime);
  14690. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  14691. {
  14692. sprintf(buf_log_evcomm,
  14693. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  14694. DiffTimeb(SeqStartTime, SeqEndTime),
  14695. V2G_SECC_ChargingParameter_Performance_Time);
  14696. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14697. Update_V2G_Flow_Status(Sequence_Timeout);
  14698. break;
  14699. }
  14700. #endif
  14701. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  14702. {
  14703. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14704. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  14705. {
  14706. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14707. }
  14708. else
  14709. {
  14710. SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
  14711. Update_V2G_Flow_Status(Other_Fault);
  14712. }
  14713. req_is_responsed = TRUE;
  14714. break;
  14715. }
  14716. //STEP 2: Check for CableCheckReq message
  14717. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  14718. {
  14719. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14720. Update_V2G_Flow_Status(CableCheckRequest);
  14721. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
  14722. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  14723. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  14724. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14725. ftime(&SeqStartTime);
  14726. #endif
  14727. }
  14728. //STEP 3: Wait for PowerDeliveryReq Message
  14729. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14730. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14731. {
  14732. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14733. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14734. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14735. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14736. ftime(&SeqStartTime);
  14737. #endif
  14738. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  14739. {
  14740. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14741. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14742. }
  14743. else
  14744. {
  14745. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14746. Update_V2G_Flow_Status(Other_Fault);
  14747. }
  14748. break;
  14749. }
  14750. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14751. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14752. {
  14753. sprintf(buf_log_evcomm,
  14754. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14755. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14756. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14757. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14758. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14759. }
  14760. else
  14761. {
  14762. break;
  14763. }
  14764. break;
  14765. }
  14766. //-------------------------------------------
  14767. case CableCheckRequest: //37
  14768. {
  14769. //STEP 3: Execute Cable Check Process
  14770. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  14771. {
  14772. Update_V2G_Flow_Status(CableCheckResponse);
  14773. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14774. }
  14775. else
  14776. {
  14777. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  14778. Update_V2G_Flow_Status(Other_Fault);
  14779. }
  14780. req_is_responsed = TRUE;
  14781. break;
  14782. }
  14783. case CableCheckResponse: //38
  14784. {
  14785. //STEP 1: Check for Process Timeout
  14786. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14787. ftime(&SeqEndTime);
  14788. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  14789. {
  14790. //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
  14791. sprintf(buf_log_evcomm,
  14792. "CableCheck Timeout - (%.02lf of %d ms)\n",
  14793. DiffTimeb(SeqStartTime, SeqEndTime),
  14794. V2G_SECC_CableCheck_Performance_Time);
  14795. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14796. Update_V2G_Flow_Status(Sequence_Timeout);
  14797. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14798. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  14799. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14800. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14801. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14802. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14803. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  14804. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  14805. break;
  14806. }
  14807. #endif
  14808. //STEP 2: Check for CableCheckReq message
  14809. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  14810. {
  14811. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14812. //STEP 3: Execute Cable Check Process
  14813. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  14814. {
  14815. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14816. }
  14817. else
  14818. {
  14819. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
  14820. Update_V2G_Flow_Status(Other_Fault);
  14821. }
  14822. req_is_responsed = TRUE;
  14823. break;
  14824. }
  14825. //STEP 3: Check for PreChargeReq message
  14826. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  14827. {
  14828. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14829. Update_V2G_Flow_Status(PreChargeRequest);
  14830. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  14831. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  14832. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  14833. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14834. ftime(&SeqStartTime);
  14835. #endif
  14836. }
  14837. //STEP 3: Wait for PowerDeliveryReq Message
  14838. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14839. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14840. {
  14841. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  14842. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14843. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  14844. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14845. ftime(&SeqStartTime);
  14846. #endif
  14847. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  14848. {
  14849. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  14850. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14851. }
  14852. else
  14853. {
  14854. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  14855. Update_V2G_Flow_Status(Other_Fault);
  14856. }
  14857. break;
  14858. }
  14859. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14860. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14861. {
  14862. sprintf(buf_log_evcomm,
  14863. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14864. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14865. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14866. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14867. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14868. }
  14869. else
  14870. {
  14871. break;
  14872. }
  14873. break;
  14874. }
  14875. //-------------------------------------------
  14876. case PreChargeRequest: //39
  14877. {
  14878. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  14879. {
  14880. Update_V2G_Flow_Status(PreChargeResponse);
  14881. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14882. }
  14883. else
  14884. {
  14885. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  14886. Update_V2G_Flow_Status(Other_Fault);
  14887. }
  14888. req_is_responsed = TRUE;
  14889. break;
  14890. }
  14891. case PreChargeResponse: //40
  14892. {
  14893. //STEP 1: Check for Process Timeout
  14894. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14895. ftime(&SeqEndTime);
  14896. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  14897. {
  14898. sprintf(buf_log_evcomm,
  14899. "Precharge Timeout - (%.02lf of %d ms)\n",
  14900. DiffTimeb(SeqStartTime, SeqEndTime),
  14901. V2G_SECC_PreCharge_Performance_Time);
  14902. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14903. Update_V2G_Flow_Status(Sequence_Timeout);
  14904. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14905. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  14906. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14907. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14908. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14909. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14910. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  14911. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  14912. break;
  14913. }
  14914. #endif
  14915. //STEP 2: Check for PreChargeReq message
  14916. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  14917. {
  14918. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14919. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  14920. {
  14921. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14922. }
  14923. else
  14924. {
  14925. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
  14926. Update_V2G_Flow_Status(Other_Fault);
  14927. }
  14928. req_is_responsed = TRUE;
  14929. break;
  14930. }
  14931. //STEP 3: Check for PowerDeliveryReq message
  14932. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  14933. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  14934. {
  14935. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14936. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  14937. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  14938. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14939. ftime(&SeqStartTime);
  14940. #endif
  14941. }
  14942. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  14943. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  14944. {
  14945. sprintf(buf_log_evcomm,
  14946. "[ERROR]SequenceError(%d) => Tx Res MSG",
  14947. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14948. EVCOMM_SYS_INFO.SequenceError = TRUE;
  14949. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  14950. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14951. }
  14952. else
  14953. {
  14954. break;
  14955. }
  14956. break;
  14957. }
  14958. //-------------------------------------------
  14959. case PowerDeliveryRequestStart: //41
  14960. {
  14961. if (Proc_iso2_PowerDeliveryStartReq(AcceptFd) == 0)
  14962. {
  14963. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  14964. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14965. }
  14966. else
  14967. {
  14968. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
  14969. Update_V2G_Flow_Status(Other_Fault);
  14970. }
  14971. req_is_responsed = TRUE;
  14972. break;
  14973. }
  14974. case PowerDeliveryResponsetStart: //42
  14975. {
  14976. //STEP 1: Check for Process Timeout
  14977. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  14978. if (ccs_exi_doc_ISO2.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  14979. {
  14980. ftime(&SeqEndTime);
  14981. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  14982. {
  14983. sprintf(buf_log_evcomm,
  14984. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  14985. DiffTimeb(SeqStartTime, SeqEndTime),
  14986. 2000);
  14987. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  14988. Update_V2G_Flow_Status(Sequence_Timeout);
  14989. }
  14990. break;
  14991. }
  14992. #endif
  14993. //STEP 2: Wait for CurrentDemandReq Message
  14994. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  14995. {
  14996. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  14997. Update_V2G_Flow_Status(CurrentDemandRequest);
  14998. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  14999. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  15000. }
  15001. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15002. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15003. {
  15004. sprintf(buf_log_evcomm,
  15005. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15006. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15007. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15008. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15009. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15010. }
  15011. else
  15012. {
  15013. break;
  15014. }
  15015. break;
  15016. }
  15017. //-------------------------------------------
  15018. case CurrentDemandRequest: //45,
  15019. {
  15020. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  15021. {
  15022. Update_V2G_Flow_Status(CurrentDemandResponse);
  15023. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15024. }
  15025. else
  15026. {
  15027. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  15028. Update_V2G_Flow_Status(Other_Fault);
  15029. }
  15030. req_is_responsed = TRUE;
  15031. break;
  15032. }
  15033. case CurrentDemandResponse: //46,
  15034. {
  15035. //STEP 1: Wait for CurrentDemandReq Message
  15036. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  15037. {
  15038. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15039. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  15040. {
  15041. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15042. }
  15043. else
  15044. {
  15045. SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
  15046. Update_V2G_Flow_Status(Other_Fault);
  15047. }
  15048. req_is_responsed = TRUE;
  15049. break;
  15050. }
  15051. //STEP 2: Wait for PowerDeliveryReq Message
  15052. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  15053. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  15054. {
  15055. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  15056. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15057. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  15058. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15059. ftime(&SeqStartTime);
  15060. #endif
  15061. }
  15062. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15063. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15064. {
  15065. sprintf(buf_log_evcomm,
  15066. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15067. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15068. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15069. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15070. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15071. }
  15072. else
  15073. {
  15074. break;
  15075. }
  15076. break;
  15077. }
  15078. //-------------------------------------------
  15079. case PowerDeliveryRequestStop: //49,
  15080. {
  15081. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  15082. {
  15083. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  15084. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15085. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15086. ftime(&SeqStartTime);
  15087. #endif
  15088. }
  15089. else
  15090. {
  15091. SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
  15092. Update_V2G_Flow_Status(Other_Fault);
  15093. }
  15094. req_is_responsed = TRUE;
  15095. break;
  15096. }
  15097. case PowerDeliveryResponseStop: //50,
  15098. {
  15099. //STEP 1: Check for Process Timeout
  15100. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15101. ftime(&SeqEndTime);
  15102. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  15103. {
  15104. sprintf(buf_log_evcomm,
  15105. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  15106. DiffTimeb(SeqStartTime, SeqEndTime),
  15107. 2000);
  15108. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15109. Update_V2G_Flow_Status(Sequence_Timeout);
  15110. break;
  15111. }
  15112. #endif
  15113. //STEP 2: Check for WeldingDetectionReq Message
  15114. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  15115. {
  15116. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15117. Update_V2G_Flow_Status(WeldingDetectionRequest);
  15118. SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
  15119. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  15120. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15121. ftime(&SeqStartTime);
  15122. #endif
  15123. }
  15124. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  15125. {
  15126. Update_V2G_Flow_Status(SessionStopRequest);
  15127. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15128. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  15129. {
  15130. Update_V2G_Flow_Status(SessionStopResponse);
  15131. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15132. }
  15133. else
  15134. {
  15135. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  15136. Update_V2G_Flow_Status(Other_Fault);
  15137. }
  15138. break;
  15139. }
  15140. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15141. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15142. {
  15143. sprintf(buf_log_evcomm,
  15144. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15145. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15146. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15147. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15148. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15149. }
  15150. else
  15151. {
  15152. break;
  15153. }
  15154. break;
  15155. }
  15156. //-------------------------------------------
  15157. case WeldingDetectionRequest: //51,
  15158. {
  15159. if (Proc_iso2_WeldingDetectionReq(AcceptFd) == 0)
  15160. {
  15161. Update_V2G_Flow_Status(WeldingDetectionResponse);
  15162. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15163. }
  15164. else
  15165. {
  15166. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  15167. Update_V2G_Flow_Status(Other_Fault);
  15168. }
  15169. req_is_responsed = TRUE;
  15170. break;
  15171. }
  15172. case WeldingDetectionResponse: //52,
  15173. {
  15174. //STEP 1: Check for Process Timeout
  15175. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  15176. ftime(&SeqEndTime);
  15177. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  15178. {
  15179. sprintf(buf_log_evcomm,
  15180. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  15181. DiffTimeb(SeqStartTime, SeqEndTime),
  15182. V2G_SECC_WeldingDetection_Performance_Time);
  15183. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15184. Update_V2G_Flow_Status(Sequence_Timeout);
  15185. break;
  15186. }
  15187. #endif
  15188. //STEP 2: Check for WeldingDetectionReq Message
  15189. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  15190. {
  15191. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15192. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  15193. {
  15194. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15195. }
  15196. else
  15197. {
  15198. SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
  15199. Update_V2G_Flow_Status(Other_Fault);
  15200. }
  15201. req_is_responsed = TRUE;
  15202. break;
  15203. }
  15204. //STEP 3: Check for SessionStopReq Message
  15205. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  15206. {
  15207. Update_V2G_Flow_Status(SessionStopRequest);
  15208. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15209. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  15210. }
  15211. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  15212. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  15213. {
  15214. sprintf(buf_log_evcomm,
  15215. "[ERROR]SequenceError(%d) => Tx Res MSG",
  15216. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15217. EVCOMM_SYS_INFO.SequenceError = TRUE;
  15218. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  15219. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  15220. }
  15221. else
  15222. {
  15223. break;
  15224. }
  15225. break;
  15226. }
  15227. //-------------------------------------------
  15228. case SessionStopRequest: //53,
  15229. {
  15230. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  15231. {
  15232. Update_V2G_Flow_Status(SessionStopResponse);
  15233. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  15234. }
  15235. else
  15236. {
  15237. SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
  15238. Update_V2G_Flow_Status(Other_Fault);
  15239. }
  15240. req_is_responsed = TRUE;
  15241. break;
  15242. }
  15243. case SessionStopResponse: //54,
  15244. {
  15245. break;
  15246. }
  15247. #endif
  15248. //-------------------------------------------
  15249. default:
  15250. {
  15251. break;
  15252. }
  15253. }
  15254. }
  15255. }
  15256. /*===========================================================================
  15257. FUNCTION: V2gMsg_Process_iso2_AC
  15258. DESCRIPTION:
  15259. PRE-CONDITION:
  15260. INPUT:
  15261. 1. V2gFlowStatus
  15262. OUTPUT:
  15263. GLOBAL VARIABLES:
  15264. 1. V2gFlowStatus
  15265. =============================================================================*/
  15266. int V2gMsg_Process_iso2_AC(int AcceptFd)
  15267. {
  15268. }
  15269. /*===========================================================================
  15270. FUNCTION: V2gMsg_Process_iso2
  15271. DESCRIPTION:
  15272. PRE-CONDITION:
  15273. INPUT:
  15274. 1. V2gFlowStatus
  15275. OUTPUT:
  15276. GLOBAL VARIABLES:
  15277. 1. V2gFlowStatus
  15278. =============================================================================*/
  15279. int V2gMsg_Process_iso2(int AcceptFd, unsigned char EnergyTransferMode)
  15280. {
  15281. switch (EnergyTransferMode)
  15282. {
  15283. case DC_extended:
  15284. {
  15285. V2gMsg_Process_iso2_DC(AcceptFd);
  15286. break;
  15287. }
  15288. case AC_single_phase_core:
  15289. case AC_three_phase_core:
  15290. {
  15291. V2gMsg_Process_iso2_AC(AcceptFd);
  15292. break;
  15293. }
  15294. default:
  15295. {
  15296. sprintf(buf_log_evcomm,
  15297. "[ISO2][Warning]Unexpected EnergyTransferMode(%d)",
  15298. EnergyTransferMode);
  15299. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15300. break;
  15301. }
  15302. }
  15303. }
  15304. /*===========================================================================
  15305. FUNCTION: V2gMsg_Process
  15306. DESCRIPTION:
  15307. PRE-CONDITION:
  15308. INPUT:
  15309. OUTPUT:
  15310. GLOBAL VARIABLES:
  15311. =============================================================================*/
  15312. int V2gMsg_Process(int AcceptFd)
  15313. {
  15314. int errn = 0;
  15315. switch (ShmCcsData->CommProtocol)
  15316. {
  15317. case V2GT_MSG_PROTOCOL_DIN70121: //0
  15318. {
  15319. V2gMsg_Process_din(AcceptFd);
  15320. break;
  15321. }
  15322. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  15323. {
  15324. V2gMsg_Process_iso1(AcceptFd, ShmCcsData->EnergyTransferMode);
  15325. break;
  15326. }
  15327. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  15328. {
  15329. V2gMsg_Process_iso2(AcceptFd, ShmCcsData->EnergyTransferMode);
  15330. break;
  15331. }
  15332. default:
  15333. {
  15334. sprintf(buf_log_evcomm,
  15335. "[Warning]Unexpected CommProtocol(%d)",
  15336. ShmCcsData->CommProtocol);
  15337. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15338. break;
  15339. }
  15340. }
  15341. return errn;
  15342. }
  15343. /*===========================================================================
  15344. FUNCTION: V2gMsg_Rx
  15345. DESCRIPTION:
  15346. PRE-CONDITION:
  15347. INPUT:
  15348. OUTPUT:
  15349. GLOBAL VARIABLES:
  15350. =============================================================================*/
  15351. int V2gMsg_Rx(int AcceptFd)
  15352. {
  15353. int errn = 0;
  15354. unsigned int packet_size = 0;
  15355. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15356. #ifdef SUPPORT_TLS_CONNECTION
  15357. if(EvSecurity == 0)//support security
  15358. {
  15359. packet_size = SSL_read(ssl, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE);
  15360. }
  15361. else
  15362. {
  15363. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  15364. }
  15365. #else
  15366. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  15367. #endif
  15368. //[CAUTION] Everytime recv() is called, it will take a default time to wait for TCP packets.
  15369. //The more time you call recv(), the more time you will waste here.
  15370. //Here it is suggested that response immediatedly once you receive any packets.
  15371. //For configuring the Rx waiting time, please use setsockopt().
  15372. if(packet_size > 0) //[Joseph] If there is no data, ignore. (TBD)
  15373. {
  15374. //DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got TCP V2GTP Message: size = %d Bytes\n", packet_size);
  15375. errn = V2gMsgDecoder(V2gtpMsgRxBuf, packet_size, V2gFlowStatus);
  15376. if (errn < 0)
  15377. {
  15378. sprintf(buf_log_evcomm, "[ERROR]V2gMsgDecoder", errn);
  15379. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15380. }
  15381. }
  15382. return errn;
  15383. }
  15384. /*===========================================================================
  15385. FUNCTION: V2gComm
  15386. DESCRIPTION:
  15387. PRE-CONDITION:
  15388. 1. TCP socket is connected.
  15389. INPUT:
  15390. 1. AcceptFd //TCP Connection ID
  15391. 2. V2gtpMsgRxBuf[] //V2GTP Messages (Header + Payload)
  15392. 3. V2GTP_MSG_RX_BUFFER_SIZE //64*1024 = 65,536 = 65.5K (Bytes)
  15393. OUTPUT:
  15394. GLOBAL VARIABLES:
  15395. 1. V2gtpMsgRxBuf[]
  15396. =============================================================================*/
  15397. int V2gComm(int AcceptFd)
  15398. {
  15399. int errn = 0;
  15400. if (V2gMsg_Rx(AcceptFd) < 0)
  15401. {
  15402. Update_V2G_Flow_Status(Other_Fault);
  15403. errn = -1;
  15404. }
  15405. //following are the response message handling according to status flag
  15406. if (V2gMsg_Process(AcceptFd) < 0)
  15407. {
  15408. errn = -1;
  15409. }
  15410. //Error Check
  15411. //V2G_Error_Monitor();
  15412. return errn;
  15413. }
  15414. /*===========================================================================
  15415. FUNCTION: SdpUdpConnected
  15416. DESCRIPTION:
  15417. PRE-CONDITION:
  15418. INPUT:
  15419. OUTPUT:
  15420. GLOBAL VARIABLES:
  15421. =============================================================================*/
  15422. int SdpUdpConnected()
  15423. {
  15424. int packet_size,Rtn;
  15425. struct sockaddr_in6 ServerAddr,ClientAddr;
  15426. struct V2gtpHeader *header;
  15427. unsigned char *payload;
  15428. if(UdpSock <= 0)
  15429. {
  15430. if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
  15431. {
  15432. SAVE_SYS_LOG_MSG_EVCOMM("SdpUdpConnected: Fail to open UdpSock");
  15433. return 0;
  15434. }
  15435. ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp=UdpSock;
  15436. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  15437. ServerAddr.sin6_family = AF_INET6;
  15438. ServerAddr.sin6_addr = in6addr_any;
  15439. ServerAddr.sin6_port = htons(SdpUdpServerPort);
  15440. if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  15441. {
  15442. sprintf(buf_log_evcomm,
  15443. "SdpUdpConnected: Fail to bind UdpSock(%d)",
  15444. UdpSock);
  15445. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15446. close(UdpSock);
  15447. UdpSock = -1;
  15448. return 0;
  15449. }
  15450. sprintf(buf_log_evcomm, "[UdpSock]opend:%d", UdpSock);
  15451. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15452. sprintf(buf_log_evcomm, "[SDP]Req from EVCC: waiting...(%d)", UdpSock);
  15453. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15454. }
  15455. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15456. memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
  15457. Rtn = sizeof(struct sockaddr_in6);
  15458. packet_size = recvfrom(UdpSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, &Rtn);
  15459. if(packet_size > 0)
  15460. {
  15461. header = (struct V2gtpHeader *) V2gtpMsgRxBuf;
  15462. payload = V2gtpMsgRxBuf+sizeof(struct V2gtpHeader);
  15463. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15464. {
  15465. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got UDP packet_size = %d (Bytes)\n", packet_size);
  15466. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
  15467. DEBUG_PRINTF_EVCOMM_DETAIL("***** Received SDP Packet *****\n");
  15468. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  15469. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  15470. for(Rtn = 0; Rtn < 16; Rtn += 2)
  15471. {
  15472. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  15473. }
  15474. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15475. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n",ClientAddr.sin6_port);
  15476. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n",header->ProtocolVersion);
  15477. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n",header->InverseProtocolVersion);
  15478. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n",htons(header->PayloadType));
  15479. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n",htonl(header->PayloadLength));
  15480. DEBUG_PRINTF_EVCOMM_DETAIL("htons(header->PayloadType)=0x%x\n",htons(header->PayloadType));
  15481. }
  15482. #endif
  15483. if( (header->ProtocolVersion == 0x01) &&
  15484. (header->InverseProtocolVersion == 0xFE) &&
  15485. (htons(header->PayloadType) == V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
  15486. {
  15487. sprintf(buf_log_evcomm, "[SDP][Rx]Req from EVCC: GOT(%d)", UdpSock);
  15488. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15489. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", *(payload + 0));
  15490. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", *(payload + 1));
  15491. #ifdef SUPPORT_TLS_CONNECTION
  15492. EvSecurity= *(payload);
  15493. #endif
  15494. header->PayloadType = htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
  15495. header->PayloadLength = htonl(20); //Fixed Length=20
  15496. memset(payload, 0, 20);
  15497. // MAC address[0:2] + FFFE + MAC address[3:5]
  15498. payload[0] = (IPV6_LINK_LOCAL_PREFIX>>8) & 0xFF;
  15499. payload[1] = IPV6_LINK_LOCAL_PREFIX & 0xFF;
  15500. payload[8 ]= CsuMac[0];
  15501. payload[8] ^= 0x02;// bit 1 should complemented.
  15502. payload[9] = CsuMac[1];
  15503. payload[10] = CsuMac[2];
  15504. payload[11] = 0xFF;
  15505. payload[12] = 0xFE;
  15506. payload[13] = CsuMac[3];
  15507. payload[14] = CsuMac[4];
  15508. payload[15] = CsuMac[5];
  15509. //TCP port
  15510. payload[16] = (EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active>>8) & 0xFF;
  15511. payload[17] = EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active & 0xFF;
  15512. #ifdef SUPPORT_TLS_CONNECTION
  15513. if(EvSecurity == 0)//support security
  15514. payload[18] = SDP_PAYLOAD_SECURITY_TLS; //Security
  15515. else
  15516. payload[18] = SDP_PAYLOAD_SECURITY_NONE; // No Security
  15517. #else
  15518. payload[18] = SDP_PAYLOAD_SECURITY_NONE; //No Security
  15519. #endif
  15520. payload[19] = SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
  15521. //[To-Do] Setup the TCP in advance to receive the coming TCP handshke messages after SDP response.
  15522. Rtn = sendto(UdpSock, V2gtpMsgRxBuf, sizeof(struct V2gtpHeader) + htonl(header->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
  15523. sprintf(buf_log_evcomm, "[SDP][Tx]Res from SECC");
  15524. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15525. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15526. {
  15527. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response SDP Packet *****\n");
  15528. DEBUG_PRINTF_EVCOMM_DETAIL("Send size=%d\n",Rtn);
  15529. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Address=");
  15530. for(Rtn = 0; Rtn < 16; Rtn++)
  15531. {
  15532. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ", ClientAddr.sin6_addr.s6_addr[Rtn]);
  15533. }
  15534. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15535. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Port=%d\n", ClientAddr.sin6_port);
  15536. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n", header->ProtocolVersion);
  15537. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n", header->InverseProtocolVersion);
  15538. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n", htons(header->PayloadType));
  15539. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n", htonl(header->PayloadLength));
  15540. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Ipv6 Address=");
  15541. for(Rtn = 0; Rtn < 16; Rtn++)
  15542. {
  15543. DEBUG_PRINTF_EVCOMM_DETAIL("%02x:",payload[Rtn]);
  15544. }
  15545. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15546. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Port=%d\n", (payload[16]<<8 | payload[17]));
  15547. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", payload[19]);
  15548. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", payload[20]);
  15549. }
  15550. #endif
  15551. if(Rtn >= 28)
  15552. {
  15553. return 1;
  15554. }
  15555. }
  15556. }
  15557. return 0;
  15558. }
  15559. /*===========================================================================
  15560. FUNCTION: V2gTcpConnected
  15561. DESCRIPTION:
  15562. PRE-CONDITION:
  15563. INPUT:
  15564. OUTPUT:
  15565. GLOBAL VARIABLES:
  15566. =============================================================================*/
  15567. int V2gTcpConnected()
  15568. {
  15569. int packet_size,Rtn,AcceptFd;
  15570. struct sockaddr_in6 ServerAddr,ClientAddr;
  15571. if(TcpSock <= 0)
  15572. {
  15573. if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) < 0)
  15574. {
  15575. sprintf(buf_log_evcomm,
  15576. "V2gTcpConnected: Fail to open TcpSock (%s)",
  15577. strerror(errno));
  15578. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15579. usleep(100000); //100ms
  15580. return 0;
  15581. }
  15582. ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp=TcpSock;
  15583. fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
  15584. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]socket set: DONE");
  15585. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  15586. ServerAddr.sin6_family = PF_INET6;
  15587. ServerAddr.sin6_addr = in6addr_any;
  15588. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15589. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 10) + 1);
  15590. //printf("SdpTcpServerPort = %d(DEC)\n", htons(ServerAddr.sin6_port));
  15591. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  15592. {
  15593. sprintf(buf_log_evcomm,
  15594. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  15595. strerror(errno),
  15596. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  15597. );
  15598. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15599. //Change to another TCP port
  15600. /*
  15601. memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
  15602. ServerAddr.sin6_family = PF_INET6;
  15603. ServerAddr.sin6_addr = in6addr_any;
  15604. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 1000) + 1);
  15605. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15606. */
  15607. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  15608. {
  15609. sprintf(buf_log_evcomm,
  15610. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  15611. strerror(errno),
  15612. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  15613. );
  15614. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15615. usleep(100000); //100ms
  15616. close(TcpSock);
  15617. TcpSock = -1;
  15618. return 0;
  15619. }
  15620. }
  15621. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]blid: DONE");
  15622. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]listen: START");
  15623. if(listen(TcpSock, 1) < 0) //only accept one connection
  15624. {
  15625. sprintf(buf_log_evcomm,
  15626. "V2gTcpConnected: Fail to listen TcpSock (%s)",
  15627. strerror(errno));
  15628. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15629. usleep(100000); //100ms
  15630. close(TcpSock);
  15631. TcpSock = -1;
  15632. return 0;
  15633. }
  15634. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]listen: DONE");
  15635. sprintf(buf_log_evcomm, "[TCP]TcpSock: opened(%d), port=%d", TcpSock, htons(ServerAddr.sin6_port));
  15636. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15637. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]accept: START");
  15638. }
  15639. Rtn = sizeof(struct sockaddr_in6);
  15640. if((AcceptFd = accept(TcpSock, (struct sockaddr *)&ClientAddr, &Rtn)) < 0 )
  15641. {
  15642. static BOOL tmp = 0;
  15643. if (tmp = 0)
  15644. {
  15645. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]Wait TCP connection...");
  15646. tmp = 1;
  15647. }
  15648. else
  15649. {
  15650. //DEBUG_PRINTF_EVCOMM_DETAIL(".");
  15651. }
  15652. return 0;
  15653. }
  15654. ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed=AcceptFd;
  15655. SAVE_SYS_LOG_MSG_EVCOMM("[TCP]accept: DONE\n");
  15656. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  15657. {
  15658. DEBUG_PRINTF_EVCOMM_DETAIL("\n\nAccept one TCP connection:\n");
  15659. DEBUG_PRINTF_EVCOMM_DETAIL("AcceptFd=%d\n",AcceptFd);
  15660. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  15661. for(Rtn = 0; Rtn < 16; Rtn += 2)
  15662. {
  15663. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:", ClientAddr.sin6_addr.s6_addr[Rtn], ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  15664. }
  15665. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  15666. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n", ClientAddr.sin6_port);
  15667. }
  15668. #endif
  15669. #ifdef SUPPORT_TLS_CONNECTION
  15670. /* TCP connection is ready. Do server side SSL connection. */
  15671. if(EvSecurity == 0)//support security
  15672. {
  15673. ssl = SSL_new(ctx);
  15674. SSL_set_fd(ssl, AcceptFd);
  15675. if (SSL_accept(ssl) <= 0)
  15676. {
  15677. //SAVE_SYS_LOG_MSG_EVCOMM("[SSL]SSL_accept Failed");
  15678. //SSL_free(ssl);
  15679. //close(AcceptFd);
  15680. //AcceptFd = -1;
  15681. return 0;
  15682. }
  15683. }
  15684. #endif
  15685. return AcceptFd;
  15686. }
  15687. /*===========================================================================
  15688. FUNCTION: End_Process
  15689. DESCRIPTION:
  15690. PRE-CONDITION:
  15691. 1. <CAUTION> This function could only be used in SeccComm fork2.
  15692. INPUT:
  15693. OUTPUT:
  15694. GLOBAL VARIABLES:
  15695. =============================================================================*/
  15696. int End_Process()
  15697. {
  15698. if(EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  15699. {
  15700. SAVE_SYS_LOG_MSG_EVCOMM("End_Process has been triggered by another event.");
  15701. return -1;
  15702. }
  15703. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]entering...");
  15704. //STEP 1: Ask CSU to Stop
  15705. EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  15706. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  15707. EVCOMM_SYS_INFO.ConnectorLocked = FALSE;
  15708. ShmInternalComm->ChargingPermission = FALSE;
  15709. //Step 2: Close sockets
  15710. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]close sockets...");
  15711. if(RawSock > 0)
  15712. {
  15713. close(RawSock);
  15714. }
  15715. if(UdpSock > 0)
  15716. {
  15717. close(UdpSock);
  15718. }
  15719. if(TcpSock > 0)
  15720. {
  15721. close(TcpSock);
  15722. close(TcpAcceptFd);
  15723. }
  15724. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  15725. if(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp > 0)
  15726. {
  15727. close(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp);
  15728. ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp=0;
  15729. }
  15730. if(ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp > 0)
  15731. {
  15732. close(ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp);
  15733. ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp=0;
  15734. }
  15735. if(ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp > 0)
  15736. {
  15737. close(ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp);
  15738. close(ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed);
  15739. ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp=0;
  15740. ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed=0;
  15741. }
  15742. /*#ifdef SUPPORT_TLS_CONNECTION
  15743. if(EvSecurity == 0)//support security
  15744. {
  15745. SSL_shutdown(ssl);
  15746. SSL_free (ssl);
  15747. }
  15748. SSL_CTX_free (ctx);
  15749. #endif*/
  15750. //STEP 3: Switch to State E
  15751. //SwitchCpStateE(ENABLE);
  15752. //STEP 4: Close tcpdump
  15753. Sniffer_Tcpdump(DISABLE);
  15754. //STEP 5: Keep 100% PWM for 5 seconds
  15755. OutputCpPwmDuty(100);
  15756. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 5");
  15757. sleep(1);
  15758. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 4");
  15759. sleep(1);
  15760. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 3");
  15761. sleep(1);
  15762. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 2");
  15763. sleep(1);
  15764. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 1");
  15765. sleep(1);
  15766. SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 0");
  15767. AttenProfileCnt = 0;
  15768. init_appHandEXIDocument(&ccs_handshake);
  15769. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  15770. {
  15771. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]1st sync...");
  15772. system("sync");
  15773. }
  15774. #endif
  15775. //STEP 4: Switch to State E
  15776. //Keep State E for 5 seconds
  15777. #if 0
  15778. SwitchCpStateE(ENABLE); //Set PWM Duty as 0 and set State as E (0V)
  15779. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 5");
  15780. sleep(1);
  15781. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 4");
  15782. sleep(1);
  15783. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 3");
  15784. sleep(1);
  15785. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 2");
  15786. sleep(1);
  15787. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 1");
  15788. sleep(1);
  15789. SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 0");
  15790. #endif
  15791. //Reset Memory
  15792. unsigned char SlaveAddress_backup;
  15793. unsigned int matched_backup;
  15794. //unsigned char state_backup;
  15795. SAVE_SYS_LOG_MSG_EVCOMM("[CCS Board]soft reset (closing SeccComm)...");
  15796. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------");
  15797. SAVE_SYS_LOG_MSG_EVCOMM("-- EVCOMM: END --");
  15798. SAVE_SYS_LOG_MSG_EVCOMM("-----------------------------------------\n");
  15799. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  15800. {
  15801. SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]2nd sync...");
  15802. system("sync");
  15803. }
  15804. #endif
  15805. // system("sleep 1");
  15806. //Backup CsuComm flags
  15807. SlaveAddress_backup = ShmInternalComm->SlaveAddress;
  15808. matched_backup = CSUCOMMDC_TASK_FLAG.matched;
  15809. //state_backup = Check_V2G_Flow_Status();
  15810. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15811. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15812. memset(&ccs_handshake, 0, sizeof(struct appHandEXIDocument));
  15813. memset(&ccs_exi_doc_DIN, 0, sizeof(struct dinEXIDocument));
  15814. memset(V2GTP_Tx_buf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15815. memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  15816. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  15817. memset(ShmInternalComm, 0, sizeof(struct InternalComm));
  15818. memset(ShmCcsData, 0, sizeof(struct CcsData));
  15819. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress= 0xFF;
  15820. //Resume CsuComm flags
  15821. ShmInternalComm->SlaveAddress = SlaveAddress_backup;
  15822. CSUCOMMDC_TASK_FLAG.matched = matched_backup;
  15823. Sniffer_Candump(DISABLE);
  15824. Sniffer_Candump(ENABLE);
  15825. //memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo)); //EVCOMM_SYS_INFO.End_Process_inused = FALSE;
  15826. //EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  15827. EVCOMM_SYS_INFO.DC_EVSEStatus=EVSE_NotReady;
  15828. //Update_V2G_Flow_Status(state_backup);
  15829. //CP_Detection_Pid = 0;
  15830. //PP_Detection_Pid = 0;
  15831. //Error_Monitor_Pid = 0;
  15832. /* while(CheckConnectorPlugIn() != TRUE)
  15833. {
  15834. sleep(1);
  15835. }*/
  15836. free(V2gtpMsgRxBuf);
  15837. free(V2gtpMsgTxBuf);
  15838. //DetachShareMemory();
  15839. Qca7kPowerReset(); //reset QCA7000 /* +++ 20200808, vern, should disconnected PLC connection after session stop ---*/
  15840. system("cd /root;./reset_soft.sh");
  15841. while(1)
  15842. {
  15843. //wait for CSU configrm
  15844. }
  15845. }
  15846. /*===========================================================================
  15847. FUNCTION: Parameters_Init
  15848. DESCRIPTION:
  15849. PRE-CONDITION:
  15850. INPUT:
  15851. OUTPUT:
  15852. GLOBAL VARIABLES:
  15853. =============================================================================*/
  15854. int Parameters_Init()
  15855. {
  15856. //Step 0: Generate random number
  15857. unsigned int value_random;
  15858. struct timeb time_seed;
  15859. ftime(&time_seed);
  15860. srand(time_seed.millitm);
  15861. //Step 1: Init SDP TCP Port
  15862. value_random = rand();
  15863. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active = (unsigned short)(SdpTcpServerPort + (value_random % 10000) + 1);
  15864. if((EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active <= 49152)||(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active >= 65535))//49152-65535
  15865. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active=59438;
  15866. sprintf(buf_log_evcomm,
  15867. "[Init]TCP Port:OK(%d)",
  15868. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  15869. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15870. //Step 2: Init SessionID
  15871. value_random = rand();
  15872. memcpy(&EVCOMM_SYS_INFO.SessionID[0], &value_random, 4);
  15873. value_random = rand();
  15874. memcpy(&EVCOMM_SYS_INFO.SessionID[4], &value_random, 4);
  15875. sprintf(buf_log_evcomm,
  15876. "[Init]SessionID:OK(%02X%02X%02X%02X%02X%02X%02X%02X)",
  15877. EVCOMM_SYS_INFO.SessionID[0],
  15878. EVCOMM_SYS_INFO.SessionID[1],
  15879. EVCOMM_SYS_INFO.SessionID[2],
  15880. EVCOMM_SYS_INFO.SessionID[3],
  15881. EVCOMM_SYS_INFO.SessionID[4],
  15882. EVCOMM_SYS_INFO.SessionID[5],
  15883. EVCOMM_SYS_INFO.SessionID[6],
  15884. EVCOMM_SYS_INFO.SessionID[7]);
  15885. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15886. }
  15887. #ifdef SUPPORT_TLS_CONNECTION
  15888. SSL_CTX *create_sslcontext()
  15889. {
  15890. const SSL_METHOD *method;
  15891. SSL_CTX *ctx;
  15892. // Support only TLSv1.2
  15893. method = TLSv1_2_server_method();
  15894. // Create context
  15895. ctx = SSL_CTX_new(method);
  15896. if (!ctx)
  15897. {
  15898. ERR_print_errors_fp(stderr);
  15899. return NULL;
  15900. }
  15901. return ctx;
  15902. }
  15903. int configure_sslcertkey_file(SSL_CTX *ctx)
  15904. {
  15905. SSL_CTX_set_ecdh_auto(ctx, 1);
  15906. // Load certificate file
  15907. if (SSL_CTX_use_certificate_file(ctx, "/root/cacert.pem", SSL_FILETYPE_PEM) <= 0)
  15908. {
  15909. ERR_print_errors_fp(stderr);
  15910. return -1;
  15911. }
  15912. // Load private key file
  15913. if (SSL_CTX_use_PrivateKey_file(ctx, "/root/cakey.pem", SSL_FILETYPE_PEM) <= 0 )
  15914. {
  15915. ERR_print_errors_fp(stderr);
  15916. return -1;
  15917. }
  15918. return 0;
  15919. }
  15920. #endif
  15921. /*===========================================================================
  15922. FUNCTION: main
  15923. DESCRIPTION:
  15924. PRE-CONDITION:
  15925. INPUT:
  15926. OUTPUT:
  15927. GLOBAL VARIABLES:
  15928. =============================================================================*/
  15929. int main(int argc, char *argv[])
  15930. {
  15931. unsigned char Rtn;
  15932. //Initialization
  15933. if(ShareMemory_Init()==0)
  15934. {
  15935. system("reboot -f");
  15936. sleep(5);
  15937. system("reboot -f");
  15938. }
  15939. memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
  15940. if(RawSock > 0)
  15941. {
  15942. close(RawSock);
  15943. }
  15944. if(UdpSock > 0)
  15945. {
  15946. close(UdpSock);
  15947. }
  15948. if(TcpSock > 0)
  15949. {
  15950. close(TcpSock);
  15951. }
  15952. RawSock = UdpSock = TcpSock = -1;
  15953. Update_V2G_Flow_Status(IDLE);
  15954. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------");
  15955. SAVE_SYS_LOG_MSG_EVCOMM("-- EVCOMM: START --");
  15956. SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------\n");
  15957. //Print Linux Kernel Version
  15958. sprintf(buf_log_evcomm, "\nLinux Image SHA1: %s\n", LINUX_IMAGE_VERSION);
  15959. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15960. //Print Hardware Version
  15961. sprintf(buf_log_evcomm, "HW: %s\n", HARDWARE_VERSION);
  15962. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15963. //Print Firmware Version
  15964. sprintf(buf_log_evcomm, "FW: %s\n", FIRMWARE_VERSION);
  15965. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15966. SAVE_SYS_LOG_MSG_EVCOMM("init...");
  15967. //Init V2G TCP/IPv6 packets buffer
  15968. V2gtpMsgRxBuf = (unsigned char *)malloc(V2GTP_MSG_RX_BUFFER_SIZE);
  15969. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  15970. V2gtpMsgTxBuf = (unsigned char *)malloc(V2GTP_MSG_TX_BUFFER_SIZE);
  15971. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  15972. //Release State E Control
  15973. SwitchCpStateE(DISABLE);
  15974. OutputCpPwmDuty(100);
  15975. //start to detect CP pilot state
  15976. CP_Detection_Pid = 0;
  15977. CP_Detection(); //fork1
  15978. SAVE_SYS_LOG_MSG_EVCOMM("[fork1]CP Detection: ON");
  15979. //start to detect errors
  15980. Error_Monitor(); //fork2
  15981. SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Error Monitor: ON");
  15982. //CCS connector type
  15983. sprintf(buf_log_evcomm, "CCS connector type : %s\n", ShmInternalComm->CCSConnectorType > 0? "CCS2":"CCS1" );
  15984. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  15985. //start to detect PP
  15986. PP_Detection_Pid = 0;
  15987. #if (PP_PROTECTION_MECHANISM == ENABLE)
  15988. PP_Detection();
  15989. SAVE_SYS_LOG_MSG_EVCOMM("[fork3]PP Detection: ON");
  15990. #else
  15991. SAVE_SYS_LOG_MSG_EVCOMM("[fork3]PP Detection: OFF");
  15992. #endif
  15993. //Init communication parameters
  15994. GetEthMac(QcaInterface, CsuMac);
  15995. AttenProfileCnt = 0;
  15996. init_appHandEXIDocument(&ccs_handshake);
  15997. //Init Energy transfer mode
  15998. //[To-Do] Parsing Model Name
  15999. if(CCS_ENERGY_TRANSFER_MODE<=1)
  16000. {
  16001. if((ShmInternalComm->AC_EVSEModelName[2]=='Y') || (ShmInternalComm->AC_EVSEModelName[2]=='D') || (ShmInternalComm->AC_EVSEModelName[2]=='W'))
  16002. //if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount==3)
  16003. ShmCcsData->EnergyTransferMode = MODE_AC_THREE_PHASE_CORE;
  16004. else
  16005. ShmCcsData->EnergyTransferMode = MODE_AC_SINGLE_PHASE_CORE;
  16006. }
  16007. else
  16008. ShmCcsData->EnergyTransferMode = CCS_ENERGY_TRANSFER_MODE;
  16009. struct ChargingInfoData *ccs;
  16010. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  16011. Parameters_Init();
  16012. Sniffer_Tcpdump(ENABLE);
  16013. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  16014. sleep(1); //wait for tcpdump getting ready
  16015. #endif
  16016. #ifdef SUPPORT_TLS_CONNECTION
  16017. // SSL init
  16018. //SSL_free (ssl);
  16019. //SSL_CTX_free (ctx);
  16020. SSL_load_error_strings();
  16021. OpenSSL_add_ssl_algorithms();
  16022. // Create SSL_CTX
  16023. ctx = create_sslcontext();
  16024. if (ctx == NULL)
  16025. {
  16026. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]create_sslcontext Failed");
  16027. }
  16028. else
  16029. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]create_sslcontext OK");
  16030. // Configure cert and key
  16031. if (configure_sslcertkey_file(ctx) < 0)
  16032. {
  16033. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]configure_sslcertkey_file Failed");
  16034. }
  16035. else
  16036. SAVE_SYS_LOG_MSG_EVCOMM("[SSL]configure_sslcertkey_file OK");
  16037. #endif
  16038. SAVE_SYS_LOG_MSG_EVCOMM("[Init]DONE");
  16039. while(1)
  16040. {
  16041. //DEBUG_PRINTF_EVCOMM_DETAIL("\nV2gFlowStatus = %d\n", V2gFlowStatus);
  16042. //if((ShmInternalComm->ChargingPermission == 0x01) && (CheckConnectorPlugIn() == 1))
  16043. //if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
  16044. //if(ShmInternalComm->ChargingPermission == 0x01)
  16045. //if(CheckConnectorPlugIn() == TRUE)
  16046. if (EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  16047. {
  16048. if(V2gFlowStatus < SLACC_SDP_UDP_Connection)
  16049. {
  16050. SlacComm();
  16051. }
  16052. else if(V2gFlowStatus == SLACC_SDP_UDP_Connection)
  16053. {
  16054. if(SdpUdpConnected() == 1)
  16055. {
  16056. Update_V2G_Flow_Status(SLACC_SDP_TCP_Connection);
  16057. continue;
  16058. }
  16059. SlacComm(); //TC_SECC_VTB_CmSlacMatch_004
  16060. ftime(&SeqEndTime);
  16061. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  16062. {
  16063. sprintf(buf_log_evcomm,
  16064. "Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join (%.02lf of %d ms)\n",
  16065. DiffTimeb(SeqStartTime, SeqEndTime),
  16066. TT_match_join);
  16067. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  16068. Update_V2G_Flow_Status(Sequence_Timeout);
  16069. //Update_ShmStatusCode(); //[To-Do] to be implemented
  16070. //CCS_SECC_TIMEOUT_SLACC_SDP_UDP_TT_match_join (023823)
  16071. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  16072. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  16073. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  16074. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  16075. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  16076. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  16077. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  16078. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  16079. }
  16080. }
  16081. else if(V2gFlowStatus == SLACC_SDP_TCP_Connection)
  16082. {
  16083. if((TcpAcceptFd = V2gTcpConnected()) > 0)
  16084. {
  16085. Update_V2G_Flow_Status(SupportedAppProtocolRequest);
  16086. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  16087. continue;
  16088. }
  16089. SlacComm();
  16090. ftime(&SeqEndTime);
  16091. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  16092. {
  16093. sprintf(buf_log_evcomm,
  16094. "Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join (%.02lf / %d ms)",
  16095. DiffTimeb(SeqStartTime, SeqEndTime),
  16096. TT_match_join);
  16097. SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
  16098. Update_V2G_Flow_Status(Sequence_Timeout);
  16099. //Update_ShmStatusCode(); //[To-Do] to be implemented
  16100. //CCS_SECC_TIMEOUT_SLACC_SDP_TCP_TT_match_join (023824)
  16101. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  16102. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  16103. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  16104. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  16105. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  16106. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  16107. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  16108. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  16109. }
  16110. }
  16111. else if(V2gFlowStatus <= SessionStopResponse)
  16112. {
  16113. if (V2gComm(TcpAcceptFd) < 0)
  16114. {
  16115. //error occours
  16116. }
  16117. if(V2gFlowStatus == SessionStopResponse)
  16118. {
  16119. if(RawSock > 0)
  16120. {
  16121. close(RawSock);
  16122. }
  16123. if(UdpSock > 0)
  16124. {
  16125. close(UdpSock);
  16126. }
  16127. if(TcpSock > 0)
  16128. {
  16129. close(TcpSock);
  16130. close(TcpAcceptFd);
  16131. }
  16132. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  16133. #ifdef SUPPORT_TLS_CONNECTION
  16134. if(EvSecurity == 0)//support security
  16135. {
  16136. SSL_shutdown(ssl);
  16137. SSL_free (ssl);
  16138. }
  16139. SSL_CTX_free (ctx);
  16140. #endif
  16141. }
  16142. }
  16143. else if (V2gFlowStatus >= Performance_Timeout)
  16144. {
  16145. //End_Process
  16146. if(RawSock > 0)
  16147. {
  16148. close(RawSock);
  16149. }
  16150. if(UdpSock > 0)
  16151. {
  16152. close(UdpSock);
  16153. }
  16154. if(TcpSock > 0)
  16155. {
  16156. close(TcpSock);
  16157. close(TcpAcceptFd);
  16158. }
  16159. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  16160. #ifdef SUPPORT_TLS_CONNECTION
  16161. if(EvSecurity == 0)//support security
  16162. {
  16163. SSL_shutdown(ssl);
  16164. SSL_free (ssl);
  16165. }
  16166. SSL_CTX_free (ctx);
  16167. #endif
  16168. }
  16169. else
  16170. {
  16171. //null
  16172. }
  16173. }
  16174. // printf("V2gFlowStatus=%d, socket=%d,%d,%d\n",V2gFlowStatus,RawSock,UdpSock,TcpSock);
  16175. } //while
  16176. }//main while