Module_CCS.c 652 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201
  1. /*
  2. * Module_CCS.c
  3. *
  4. * Created on: 2020/-3/16
  5. * Author: foluswen
  6. */
  7. #include "Module_CCS.h"
  8. #include "define_ccs.h"
  9. #include "main.h"
  10. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  11. struct StatusCodeData *ShmStatusCodeData;
  12. struct CcsData *ShmCcsData;
  13. struct InternalComm *ShmInternalComm;
  14. struct Charger *ShmCharger;
  15. struct appHandEXIDocument ccs_handshake;
  16. struct dinEXIDocument ccs_exi_doc_DIN;
  17. struct iso1EXIDocument ccs_exi_doc_ISO1;
  18. struct iso2EXIDocument ccs_exi_doc_ISO2;
  19. unsigned char V2GTP_Tx_buf[V2GTP_MSG_TX_BUFFER_SIZE]; //64*1024 = 65,536 = 65.5KB
  20. unsigned char buf_log_evcomm[SIZE_OF_LOG_BUFFER];
  21. unsigned char buf_log_evcomm_fork1[SIZE_OF_LOG_BUFFER];
  22. unsigned char buf_log_evcomm_fork2[SIZE_OF_LOG_BUFFER];
  23. unsigned char buf_log_evcomm_fork3[SIZE_OF_LOG_BUFFER];
  24. pid_t CP_Detection_Pid = 0;
  25. pid_t PP_Detection_Pid = 0;
  26. pid_t Error_Monitor_Pid = 0;
  27. int TcpAcceptFd;
  28. enum MsgFlowStatus V2gFlowStatus;
  29. int RawSock,UdpSock,TcpSock;
  30. unsigned char *V2gtpMsgRxBuf, *V2gtpMsgTxBuf;
  31. unsigned short Aag[64];
  32. struct MmeHeader SendMmePacket;
  33. int SendMmePacketSize;
  34. unsigned char CsuMac[6],QcaMac[6],EvMac[6],SlacRunId[8];
  35. struct sockaddr_ll DestSocketAddress;
  36. struct ifreq Req;
  37. unsigned int PwmStartTime;
  38. struct timeb SeqStartTime, SeqEndTime;
  39. unsigned char AagGroupsNum, MnbcSoundNum, AttenProfileCnt;
  40. unsigned char NewNmkKey[16], Nid[7];
  41. /*===========================================================================
  42. FUNCTION: Check_V2G_Flow_Status
  43. DESCRIPTION:
  44. PRE-CONDITION:
  45. INPUT:
  46. OUTPUT:
  47. GLOBAL VARIABLES:
  48. =============================================================================*/
  49. unsigned char Check_V2G_Flow_Status()
  50. {
  51. unsigned char result = 0;
  52. switch (ShmCcsData->CommProtocol)
  53. {
  54. case V2GT_MSG_PROTOCOL_DIN70121: //0
  55. {
  56. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  57. break;
  58. }
  59. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  60. {
  61. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  62. break;
  63. }
  64. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  65. {
  66. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  67. break;
  68. }
  69. default:
  70. break;
  71. }
  72. return result;
  73. }
  74. /*===========================================================================
  75. FUNCTION: CAN_Tx_MSG
  76. DESCRIPTION:
  77. PRE-CONDITION:
  78. INPUT:
  79. OUTPUT:
  80. GLOBAL VARIABLES:
  81. =============================================================================*/
  82. int CAN_Tx_MSG(int Fd, unsigned int MsgId, unsigned char SlaveAddress, unsigned char DataLength, unsigned char *SendData)
  83. {
  84. #if 0
  85. struct can_frame frame;
  86. struct timeb StartTime, EndTime;
  87. unsigned int tmp = 0;
  88. int nbytes = 0;
  89. int i = 0;
  90. //Protection: To avoid unexpected length for CAN bus payload.
  91. if (DataLength > 8)
  92. {
  93. DataLength = 8;
  94. }
  95. memset(&frame, 0, sizeof(struct can_frame));
  96. frame.can_id = 0x80000000 | CAN_SEND_DIRECTION | MsgId | SlaveAddress; //0x80000000: extension ID format
  97. frame.can_dlc = DataLength;
  98. memcpy(frame.data, SendData, DataLength);
  99. nbytes = write(Fd, &frame, sizeof(struct can_frame));
  100. #if 0
  101. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][CAN_Tx_MSG] <%X> ", frame.can_id);
  102. for (i = 0; i < frame.can_dlc; i++)
  103. {
  104. DEBUG_PRINTF_EVCOMM_DETAIL("%02X ", frame.data[i]);
  105. }
  106. DEBUG_PRINTF_EVCOMM_DETAIL("(%d Bytes)\n", frame.can_dlc);
  107. #endif
  108. return nbytes;
  109. #else
  110. return -1;
  111. #endif
  112. }
  113. /*===========================================================================
  114. FUNCTION: Proc_EVStopRes
  115. DESCRIPTION:
  116. PRE-CONDITION:
  117. INPUT:
  118. OUTPUT:
  119. GLOBAL VARIABLES:
  120. =============================================================================*/
  121. int Proc_EVStopRes(int Fd)
  122. {
  123. int nbytes;
  124. unsigned char Buffer[8];
  125. memset(Buffer, 0, sizeof(Buffer));
  126. if (CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency == TRUE)
  127. {
  128. Buffer[0] = EV_EMERGENCY_STOP; //2
  129. }
  130. else
  131. {
  132. Buffer[0] = EV_NORMAL_STOP; //1
  133. }
  134. /*
  135. if(strlen(ShmStatusCodeData->PresentStatusCode[0]) > 0)
  136. {
  137. memcpy(Buffer + 2, ShmStatusCodeData->PresentStatusCode[0], 6);
  138. }
  139. */
  140. Buffer[1] = ShmStatusCodeData->PresentStatusCode[0][0];
  141. Buffer[2] = ShmStatusCodeData->PresentStatusCode[0][1];
  142. Buffer[3] = ShmStatusCodeData->PresentStatusCode[0][2];
  143. Buffer[4] = ShmStatusCodeData->PresentStatusCode[0][3];
  144. Buffer[5] = ShmStatusCodeData->PresentStatusCode[0][4];
  145. Buffer[6] = ShmStatusCodeData->PresentStatusCode[0][5];
  146. nbytes = CAN_Tx_MSG(Fd, CAN_CMD_EV_STOP_EVENT, ShmInternalComm->SlaveAddress, 7, Buffer);
  147. //system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); //for test only
  148. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  149. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_EVStopRes] Sending STOP Command to CSU");
  150. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = FALSE;
  151. return nbytes;
  152. }
  153. /*===========================================================================
  154. FUNCTION: Sniffer_Candump
  155. DESCRIPTION:
  156. 1. Only used in End_Process(), which is in fork2 of SeccComm task.
  157. PRE-CONDITION:
  158. INPUT:
  159. OUTPUT:
  160. 0: accept
  161. -1: invalid
  162. GLOBAL VARIABLES:
  163. =============================================================================*/
  164. int Sniffer_Candump(char cmd)
  165. {
  166. #if (CANDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  167. if (cmd == ENABLE)
  168. {
  169. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]init");
  170. system("cd /mnt/;rm -rf candump/");
  171. system("cd /mnt/;mkdir candump");
  172. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]on");
  173. system("cd /mnt/candump;candump -l can0 &");
  174. return 0;
  175. }
  176. else if (cmd == DISABLE)
  177. {
  178. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]off");
  179. system("killall candump");
  180. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]save");
  181. system("cd /;cp -rfv /mnt/candump /Storage/SystemLog/");
  182. return 0;
  183. }
  184. else
  185. {
  186. sprintf((char*)buf_log_evcomm_fork2, "[candump]unexpected cmd(%d)", cmd);
  187. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  188. return -1;
  189. }
  190. #endif
  191. return 0;
  192. }
  193. /*===========================================================================
  194. FUNCTION: Sniffer_Tcpdump
  195. DESCRIPTION:
  196. PRE-CONDITION:
  197. INPUT:
  198. OUTPUT:
  199. GLOBAL VARIABLES:
  200. =============================================================================*/
  201. int Sniffer_Tcpdump(char cmd)
  202. {
  203. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  204. if (cmd == ENABLE)
  205. {
  206. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]init...");
  207. system("cd /mnt/;rm -rf tcpdump/");
  208. system("cd /mnt/;mkdir tcpdump");
  209. unsigned char buf[256];
  210. time_t CurrentTime;
  211. struct tm *tm;
  212. struct timeval tv;
  213. memset(buf, 0, sizeof(buf));
  214. CurrentTime = time(NULL);
  215. tm = localtime(&CurrentTime);
  216. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  217. sprintf((char*)buf,
  218. "tcpdump -i eth1 -w /mnt/tcpdump/[%s][%04d%02d%02d-%02d:%02d:%02d.%06d]packets.pcap&",
  219. FIRMWARE_VERSION,
  220. tm->tm_year + 1900,
  221. tm->tm_mon + 1,
  222. tm->tm_mday,
  223. tm->tm_hour,
  224. tm->tm_min,
  225. tm->tm_sec,
  226. tv.tv_usec
  227. );
  228. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]on");
  229. system(buf);
  230. return 0;
  231. }
  232. else if (cmd == DISABLE)
  233. {
  234. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]off");
  235. system("killall tcpdump");
  236. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]wait: 2s");
  237. sleep(1);
  238. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]wait: 1s");
  239. sleep(1);
  240. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]save");
  241. system("cd /;cp -rfv /mnt/tcpdump /Storage/SystemLog/");
  242. return 0;
  243. }
  244. else
  245. {
  246. sprintf((char*)buf_log_evcomm, "[tcpdump]unexpected cmd(%d)", cmd);
  247. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  248. return -1;
  249. }
  250. #endif
  251. return 0;
  252. }
  253. /*===========================================================================
  254. FUNCTION: Check_V2G_Flow_Status_pre
  255. DESCRIPTION:
  256. PRE-CONDITION:
  257. INPUT:
  258. OUTPUT:
  259. GLOBAL VARIABLES:
  260. =============================================================================*/
  261. unsigned char Check_V2G_Flow_Status_pre()
  262. {
  263. unsigned char result = 0;
  264. switch (ShmCcsData->CommProtocol)
  265. {
  266. case V2GT_MSG_PROTOCOL_DIN70121: //0
  267. {
  268. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre;
  269. break;
  270. }
  271. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  272. {
  273. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre;
  274. break;
  275. }
  276. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  277. {
  278. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre;
  279. break;
  280. }
  281. default:
  282. break;
  283. }
  284. return result;
  285. }
  286. /*===========================================================================
  287. FUNCTION: Update_V2G_Flow_Status
  288. DESCRIPTION:
  289. PRE-CONDITION:
  290. INPUT:
  291. OUTPUT:
  292. 1. V2gFlowStatus
  293. GLOBAL VARIABLES:
  294. 1. V2gFlowStatus
  295. =============================================================================*/
  296. int Update_V2G_Flow_Status(unsigned int state_new)
  297. {
  298. unsigned char state_now;
  299. state_now = Check_V2G_Flow_Status();
  300. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE ||
  301. CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused == TRUE)
  302. {
  303. if (state_now != Performance_Timeout && //253
  304. state_now != Sequence_Timeout && //254
  305. state_now != Other_Fault) //255
  306. {
  307. sprintf((char*)buf_log_evcomm,
  308. "[Warning]state(%d) change: ignored (End_Process_inused:%d, FW_Update_Task_inused:%d)",
  309. state_new,
  310. EVCOMM_SYS_INFO.End_Process_inused,
  311. CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused
  312. );
  313. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  314. return -1;
  315. }
  316. }
  317. if (state_now != state_new)
  318. {
  319. //Step 1: Check if Error Occours
  320. if (state_now == Performance_Timeout || //253
  321. state_now == Sequence_Timeout || //254
  322. state_now == Other_Fault) //255
  323. {
  324. if (state_new != IDLE)
  325. {
  326. if (EVCOMM_SYS_INFO.State_Change_Ignored_Notice == FALSE)
  327. {
  328. EVCOMM_SYS_INFO.State_Change_Ignored_Notice = TRUE;
  329. sprintf((char*)buf_log_evcomm,
  330. "[Warning]state(%d) change: ignored(now in error state(%d))",
  331. state_new,
  332. state_now);
  333. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  334. }
  335. return -1;
  336. }
  337. }
  338. //Updating the state formally.
  339. sprintf((char*)buf_log_evcomm,
  340. "%02d >> %02d",
  341. state_now,
  342. state_new
  343. );
  344. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  345. V2gFlowStatus = state_new;
  346. state_now = state_new;
  347. switch (ShmCcsData->CommProtocol)
  348. {
  349. case V2GT_MSG_PROTOCOL_DIN70121: //0
  350. {
  351. ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  352. ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus = V2gFlowStatus;
  353. break;
  354. }
  355. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  356. {
  357. ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  358. ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus = V2gFlowStatus;
  359. break;
  360. }
  361. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  362. {
  363. ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  364. ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus = V2gFlowStatus;
  365. break;
  366. }
  367. default:
  368. break;
  369. }
  370. }
  371. return 0;
  372. }
  373. double DiffTimeb(struct timeb ST, struct timeb ET)
  374. {
  375. //return milli-second
  376. double StartTime, EndTime;
  377. double t_diff;
  378. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  379. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  380. t_diff = EndTime - StartTime;
  381. if (t_diff < 0)
  382. {
  383. #if 0
  384. if (t_diff < -1000) //1000ms
  385. {
  386. sprintf((char*)buf_log_evcomm,
  387. "[Warning]StartTime(%.02lf) > EndTime(%.02lf), d(%.02lf)",
  388. StartTime,
  389. EndTime,
  390. t_diff);
  391. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  392. }
  393. #endif
  394. return -1;
  395. }
  396. return t_diff;
  397. }
  398. double DiffTimeb_fork1_Error_Monitor(struct timeb ST, struct timeb ET)
  399. {
  400. //return milli-second
  401. static double StartTime, EndTime;
  402. static double t_diff;
  403. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  404. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  405. t_diff = EndTime - StartTime;
  406. if (t_diff < 0)
  407. {
  408. #if 0
  409. if (t_diff < -1000) //1000ms
  410. {
  411. sprintf((char*)buf_log_evcomm_fork2,
  412. "[fork1][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
  413. StartTime,
  414. EndTime,
  415. t_diff);
  416. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  417. }
  418. #endif
  419. return -1;
  420. }
  421. return t_diff;
  422. }
  423. double DiffTimeb_fork2_Error_Monitor(struct timeb ST, struct timeb ET)
  424. {
  425. //return milli-second
  426. static double StartTime, EndTime;
  427. static double t_diff;
  428. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  429. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  430. t_diff = EndTime - StartTime;
  431. if (t_diff < 0)
  432. {
  433. #if 0
  434. if (t_diff < -1000) //1000ms
  435. {
  436. sprintf((char*)buf_log_evcomm_fork2,
  437. "[fork2][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
  438. StartTime,
  439. EndTime,
  440. t_diff);
  441. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  442. }
  443. #endif
  444. return -1;
  445. }
  446. return t_diff;
  447. }
  448. int CreateShareMemory()
  449. {
  450. int MeterSMId;
  451. //create ShmSysConfigAndInfo
  452. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  453. {
  454. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmget ShmSysConfigAndInfo NG");
  455. return 0;
  456. }
  457. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  458. {
  459. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmat ShmSysConfigAndInfo NG");
  460. return 0;
  461. }
  462. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  463. //create ShmStatusCodeData
  464. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  465. {
  466. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmget ShmStatusCodeData NG");
  467. return 0;
  468. }
  469. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  470. {
  471. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmat ShmStatusCodeData NG");
  472. return 0;
  473. }
  474. memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData));
  475. //create ShmCcsData
  476. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  477. {
  478. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmget ShmCcsData NG");
  479. return 0;
  480. }
  481. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  482. {
  483. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmat ShmCcsData NG");
  484. return 0;
  485. }
  486. memset(ShmCcsData,0,sizeof(struct CcsData));
  487. return 1;
  488. }
  489. /*===========================================================================
  490. FUNCTION: ShareMemory_Init
  491. DESCRIPTION:
  492. PRE-CONDITION:
  493. INPUT:
  494. OUTPUT:
  495. GLOBAL VARIABLES:
  496. =============================================================================*/
  497. int ShareMemory_Init()
  498. {
  499. int MeterSMId;
  500. //create ShmSysConfigAndInfo
  501. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  502. {
  503. DEBUG_ERROR("ShareMemory_Init:shmget ShmSysConfigAndInfo NG");
  504. return 0;
  505. }
  506. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  507. {
  508. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "ShareMemory_Init:shmat ShmSysConfigAndInfo NG");
  509. return 0;
  510. }
  511. //create ShmStatusCodeData
  512. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  513. {
  514. DEBUG_ERROR("ShareMemory_Init:shmget ShmStatusCodeData NG");
  515. return 0;
  516. }
  517. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  518. {
  519. DEBUG_ERROR("ShareMemory_Init:shmat ShmStatusCodeData NG");
  520. return 0;
  521. }
  522. //create ShmCcsData
  523. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  524. {
  525. DEBUG_ERROR("ShareMemory_Init:shmget ShmCcsData NG");
  526. return 0;
  527. }
  528. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  529. {
  530. DEBUG_ERROR("ShareMemory_Init:shmat ShmCcsData NG");
  531. return 0;
  532. }
  533. //create ShmInternalComm
  534. if ((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), IPC_CREAT | 0777)) < 0)
  535. {
  536. DEBUG_ERROR("ShareMemory_Init:shmget ShmInternalComm NG");
  537. return 0;
  538. }
  539. else if ((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  540. {
  541. DEBUG_ERROR("ShareMemory_Init:shmat ShmInternalComm NG");
  542. return 0;
  543. }
  544. //Initial ShmCharger
  545. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0)
  546. {
  547. DEBUG_ERROR("shmget ShmChargerKey NG\r\n");
  548. return 0;
  549. }
  550. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  551. {
  552. DEBUG_ERROR("shmat ShmChargerKey NG\r\n");
  553. return 0;
  554. }
  555. //[To-Do] The initialization here is reduntant and should be removed partially.
  556. //SHM_Init_supportedAppProtocolRes(ShmCcsData);
  557. //SHM_Init_din_SessionSetupRes(ShmCcsData);
  558. //SHM_Init_din_ServiceDiscoveryRes(ShmCcsData);
  559. //SHM_Init_din_ServiceAndPaymentSelectionRes(ShmCcsData);
  560. //SHM_Init_din_ContractAuthenticationRes(ShmCcsData);
  561. SHM_Init_din_ChargeParameterDiscoveryRes(ShmCcsData);
  562. SHM_Init_din_CableCheckRes(ShmCcsData);
  563. SHM_Init_din_PreChargeRes(ShmCcsData);
  564. SHM_Init_din_PowerDeliveryRes(ShmCcsData);
  565. SHM_Init_din_CurrentDemandRes(ShmCcsData);
  566. SHM_Init_din_WeldingDetectionRes(ShmCcsData);
  567. SHM_Init_din_SessionStopRes(ShmCcsData);
  568. return 1;
  569. }
  570. /*===========================================================================
  571. FUNCTION: GetEthMac
  572. DESCRIPTION:
  573. 1. Accessing current CsuMac address, if Eth = eth1
  574. 2. The address of eth1(for QCA7000) is a random number, which will be modified
  575. after each time of booting up system.
  576. PRE-CONDITION:
  577. INPUT:
  578. OUTPUT:
  579. GLOBAL VARIABLES:
  580. =============================================================================*/
  581. int GetEthMac(unsigned char *Eth, unsigned char *mac)
  582. {
  583. //Parameters:MAC,IP,Mask,Gateway
  584. int fd;
  585. unsigned char addr[18], Buffer[128];
  586. memset(Buffer, 0, sizeof(Buffer));
  587. sprintf((char*)Buffer, "cat /sys/class/net/%s/address > /mnt/GetEthInfo", Eth); //CsuMac (Eth = eth1)
  588. system((char*)Buffer);
  589. fd = open("/mnt/GetEthInfo", O_RDONLY);
  590. if(fd < 0)
  591. {
  592. system("rm -f /mnt/GetEthInfo");
  593. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "GetEthMac: MAC Address open error");
  594. return 0;
  595. }
  596. memset(mac, 0, 6);
  597. memset(addr, 0, sizeof(addr));
  598. read(fd, addr, 17);
  599. close(fd);
  600. system("rm -f /mnt/GetEthInfo");
  601. sscanf((char*)addr, "%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t *)&mac[0], (uint32_t *)&mac[1], (uint32_t *)&mac[2], (uint32_t *)&mac[3], (uint32_t *)&mac[4], (uint32_t *)&mac[5]); //CsuMac (Eth = eth1)
  602. sprintf((char*)buf_log_evcomm,
  603. "[GetEthMac]EVSE MACAddr(CsuMac): %02x:%02x:%02x:%02x:%02x:%02x",
  604. mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); //CsuMac (Eth = eth1)
  605. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  606. return 1;
  607. }
  608. /*===========================================================================
  609. FUNCTION: ReadAdcVolt
  610. DESCRIPTION:
  611. 1. fork1
  612. PRE-CONDITION:
  613. INPUT:
  614. OUTPUT:
  615. GLOBAL VARIABLES:
  616. =============================================================================*/
  617. float ReadAdcVolt(unsigned char AdcChannel)
  618. {
  619. //AIN0=CCS GUN Temp 1
  620. //AIN1=CCS GUN Temp 2
  621. //AIN2=CCS_Proximity/2
  622. //AIN3=pilot voltage
  623. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  624. return 0;
  625. #else
  626. if(AdcChannel == 3)
  627. {
  628. int fd,count,AvgTimes;
  629. unsigned char SampleBuf[4];
  630. float TmpVolt, MinSample, AvgSample = 0;
  631. fd = open("/sys/bus/iio/devices/iio\\:device0/in_voltage3_raw", O_RDONLY);
  632. if(fd > 0)
  633. {
  634. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  635. for(AvgTimes = 0; AvgTimes < 3; AvgTimes++) //period = 60~91 ms(renice -10, , CurrentDemand())
  636. {
  637. count = 0;
  638. MinSample = 2306;
  639. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  640. while(count < 30) //period = 21~42ms (renice -10, CurrentDemand())
  641. {
  642. //re-sampling period = 3~13ms (renice -10, SLAC())
  643. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  644. read(fd, SampleBuf, 4); //period = 3.2~10ms (renice -10, SLAC())
  645. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  646. TmpVolt = atoi((char*)SampleBuf);
  647. if((TmpVolt < 2306) && (TmpVolt > 0))//positive voltage
  648. {
  649. if(TmpVolt < MinSample)
  650. {
  651. MinSample = TmpVolt;
  652. }
  653. count++;
  654. }
  655. lseek(fd, 0, SEEK_SET);
  656. }
  657. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  658. AvgSample += MinSample;
  659. }
  660. AvgSample /= AvgTimes;
  661. close(fd);
  662. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  663. return ((0.954-(1.8*AvgSample/4095))/0.06);
  664. }
  665. else
  666. {
  667. return -1;
  668. }
  669. }
  670. else
  671. {
  672. FILE *fp;
  673. unsigned char str[64];
  674. unsigned char AdcValue[8];
  675. if(AdcChannel > 7)
  676. {
  677. return -1;
  678. }
  679. memset(str,0,sizeof(str));
  680. memset(AdcValue,0,sizeof(AdcValue));
  681. sprintf((char*)str, "cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw", AdcChannel);
  682. fp=popen((char*)str, "r");
  683. if(fgets((char*)AdcValue,sizeof(AdcValue),fp) == NULL)
  684. {
  685. pclose(fp);
  686. return -1;
  687. }
  688. pclose(fp);
  689. //Vin = Vref *D / (2^n - 1)
  690. return ((float)1.8*(float)atoi((char*)AdcValue))/4095;
  691. }
  692. #endif
  693. }
  694. /*===========================================================================
  695. FUNCTION: ReadAdcVolt
  696. DESCRIPTION:
  697. //AIN0=CCS GUN Temp 1
  698. //AIN1=CCS GUN Temp 2
  699. //AIN2=CCS_Proximity/2
  700. //AIN3=pilot voltage
  701. PRE-CONDITION:
  702. INPUT:
  703. OUTPUT:
  704. GLOBAL VARIABLES:
  705. =============================================================================*/
  706. float ReadAdcVolt_PP_fork3()
  707. {
  708. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  709. return 0;
  710. #else
  711. int fd, AvgTimes;
  712. unsigned char SampleBuf[4];
  713. float TmpVolt = 0;
  714. float AvgSample = 0;
  715. float V_pp = 0;
  716. fd = open("/sys/bus/iio/devices/iio\\:device0/in_voltage2_raw", O_RDONLY); //PP
  717. if(fd > 0)
  718. {
  719. for(AvgTimes = 0; AvgTimes < 5; AvgTimes++) //get 5 samples
  720. {
  721. read(fd, SampleBuf, 4);
  722. TmpVolt = atoi((char*)SampleBuf);
  723. lseek(fd, 0, SEEK_SET);
  724. AvgSample += TmpVolt;
  725. }
  726. close(fd);
  727. AvgSample /= AvgTimes;
  728. V_pp = (3.6*AvgSample)/4095; //PP
  729. #if 0
  730. printf("PP_adc = %.02f, PP_v = %.02f\n", AvgSample, V_pp);
  731. usleep(3000000); //300ms
  732. #endif
  733. usleep(20000); //20ms
  734. return V_pp;
  735. }
  736. else
  737. {
  738. return -1;
  739. }
  740. #endif
  741. }
  742. /*===========================================================================
  743. FUNCTION: Qca7kPowerReset
  744. DESCRIPTION:
  745. PRE-CONDITION:
  746. INPUT:
  747. OUTPUT:
  748. GLOBAL VARIABLES:
  749. =============================================================================*/
  750. void Qca7kPowerReset()
  751. {
  752. printf("\n[CCS Board]Reset QCA7000...\n");
  753. system("echo 1 > /sys/class/gpio/gpio88/value");
  754. usleep(500000);
  755. system("echo 0 > /sys/class/gpio/gpio88/value");
  756. }
  757. /*===========================================================================
  758. FUNCTION: SwitchCpStateE
  759. DESCRIPTION:
  760. PRE-CONDITION:
  761. INPUT:
  762. OUTPUT:
  763. GLOBAL VARIABLES:
  764. =============================================================================*/
  765. int SwitchCpStateE(unsigned char OnOff)
  766. {
  767. /*
  768. * TODO: Request CP change to state E
  769. */
  770. if((OnOff != ENABLE) && (OnOff != DISABLE))
  771. {
  772. return -1;
  773. }
  774. struct ChargingInfoData *ccs;
  775. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  776. ccs->SwitchCpStateE_status = OnOff;
  777. //OnOff = 1 => switch State to E
  778. //OnOff = 0 => return noraml
  779. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  780. {
  781. if(OnOff == DISABLE)
  782. {
  783. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: released\n");
  784. CSUCOMMAC_SHM.CpSetStateE = DISABLE;
  785. }
  786. else
  787. {
  788. OutputCpPwmDuty(100); //set CP duty as 100, firstly.
  789. CSUCOMMAC_SHM.CpSetStateE = ENABLE;
  790. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: enabled!\n");
  791. }
  792. }
  793. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  794. {
  795. if(OnOff == DISABLE)
  796. {
  797. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: released\n");
  798. system("echo 0 > /sys/class/gpio/gpio86/value");
  799. }
  800. else
  801. {
  802. OutputCpPwmDuty(100); //set CP duty as 100, firstly.
  803. system("echo 1 > /sys/class/gpio/gpio86/value");
  804. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: enabled!\n");
  805. }
  806. }
  807. #endif
  808. if (ccs->SwitchCpStateE_status_pre != ccs->SwitchCpStateE_status)
  809. {
  810. sprintf((char*)buf_log_evcomm,
  811. "SwitchCpStateE: %d >> %d",
  812. ccs->SwitchCpStateE_status_pre,
  813. ccs->SwitchCpStateE_status
  814. );
  815. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  816. ccs->SwitchCpStateE_status_pre = ccs->SwitchCpStateE_status;
  817. }
  818. return 0;
  819. }
  820. /*===========================================================================
  821. FUNCTION: OutputCpPwmDuty
  822. DESCRIPTION:
  823. PRE-CONDITION:
  824. INPUT:
  825. OUTPUT:
  826. GLOBAL VARIABLES:
  827. =============================================================================*/
  828. int OutputCpPwmDuty(unsigned char Duty)
  829. {
  830. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  831. int DutyInNanoSec;
  832. #endif
  833. struct ChargingInfoData *ccs;
  834. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  835. if((Duty < 0)||(Duty > 100))
  836. {
  837. return -1;
  838. }
  839. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  840. {
  841. CSUCOMMAC_SHM.CpSetPWMDuty = Duty;
  842. }
  843. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  844. {
  845. DutyInNanoSec = 10000 * Duty;
  846. sprintf((char*)buf_log_evcomm, "echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle", DutyInNanoSec);//nanoseconds
  847. system((char*)buf_log_evcomm);
  848. }
  849. #endif
  850. ccs->CpDuty = Duty;
  851. //CP Duty
  852. if (ccs->CpDuty != ccs->CpDuty_pre)
  853. {
  854. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  855. sprintf((char*)buf_log_evcomm, "CP Duty: %d %% >> %d %%", ccs->CpDuty_pre, ccs->CpDuty);
  856. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  857. ccs->CpDuty_pre = ccs->CpDuty;
  858. }
  859. return 0;
  860. }
  861. /*===========================================================================
  862. FUNCTION: Check_Plugin_Status_Update_fork1
  863. DESCRIPTION:
  864. PRE-CONDITION:
  865. INPUT:
  866. OUTPUT:
  867. GLOBAL VARIABLES:
  868. =============================================================================*/
  869. //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  870. void Check_Plugin_Status_Update_fork1(struct ChargingInfoData *ccs)
  871. {
  872. if (ccs->ConnectorPlugIn != ccs->ConnectorPlugIn_new)
  873. {
  874. sprintf((char*)buf_log_evcomm_fork1, "[fork1]Plugin: %d >> %d (CP=%.2fV, PP=%.2fV)",
  875. ccs->ConnectorPlugIn,
  876. ccs->ConnectorPlugIn_new,
  877. ccs->CpVoltage,
  878. ccs->PpVoltage
  879. );
  880. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  881. ccs->ConnectorPlugIn_pre = ccs->ConnectorPlugIn;
  882. ccs->ConnectorPlugIn = ccs->ConnectorPlugIn_new;
  883. //ccs->CpVoltage_pre = ccs->CpVoltage;
  884. }
  885. }
  886. //#endif
  887. /*===========================================================================
  888. FUNCTION: ConnectorPlugIn
  889. DESCRIPTION:
  890. PRE-CONDITION:
  891. INPUT:
  892. OUTPUT:
  893. 0: Unplug
  894. 1: Plug-in
  895. GLOBAL VARIABLES:
  896. =============================================================================*/
  897. int CheckConnectorPlugIn()
  898. {
  899. /*
  900. * TODO: Return connector status depedon CP
  901. */
  902. static struct ChargingInfoData *ccs;
  903. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  904. #if (CP_PROTECTION_MECHANISM == ENABLE)
  905. return (int)ccs->ConnectorPlugIn;
  906. #else
  907. return TRUE;
  908. #endif
  909. }
  910. /*===========================================================================
  911. FUNCTION: Check_CP_State_Error_fork1
  912. DESCRIPTION:
  913. PRE-CONDITION:
  914. INPUT:
  915. OUTPUT:
  916. GLOBAL VARIABLES:
  917. =============================================================================*/
  918. int Check_CP_State_Error_fork1(struct ChargingInfoData *ccs)
  919. {
  920. #if (CP_PROTECTION_MECHANISM == DISABLE)
  921. {
  922. return -1;
  923. }
  924. #endif
  925. unsigned char state = 0;
  926. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  927. double time_diff = 0;
  928. #endif
  929. state = Check_V2G_Flow_Status();
  930. //SLAC, SLAAC, SDP, ..., ChargeParameterDiscovery
  931. if (state >= CM_SLAC_PARM_CONF && //by considering 15118(SLAC first)
  932. state < ChargeParameterDiscoveryRequest &&
  933. state != IDLE &&
  934. state != CM_SET_KEY_REQ &&
  935. state != CM_SET_KEY_CNF &&
  936. state != CM_VALIDATE_REQ &&
  937. state != CM_VALIDATE_CNF)
  938. {
  939. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  940. {
  941. if((ccs->CpState != 2) && (ccs->CpState != 3))
  942. {
  943. if (ccs->CpState_err == FALSE)
  944. {
  945. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  946. //CPD: ChargeParameterDiscovery
  947. }
  948. ccs->CpState_err = TRUE;
  949. }
  950. }
  951. #else
  952. {
  953. if(ccs->CpState != 3)
  954. {
  955. if (ccs->CpState_err == FALSE)
  956. {
  957. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  958. //CPD: ChargeParameterDiscovery
  959. }
  960. ccs->CpState_err = TRUE;
  961. }
  962. }
  963. #endif
  964. }
  965. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  966. {
  967. //ChargeParameterDiscovery
  968. if(state >= ChargeParameterDiscoveryRequest && //35
  969. state <= ChargeParameterDiscoveryResponse) //36
  970. {
  971. if(ccs->CpState != 3)
  972. {
  973. if (ccs->CpState_err == FALSE)
  974. {
  975. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD");
  976. //PRC: Precharge
  977. //CUD: CurrentDemand
  978. }
  979. ccs->CpState_err = TRUE;
  980. }
  981. }
  982. //ChargingStatus
  983. if(state >= ChargingStatusRequest && //43
  984. state <= ChargingStatusResponse) //44
  985. {
  986. if(ccs->CpState != 4 && ccs->CpState != 5)
  987. {
  988. if (ccs->CpState_err == FALSE)
  989. {
  990. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CGS");
  991. //PRC: Precharge
  992. //CUD: CurrentDemand
  993. }
  994. ccs->CpState_err = TRUE;
  995. }
  996. }
  997. }
  998. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  999. {
  1000. //ChargeParameterDiscovery, CableCheck
  1001. if (state >= ChargeParameterDiscoveryRequest && //35
  1002. state <= CableCheckResponse) //38
  1003. {
  1004. if(ccs->CableCheckPreCountDownDone == FALSE &&
  1005. state >= CableCheckRequest)
  1006. {
  1007. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  1008. time_diff = DiffTimeb_fork1_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  1009. if(time_diff >= V2G_SECC_CP_Timeout_CableCheck) //2 sec
  1010. {
  1011. sprintf((char*)buf_log_evcomm_fork1,
  1012. "[fork1][CP]check C(4),D(5): ON (%.02lf of %dms)",
  1013. time_diff,
  1014. V2G_SECC_CP_Timeout_CableCheck);
  1015. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1016. ccs->CableCheckPreCountDownDone = TRUE;
  1017. }
  1018. }
  1019. if(ccs->CableCheckPreCountDownDone == TRUE)
  1020. {
  1021. if(ccs->CpState != 4 && ccs->CpState != 5)
  1022. {
  1023. if (ccs->CpState_err == FALSE)
  1024. {
  1025. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD and CCK (after CNT)");
  1026. //CPD: ChargeParameterDiscovery
  1027. //CCK: CableCheck
  1028. //CNT: count down
  1029. }
  1030. ccs->CpState_err = TRUE;
  1031. }
  1032. }
  1033. else
  1034. {
  1035. if(ccs->CpState != 3 && ccs->CpState != 4 && ccs->CpState != 5)
  1036. {
  1037. if (ccs->CpState_err == FALSE)
  1038. {
  1039. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD and CCK (before CNT)");
  1040. //CPD: ChargeParameterDiscovery
  1041. //CCK: CableCheck
  1042. //CNT: count down
  1043. }
  1044. ccs->CpState_err = TRUE;
  1045. }
  1046. }
  1047. }
  1048. //Precharge, CurrentDemand
  1049. if(state >= PreChargeRequest && //39
  1050. state <= CurrentDemandResponse) //46
  1051. {
  1052. if(ccs->CpState != 4 && ccs->CpState != 5)
  1053. {
  1054. if (ccs->CpState_err == FALSE)
  1055. {
  1056. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]PRC and CUD");
  1057. //PRC: Precharge
  1058. //CUD: CurrentDemand
  1059. }
  1060. ccs->CpState_err = TRUE;
  1061. }
  1062. }
  1063. }
  1064. #endif
  1065. if(ccs->CpState_err == TRUE && ccs->CpState_err_logged == FALSE)
  1066. {
  1067. OutputCpPwmDuty(100);
  1068. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  1069. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1070. //CCS_SECC_CP_State_Error (023889)
  1071. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1072. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1073. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1074. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1075. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1076. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1077. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1078. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1079. sprintf((char*)buf_log_evcomm_fork1, "[fork1][Erorr]CP(%d) Error in state %d(%d)",
  1080. ccs->CpState,
  1081. state,
  1082. ccs->CableCheckPreCountDownDone
  1083. );
  1084. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1085. ccs->CpState_err_logged = TRUE;
  1086. }
  1087. return 0;
  1088. }
  1089. /*===========================================================================
  1090. FUNCTION: Check_CP_State_Update_fork1
  1091. DESCRIPTION:
  1092. PRE-CONDITION:
  1093. INPUT:
  1094. OUTPUT:
  1095. GLOBAL VARIABLES:
  1096. =============================================================================*/
  1097. //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  1098. void Check_CP_State_Update_fork1(struct ChargingInfoData *ccs)
  1099. {
  1100. //CP State
  1101. if (ccs->CpState != ccs->CpState_pre)
  1102. {
  1103. sprintf((char*)buf_log_evcomm_fork1, "[fork1]CP State: %d >> %d (%.2fV)",
  1104. ccs->CpState_pre,
  1105. ccs->CpState,
  1106. ccs->CpVoltage
  1107. );
  1108. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1109. ccs->CpState_pre = ccs->CpState;
  1110. }
  1111. }
  1112. //#endif
  1113. /*===========================================================================
  1114. FUNCTION: CP_Detection
  1115. DESCRIPTION:
  1116. 1. In order to detect CP in efficient response time, we creat an independent
  1117. thead for this procedure.
  1118. 2. The priority of this thread is set as the same as other tasks.
  1119. 3. fork1
  1120. PRE-CONDITION:
  1121. INPUT:
  1122. OUTPUT:
  1123. GLOBAL VARIABLES:
  1124. =============================================================================*/
  1125. void CP_Detection()
  1126. {
  1127. pid_t tmp = 0;
  1128. // struct timeb StartTime, EndTime;
  1129. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  1130. unsigned char Statetmp;
  1131. float TotalTmpVolt;
  1132. #endif
  1133. struct ChargingInfoData *ccs;
  1134. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1135. if(CP_Detection_Pid == 0)
  1136. {
  1137. tmp = fork();
  1138. if(tmp > 0)
  1139. {
  1140. CP_Detection_Pid = tmp;
  1141. #if 1
  1142. unsigned char buf[64];
  1143. memset(buf, 0, sizeof(buf));
  1144. //sprintf((char*)buf, "renice -20 -p %d", tmp);
  1145. sprintf((char*)buf, "renice -10 -p %d", tmp);
  1146. system((char*)buf);
  1147. #endif
  1148. return;
  1149. }
  1150. }
  1151. while(1)
  1152. {
  1153. //ADC_Voltage = (1+RE62/RE63)*0.9 - (RE62/RE63)*Pilot_Voltage, RE62/RE63=0.06
  1154. //=>Pilot_Voltage=(0.954-ADC_Voltage)/0.06
  1155. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  1156. {
  1157. ccs->CpVoltage = ShmInternalComm->AC_CpPositiveVoltage;
  1158. ccs->CpState = ShmInternalComm->AC_CpPresentState;
  1159. }
  1160. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  1161. {
  1162. TotalTmpVolt = ReadAdcVolt(3);
  1163. ccs->CpVoltage = TotalTmpVolt;
  1164. if (ccs->CpVoltage_pre != ccs->CpVoltage)
  1165. {
  1166. ccs->CpVoltage_pre = ccs->CpVoltage;
  1167. }
  1168. //printf("TotalTmpVolt = %.02f\n", TotalTmpVolt);
  1169. //If CP voltage is higer than 13.5V
  1170. if(TotalTmpVolt >= 13.5)
  1171. {
  1172. //Pilot Error
  1173. if((ccs->CpState == 1) &&
  1174. (TotalTmpVolt < 13.75))
  1175. {
  1176. //V_cp = 13.5 ~ 13.75
  1177. Statetmp = 1;
  1178. }
  1179. else
  1180. {
  1181. //V_cp = 13.5 ~
  1182. Statetmp = 8;
  1183. }
  1184. }
  1185. else if((TotalTmpVolt >= 10.5) && (TotalTmpVolt < 13.5)) //V_cp = 10.5 ~ 13.5
  1186. {
  1187. //State A (12V)
  1188. if((ccs->CpState >= 2) &&
  1189. (ccs->CpState <= 3) &&
  1190. (TotalTmpVolt < 10.75))
  1191. {
  1192. if((ccs->CpDuty >= 5) &&
  1193. (ccs->CpDuty < 100))
  1194. {
  1195. Statetmp = 3;
  1196. }
  1197. else
  1198. {
  1199. Statetmp = 2;
  1200. }
  1201. }
  1202. else if((ccs->CpState == 8) &&
  1203. (TotalTmpVolt >= 13.25))
  1204. {
  1205. Statetmp = 8;
  1206. }
  1207. else
  1208. {
  1209. Statetmp = 1;
  1210. }
  1211. }
  1212. else if((TotalTmpVolt >= 7.5) && (TotalTmpVolt < 10.5))
  1213. {
  1214. //State B (9V)
  1215. if((ccs->CpState == 4) && (TotalTmpVolt < 7.75))
  1216. {
  1217. Statetmp = 4;
  1218. }
  1219. else if((ccs->CpState == 1) && (TotalTmpVolt >= 10.25))
  1220. {
  1221. Statetmp = 1;
  1222. }
  1223. else
  1224. {
  1225. if((ccs->CpDuty >= 5) && (ccs->CpDuty < 100))
  1226. {
  1227. Statetmp = 3;
  1228. }
  1229. else
  1230. {
  1231. Statetmp = 2;
  1232. }
  1233. }
  1234. }
  1235. else if((TotalTmpVolt >= 4.5) && (TotalTmpVolt < 7.5))
  1236. {
  1237. //State C (6V)
  1238. if((ccs->CpState == 5) && (TotalTmpVolt < 4.75))
  1239. {
  1240. Statetmp = 5;
  1241. }
  1242. else if((ccs->CpState >= 2) && (ccs->CpState <= 3) && (TotalTmpVolt >= 7.25))
  1243. {
  1244. if((ccs->CpDuty >= 5)&&(ccs->CpDuty < 100))
  1245. {
  1246. Statetmp = 3;
  1247. }
  1248. else
  1249. {
  1250. Statetmp = 2;
  1251. }
  1252. }
  1253. else
  1254. {
  1255. Statetmp = 4;
  1256. }
  1257. }
  1258. else if((TotalTmpVolt >= 1.5) && (TotalTmpVolt < 4.5))
  1259. {
  1260. //State D (3V)
  1261. if((ccs->CpState == 6)&&(TotalTmpVolt < 1.75))
  1262. {
  1263. Statetmp = 6;
  1264. }
  1265. else if((ccs->CpState == 4)&&(TotalTmpVolt >= 4.25))
  1266. {
  1267. Statetmp = 4;
  1268. }
  1269. else
  1270. {
  1271. Statetmp = 5;
  1272. }
  1273. }
  1274. else if((TotalTmpVolt >= -1.5) && (TotalTmpVolt < 1.5)) //V_cp = -1.5V ~ 1.5V
  1275. {
  1276. //State E (0V)
  1277. if((ccs->CpState == 8) &&
  1278. (TotalTmpVolt < -1.25))
  1279. {
  1280. Statetmp = 8;
  1281. }
  1282. else if((ccs->CpState == 5) &&
  1283. (TotalTmpVolt >= 1.25))
  1284. {
  1285. Statetmp = 5;
  1286. }
  1287. else
  1288. {
  1289. Statetmp = 6;
  1290. }
  1291. }
  1292. else if((TotalTmpVolt >= -13.5) && (TotalTmpVolt < -10.5)) //V_cp = -10.5V ~ -13.5V
  1293. {
  1294. //State F (-12V)
  1295. if((ccs->CpState == 8) &&
  1296. (TotalTmpVolt >= -10.75))
  1297. {
  1298. Statetmp = 8;
  1299. }
  1300. else
  1301. {
  1302. Statetmp = 7;
  1303. }
  1304. }
  1305. else
  1306. {
  1307. //null
  1308. }
  1309. ccs->CpState = Statetmp;
  1310. }
  1311. #endif
  1312. Check_CP_State_Update_fork1(ccs);
  1313. Check_CP_State_Error_fork1(ccs);
  1314. //Updating Plugin status
  1315. #if (PP_PROTECTION_MECHANISM == ENABLE)
  1316. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ) && (ccs->PpVoltage >= 1.0)) //PP >= 1.0V
  1317. #else
  1318. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ))
  1319. #endif
  1320. {
  1321. ccs->ConnectorPlugIn_new = TRUE;
  1322. }
  1323. else
  1324. {
  1325. ccs->ConnectorPlugIn_new = FALSE;
  1326. OutputCpPwmDuty(100);
  1327. }
  1328. Check_Plugin_Status_Update_fork1(ccs);
  1329. //ftime(&EndTime);
  1330. //DEBUG_PRINTF_EVCOMM_DETAIL("duration:%.02lf\n", DiffTimeb(StartTime, EndTime));
  1331. }//while
  1332. }
  1333. /*===========================================================================
  1334. FUNCTION: PP_Detection
  1335. DESCRIPTION:
  1336. 0. SeccComm fork3
  1337. 1. In order to detect CP in efficient response time, we creat an independent
  1338. thead for this procedure.
  1339. 2. The priority of this thread is set as the same as other tasks.
  1340. PRE-CONDITION:
  1341. INPUT:
  1342. OUTPUT:
  1343. GLOBAL VARIABLES:
  1344. =============================================================================*/
  1345. void PP_Detection()
  1346. {
  1347. pid_t tmp = 0;
  1348. // struct timeb StartTime, EndTime;
  1349. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED))
  1350. //unsigned char Statetmp;
  1351. #endif
  1352. float TotalTmpVolt;
  1353. if(PP_Detection_Pid == 0)
  1354. {
  1355. tmp = fork();
  1356. if(tmp > 0)
  1357. {
  1358. PP_Detection_Pid = tmp;
  1359. #if 0
  1360. unsigned char buf[64];
  1361. memset(buf, 0, sizeof(buf));
  1362. sprintf((char*)buf, "renice -20 -p %d", tmp);
  1363. system(buf);
  1364. #endif
  1365. return;
  1366. }
  1367. }
  1368. while(1)
  1369. {
  1370. TotalTmpVolt = ReadAdcVolt_PP_fork3();
  1371. EVCOMM_SYS_INFO.PpVoltage = TotalTmpVolt;
  1372. if (EVCOMM_SYS_INFO.PpVoltage_pre != EVCOMM_SYS_INFO.PpVoltage)
  1373. {
  1374. if ((EVCOMM_SYS_INFO.PpVoltage_pre < 0.5 && EVCOMM_SYS_INFO.PpVoltage >= 1.0) ||
  1375. (EVCOMM_SYS_INFO.PpVoltage_pre >= 1.0 && EVCOMM_SYS_INFO.PpVoltage < 0.5))
  1376. {
  1377. sprintf((char*)buf_log_evcomm_fork3,
  1378. "[fork3]PP(%.2f >> %.2fV)",
  1379. EVCOMM_SYS_INFO.PpVoltage_pre,
  1380. EVCOMM_SYS_INFO.PpVoltage
  1381. );
  1382. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork3);
  1383. EVCOMM_SYS_INFO.PpVoltage_pre = EVCOMM_SYS_INFO.PpVoltage;
  1384. }
  1385. }
  1386. #if 0
  1387. sleep(5);
  1388. printf("V_pp = %.02f\n", TotalTmpVolt);
  1389. #endif
  1390. }//while
  1391. }
  1392. /*===========================================================================
  1393. FUNCTION: Error_Monitor
  1394. DESCRIPTION:
  1395. 1. This function only works in SeccComm fork2.
  1396. PRE-CONDITION:
  1397. INPUT:
  1398. OUTPUT:
  1399. GLOBAL VARIABLES:
  1400. =============================================================================*/
  1401. void Error_Monitor()
  1402. {
  1403. pid_t tmp = 0;
  1404. double time_diff = 0;
  1405. unsigned char status = 0;
  1406. struct ChargingInfoData *ccs;
  1407. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1408. if(Error_Monitor_Pid == 0)
  1409. {
  1410. tmp = fork(); //SeccComm fork2
  1411. if(tmp > 0)
  1412. {
  1413. Error_Monitor_Pid = tmp;
  1414. #if 0
  1415. unsigned char buf[64];
  1416. memset(buf, 0, sizeof(buf));
  1417. sprintf((char*)buf, "renice -20 -p %d", tmp);
  1418. system(buf);
  1419. #endif
  1420. return;
  1421. }
  1422. }
  1423. while(1)
  1424. {
  1425. //Step 0
  1426. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  1427. {
  1428. //If the End_Process is in processing, disable Error_Monitor.
  1429. continue;
  1430. }
  1431. //Step1 1: Check and Response to Plugin Status
  1432. if(CheckConnectorPlugIn() == FALSE)
  1433. {
  1434. status = Check_V2G_Flow_Status();
  1435. if (status > IDLE &&
  1436. status < Performance_Timeout &&
  1437. status != CM_SET_KEY_REQ &&
  1438. status != CM_SET_KEY_CNF &&
  1439. EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  1440. {
  1441. #if (CP_PROTECTION_MECHANISM == ENABLE)
  1442. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2] Emergency Stop (due to Connector is plugged out during communication.)");
  1443. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Plug out Error => End_Process");
  1444. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1445. //CCS_SECC_CP_State_Error (023889)
  1446. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1447. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1448. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1449. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1450. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1451. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1452. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1453. End_Process();
  1454. #else
  1455. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CP_PROTECTION_MECHANISM is disabled. Emergency Stop: skipped" );
  1456. #endif
  1457. }
  1458. }
  1459. //Step 2: Check for V2G_SECC_Sequence_Timeout
  1460. //#if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  1461. #if 1
  1462. status = Check_V2G_Flow_Status();
  1463. if (status >= SupportedAppProtocolRequest &&
  1464. status < SessionStopRequest)
  1465. {
  1466. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1467. time_diff = DiffTimeb_fork2_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1468. if(time_diff > V2G_SECC_Sequence_Timeout) //60s
  1469. {
  1470. sprintf((char*)buf_log_evcomm_fork2,
  1471. "[fork2]V2G_SECC_Sequence_Timeout in state %d - (%.02lf of %d ms)\n",
  1472. status,
  1473. time_diff,
  1474. V2G_SECC_Sequence_Timeout);
  1475. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1476. Update_V2G_Flow_Status(Sequence_Timeout);
  1477. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1478. //CCS_SECC_TIMEOUT_V2G_Sequence_Time (023844)
  1479. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1480. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1481. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1482. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1483. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  1484. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  1485. End_Process();
  1486. break;
  1487. }
  1488. else if (time_diff > 4000) //4s
  1489. {
  1490. //Check for CSU command of "Stop by EVSE"
  1491. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown)
  1492. {
  1493. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]EVSE_Shutdown");
  1494. Update_V2G_Flow_Status(Other_Fault);
  1495. }
  1496. else if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1497. {
  1498. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]EVSE_EmergencyShutdown");
  1499. Update_V2G_Flow_Status(Other_Fault);
  1500. }
  1501. else if (ShmInternalComm->ChargingPermission == FALSE)
  1502. {
  1503. if (status >= ChargeParameterDiscoveryRequest) //&& status < SessionStopRequest
  1504. {
  1505. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]ChargingPermission = FALSE");
  1506. Update_V2G_Flow_Status(Other_Fault);
  1507. }
  1508. }
  1509. else
  1510. {
  1511. //null
  1512. }
  1513. }
  1514. else
  1515. {
  1516. //null
  1517. }
  1518. }
  1519. #endif
  1520. //Step 3: Check and Response to Error V2gFlowStatus
  1521. status = Check_V2G_Flow_Status();
  1522. if (status == Performance_Timeout ||
  1523. status == Sequence_Timeout ||
  1524. status == Other_Fault)
  1525. {
  1526. sprintf((char*)buf_log_evcomm_fork2,
  1527. "[fork2]Timeout or Fault State(%d) => End_Process",
  1528. status);
  1529. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1530. //Normal Stop
  1531. //alarm and duty to 100%
  1532. //OutputCpPwmDuty(100);
  1533. //SwitchCpStateE(ENABLE); //Set CP duty as 100% and set CP state as E (0V).
  1534. //[Joseph/ To-Do] Set State E (0V) via GPIO setting
  1535. End_Process();
  1536. }
  1537. //Step 4: Check and Response to CP State Error
  1538. if(ccs->CpState_err == TRUE)
  1539. {
  1540. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]CP Error => End_Process");
  1541. Update_V2G_Flow_Status(Other_Fault);
  1542. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1543. //CCS_SECC_CP_State_Error (023889)
  1544. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1545. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1546. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1547. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1548. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1549. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1550. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1551. End_Process();
  1552. }
  1553. //Step 5: Check and Response to Shutdown Commnad from CSU
  1554. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown ||
  1555. EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1556. {
  1557. if (Check_V2G_Flow_Status() <= SLACC_SDP_TCP_Connection)
  1558. {
  1559. sprintf((char*)buf_log_evcomm_fork2,
  1560. "[fork2]EVSE Shutdown(%d) => End_Process",
  1561. EVCOMM_SYS_INFO.DC_EVSEStatus);
  1562. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1563. Update_V2G_Flow_Status(Other_Fault);
  1564. End_Process();
  1565. }
  1566. }
  1567. //Step 6: Check and Response to SessionStop
  1568. status = Check_V2G_Flow_Status();
  1569. if (status == SessionStopResponse)
  1570. {
  1571. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]SessionStopResponse => End_Process");
  1572. End_Process();
  1573. }
  1574. //Step 7: Check for ChargingPermission from TRUE to FALSE before V2G Messages
  1575. if ((ShmInternalComm->ChargingPermission == FALSE) &&
  1576. (ShmInternalComm->ChargingPermission_pre == TRUE) &&
  1577. (ccs->CpState >= 3) && (ccs->CpState <=5))
  1578. {
  1579. if (status >= CM_SLAC_PARM_REQ &&
  1580. status != CM_SET_KEY_REQ &&
  1581. status != CM_SET_KEY_CNF &&
  1582. status <= SLACC_SDP_TCP_Connection)
  1583. {
  1584. sprintf((char*)buf_log_evcomm_fork2,
  1585. "[fork2]Permission OFF before V2G msg(%d) => End_Process",
  1586. ShmInternalComm->ChargingPermission);
  1587. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1588. Update_V2G_Flow_Status(Other_Fault);
  1589. End_Process();
  1590. }
  1591. }
  1592. //Step 8: DC OVP Protection
  1593. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1594. status > CableCheckResponse &&
  1595. status <= SessionStopRequest &&
  1596. status != ChargingStatusRequest &&
  1597. status != ChargingStatusResponse &&
  1598. EVCOMM_SYS_INFO.EvBatteryMaxVoltage != 0)
  1599. {
  1600. //Part A: OVP Protection
  1601. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)) // 2%
  1602. {
  1603. sprintf((char*)buf_log_evcomm_fork2,
  1604. "[fork2][Error]OVP => End_Process (%.02f > %.02f)",
  1605. EVCOMM_SYS_INFO.PresentChargingVoltage,
  1606. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02));
  1607. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1608. Update_V2G_Flow_Status(Other_Fault);
  1609. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1610. //System CCS output OVP (012219)
  1611. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1612. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1613. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1614. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1615. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1616. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1617. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1618. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1619. End_Process();
  1620. }
  1621. //Part B: Over Voltage Request Protection
  1622. if (EVCOMM_SYS_INFO.EvBatterytargetVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02))
  1623. {
  1624. sprintf((char*)buf_log_evcomm_fork2,
  1625. "[fork2]Over V Req => End_Process (%.02f > %.02f)",
  1626. EVCOMM_SYS_INFO.EvBatterytargetVoltage,
  1627. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)
  1628. );
  1629. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1630. Update_V2G_Flow_Status(Other_Fault);
  1631. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1632. //System CCS output OVP (012219)
  1633. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1634. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1635. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1636. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1637. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1638. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1639. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1640. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1641. End_Process();
  1642. }
  1643. }
  1644. //Step 9: Check 60V
  1645. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1646. ShmInternalComm->ChargingPermission == TRUE &&
  1647. status < CableCheckRequest)
  1648. {
  1649. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= 60) //60V
  1650. {
  1651. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]DC Output Voltage is over 60V => End_Process");
  1652. Update_V2G_Flow_Status(Other_Fault);
  1653. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1654. //CCS_SECC_Unexpected_60V_Before_Charing_Error (023890)
  1655. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1656. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1657. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1658. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1659. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  1660. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  1661. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1662. //Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1663. End_Process();
  1664. }
  1665. }
  1666. //Step 10: Check if the connector is unplug from plugin
  1667. if (EVCOMM_SYS_INFO.ConnectorPlugIn_pre == TRUE && EVCOMM_SYS_INFO.ConnectorPlugIn == FALSE)
  1668. {
  1669. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Unplug Reset => End_Process");
  1670. Update_V2G_Flow_Status(Other_Fault);
  1671. End_Process();
  1672. }
  1673. }//while
  1674. }
  1675. /*===========================================================================
  1676. FUNCTION: SendSetKey
  1677. DESCRIPTION:
  1678. PRE-CONDITION:
  1679. INPUT:
  1680. OUTPUT:
  1681. GLOBAL VARIABLES:
  1682. =============================================================================*/
  1683. int SendSetKey()
  1684. {
  1685. int i = 0;
  1686. unsigned char nRandValue = 0x0;
  1687. unsigned char ConstString[16] = "PhihongKey000000";
  1688. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  1689. memcpy(SendMmePacket.ODA,QcaMac,6);
  1690. memcpy(SendMmePacket.OSA,CsuMac,6);
  1691. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  1692. SendMmePacket.MMV = 0x01;
  1693. SendMmePacket.MMTYPE = MMTYPE_CM_SET_KEY_REQ;
  1694. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  1695. SendMmePacketSize = 0;
  1696. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate ��NMK��
  1697. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
  1698. SendMmePacketSize+=4;
  1699. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
  1700. SendMmePacketSize+=4;
  1701. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
  1702. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
  1703. SendMmePacketSize+=2;
  1704. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00;//PMN, Fixed value(0x00) encrypted payload not used
  1705. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//CCo Capablility
  1706. srand(time(NULL));
  1707. for (i = 10; i < 16; i++)
  1708. {
  1709. nRandValue = (rand()%62) + 1;
  1710. if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
  1711. {
  1712. ConstString[i]= nRandValue + 0x30;
  1713. }
  1714. else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
  1715. {
  1716. ConstString[i]= nRandValue -10 + 0x41;
  1717. }
  1718. else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
  1719. {
  1720. ConstString[i]= nRandValue -37 + 0x61;
  1721. }
  1722. else
  1723. {
  1724. ConstString[i]= 0x30;
  1725. }
  1726. }
  1727. memset(NewNmkKey,0,sizeof(NewNmkKey));
  1728. memset(Nid,0,sizeof(Nid));
  1729. HPAVKeyNMK(NewNmkKey, (char*)ConstString);
  1730. HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
  1731. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid)); //NID, 54 LSBs contain the NID 2 MSBs = 0b00
  1732. SendMmePacketSize+=sizeof(Nid);
  1733. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
  1734. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
  1735. SendMmePacketSize += sizeof(NewNmkKey);
  1736. SendMmePacketSize += 19; //the size before MMENTRY
  1737. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Tx]CM_SET_KEY_REQ");
  1738. i = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1739. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  1740. DEBUG_PRINTF_EVCOMM_DETAIL("SendSetKey: send size =%d\n",i);
  1741. return 0;
  1742. }
  1743. /*===========================================================================
  1744. FUNCTION: GetQca7kMac
  1745. DESCRIPTION:
  1746. PRE-CONDITION:
  1747. INPUT:
  1748. OUTPUT:
  1749. GLOBAL VARIABLES:
  1750. =============================================================================*/
  1751. int GetQca7kMac()
  1752. {
  1753. struct QcaVendorMmeHeader SendPacket;
  1754. memset(&SendPacket, 0, sizeof(struct QcaVendorMmeHeader));
  1755. memset(SendPacket.ODA, 0xFF, 6); //broadcast
  1756. memcpy(SendPacket.OSA, CsuMac, 6);
  1757. SendPacket.MTYPE = htons(EtherType_HomePlug);
  1758. SendPacket.MMV = 0x00;
  1759. SendPacket.MMTYPE = MMTYPE_VENDOR_VS_NW_INFO;
  1760. SendPacket.OUI[0] = 0x00;
  1761. SendPacket.OUI[1] = 0xB0;
  1762. SendPacket.OUI[2] = 0x52;
  1763. DEBUG_PRINTF_EVCOMM_DETAIL("GetQca7kMac: send size =%d\n", sendto(RawSock, &SendPacket, 20, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll)));
  1764. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Req for QCA7K MacAddr");
  1765. return 0;
  1766. }
  1767. /*===========================================================================
  1768. FUNCTION: Array_Check_All_Zero
  1769. DESCRIPTION:
  1770. PRE-CONDITION:
  1771. INPUT:
  1772. OUTPUT:
  1773. result:
  1774. (1) TRUE: all zero
  1775. (2) FALSE: not all zero
  1776. GLOBAL VARIABLES:
  1777. =============================================================================*/
  1778. int Array_Check_All_Zero(unsigned char *ptr, int size)
  1779. {
  1780. int result = TRUE;
  1781. int i = 0;
  1782. for (i = 0; i < size; i++)
  1783. {
  1784. if (ptr[i] != 0)
  1785. {
  1786. result = FALSE;
  1787. break;
  1788. }
  1789. }
  1790. return result;
  1791. }
  1792. /*===========================================================================
  1793. FUNCTION: Array_Compare_Identity
  1794. DESCRIPTION:
  1795. PRE-CONDITION:
  1796. INPUT:
  1797. OUTPUT:
  1798. result = FALSE (not identical)
  1799. result = TRUE (identical)
  1800. GLOBAL VARIABLES:
  1801. =============================================================================*/
  1802. int Array_Compare_Identity(unsigned char *ptrA, unsigned char *ptrB, int size)
  1803. {
  1804. int result = TRUE;
  1805. int i = 0;
  1806. for (i = 0; i < size; i++)
  1807. {
  1808. if (ptrA[i] != ptrB[i])
  1809. {
  1810. result = FALSE;
  1811. #if 0
  1812. sprintf((char*)buf_log_evcomm,
  1813. "[Array_Compare_Identity]%02X%02X%02X%02X%02X%02X,%02X%02X%02X%02X%02X%02X(%d)\n",
  1814. ptrA[0], ptrA[1], ptrA[2], ptrA[3], ptrA[4], ptrA[5],
  1815. ptrB[0], ptrB[1], ptrB[2], ptrB[3], ptrB[4], ptrB[5],
  1816. result);
  1817. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  1818. #endif
  1819. break;
  1820. }
  1821. }
  1822. return result;
  1823. }
  1824. /*===========================================================================
  1825. FUNCTION: SLAC_DB_Search_EvMac_idx
  1826. DESCRIPTION:
  1827. PRE-CONDITION:
  1828. INPUT:
  1829. OUTPUT:
  1830. idx = -1 (not found)
  1831. GLOBAL VARIABLES:
  1832. =============================================================================*/
  1833. int SLAC_DB_Search_EvMac_idx(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in)
  1834. {
  1835. int idx = -1;
  1836. int i = 0;
  1837. if (evcc->arrayLen == 0)
  1838. {
  1839. //printf("[SLAC_DB_Search_EvMac_idx]arrayLen is empty (%d)\n", evcc->arrayLen);
  1840. //no need to search
  1841. }
  1842. else if (evcc->arrayLen > EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE)
  1843. {
  1844. //error
  1845. sprintf((char*)buf_log_evcomm,
  1846. "[ERROR][SLAC_DB_Search_EvMac_idx]DB length(%d) > %d",
  1847. evcc->arrayLen,
  1848. EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE);
  1849. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  1850. evcc->arrayLen = 0; //reset
  1851. }
  1852. else
  1853. {
  1854. //start searching
  1855. for (i = 0; i < evcc->arrayLen; i++)
  1856. {
  1857. //printf("[SLAC_DB_Search_EvMac_idx]checking DB[%d]...\n", i);
  1858. if (Array_Compare_Identity(evcc->array[i].EvMac, EvMac_in, SLAC_EVMAC_LENGTH) == TRUE)
  1859. {
  1860. //printf("[SLAC_DB_Search_EvMac_idx]identical at DB[%d]...\n", i);
  1861. idx = i;
  1862. break;
  1863. }
  1864. }
  1865. }
  1866. //printf("[SLAC_DB_Search_EvMac_idx]return = %d\n", idx);
  1867. return idx;
  1868. }
  1869. /*===========================================================================
  1870. FUNCTION: SLAC_DB_Check_EvMac_RunID_Matching
  1871. DESCRIPTION:
  1872. PRE-CONDITION:
  1873. INPUT:
  1874. OUTPUT:
  1875. res = FALSE (unmatched)
  1876. res = TRUE (matched)
  1877. GLOBAL VARIABLES:
  1878. =============================================================================*/
  1879. int SLAC_DB_Check_EvMac_RunID_Matching(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in, unsigned char *RunID_in)
  1880. {
  1881. int res = FALSE;
  1882. int idx = -1;
  1883. idx = SLAC_DB_Search_EvMac_idx(evcc, EvMac_in);
  1884. if (idx >= 0)
  1885. {
  1886. res = Array_Compare_Identity(evcc->array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  1887. }
  1888. else
  1889. {
  1890. //not found the EvMac data in DB
  1891. res = FALSE;
  1892. }
  1893. return res;
  1894. }
  1895. /*===========================================================================
  1896. FUNCTION: SLAC_DB_Add
  1897. DESCRIPTION:
  1898. 1. Saving each CM_SLAC_PARM_REQ data into EVCC database if its
  1899. EvMac and RunID data are different, respectively.
  1900. PRE-CONDITION:
  1901. INPUT:
  1902. OUTPUT:
  1903. idx = saved index (must be a positive value)
  1904. GLOBAL VARIABLES:
  1905. =============================================================================*/
  1906. int SLAC_DB_Add(unsigned char *EvMac_in, unsigned char *RunID_in)
  1907. {
  1908. int idx = -1;
  1909. //Search if this EvMac and RunID already exists
  1910. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  1911. if (idx < 0) //not exist, yet.
  1912. {
  1913. if (SLAC_INFO.arrayLen < EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE) //20
  1914. {
  1915. sprintf((char*)buf_log_evcomm,
  1916. "[SLAC_DB_Add]data does not exist => added to %d-th",
  1917. SLAC_INFO.arrayLen);
  1918. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  1919. if (SLAC_INFO.arrayLen >= 0)
  1920. {
  1921. memset(&SLAC_INFO.array[SLAC_INFO.arrayLen], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  1922. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  1923. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].RunID, RunID_in, SLAC_RUNID_LENGTH);
  1924. idx = SLAC_INFO.arrayLen;
  1925. SLAC_INFO.arrayLen++;
  1926. }
  1927. else
  1928. {
  1929. sprintf((char*)buf_log_evcomm,
  1930. "[ERROR][SLAC_DB_Add]arrayLen: unexpected(%d)",
  1931. SLAC_INFO.arrayLen);
  1932. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  1933. SLAC_INFO.arrayLen = 0;
  1934. }
  1935. }
  1936. else
  1937. {
  1938. //DB is full
  1939. sprintf((char*)buf_log_evcomm,
  1940. "[SLAC_DB_Add]DB is full(%d) => bypass",
  1941. SLAC_INFO.arrayLen);
  1942. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  1943. }
  1944. }
  1945. else
  1946. {
  1947. #if 0
  1948. sprintf((char*)buf_log_evcomm,
  1949. "[SLAC_DB_Add]EvMac: existed (%d)",
  1950. idx);
  1951. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  1952. #endif
  1953. //Check RunID
  1954. if (Array_Compare_Identity(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH) == TRUE)
  1955. {
  1956. //RunID is the same
  1957. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Add]RunID: same");
  1958. }
  1959. else
  1960. {
  1961. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Add]RunID: diff");
  1962. }
  1963. //Reset all corresponding parameters
  1964. #if 0
  1965. sprintf((char*)buf_log_evcomm,
  1966. "[SLAC_DB_Add]EvMac: reset para(%d)",
  1967. idx);
  1968. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  1969. #endif
  1970. memset(&SLAC_INFO.array[idx], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  1971. memcpy(SLAC_INFO.array[idx].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  1972. memcpy(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  1973. }
  1974. return idx;
  1975. }
  1976. /*===========================================================================
  1977. FUNCTION: SLAC_DB_Reset
  1978. DESCRIPTION:
  1979. PRE-CONDITION:
  1980. INPUT:
  1981. OUTPUT:
  1982. GLOBAL VARIABLES:
  1983. =============================================================================*/
  1984. int SLAC_DB_Reset()
  1985. {
  1986. memset(&SLAC_INFO, 0, sizeof(struct EVCC_SLAC_DATA_TYPE));
  1987. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Reset]DONE");
  1988. return 0;
  1989. }
  1990. /*===========================================================================
  1991. FUNCTION: MmeProcess
  1992. DESCRIPTION:
  1993. PRE-CONDITION:
  1994. INPUT:
  1995. OUTPUT:
  1996. GLOBAL VARIABLES:
  1997. =============================================================================*/
  1998. int MmeProcess(unsigned char *Buffer, int DataLength)
  1999. {
  2000. //struct ethhdr *EthPacket;
  2001. struct MmeHeader *MmePacket;
  2002. static unsigned char counter;
  2003. unsigned char state = 0;
  2004. unsigned char *EvMac_in;
  2005. unsigned char *RunID_in;
  2006. int Rtn = 0;
  2007. int idx = 0;
  2008. MmePacket = (struct MmeHeader *)Buffer;
  2009. state = Check_V2G_Flow_Status();
  2010. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2011. {
  2012. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  2013. DEBUG_PRINTF_EVCOMM_DETAIL("******* Received MME Packet *******\n");
  2014. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  2015. DEBUG_PRINTF_EVCOMM_DETAIL("DataLength=%d\n",DataLength);
  2016. DEBUG_PRINTF_EVCOMM_DETAIL("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Destination MAC Address
  2017. MmePacket->ODA[0], MmePacket->ODA[1],
  2018. MmePacket->ODA[2], MmePacket->ODA[3],
  2019. MmePacket->ODA[4], MmePacket->ODA[5]);
  2020. DEBUG_PRINTF_EVCOMM_DETAIL("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Source MAC Address (EV MAC)
  2021. MmePacket->OSA[0], MmePacket->OSA[1],
  2022. MmePacket->OSA[2], MmePacket->OSA[3],
  2023. MmePacket->OSA[4], MmePacket->OSA[5]);
  2024. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  2025. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", MmePacket->MMV);
  2026. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  2027. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n",
  2028. MmePacket->FMI[0],MmePacket->FMI[1]);
  2029. }
  2030. #endif
  2031. #if (SLAC_FIRST_RESPONSE_METHOD == SET_NO_PWM_IF_NOT_GET_PERMISSION)
  2032. {
  2033. //Check CP as 5%
  2034. if (EVCOMM_SYS_INFO.CpState != 3 &&
  2035. EVCOMM_SYS_INFO.CpState != 4 &&
  2036. MmePacket->MMTYPE != MMTYPE_CM_SET_KEY_CNF &&
  2037. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_HOST_ACTION &&
  2038. MmePacket->MMTYPE != MMTYPE_VENDOR_ATTEN_CHAR &&
  2039. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_NW_INFO_CNF
  2040. )
  2041. {
  2042. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC]ignored(wrong CP state)");
  2043. return 0;
  2044. }
  2045. }
  2046. #endif
  2047. //[To-Do] Adding a pre-check filter mechanism for Source and Destination MAC Address
  2048. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  2049. switch(MmePacket->MMTYPE)
  2050. {
  2051. case MMTYPE_CM_SET_KEY_CNF:
  2052. {
  2053. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SET_KEY_CNF ---\n");
  2054. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[0]);
  2055. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Rx]CM_SET_KEY_CNF (SetKey: DONE)");
  2056. Update_V2G_Flow_Status(CM_SET_KEY_CNF);
  2057. break;
  2058. }
  2059. case MMTYPE_CM_SLAC_PARM_REQ:
  2060. {
  2061. //Check QCA7000 status
  2062. if (EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  2063. {
  2064. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(QCA7K init...)");
  2065. break;
  2066. }
  2067. //Check error state
  2068. state = Check_V2G_Flow_Status();
  2069. if (state == Performance_Timeout || //253
  2070. state == Sequence_Timeout || //254
  2071. state == Other_Fault) //255
  2072. {
  2073. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(in error state)");
  2074. break;
  2075. }
  2076. //Printing EV MAC Address
  2077. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ");
  2078. //Avoid Coupled SLAC_PARM_REQ
  2079. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2080. {
  2081. #if 0
  2082. sprintf((char*)buf_log_evcomm,
  2083. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(coupled SLAC,%d)",
  2084. CheckConnectorPlugIn());
  2085. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2086. #endif
  2087. break;
  2088. }
  2089. //[TC_SECC_VTB_CmSlacParm_003] SECURITY_TYPE needs to be 0x00 (no security)
  2090. if (MmePacket->MMENTRY[1] != 0)
  2091. {
  2092. sprintf((char*)buf_log_evcomm,
  2093. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(invalid SECURITY_TYPE,%d)", //Source MAC Address (EV MAC)
  2094. MmePacket->MMENTRY[1]);
  2095. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2096. break;
  2097. }
  2098. //=================== Legal CM_SLAC_PARM_REQ Zone =================
  2099. Update_V2G_Flow_Status(CM_SLAC_PARM_REQ);
  2100. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_RX_CM_SLAC_PARM_REQ)
  2101. {
  2102. //Once receiving CM_SLAC_PARM_REQ, set PWM as 5%
  2103. SwitchCpStateE(DISABLE);
  2104. OutputCpPwmDuty(5);
  2105. }
  2106. #endif
  2107. //Checking if this SLAC Req comes before 5% PWM (for 15118)
  2108. if(ShmInternalComm->ChargingPermission == FALSE)
  2109. {
  2110. //Sniffer_Tcpdump(ENABLE);
  2111. sprintf((char*)buf_log_evcomm, "Check Permission: %d (SLAC first => START)", ShmInternalComm->ChargingPermission);
  2112. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2113. }
  2114. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2115. {
  2116. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
  2117. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2118. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2119. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2120. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2121. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2122. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2123. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2124. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  2125. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuite [1]: 0x%x,0x%x\n",
  2126. MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  2127. }
  2128. #endif
  2129. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2130. {
  2131. //Saving each CM_SLAC_PARM_REQ data into EVCC database
  2132. EvMac_in = &MmePacket->OSA[0];
  2133. RunID_in = &MmePacket->MMENTRY[2];
  2134. idx = SLAC_DB_Add(EvMac_in, RunID_in); //(EvMac, RunID)
  2135. if (idx < 0)
  2136. {
  2137. sprintf((char*)buf_log_evcomm,
  2138. "[WARNING][CM_SLAC_PARM_REQ]DB is full or errors occour(%d) => ignore",
  2139. idx);
  2140. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2141. break;
  2142. }
  2143. //Select the 1st EV MAC address
  2144. if (SLAC_INFO.arrayLen == 1) //1st Req
  2145. {
  2146. #if 1
  2147. sprintf((char*)buf_log_evcomm,
  2148. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):selected",
  2149. (idx + 1),
  2150. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2151. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2152. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2153. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2154. #endif
  2155. /*
  2156. sprintf((char*)buf_log_evcomm,
  2157. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (selected)", //Source MAC Address (EV MAC)
  2158. SLAC_INFO.arrayLen,
  2159. MmePacket->OSA[0], MmePacket->OSA[1],
  2160. MmePacket->OSA[2], MmePacket->OSA[3],
  2161. MmePacket->OSA[4], MmePacket->OSA[5]);
  2162. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2163. sprintf((char*)buf_log_evcomm,
  2164. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (selected)", //RunID (from EVCC)
  2165. SLAC_INFO.arrayLen,
  2166. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2167. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2168. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2169. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2170. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2171. */
  2172. }
  2173. else //2nd Req
  2174. {
  2175. #if 1
  2176. sprintf((char*)buf_log_evcomm,
  2177. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):not selected",
  2178. (idx + 1),
  2179. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2180. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2181. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2182. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2183. #endif
  2184. /*
  2185. sprintf((char*)buf_log_evcomm,
  2186. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (not selected)", //Source MAC Address (EV MAC)
  2187. SLAC_INFO.arrayLen,
  2188. MmePacket->OSA[0], MmePacket->OSA[1],
  2189. MmePacket->OSA[2], MmePacket->OSA[3],
  2190. MmePacket->OSA[4], MmePacket->OSA[5]);
  2191. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2192. sprintf((char*)buf_log_evcomm,
  2193. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (not selected)", //RunID (from EVCC)
  2194. SLAC_INFO.arrayLen,
  2195. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2196. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2197. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2198. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2199. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2200. */
  2201. }
  2202. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2203. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, SLAC_EVMAC_LENGTH);
  2204. memcpy(SlacRunId, MmePacket->MMENTRY + 2, SLAC_RUNID_LENGTH);
  2205. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2206. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2207. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2208. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2209. SendMmePacket.MMV = MmePacket->MMV;
  2210. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2211. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2212. SendMmePacketSize = 0;
  2213. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2214. SendMmePacketSize += 6;
  2215. 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
  2216. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2217. 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
  2218. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SLAC_INFO.array[idx].EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2219. SendMmePacketSize += 6;
  2220. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2221. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2222. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, SLAC_RUNID_LENGTH); //RunID (8-byte)
  2223. SendMmePacketSize += SLAC_RUNID_LENGTH;
  2224. SendMmePacketSize += 19; //the size before MMENTRY
  2225. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2226. {
  2227. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2228. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2229. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2230. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2231. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2232. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2233. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2234. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2235. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2236. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2237. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2238. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2239. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2240. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2241. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2242. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2243. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2244. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2245. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2246. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2247. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2248. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2249. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2250. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2251. }
  2252. #endif
  2253. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2254. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2255. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2256. ftime(&SeqStartTime);
  2257. break;
  2258. }
  2259. #else
  2260. {
  2261. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2262. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, sizeof(EvMac));
  2263. memcpy(SlacRunId,MmePacket->MMENTRY + 2, sizeof(SlacRunId));
  2264. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2265. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2266. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2267. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2268. SendMmePacket.MMV = MmePacket->MMV;
  2269. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2270. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2271. SendMmePacketSize = 0;
  2272. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2273. SendMmePacketSize += 6;
  2274. 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
  2275. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2276. 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
  2277. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2278. SendMmePacketSize += 6;
  2279. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2280. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2281. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, sizeof(SlacRunId)); //RunID (8-byte)
  2282. SendMmePacketSize += sizeof(SlacRunId);
  2283. SendMmePacketSize += 19; //the size before MMENTRY
  2284. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2285. {
  2286. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2287. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2288. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2289. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2290. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2291. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2292. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2293. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2294. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2295. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2296. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2297. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2298. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2299. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2300. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2301. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2302. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2303. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2304. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2305. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2306. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2307. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2308. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2309. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2310. }
  2311. #endif
  2312. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2313. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2314. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2315. ftime(&SeqStartTime);
  2316. counter = 0;
  2317. break;
  2318. }
  2319. #endif
  2320. }
  2321. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  2322. {
  2323. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2324. {
  2325. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(timeup)");
  2326. break;
  2327. }
  2328. //Avoid Coupled CM_START_ATTEN_CHAR_IND
  2329. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2330. {
  2331. sprintf((char*)buf_log_evcomm,
  2332. "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(coupled SLAC,%d)",
  2333. CheckConnectorPlugIn());
  2334. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2335. break;
  2336. }
  2337. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2338. {
  2339. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n",counter + 1);
  2340. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2341. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2342. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  2343. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  2344. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]); //Fixed value (0x01) indicating ��other Green PHY station��
  2345. DEBUG_PRINTF_EVCOMM_DETAIL("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2346. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  2347. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  2348. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2349. MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
  2350. MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
  2351. }
  2352. #endif
  2353. //New SLAC architecture designed by Joseph
  2354. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2355. {
  2356. EvMac_in = &MmePacket->OSA[0];
  2357. RunID_in = &MmePacket->MMENTRY[11];
  2358. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2359. if (idx >= 0)
  2360. {
  2361. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2362. //[TC_SECC_VTB_AttenuationCharacterization_013]
  2363. if (MmePacket->MMENTRY[0] != 0) //APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  2364. {
  2365. sprintf((char*)buf_log_evcomm,
  2366. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]APPLICATION_TYPE(%d): invalid => ignore Req",
  2367. MmePacket->MMENTRY[0]);
  2368. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2369. break;
  2370. }
  2371. //[TC_SECC_VTB_AttenuationCharacterization_014]
  2372. if (MmePacket->MMENTRY[1] != 0) //SECURITY_TYPE must be 0x00(No Security)
  2373. {
  2374. sprintf((char*)buf_log_evcomm,
  2375. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]SECURITY_TYPE(%d): invalid => ignore Req",
  2376. MmePacket->MMENTRY[1]);
  2377. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2378. break;
  2379. }
  2380. //[TC_SECC_VTB_AttenuationCharacterization_017]
  2381. if (MmePacket->MMENTRY[4] != 0x01) //RESP_TYPE must be 0x01(Send to another GP STA(EV))
  2382. {
  2383. sprintf((char*)buf_log_evcomm,
  2384. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]RESP_TYPE(%d): invalid => ignore Req",
  2385. MmePacket->MMENTRY[4]);
  2386. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2387. break;
  2388. }
  2389. //[TC_SECC_VTB_AttenuationCharacterization_021]
  2390. //FORWARDING_STA: MAC Address of the EV HLE (station which the measurement results shall be sent to)
  2391. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[5], SLAC_EVMAC_LENGTH) == FALSE)
  2392. {
  2393. sprintf((char*)buf_log_evcomm,
  2394. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]FORWARDING_STA(%02X:%02X:%02X:%02X:%02X:%02X): invalid => ignore Req",
  2395. MmePacket->MMENTRY[5], MmePacket->MMENTRY[6],
  2396. MmePacket->MMENTRY[7], MmePacket->MMENTRY[8],
  2397. MmePacket->MMENTRY[9], MmePacket->MMENTRY[10]);
  2398. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2399. SLAC_INFO.array[idx].StartAttenCharErr = TRUE;
  2400. break;
  2401. }
  2402. //Check RunID
  2403. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2404. {
  2405. SLAC_INFO.array[idx].MnbcSoundNum = MmePacket->MMENTRY[2];
  2406. SLAC_INFO.array[idx].StartAttenCharCnt++;
  2407. #if 0
  2408. sprintf((char*)buf_log_evcomm,
  2409. "[SLAC][Rx]CM_START_ATTEN_CHAR_IND[%d]:%d-th",
  2410. (idx + 1),
  2411. SLAC_INFO.array[idx].StartAttenCharCnt);
  2412. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2413. #endif
  2414. if (SLAC_INFO.array[idx].StartAttenCharCnt == 1)
  2415. {
  2416. memset(SLAC_INFO.array[idx].AAG, 0, sizeof(SLAC_INFO.array[idx].AAG));
  2417. SLAC_INFO.array[idx].AttenProfileCnt = 0;
  2418. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2419. }
  2420. else if (SLAC_INFO.array[idx].StartAttenCharCnt >= 3)
  2421. {
  2422. sprintf((char*)buf_log_evcomm,
  2423. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]counter(%d): unexpected",
  2424. SLAC_INFO.array[idx].StartAttenCharCnt);
  2425. }
  2426. else
  2427. {
  2428. //null
  2429. }
  2430. }
  2431. else
  2432. {
  2433. //This RunID is not matched with this EvMac,
  2434. //or this RunID is not found in DB.
  2435. sprintf((char*)buf_log_evcomm,
  2436. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]EvMac-RunID: unmatched => ignore Req");
  2437. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2438. //Response: ignore
  2439. }
  2440. }
  2441. else
  2442. {
  2443. //this msg source is not in database
  2444. //ignore
  2445. }
  2446. break;
  2447. }
  2448. #else //Old SLAC architecture designed by Vern
  2449. {
  2450. MnbcSoundNum = MmePacket->MMENTRY[2];
  2451. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2452. counter++;
  2453. if(counter == 1)
  2454. {
  2455. memset(Aag, 0, sizeof(Aag));
  2456. AttenProfileCnt = 0;
  2457. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2458. }
  2459. else if(counter >= 3)
  2460. {
  2461. counter = 0;
  2462. }
  2463. break;
  2464. }
  2465. #endif
  2466. }
  2467. case MMTYPE_CM_MNBC_SOUND_IND:
  2468. {
  2469. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2470. {
  2471. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(timeup)");
  2472. break;
  2473. }
  2474. //Avoid Coupled CM_MNBC_SOUND_IND
  2475. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2476. {
  2477. sprintf((char*)buf_log_evcomm,
  2478. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(coupled SLAC,%d)",
  2479. CheckConnectorPlugIn());
  2480. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2481. break;
  2482. }
  2483. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  2484. {
  2485. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n",counter + 1 , MnbcSoundNum);
  2486. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2487. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2488. DEBUG_PRINTF_EVCOMM_DETAIL("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2489. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2490. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
  2491. MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
  2492. MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
  2493. MmePacket->MMENTRY[18]);
  2494. DEBUG_PRINTF_EVCOMM_DETAIL("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  2495. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2496. MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
  2497. MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
  2498. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2499. MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
  2500. MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
  2501. DEBUG_PRINTF_EVCOMM_DETAIL("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2502. MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
  2503. MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
  2504. MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
  2505. MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
  2506. }
  2507. #endif
  2508. //New SLAC architecture designed by Joseph
  2509. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2510. {
  2511. EvMac_in = &MmePacket->OSA[0];
  2512. RunID_in = &MmePacket->MMENTRY[20];
  2513. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2514. if (idx >= 0)
  2515. {
  2516. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2517. //Check for RunID
  2518. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2519. {
  2520. SLAC_INFO.array[idx].MnbcSoundCnt++;
  2521. /*
  2522. sprintf((char*)buf_log_evcomm,
  2523. "[SLAC][Rx]CM_MNBC_SOUND_IND[%d]:%d-th",
  2524. (idx + 1),
  2525. SLAC_INFO.array[idx].MnbcSoundCnt);
  2526. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2527. */
  2528. }
  2529. else
  2530. {
  2531. //RunID is not matched or does not exist.
  2532. sprintf((char*)buf_log_evcomm,
  2533. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac-RunID: unmatched");
  2534. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2535. }
  2536. }
  2537. else
  2538. {
  2539. //ignore
  2540. sprintf((char*)buf_log_evcomm,
  2541. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac does not exist");
  2542. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2543. }
  2544. break;
  2545. }
  2546. #else //Old SLAC architecture designed by Vern
  2547. {
  2548. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2549. counter++;
  2550. break;
  2551. }
  2552. #endif
  2553. }
  2554. case MMTYPE_CM_ATTEN_PROFILE_IND:
  2555. {
  2556. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2557. {
  2558. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_ATTEN_PROFILE_IND: ignore(timeup)");
  2559. break;
  2560. }
  2561. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  2562. {
  2563. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n", counter, MnbcSoundNum);
  2564. DEBUG_PRINTF_EVCOMM_DETAIL("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2565. MmePacket->MMENTRY[0], MmePacket->MMENTRY[1], MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2566. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5]);
  2567. DEBUG_PRINTF_EVCOMM_DETAIL("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]); //NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2568. //NumGroups: Number of OFDM carrier groups used for the SLAC signal characterization.
  2569. //AAG[i]: Average Attenuation of Group i (i = 1 ~ 58)
  2570. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  2571. DEBUG_PRINTF_EVCOMM_DETAIL("AAG: \n");
  2572. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2573. {
  2574. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[8 + Rtn]);
  2575. }
  2576. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2577. }
  2578. #endif
  2579. //New SLAC architecture designed by Joseph
  2580. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2581. {
  2582. EvMac_in = &MmePacket->MMENTRY[0]; //[CAUTION] The EvMac address is not &MmePacket->OSA[0]
  2583. //[CAUTION] There is no RunID information of CM_ATTEN_PROFILE_IND
  2584. // packet, which means SECC cannot use the RunID to
  2585. // distinguish those SLAC request with identical EvMac
  2586. // but with different RunID.
  2587. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2588. /*
  2589. printf("%d, %d, %d, %d\n",
  2590. idx,
  2591. SLAC_INFO.array[idx].AagGroupsNum,
  2592. MmePacket->MMENTRY[6],
  2593. SLAC_INFO.array[idx].AttenProfileCnt);
  2594. */
  2595. if (idx >= 0)
  2596. {
  2597. SLAC_INFO.array[idx].AttenProfileCnt++;
  2598. /*
  2599. sprintf((char*)buf_log_evcomm,
  2600. "[SLAC][Rx]CM_ATTEN_PROFILE_IND[%d]:%d-th",
  2601. (idx + 1),
  2602. SLAC_INFO.array[idx].AttenProfileCnt);
  2603. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2604. */
  2605. //printf("%d, %d\n", SLAC_INFO.array[idx].AagGroupsNum, MmePacket->MMENTRY[6]);
  2606. SLAC_INFO.array[idx].AagGroupsNum = MmePacket->MMENTRY[6];
  2607. ////NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2608. for(Rtn = 0; Rtn < SLAC_INFO.array[idx].AagGroupsNum; Rtn++) //ex:58
  2609. {
  2610. SLAC_INFO.array[idx].AAG[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2611. }
  2612. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2613. break;
  2614. }
  2615. else
  2616. {
  2617. //The EvMac is not in the database
  2618. //ignore
  2619. sprintf((char*)buf_log_evcomm,
  2620. "[SLAC][Rx][CM_ATTEN_PROFILE_IND]EvMac(%02X%02X%02X%02X%02X%02X): not exist => ignore",
  2621. EvMac_in[0], EvMac_in[1], EvMac_in[2], EvMac_in[3], EvMac_in[4], EvMac_in[5]);
  2622. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2623. break;
  2624. }
  2625. }
  2626. #else //Old SLAC architecture designed by Vern
  2627. {
  2628. AagGroupsNum = MmePacket->MMENTRY[6];
  2629. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2630. {
  2631. Aag[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2632. }
  2633. AttenProfileCnt++;
  2634. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2635. break;
  2636. }
  2637. #endif
  2638. }
  2639. case MMTYPE_CM_ATTEN_CHAR_RSP:
  2640. {
  2641. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2642. {
  2643. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_CHAR_RSP ---\n");
  2644. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2645. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2646. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2647. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2648. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  2649. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2650. MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
  2651. MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
  2652. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  2653. for(Rtn = 0; Rtn < 17; Rtn++)
  2654. {
  2655. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[16 + Rtn]);
  2656. }
  2657. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2658. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  2659. for(Rtn = 0; Rtn < 17; Rtn++)
  2660. {
  2661. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[33 + Rtn]);
  2662. }
  2663. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2664. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[50]); //Fixed value of 0x00 indicates a successful SLAC process
  2665. }
  2666. #endif
  2667. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2668. {
  2669. //Check ODA (Destination Address)
  2670. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  2671. {
  2672. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx][CM_ATTEN_CHAR_RSP]wrong ODA: ignore");
  2673. break;
  2674. }
  2675. EvMac_in = &MmePacket->OSA[0];
  2676. RunID_in = &MmePacket->MMENTRY[8];
  2677. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2678. //Check Parameters
  2679. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2680. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2681. (SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in) < 0) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2682. (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2683. (Array_Check_All_Zero(&MmePacket->MMENTRY[16], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] SourceID(17 bytes) must be all zero.
  2684. (Array_Check_All_Zero(&MmePacket->MMENTRY[33], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] RESP_ID (17 bytes) must be all zero.
  2685. (MmePacket->MMENTRY[50] != 0) //Result: must be 0x00(Success)
  2686. )
  2687. {
  2688. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2689. sprintf((char*)buf_log_evcomm,
  2690. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para(%d,%d,%d,%d,%d) => %d-th retry",
  2691. MmePacket->MMENTRY[0], //applicationType must be 0x00
  2692. MmePacket->MMENTRY[1], //securityType must be 0x00
  2693. SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in),
  2694. SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in),
  2695. MmePacket->MMENTRY[50],
  2696. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry
  2697. );
  2698. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2699. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2700. {
  2701. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2702. ftime(&SeqStartTime);
  2703. break;
  2704. }
  2705. else
  2706. {
  2707. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para => 2-retry fail => End_Process");
  2708. Update_V2G_Flow_Status(Other_Fault);
  2709. break;
  2710. }
  2711. }
  2712. else
  2713. {
  2714. //The CM_ATTEN_CHAR_IND is legal
  2715. SLAC_INFO.array[idx].AttenCharRspCnt++;
  2716. sprintf((char*)buf_log_evcomm,
  2717. "[SLAC][Rx]CM_ATTEN_CHAR_RSP[%d]:%d-th",
  2718. (idx + 1),
  2719. SLAC_INFO.array[idx].AttenCharRspCnt);
  2720. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2721. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2722. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2723. ftime(&SeqStartTime);
  2724. break;
  2725. }
  2726. }
  2727. #else
  2728. {
  2729. //Check Parameters
  2730. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2731. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2732. (Array_Compare_Identity(SLAC_INFO.array[0].EvMac, &MmePacket->MMENTRY[2], 6) == TRUE) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2733. (Array_Compare_Identity(SLAC_INFO.array[0].RunID, &MmePacket->MMENTRY[8], 8) == TRUE) //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2734. )
  2735. {
  2736. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2737. sprintf((char*)buf_log_evcomm,
  2738. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP: invalid parameters(%d-th)",
  2739. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  2740. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2741. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2742. {
  2743. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2744. ftime(&SeqStartTime);
  2745. break;
  2746. }
  2747. else
  2748. {
  2749. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]CM_ATTEN_CHAR_RSP: invalid parameters => End_Process");
  2750. Update_V2G_Flow_Status(Other_Fault);
  2751. ftime(&SeqStartTime);
  2752. break;
  2753. }
  2754. }
  2755. else
  2756. {
  2757. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2758. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2759. ftime(&SeqStartTime);
  2760. break;
  2761. }
  2762. }
  2763. #endif
  2764. }
  2765. case MMTYPE_CM_VALIDATE_REQ: //BCB Toggle
  2766. {
  2767. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2768. {
  2769. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_VALIDATE_REQ ---\n");
  2770. DEBUG_PRINTF_EVCOMM_DETAIL("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]); //Fixed value (0x00) to indicate ��PEV S2 toggles on control pilot line��
  2771. 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.
  2772. 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��.
  2773. }
  2774. #endif
  2775. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2776. {
  2777. counter = 0;
  2778. EvMac_in = &MmePacket->OSA[0];
  2779. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2780. if (idx >= 0)
  2781. {
  2782. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  2783. SLAC_INFO.array[idx].ValidateReqCnt++;
  2784. sprintf((char*)buf_log_evcomm,
  2785. "[SLAC][Rx]CM_VALIDATE_REQ[%d]:%d-th",
  2786. (idx + 1),
  2787. SLAC_INFO.array[idx].ValidateReqCnt);
  2788. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2789. //[To-Do] Protection
  2790. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2791. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  2792. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2793. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2794. SendMmePacket.MMV = 0x01;
  2795. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  2796. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2797. SendMmePacketSize = 0;
  2798. if(counter == 0)
  2799. {
  2800. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  2801. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SignalType(0x00): Fixed value to indicate "EV S2 toggles on control pilot line"
  2802. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //ToggleNum(0x00): Fixed value. In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  2803. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  2804. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  2805. #else
  2806. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  2807. #endif
  2808. }
  2809. else
  2810. {
  2811. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  2812. unsigned char PreStatus = 3;
  2813. unsigned char ToggleNum = 0;
  2814. ftime(&SeqStartTime);
  2815. while(1)
  2816. {
  2817. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  2818. {
  2819. ToggleNum++;
  2820. PreStatus = 4;
  2821. }
  2822. else
  2823. {
  2824. PreStatus = 3;
  2825. }
  2826. ftime(&SeqEndTime);
  2827. if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
  2828. {
  2829. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate "PEV S2 toggles on control pilot line"
  2830. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  2831. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  2832. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  2833. #else
  2834. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  2835. #endif
  2836. break;
  2837. }
  2838. }
  2839. }
  2840. SendMmePacketSize += 19; //the size before MMENTRY
  2841. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2842. ftime(&SeqStartTime);
  2843. }
  2844. else
  2845. {
  2846. //EvMac does not exist.
  2847. //ignore
  2848. }
  2849. break;
  2850. }
  2851. #else
  2852. {
  2853. counter = 0;
  2854. for(Rtn = 0; Rtn < 6; Rtn++)
  2855. {
  2856. if(MmePacket->ODA[Rtn] != CsuMac[Rtn])
  2857. {
  2858. counter = 1;
  2859. break;
  2860. }
  2861. }
  2862. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2863. memcpy(SendMmePacket.ODA, EvMac,6);
  2864. memcpy(SendMmePacket.OSA, CsuMac,6);
  2865. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2866. SendMmePacket.MMV = 0x01;
  2867. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  2868. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2869. SendMmePacketSize = 0;
  2870. if(counter == 0)
  2871. {
  2872. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  2873. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  2874. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  2875. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  2876. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  2877. #else
  2878. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  2879. #endif
  2880. }
  2881. else
  2882. {
  2883. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  2884. unsigned char PreStatus = 3, ToggleNum = 0;
  2885. ftime(&SeqStartTime);
  2886. while(1)
  2887. {
  2888. ftime(&SeqEndTime);
  2889. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  2890. {
  2891. ToggleNum++;
  2892. PreStatus = 4;
  2893. }
  2894. else
  2895. {
  2896. PreStatus = 3;
  2897. }
  2898. if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
  2899. {
  2900. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  2901. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  2902. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  2903. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  2904. #else
  2905. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  2906. #endif
  2907. break;
  2908. }
  2909. }
  2910. }
  2911. SendMmePacketSize += 19; //the size before MMENTRY
  2912. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2913. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  2914. ftime(&SeqStartTime);
  2915. break;
  2916. }
  2917. #endif
  2918. }
  2919. case MMTYPE_CM_SLAC_MATCH_REQ:
  2920. {
  2921. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2922. {
  2923. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  2924. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2925. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2926. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
  2927. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  2928. for(Rtn=0; Rtn<17; Rtn++)
  2929. {
  2930. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  2931. }
  2932. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2933. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  2934. for(Rtn=0; Rtn<6; Rtn++)
  2935. {
  2936. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  2937. }
  2938. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2939. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  2940. for(Rtn=0; Rtn<17; Rtn++)
  2941. {
  2942. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  2943. }
  2944. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2945. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  2946. for(Rtn=0; Rtn<6; Rtn++)
  2947. {
  2948. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  2949. }
  2950. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2951. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  2952. for(Rtn=0; Rtn<8; Rtn++)
  2953. {
  2954. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  2955. }
  2956. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2957. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  2958. for(Rtn=0; Rtn<8; Rtn++)
  2959. {
  2960. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  2961. }
  2962. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2963. }
  2964. #endif
  2965. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2966. {
  2967. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_MATCH_REQ");
  2968. //Check ODA (Destination Address)
  2969. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  2970. {
  2971. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx][CM_SLAC_MATCH_REQ]wrong ODA: ignore");
  2972. //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
  2973. }
  2974. EvMac_in = &MmePacket->OSA[0];
  2975. RunID_in = &MmePacket->MMENTRY[50];
  2976. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2977. if (idx >= 0)
  2978. {
  2979. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  2980. SLAC_INFO.array[idx].MatchReqNum++;
  2981. sprintf((char*)buf_log_evcomm,
  2982. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:%d-th",
  2983. (idx + 1),
  2984. SLAC_INFO.array[idx].MatchReqNum);
  2985. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2986. //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  2987. //[TC_SECC_VTB_CmSlacMatch_008]
  2988. if (MmePacket->MMENTRY[0] != 0)
  2989. {
  2990. sprintf((char*)buf_log_evcomm,
  2991. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong APPLICATION_TYPE(%d)",
  2992. (idx + 1),
  2993. MmePacket->MMENTRY[0]);
  2994. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2995. break;
  2996. }
  2997. //[TC_SECC_VTB_CmSlacMatch_009] SECURITY_TYPE must be 0x00(No Security)
  2998. //[TC_SECC_VTB_CmSlacMatch_010]
  2999. if (MmePacket->MMENTRY[1] != 0)
  3000. {
  3001. sprintf((char*)buf_log_evcomm,
  3002. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong SECURITY_TYPE(%d)",
  3003. (idx + 1),
  3004. MmePacket->MMENTRY[1]);
  3005. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3006. break;
  3007. }
  3008. //[TC_SECC_VTB_CmSlacMatch_011] MVFLength must be 0x3E(MatchVarField Length)
  3009. //[TC_SECC_VTB_CmSlacMatch_012]
  3010. if (MmePacket->MMENTRY[2] != 0x3E || MmePacket->MMENTRY[3] != 0x00)
  3011. {
  3012. sprintf((char*)buf_log_evcomm,
  3013. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong MVFLength(%d,%d)",
  3014. (idx + 1),
  3015. MmePacket->MMENTRY[2],
  3016. MmePacket->MMENTRY[3]);
  3017. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3018. break;
  3019. }
  3020. //[TC_SECC_VTB_CmSlacMatch_013] EV ID (muxt be all zero)
  3021. //[TC_SECC_VTB_CmSlacMatch_014]
  3022. if (Array_Check_All_Zero(&MmePacket->MMENTRY[4], 17) == FALSE)
  3023. {
  3024. sprintf((char*)buf_log_evcomm,
  3025. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV ID",
  3026. (idx + 1));
  3027. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3028. break;
  3029. }
  3030. //[TC_SECC_VTB_CmSlacMatch_015] EV MAC
  3031. //[TC_SECC_VTB_CmSlacMatch_016]
  3032. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[21], SLAC_EVMAC_LENGTH) == FALSE)
  3033. {
  3034. sprintf((char*)buf_log_evcomm,
  3035. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3036. (idx + 1),
  3037. MmePacket->MMENTRY[21], MmePacket->MMENTRY[22], MmePacket->MMENTRY[23],
  3038. MmePacket->MMENTRY[24], MmePacket->MMENTRY[25], MmePacket->MMENTRY[26]);
  3039. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3040. break;
  3041. }
  3042. //[TC_SECC_VTB_CmSlacMatch_017] EVSE ID should be all zero
  3043. //[TC_SECC_VTB_CmSlacMatch_018]
  3044. if (Array_Check_All_Zero(&MmePacket->MMENTRY[27], 17) == FALSE)
  3045. {
  3046. sprintf((char*)buf_log_evcomm,
  3047. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE ID",
  3048. (idx + 1));
  3049. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3050. break;
  3051. }
  3052. //[TC_SECC_VTB_CmSlacMatch_019] EVSE MAC
  3053. //[TC_SECC_VTB_CmSlacMatch_020]
  3054. if (Array_Compare_Identity(CsuMac, &MmePacket->MMENTRY[44], SLAC_EVSE_MAC_LENGTH) == FALSE)
  3055. {
  3056. sprintf((char*)buf_log_evcomm,
  3057. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3058. (idx + 1),
  3059. MmePacket->MMENTRY[44], MmePacket->MMENTRY[45], MmePacket->MMENTRY[46],
  3060. MmePacket->MMENTRY[47], MmePacket->MMENTRY[48], MmePacket->MMENTRY[49]);
  3061. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3062. break;
  3063. }
  3064. //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
  3065. //[TC_SECC_VTB_CmSlacMatch_022]
  3066. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
  3067. (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
  3068. {
  3069. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3070. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  3071. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3072. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3073. SendMmePacket.MMV = MmePacket->MMV;
  3074. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_MATCH_CNF;
  3075. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3076. SendMmePacketSize = 0;
  3077. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //APPLICATION_TYPE: Fixed value (0x00: EV-EVSE matching)
  3078. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //SECURITY_TYPE: Fixed value (0x00: No Security)
  3079. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x56; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3080. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3081. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EV ID
  3082. SendMmePacketSize += 17;
  3083. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //EV MAC
  3084. SendMmePacketSize += 6;
  3085. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EVSE ID
  3086. SendMmePacketSize += 17;
  3087. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, CsuMac, 6); //EVSE MAC
  3088. SendMmePacketSize += 6;
  3089. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  3090. SendMmePacketSize += SLAC_RUNID_LENGTH;
  3091. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 8); //RSVD
  3092. SendMmePacketSize += 8;
  3093. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, Nid, sizeof(Nid)); //NID: Network ID given by the CCo(EVSE)
  3094. SendMmePacketSize += sizeof(Nid); //NID caculated from the random NMK that will be set.
  3095. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //RSVD
  3096. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, NewNmkKey, sizeof(NewNmkKey)); //NMK: Random value
  3097. SendMmePacketSize += sizeof(NewNmkKey); //NMK: Private NMK of the EVSE (random value)
  3098. SendMmePacketSize += 19; //the size before MMENTRY
  3099. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3100. {
  3101. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3102. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3103. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3104. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3105. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3106. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3107. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3108. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3109. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3110. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3111. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3112. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3113. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3114. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3115. for(Rtn=0; Rtn<17; Rtn++)
  3116. {
  3117. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3118. }
  3119. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3120. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3121. for(Rtn=0; Rtn<6; Rtn++)
  3122. {
  3123. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3124. }
  3125. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3126. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3127. for(Rtn=0; Rtn<17; Rtn++)
  3128. {
  3129. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3130. }
  3131. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3132. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3133. for(Rtn=0; Rtn<6; Rtn++)
  3134. {
  3135. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3136. }
  3137. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3138. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3139. for(Rtn=0; Rtn<8; Rtn++)
  3140. {
  3141. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3142. }
  3143. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3144. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3145. for(Rtn=0; Rtn<8; Rtn++)
  3146. {
  3147. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3148. }
  3149. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3150. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3151. for(Rtn=0; Rtn<7; Rtn++)
  3152. {
  3153. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3154. }
  3155. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3156. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3157. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3158. for(Rtn=0; Rtn<16; Rtn++)
  3159. {
  3160. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3161. }
  3162. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3163. }
  3164. #endif
  3165. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3166. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3167. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3168. sprintf((char*)buf_log_evcomm,
  3169. "[SLAC][Tx]CM_SLAC_MATCH_CNF[%d]",
  3170. (idx + 1));
  3171. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3172. ftime(&SeqStartTime);
  3173. }
  3174. else
  3175. {
  3176. //RunID does not match and it's not the first SLAC request
  3177. //Reset the SLAC database to embrace SLAC retry
  3178. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
  3179. SLAC_DB_Reset();
  3180. }
  3181. }
  3182. else
  3183. {
  3184. //OSA(EvMac) does not exist
  3185. }
  3186. break;
  3187. }
  3188. #else
  3189. {
  3190. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3191. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3192. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  3193. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  3194. memcpy(SendMmePacket.OSA,CsuMac,6);
  3195. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  3196. SendMmePacket.MMV=MmePacket->MMV;
  3197. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_MATCH_CNF;
  3198. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  3199. SendMmePacketSize=0;
  3200. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating ��PEV-EVSE matching��
  3201. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating ��No Security��
  3202. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56; //Fixed value (0x0056) for matching
  3203. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x0056) for matching
  3204. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //PEV ID
  3205. SendMmePacketSize+=17;
  3206. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  3207. SendMmePacketSize+=6;
  3208. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //EVSE ID
  3209. SendMmePacketSize+=17;
  3210. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
  3211. SendMmePacketSize+=6;
  3212. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  3213. SendMmePacketSize+=sizeof(SlacRunId);
  3214. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8); //RSVD
  3215. SendMmePacketSize+=8;
  3216. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
  3217. SendMmePacketSize+=sizeof(Nid);
  3218. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //RSVD
  3219. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
  3220. SendMmePacketSize+=sizeof(NewNmkKey);
  3221. SendMmePacketSize+=19; //the size before MMENTRY
  3222. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3223. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3224. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3225. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3226. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3227. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3228. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3229. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3230. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3231. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3232. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3233. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3234. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3235. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3236. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3237. for(Rtn=0; Rtn<17; Rtn++)
  3238. {
  3239. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3240. }
  3241. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3242. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3243. for(Rtn=0; Rtn<6; Rtn++)
  3244. {
  3245. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3246. }
  3247. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3248. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3249. for(Rtn=0; Rtn<17; Rtn++)
  3250. {
  3251. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3252. }
  3253. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3254. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3255. for(Rtn=0; Rtn<6; Rtn++)
  3256. {
  3257. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3258. }
  3259. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3260. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3261. for(Rtn=0; Rtn<8; Rtn++)
  3262. {
  3263. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3264. }
  3265. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3266. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3267. for(Rtn=0; Rtn<8; Rtn++)
  3268. {
  3269. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3270. }
  3271. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3272. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3273. for(Rtn=0; Rtn<7; Rtn++)
  3274. {
  3275. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3276. }
  3277. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3278. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3279. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3280. for(Rtn=0; Rtn<16; Rtn++)
  3281. {
  3282. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3283. }
  3284. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3285. #endif
  3286. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3287. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3288. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3289. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Tx]CM_SLAC_MATCH_CNF");
  3290. ftime(&SeqStartTime);
  3291. break;
  3292. }
  3293. #endif
  3294. }
  3295. case MMTYPE_VENDOR_VS_HOST_ACTION:
  3296. {
  3297. struct QcaVendorMmeHeader *RecvPacket;
  3298. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3299. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_HOST_ACTION ---\n");
  3300. switch (RecvPacket->MBODY[0])
  3301. {
  3302. case 0x00:
  3303. //Loader (Device Softloader or Bootloader) ready
  3304. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader Ready\n");
  3305. break;
  3306. case 0x01:
  3307. //Firmware Upgrade Ready
  3308. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade Ready\n");
  3309. break;
  3310. case 0x02:
  3311. //PIB Update Ready
  3312. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: PIB Update Ready\n");
  3313. break;
  3314. case 0x03:
  3315. //Firmware Upgrade and PIB Update ready
  3316. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade and PIB Update ready\n");
  3317. break;
  3318. case 0x04:
  3319. //Loader (Bootloader) ready to receive SDRAM configuration.
  3320. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader ready to receive SDRAM configuration\n");
  3321. break;
  3322. case 0x05:
  3323. //Reset to Factory Defaults.
  3324. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reset to Factory Defaults\n");
  3325. break;
  3326. default:
  3327. //Reserved
  3328. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reserved\n");
  3329. break;
  3330. }
  3331. break;
  3332. }
  3333. case MMTYPE_VENDOR_ATTEN_CHAR:
  3334. {
  3335. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_ATTEN_CHAR ---\n");
  3336. break;
  3337. }
  3338. case MMTYPE_VENDOR_VS_NW_INFO_CNF:
  3339. {
  3340. memcpy(QcaMac, MmePacket->OSA, 6);
  3341. sprintf((char*)buf_log_evcomm,
  3342. "[QCA7K][Rx][VENDOR_VS_NW_INFO_CNF]Got QCA7K MacAddr:%02X:%02X:%02X:%02X:%02X:%02X (comm:OK)",
  3343. QcaMac[0], QcaMac[1], QcaMac[2], QcaMac[3], QcaMac[4], QcaMac[5]);
  3344. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3345. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
  3346. DEBUG_PRINTF_EVCOMM_DETAIL("QcaMac: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3347. QcaMac[0],
  3348. QcaMac[1],
  3349. QcaMac[2],
  3350. QcaMac[3],
  3351. QcaMac[4],
  3352. QcaMac[5]);
  3353. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  3354. ftime(&SeqStartTime);
  3355. break;
  3356. }
  3357. default:
  3358. {
  3359. break;
  3360. }
  3361. }
  3362. return 0;
  3363. }
  3364. /*===========================================================================
  3365. FUNCTION: SlacComm
  3366. DESCRIPTION:
  3367. PRE-CONDITION:
  3368. INPUT:
  3369. OUTPUT:
  3370. GLOBAL VARIABLES:
  3371. =============================================================================*/
  3372. int SlacComm()
  3373. {
  3374. static unsigned char qca7k_comm_retry = 0;
  3375. unsigned char *EvMac_in;
  3376. unsigned char *RunID_in;
  3377. double t_diff = 0;
  3378. int packet_size = 0;
  3379. int count = 0;
  3380. //int idx = 0;
  3381. int i = 0;
  3382. if(RawSock >= 0)
  3383. {
  3384. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  3385. packet_size = recvfrom(RawSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0, NULL, NULL);
  3386. if(packet_size > 0)
  3387. {
  3388. /*#ifdef Debug
  3389. DEBUG_PRINTF_EVCOMM_DETAIL("Raw Data: ");
  3390. for(count=0;count<packet_size;count++)
  3391. DEBUG_PRINTF_EVCOMM_DETAIL("0x%x, ",V2gtpMsgRxBuf[count]);
  3392. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3393. #endif*/
  3394. MmeProcess(V2gtpMsgRxBuf, packet_size);
  3395. }
  3396. }
  3397. switch(Check_V2G_Flow_Status())
  3398. {
  3399. case IDLE:
  3400. {
  3401. if(RawSock < 0)
  3402. {
  3403. RawSock = socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  3404. sprintf((char*)buf_log_evcomm, "[RawSock]opened(%d)", RawSock);
  3405. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3406. if(RawSock == -1)
  3407. {
  3408. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Failed to create socket");
  3409. Update_V2G_Flow_Status(Other_Fault);
  3410. return -1;
  3411. }
  3412. if (setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE, QcaInterface, 4) < 0)
  3413. {
  3414. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_BINDTODEVICE NG");
  3415. Update_V2G_Flow_Status(Other_Fault);
  3416. return -1;
  3417. }
  3418. struct timeval tv;
  3419. tv.tv_sec = 0;
  3420. tv.tv_usec = 100000; //100ms (Rx timeout)
  3421. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3422. {
  3423. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_RCVTIMEO NG");
  3424. Update_V2G_Flow_Status(Other_Fault);
  3425. return -1;
  3426. }
  3427. tv.tv_usec = 100000; //100ms (Tx timeout)
  3428. if (setsockopt(RawSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3429. {
  3430. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_SNDTIMEO NG");
  3431. Update_V2G_Flow_Status(Other_Fault);
  3432. return -1;
  3433. }
  3434. memset(&Req, 0, sizeof(struct ifreq));
  3435. strcpy( (char*)Req.ifr_name, QcaInterface);
  3436. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  3437. {
  3438. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm: ioctl NG");
  3439. Update_V2G_Flow_Status(Other_Fault);
  3440. return -1;
  3441. }
  3442. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll));
  3443. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  3444. DestSocketAddress.sll_halen = ETH_ALEN;
  3445. PwmStartTime = 0;
  3446. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = FALSE;
  3447. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K]connecting...");
  3448. //Get QCA7K MAC address
  3449. GetQca7kMac();
  3450. ftime(&SeqStartTime);
  3451. break;
  3452. }
  3453. else //RawSock: opened
  3454. {
  3455. if(EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  3456. {
  3457. ftime(&SeqEndTime);
  3458. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3459. if (t_diff > V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD) //3 secs
  3460. {
  3461. qca7k_comm_retry++;
  3462. sprintf((char*)buf_log_evcomm,
  3463. "Re-try connecting...(%.02lf/%dms)",
  3464. t_diff,
  3465. V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD);
  3466. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3467. GetQca7kMac(); //re-send req
  3468. ftime(&SeqStartTime);
  3469. break;
  3470. }
  3471. else
  3472. {
  3473. //null
  3474. }
  3475. //Retry by 3 times
  3476. if (qca7k_comm_retry >= 3)
  3477. {
  3478. sprintf((char*)buf_log_evcomm,
  3479. "[Error]Comm: fail (retry by %d times)",
  3480. qca7k_comm_retry);
  3481. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3482. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3483. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3484. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3485. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3486. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3487. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3488. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3489. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3490. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3491. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3492. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  3493. Update_V2G_Flow_Status(Sequence_Timeout);
  3494. qca7k_comm_retry = 0;
  3495. break;
  3496. }
  3497. }
  3498. else //RawSock: opened; Set Key: DONE
  3499. {
  3500. if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
  3501. {
  3502. if(PwmStartTime <= 0)
  3503. {
  3504. //Sniffer_Tcpdump(ENABLE);
  3505. //#if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  3506. //sleep(1); //wait for tcpdump to be ready.
  3507. //#endif
  3508. SwitchCpStateE(DISABLE);
  3509. OutputCpPwmDuty(5);
  3510. PwmStartTime = time(NULL);
  3511. }
  3512. else
  3513. {
  3514. if((time(NULL) - PwmStartTime) > TT_EVSE_SLAC_init)
  3515. {
  3516. sprintf((char*)buf_log_evcomm,
  3517. "SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init, NowTime(%ld)-PwmStartTime(%d)>%d (sec)",
  3518. time(NULL),
  3519. PwmStartTime,
  3520. TT_EVSE_SLAC_init);
  3521. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3522. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3523. //CCS_SECC_TIMEOUT_SLAC_TT_EVSE_SLAC_init (023809)
  3524. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3525. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3526. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3527. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3528. ShmStatusCodeData->PresentStatusCode[0][4] = 0;
  3529. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  3530. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3531. Update_V2G_Flow_Status(Sequence_Timeout);
  3532. PwmStartTime = 0;
  3533. return -1;
  3534. }
  3535. else
  3536. {
  3537. //waiting for CM_SLAC_PARM_REQ
  3538. }
  3539. }
  3540. }
  3541. else
  3542. {
  3543. PwmStartTime = 0;
  3544. }
  3545. }
  3546. }
  3547. break;
  3548. }
  3549. case CM_SET_KEY_REQ: //13
  3550. {
  3551. //CM_SET_KEY_REQ
  3552. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Rx]CM_SET_KEY_REQ");
  3553. ftime(&SeqEndTime);
  3554. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3555. if (t_diff > V2G_SECC_QCA7000_COMM_TIMEOUT) //10 seconds
  3556. {
  3557. sprintf((char*)buf_log_evcomm,
  3558. "[QCA7K]Failed on SetKey => End_Process (%.02lf/%dms)",
  3559. t_diff,
  3560. V2G_SECC_QCA7000_COMM_TIMEOUT);
  3561. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3562. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3563. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3564. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3565. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3566. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3567. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3568. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3569. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3570. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3571. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3572. Update_V2G_Flow_Status(Sequence_Timeout);
  3573. }
  3574. else if (t_diff > V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD) //2 seconds
  3575. {
  3576. sprintf((char*)buf_log_evcomm,
  3577. "[QCA7K]SetKey: proceed (%.02lf/%dms)",
  3578. t_diff,
  3579. V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD);
  3580. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3581. SendSetKey();
  3582. ftime(&SeqStartTime);
  3583. }
  3584. else
  3585. {
  3586. //null
  3587. }
  3588. break;
  3589. }
  3590. case CM_SET_KEY_CNF: //14
  3591. {
  3592. sprintf((char*)buf_log_evcomm,
  3593. "[SECCReady]Wait: plugin(%d), matached(%d), permission(%d)...",
  3594. CheckConnectorPlugIn(),
  3595. CSUCOMMDC_TASK_FLAG.matched,
  3596. ShmInternalComm->ChargingPermission
  3597. );
  3598. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3599. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = TRUE;
  3600. PwmStartTime = 0;
  3601. Update_V2G_Flow_Status(IDLE);
  3602. break;
  3603. }
  3604. case CM_SLAC_PARM_CONF:
  3605. {
  3606. ftime(&SeqEndTime);
  3607. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  3608. {
  3609. sprintf((char*)buf_log_evcomm,
  3610. "SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence (%.02lf of %dms)",
  3611. DiffTimeb(SeqStartTime, SeqEndTime),
  3612. TT_match_sequence);
  3613. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3614. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3615. //CCS_SECC_TIMEOUT_CM_START_ATTEN_CHAR_IND (023811):
  3616. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3617. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3618. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3619. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3620. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3621. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3622. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3623. ShmStatusCodeData->PresentStatusCode[0][5] = 1;
  3624. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3625. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3626. Update_V2G_Flow_Status(Sequence_Timeout);
  3627. return -1;
  3628. }
  3629. break;
  3630. }
  3631. case CM_START_ATTEN_CHAR_IND:
  3632. {
  3633. ftime(&SeqEndTime);
  3634. if(DiffTimeb(SeqStartTime, SeqEndTime) > (TP_EV_batch_msg_interval)) //one more time interval for tolerance
  3635. {
  3636. sprintf((char*)buf_log_evcomm,
  3637. "SlacComm: Wait CM_MNBC_SOUND_IND Timeout - TP_EV_batch_msg_interval (%.02lf of %dms)",
  3638. DiffTimeb(SeqStartTime, SeqEndTime),
  3639. TP_EV_batch_msg_interval);
  3640. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3641. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3642. //CCS_SECC_TIMEOUT_SLAC_CM_MNBC_SOUND_IND (023818):
  3643. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3644. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3645. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3646. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3647. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3648. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3649. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3650. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  3651. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3652. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3653. Update_V2G_Flow_Status(Sequence_Timeout);
  3654. return -1;
  3655. }
  3656. break;
  3657. }
  3658. case CM_MNBC_SOUND_IND:
  3659. {
  3660. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  3661. {
  3662. ftime(&SeqEndTime);
  3663. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3664. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  3665. if(t_diff > TT_EVSE_match_MNBC ||
  3666. (SLAC_INFO.array[0].AttenProfileCnt >= SLAC_INFO.array[0].MnbcSoundNum) ||
  3667. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)) //TC_SECC_VTB_AttenuationCharacterization_003
  3668. {
  3669. //Wait for other SLAC Req sets
  3670. if ((SLAC_INFO.arrayLen >= 2) &&
  3671. (t_diff < TT_EVSE_match_MNBC) &&
  3672. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)) //not a retry
  3673. {
  3674. break;
  3675. }
  3676. //Check if it is a timeup response
  3677. if (t_diff > TT_EVSE_match_MNBC)
  3678. {
  3679. sprintf((char*)buf_log_evcomm,
  3680. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: timeup(%.2f/%dms) => send",
  3681. (i + 1),
  3682. t_diff,
  3683. TT_EVSE_match_MNBC);
  3684. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3685. }
  3686. //Sending all CM_ATTEN_CHAR_IND according to all corresponding SLAC Req sets
  3687. for (i = 0; i < SLAC_INFO.arrayLen; i++)
  3688. {
  3689. if ((SLAC_INFO.array[i].AttenProfileCnt == 0) ||
  3690. (SLAC_INFO.array[i].AagGroupsNum == 0) ||
  3691. (SLAC_INFO.array[i].StartAttenCharCnt == 0) ||
  3692. (SLAC_INFO.array[i].MnbcSoundNum != 10) || //received in CM_START_ATTEN_CHAR_IND
  3693. (SLAC_INFO.array[i].StartAttenCharErr == TRUE)
  3694. )
  3695. {
  3696. //Ignoring those SLAC request sets without sending CM_MNBC_SOUND_IND(CM_ATTEN_PROFILE_IND)
  3697. sprintf((char*)buf_log_evcomm,
  3698. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: para err(%d,%d,%d,%d,%d) => canceled",
  3699. (i + 1),
  3700. SLAC_INFO.array[i].AttenProfileCnt,
  3701. SLAC_INFO.array[i].AagGroupsNum,
  3702. SLAC_INFO.array[i].StartAttenCharCnt,
  3703. SLAC_INFO.array[i].MnbcSoundNum,
  3704. SLAC_INFO.array[i].StartAttenCharErr);
  3705. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3706. continue;
  3707. }
  3708. //In CM_ATTEN_CHAR_IND retry process, here only re-send this message according to the 1st coming SLAC request
  3709. if ((EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0) && (i != 0))
  3710. {
  3711. sprintf((char*)buf_log_evcomm,
  3712. "[NOTE][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: canceled",
  3713. (i + 1));
  3714. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3715. break;
  3716. }
  3717. EvMac_in = SLAC_INFO.array[i].EvMac;
  3718. RunID_in = SLAC_INFO.array[i].RunID;
  3719. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3720. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  3721. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3722. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3723. SendMmePacket.MMV = 0x01;
  3724. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  3725. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3726. SendMmePacketSize = 0;
  3727. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  3728. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  3729. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //SOURCE_ADDRESS, MAC address of the EV Host
  3730. SendMmePacketSize += SLAC_EVMAC_LENGTH;
  3731. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  3732. SendMmePacketSize += SLAC_RUNID_LENGTH;
  3733. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //SOURCE_ID(0x00)
  3734. SendMmePacketSize += 17;
  3735. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //RESP_ID(0x00)
  3736. SendMmePacketSize += 17;
  3737. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AttenProfileCnt; //NumSounds: Number of M-Sounds used for generation of the ATTEN_PROFILE
  3738. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AagGroupsNum; //NumGroups
  3739. for(count = 0; count < SLAC_INFO.array[i].AagGroupsNum; count++)
  3740. {
  3741. unsigned char TmpAag;
  3742. TmpAag = ((SLAC_INFO.array[i].AAG[count] / SLAC_INFO.array[i].AttenProfileCnt) & 0xFF);
  3743. SLAC_INFO.array[i].AAG_quality_ori += (float) TmpAag; //original signal quality
  3744. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  3745. #if 1
  3746. //TC_SECC_VTB_AttenuationCharacterization_019
  3747. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  3748. #else
  3749. if(TmpAag >= 39) //original method proposed by Vern
  3750. {
  3751. TmpAag = 37;
  3752. }
  3753. #endif
  3754. #endif
  3755. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  3756. SLAC_INFO.array[i].AAG_quality_refined += (float) TmpAag; //refined signal quality
  3757. }
  3758. SendMmePacketSize += 19; //the size before MMENTRY
  3759. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  3760. {
  3761. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  3762. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3763. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3764. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3765. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3766. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3767. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3768. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3769. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3770. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  3771. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3772. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3773. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3774. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  3775. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  3776. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  3777. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  3778. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  3779. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  3780. for(count=0; count<17; count++)
  3781. {
  3782. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
  3783. }
  3784. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3785. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  3786. for(count=0; count<17; count++)
  3787. {
  3788. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
  3789. }
  3790. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3791. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  3792. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
  3793. for(count=0; count<AagGroupsNum; count++)
  3794. {
  3795. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
  3796. }
  3797. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3798. }
  3799. #endif
  3800. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3801. SLAC_INFO.array[i].AAG_quality_ori /= SLAC_INFO.array[i].AagGroupsNum;
  3802. SLAC_INFO.array[i].AAG_quality_refined /= SLAC_INFO.array[i].AagGroupsNum;
  3803. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  3804. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  3805. {
  3806. sprintf((char*)buf_log_evcomm,
  3807. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: %d-th resend (Q=%.2f/%.2f)(%d/%d)",
  3808. (i + 1),
  3809. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry,
  3810. SLAC_INFO.array[i].AAG_quality_refined,
  3811. SLAC_INFO.array[i].AAG_quality_ori,
  3812. SLAC_INFO.array[i].AttenProfileCnt,
  3813. SLAC_INFO.array[i].MnbcSoundNum);
  3814. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3815. }
  3816. else if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)
  3817. {
  3818. sprintf((char*)buf_log_evcomm,
  3819. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: Q=%.2f/%.2f(%d/%d)",
  3820. (i + 1),
  3821. SLAC_INFO.array[i].AAG_quality_refined,
  3822. SLAC_INFO.array[i].AAG_quality_ori,
  3823. SLAC_INFO.array[i].AttenProfileCnt,
  3824. SLAC_INFO.array[i].MnbcSoundNum);
  3825. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3826. }
  3827. else
  3828. {
  3829. sprintf((char*)buf_log_evcomm,
  3830. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: unexpected CM_ATTEN_CHAR_IND_retry(%d))",
  3831. i,
  3832. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  3833. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3834. }
  3835. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  3836. } //end of for loop
  3837. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  3838. ftime(&SeqStartTime);
  3839. }
  3840. break;
  3841. }
  3842. #else
  3843. {
  3844. ftime(&SeqEndTime);
  3845. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  3846. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_MNBC || (AttenProfileCnt >= MnbcSoundNum) || (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0))
  3847. {
  3848. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3849. memcpy(SendMmePacket.ODA, EvMac, 6);
  3850. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3851. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3852. SendMmePacket.MMV = 0x01;
  3853. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  3854. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3855. SendMmePacketSize = 0;
  3856. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  3857. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  3858. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //SOURCE_ADDRESS, MAC address of the EV Host
  3859. SendMmePacketSize += 6;
  3860. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize, SlacRunId, sizeof(SlacRunId));
  3861. SendMmePacketSize += sizeof(SlacRunId);
  3862. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //SOURCE_ID
  3863. SendMmePacketSize += 17;
  3864. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //RESP_ID
  3865. SendMmePacketSize += 17;
  3866. SendMmePacket.MMENTRY[SendMmePacketSize++] = AttenProfileCnt; //NumSounds
  3867. SendMmePacket.MMENTRY[SendMmePacketSize++] = AagGroupsNum; //NumGroups
  3868. for(count=0; count < AagGroupsNum; count++)
  3869. {
  3870. unsigned char TmpAag;
  3871. TmpAag = ((Aag[count] / AttenProfileCnt) & 0xFF);
  3872. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  3873. #if 1
  3874. //TC_SECC_VTB_AttenuationCharacterization_019
  3875. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  3876. #else
  3877. if(TmpAag >= 39) //original method proposed by Vern
  3878. {
  3879. /*
  3880. // [To-do] If this statement is enabled, SLAC will fail due to timeout.
  3881. {
  3882. unsigned char TmpBuf[64];
  3883. memset(TmpBuf,0,sizeof(TmpBuf));
  3884. sprintf((char*)TmpBuf,"SlacComm: bad Aag[%d]=%d",count,TmpAag);
  3885. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", TmpBuf);
  3886. }
  3887. */
  3888. printf("%d,", TmpAag);
  3889. TmpAag = 37;
  3890. }
  3891. #endif
  3892. #endif
  3893. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  3894. }
  3895. SendMmePacketSize += 19; //the size before MMENTRY
  3896. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  3897. {
  3898. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  3899. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3900. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3901. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3902. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3903. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3904. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3905. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3906. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3907. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  3908. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3909. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3910. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3911. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  3912. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  3913. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  3914. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  3915. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  3916. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  3917. for(count=0; count<17; count++)
  3918. {
  3919. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
  3920. }
  3921. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3922. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  3923. for(count=0; count<17; count++)
  3924. {
  3925. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
  3926. }
  3927. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3928. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  3929. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
  3930. for(count=0; count<AagGroupsNum; count++)
  3931. {
  3932. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
  3933. }
  3934. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3935. }
  3936. #endif
  3937. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  3938. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3939. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  3940. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  3941. {
  3942. sprintf((char*)buf_log_evcomm,
  3943. "[SLAC][Tx]CM_ATTEN_CHAR_IND: resend(%d-th)",
  3944. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  3945. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3946. }
  3947. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  3948. ftime(&SeqStartTime);
  3949. }
  3950. break;
  3951. }
  3952. #endif
  3953. }
  3954. case CM_ATTEN_CHAR_IND:
  3955. {
  3956. ftime(&SeqEndTime);
  3957. //if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  3958. 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.
  3959. {
  3960. sprintf((char*)buf_log_evcomm,
  3961. "SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response (%.02lf of %dms)",
  3962. DiffTimeb(SeqStartTime, SeqEndTime),
  3963. TT_match_response);
  3964. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3965. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3966. //CCS_SECC_TIMEOUT_SLAC_CM_ATTEN_CHAR_RSP (023814):
  3967. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  3968. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3969. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3970. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3971. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3972. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3973. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  3974. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3975. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3976. Update_V2G_Flow_Status(Sequence_Timeout);
  3977. return -1;
  3978. }
  3979. break;
  3980. }
  3981. case CM_ATTEN_CHAR_RSP:
  3982. {
  3983. ftime(&SeqEndTime);
  3984. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_session)
  3985. {
  3986. sprintf((char*)buf_log_evcomm,
  3987. "SlacComm: Wait CM_VALIDATE_REQ_1ST or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session (%.02lf of %dms)",
  3988. DiffTimeb(SeqStartTime, SeqEndTime),
  3989. TT_EVSE_match_session);
  3990. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3991. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3992. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_1ST__CM_SLAC_MATCH_REQ (023815):
  3993. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  3994. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3995. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3996. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3997. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3998. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3999. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  4000. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  4001. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4002. Update_V2G_Flow_Status(Sequence_Timeout);
  4003. return -1;
  4004. }
  4005. break;
  4006. }
  4007. case CM_VALIDATE_CNF:
  4008. {
  4009. ftime(&SeqEndTime);
  4010. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  4011. {
  4012. sprintf((char*)buf_log_evcomm,
  4013. "SlacComm: Wait CM_VALIDATE_REQ_2ND or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence (%.02lf of %dms)",
  4014. DiffTimeb(SeqStartTime, SeqEndTime),
  4015. TT_match_sequence);
  4016. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4017. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4018. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_2ND__CM_SLAC_MATCH_REQ (023819):
  4019. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4020. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4021. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4022. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4023. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4024. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4025. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  4026. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  4027. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4028. Update_V2G_Flow_Status(Sequence_Timeout);
  4029. return -1;
  4030. }
  4031. break;
  4032. }
  4033. case CM_SLAC_MATCH_CNF:
  4034. {
  4035. if(UdpSock > 0)
  4036. {
  4037. close(UdpSock);
  4038. UdpSock = -1;
  4039. }
  4040. if(TcpSock > 0)
  4041. {
  4042. close(TcpSock);
  4043. TcpSock = -1;
  4044. }
  4045. ftime(&SeqStartTime);
  4046. V2gTcpConnected();
  4047. Update_V2G_Flow_Status(SLACC_SDP_UDP_Connection);
  4048. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SLAAC,SDP,UDP: connecting...");
  4049. break;
  4050. }
  4051. default:
  4052. {
  4053. break;
  4054. }
  4055. }
  4056. return 0;
  4057. }
  4058. /*===========================================================================
  4059. FUNCTION: V2gMsgDecoder
  4060. DESCRIPTION:
  4061. 1. Decode the V2GTP messages inside "msg" and save the decoded
  4062. messages in ccs_exi_doc_DIN, ccs_exi_doc_ISO1, and ccs_exi_doc_ISO2,
  4063. respectively.
  4064. 2. After decoding, V2gMsg_Process() could then use
  4065. ccs_exi_doc_DIN, ccs_exi_doc_ISO1, or ccs_exi_doc_ISO2
  4066. to deal with the corresponding Response messages, respectively.
  4067. PRE-CONDITION:
  4068. 1. msg_length > 0
  4069. INPUT:
  4070. 1. msg
  4071. 2. msg_length
  4072. OUTPUT:
  4073. 1. ccs_exi_doc_DIN //global variable
  4074. ccs_exi_doc_ISO1
  4075. ccs_exi_doc_ISO2
  4076. 2. v2g_state //Status Flag
  4077. //indicating the V2gMsg_Process_din to proceed
  4078. the next process.
  4079. 3. return value // < 0: ERROR
  4080. // > 0: Message Type
  4081. GLOBAL VARIABLES:
  4082. =============================================================================*/
  4083. int V2gMsgDecoder(unsigned char *msg, unsigned int msg_length, unsigned int v2g_state)
  4084. {
  4085. int errn = 0;
  4086. //Checking the minimum Header size requirement
  4087. if(msg_length < V2GTP_MSG_HEADER_LENGTH) //The minimum requirement should be 8-byte header.
  4088. {
  4089. errn = -1;
  4090. return errn;
  4091. }
  4092. //Decode the 1st V2GMSG: AppProtocol
  4093. if(v2g_state == SupportedAppProtocolRequest) //17
  4094. {
  4095. if ((errn = API_V2GMSG_EXI_Decoder_AppProtocol(msg, msg_length, &ccs_handshake)) < 0)
  4096. {
  4097. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: SupportedAppProtocolRequest()\n", errn);
  4098. }
  4099. else //decoded successfully.
  4100. {
  4101. //PRINT_XML_DOC_supportedAppProtocolReq(&ccs_handshake);
  4102. }
  4103. }
  4104. //Decode the subsequent V2GMSG (DIN 70121, ISO 15118-2, ISO 15118-20)
  4105. else if(v2g_state > SupportedAppProtocolRequest && v2g_state <= SessionStopResponse)
  4106. {
  4107. //Decoding according to its own protocol
  4108. switch (ShmCcsData->CommProtocol)
  4109. {
  4110. case V2GT_MSG_PROTOCOL_DIN70121: //0
  4111. {
  4112. //DIN
  4113. if((errn = API_V2GMSG_EXI_Decoder_DIN(msg, msg_length, &ccs_exi_doc_DIN)) < 0)
  4114. {
  4115. sprintf((char*)buf_log_evcomm,
  4116. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_DIN()",
  4117. errn);
  4118. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4119. }
  4120. break;
  4121. }
  4122. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  4123. {
  4124. //ISO1
  4125. if((errn = API_V2GMSG_EXI_Decoder_ISO1(msg, msg_length, &ccs_exi_doc_ISO1)) < 0)
  4126. {
  4127. sprintf((char*)buf_log_evcomm,
  4128. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO1()",
  4129. errn);
  4130. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4131. }
  4132. break;
  4133. }
  4134. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  4135. {
  4136. //ISO2
  4137. if((errn = API_V2GMSG_EXI_Decoder_ISO2(msg, msg_length, &ccs_exi_doc_ISO2)) < 0)
  4138. {
  4139. sprintf((char*)buf_log_evcomm,
  4140. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO2()",
  4141. errn);
  4142. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4143. }
  4144. break;
  4145. }
  4146. default:
  4147. break;
  4148. }
  4149. }
  4150. else
  4151. {
  4152. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: Unexpected v2g_state\n", errn);
  4153. errn = -1;
  4154. }
  4155. return errn;
  4156. }
  4157. /*===========================================================================
  4158. FUNCTION: encode_din_V2GTP_stream
  4159. DESCRIPTION:
  4160. PRE-CONDITION:
  4161. INPUT:
  4162. OUTPUT:
  4163. GLOBAL VARIABLES:
  4164. =============================================================================*/
  4165. int encode_din_V2GTP_stream(bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4166. {
  4167. int errn = 0;
  4168. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4169. errn = encode_dinExiDocument(v2g_tx_stream, ccs_exi_doc_DIN);
  4170. if (errn == 0)
  4171. {
  4172. //successfully encoded
  4173. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4174. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4175. if (errn != 0)
  4176. {
  4177. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4178. }
  4179. }
  4180. else
  4181. {
  4182. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]encode_dinExiDocument(): %d (DEC)\n", errn);
  4183. }
  4184. return errn;
  4185. }
  4186. /*===========================================================================
  4187. FUNCTION: encode_iso1_V2GTP_stream
  4188. DESCRIPTION:
  4189. PRE-CONDITION:
  4190. INPUT:
  4191. OUTPUT:
  4192. GLOBAL VARIABLES:
  4193. =============================================================================*/
  4194. int encode_iso1_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4195. {
  4196. int errn = 0;
  4197. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4198. errn = encode_iso1ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO1);
  4199. if (errn == 0)
  4200. {
  4201. //successfully encoded
  4202. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4203. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4204. if (errn != 0)
  4205. {
  4206. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4207. }
  4208. }
  4209. else
  4210. {
  4211. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]encode_iso1ExiDocument(): %d (DEC)\n", errn);
  4212. }
  4213. return errn;
  4214. }
  4215. /*===========================================================================
  4216. FUNCTION: encode_iso2_V2GTP_stream
  4217. DESCRIPTION:
  4218. PRE-CONDITION:
  4219. INPUT:
  4220. OUTPUT:
  4221. GLOBAL VARIABLES:
  4222. =============================================================================*/
  4223. int encode_iso2_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4224. {
  4225. int errn = 0;
  4226. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4227. errn = encode_iso2ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO2);
  4228. if (errn == 0)
  4229. {
  4230. //successfully encoded
  4231. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4232. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4233. if (errn != 0)
  4234. {
  4235. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4236. }
  4237. }
  4238. else
  4239. {
  4240. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]encode_iso2ExiDocument(): %d (DEC)\n", errn);
  4241. }
  4242. return errn;
  4243. }
  4244. /*===========================================================================
  4245. FUNCTION: send_encoded_din_V2GTP_Stream
  4246. DESCRIPTION:
  4247. PRE-CONDITION:
  4248. INPUT:
  4249. OUTPUT:
  4250. GLOBAL VARIABLES:
  4251. =============================================================================*/
  4252. int send_encoded_din_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4253. {
  4254. int errn = 0;
  4255. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4256. errn = encode_din_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_DIN);
  4257. // STEP 2: =========== Send Response Packet ===========
  4258. int rtn = 0;
  4259. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4260. if (rtn == v2g_tx_stream->size)
  4261. {
  4262. /*
  4263. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_din_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4264. rtn, v2g_tx_stream->size);
  4265. */
  4266. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4267. }
  4268. else if (rtn >= 0)
  4269. {
  4270. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_din_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n", rtn, v2g_tx_stream->size);
  4271. }
  4272. else
  4273. {
  4274. errn = rtn;
  4275. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_din_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4276. }
  4277. //STEP 3: ========= Reset V2G MSG Flags ==========
  4278. init_dinBodyType(&ccs_exi_doc_DIN->V2G_Message.Body);
  4279. return errn;
  4280. }
  4281. /*===========================================================================
  4282. FUNCTION: send_encoded_iso1_V2GTP_Stream
  4283. DESCRIPTION:
  4284. PRE-CONDITION:
  4285. INPUT:
  4286. OUTPUT:
  4287. GLOBAL VARIABLES:
  4288. =============================================================================*/
  4289. int send_encoded_iso1_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4290. {
  4291. int errn = 0;
  4292. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4293. errn = encode_iso1_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO1);
  4294. // STEP 2: =========== Send Response Packet ===========
  4295. int rtn = 0;
  4296. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4297. if (rtn == v2g_tx_stream->size)
  4298. {
  4299. /*
  4300. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso1_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4301. rtn, v2g_tx_stream->size);
  4302. */
  4303. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4304. }
  4305. else if (rtn >= 0)
  4306. {
  4307. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso1_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n", rtn, v2g_tx_stream->size);
  4308. }
  4309. else
  4310. {
  4311. errn = rtn;
  4312. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso1_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4313. }
  4314. //STEP 3: ========= Reset V2G MSG Flags ==========
  4315. init_iso1BodyType(&ccs_exi_doc_ISO1->V2G_Message.Body);
  4316. return errn;
  4317. }
  4318. /*===========================================================================
  4319. FUNCTION: send_encoded_iso2_V2GTP_Stream
  4320. DESCRIPTION:
  4321. PRE-CONDITION:
  4322. INPUT:
  4323. OUTPUT:
  4324. GLOBAL VARIABLES:
  4325. =============================================================================*/
  4326. int send_encoded_iso2_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4327. {
  4328. int errn = 0;
  4329. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4330. errn = encode_iso2_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO2);
  4331. // STEP 2: =========== Send Response Packet ===========
  4332. int rtn = 0;
  4333. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4334. if (rtn == v2g_tx_stream->size)
  4335. {
  4336. /*
  4337. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso2_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4338. rtn, v2g_tx_stream->size);
  4339. */
  4340. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4341. }
  4342. else if (rtn >= 0)
  4343. {
  4344. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso2_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4345. rtn, v2g_tx_stream->size);
  4346. }
  4347. else
  4348. {
  4349. errn = rtn;
  4350. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso2_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4351. }
  4352. //STEP 3: ========= Reset V2G MSG Flags ==========
  4353. init_iso2BodyType(&ccs_exi_doc_ISO2->V2G_Message.Body);
  4354. return errn;
  4355. }
  4356. /*===========================================================================
  4357. FUNCTION: Check_din_V2G_Rx_MSG_SessionID
  4358. DESCRIPTION:
  4359. PRE-CONDITION:
  4360. INPUT:
  4361. OUTPUT:
  4362. GLOBAL VARIABLES:
  4363. =============================================================================*/
  4364. int Check_din_V2G_Rx_MSG_SessionID(struct dinEXIDocument *exi_doc_DIN)
  4365. {
  4366. int i = 0;
  4367. int leng = 0;
  4368. int errn = 0;
  4369. leng = exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen;
  4370. //Step 1: Check SessionID Length
  4371. if (leng != 8) //8-byte
  4372. {
  4373. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4374. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4375. errn = -1;
  4376. }
  4377. else
  4378. {
  4379. //Step 2-1: Check SessionID content
  4380. for (i = 0; i < leng; i++)
  4381. {
  4382. if (exi_doc_DIN->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4383. {
  4384. errn = -2;
  4385. break;
  4386. }
  4387. }
  4388. }
  4389. //Step 2-2: Print Incorrect ID
  4390. if (errn == -2) //incorrect ID
  4391. {
  4392. sprintf((char*)buf_log_evcomm,
  4393. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4394. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[0],
  4395. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[1],
  4396. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[2],
  4397. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[3],
  4398. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[4],
  4399. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[5],
  4400. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[6],
  4401. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[7],
  4402. EVCOMM_SYS_INFO.SessionID[0],
  4403. EVCOMM_SYS_INFO.SessionID[1],
  4404. EVCOMM_SYS_INFO.SessionID[2],
  4405. EVCOMM_SYS_INFO.SessionID[3],
  4406. EVCOMM_SYS_INFO.SessionID[4],
  4407. EVCOMM_SYS_INFO.SessionID[5],
  4408. EVCOMM_SYS_INFO.SessionID[6],
  4409. EVCOMM_SYS_INFO.SessionID[7]
  4410. );
  4411. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4412. }
  4413. //Step 3: Correct SessionID for Res Message
  4414. if (errn != 0)
  4415. {
  4416. exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen = 8;
  4417. memset(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, 0, 8);
  4418. memcpy(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4419. }
  4420. return errn;
  4421. }
  4422. /*===========================================================================
  4423. FUNCTION: Check_iso1_V2G_Rx_MSG_SessionID
  4424. DESCRIPTION:
  4425. PRE-CONDITION:
  4426. INPUT:
  4427. OUTPUT:
  4428. GLOBAL VARIABLES:
  4429. =============================================================================*/
  4430. int Check_iso1_V2G_Rx_MSG_SessionID(struct iso1EXIDocument *exi_doc_ISO1)
  4431. {
  4432. int i = 0;
  4433. int leng = 0;
  4434. int errn = 0;
  4435. leng = exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen;
  4436. //Step 1: Check SessionID Length
  4437. if (leng != 8) //8-byte
  4438. {
  4439. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4440. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4441. errn = -1;
  4442. }
  4443. else
  4444. {
  4445. //Step 2-1: Check SessionID content
  4446. for (i = 0; i < leng; i++)
  4447. {
  4448. if (exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4449. {
  4450. errn = -2;
  4451. break;
  4452. }
  4453. }
  4454. }
  4455. //Step 2-2: Print Incorrect ID
  4456. if (errn == -2) //incorrect ID
  4457. {
  4458. sprintf((char*)buf_log_evcomm,
  4459. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4460. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[0],
  4461. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[1],
  4462. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[2],
  4463. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[3],
  4464. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[4],
  4465. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[5],
  4466. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[6],
  4467. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[7],
  4468. EVCOMM_SYS_INFO.SessionID[0],
  4469. EVCOMM_SYS_INFO.SessionID[1],
  4470. EVCOMM_SYS_INFO.SessionID[2],
  4471. EVCOMM_SYS_INFO.SessionID[3],
  4472. EVCOMM_SYS_INFO.SessionID[4],
  4473. EVCOMM_SYS_INFO.SessionID[5],
  4474. EVCOMM_SYS_INFO.SessionID[6],
  4475. EVCOMM_SYS_INFO.SessionID[7]
  4476. );
  4477. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4478. }
  4479. //Step 3: Correct SessionID for Res Message
  4480. if (errn != 0)
  4481. {
  4482. exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen = 8;
  4483. memset(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, 0, 8);
  4484. memcpy(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4485. }
  4486. return errn;
  4487. }
  4488. /*===========================================================================
  4489. FUNCTION: Check_iso2_V2G_Rx_MSG_SessionID
  4490. DESCRIPTION:
  4491. PRE-CONDITION:
  4492. INPUT:
  4493. OUTPUT:
  4494. GLOBAL VARIABLES:
  4495. =============================================================================*/
  4496. int Check_iso2_V2G_Rx_MSG_SessionID(struct iso2EXIDocument *exi_doc_ISO2)
  4497. {
  4498. int i = 0;
  4499. int leng = 0;
  4500. int errn = 0;
  4501. leng = exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen;
  4502. //Step 1: Check SessionID Length
  4503. if (leng != 8) //8-byte
  4504. {
  4505. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4506. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4507. errn = -1;
  4508. }
  4509. else
  4510. {
  4511. //Step 2-1: Check SessionID content
  4512. for (i = 0; i < leng; i++)
  4513. {
  4514. if (exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4515. {
  4516. errn = -2;
  4517. break;
  4518. }
  4519. }
  4520. }
  4521. //Step 2-2: Print Incorrect ID
  4522. if (errn == -2) //incorrect ID
  4523. {
  4524. sprintf((char*)buf_log_evcomm,
  4525. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4526. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[0],
  4527. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[1],
  4528. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[2],
  4529. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[3],
  4530. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[4],
  4531. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[5],
  4532. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[6],
  4533. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[7],
  4534. EVCOMM_SYS_INFO.SessionID[0],
  4535. EVCOMM_SYS_INFO.SessionID[1],
  4536. EVCOMM_SYS_INFO.SessionID[2],
  4537. EVCOMM_SYS_INFO.SessionID[3],
  4538. EVCOMM_SYS_INFO.SessionID[4],
  4539. EVCOMM_SYS_INFO.SessionID[5],
  4540. EVCOMM_SYS_INFO.SessionID[6],
  4541. EVCOMM_SYS_INFO.SessionID[7]
  4542. );
  4543. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4544. }
  4545. //Step 3: Correct SessionID for Res Message
  4546. if (errn != 0)
  4547. {
  4548. exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen = 8;
  4549. memset(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, 0, 8);
  4550. memcpy(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4551. }
  4552. return errn;
  4553. }
  4554. /*===========================================================================
  4555. FUNCTION: GetSchemaID_of_Protocol
  4556. DESCRIPTION:
  4557. 1. Get the SchemaID accroding to the input target
  4558. *V2GT_MSG_PROTOCOL_DIN70121: choose DIN 70121
  4559. *V2GT_MSG_PROTOCOL_ISO15118_2014: choose ISO 15118-2 (ed1)
  4560. *V2GT_MSG_PROTOCOL_ISO15118_2018: choose ISO 15118-20 (ed2)
  4561. *V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY: choose the one with the highest priority
  4562. 2. [To-do] Checking Major and Minor version
  4563. 3. The parsing method will not support those private protocols,
  4564. such as "usr:tesla...," since "tesla" is 5 bytes but "din" and "iso" are 3 bytes.
  4565. 4. [To-do] If the target is selected as DIN," but there is no DIN.
  4566. However, if EV and EVSE all support ISO, how to use ISO instead?
  4567. PRE-CONDITION:
  4568. INPUT:
  4569. 1. target: target protocol
  4570. OUTPUT:
  4571. 1. id: SchemaID of selected protocol by EVSE
  4572. 2. ShmCcsData->CommProtocol (selected protocol)
  4573. 3. SupportedAppProtocol_result
  4574. (1) appHandresponseCodeType_OK_SuccessfulNegotiation = 0,
  4575. (2) appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation = 1,
  4576. (3) appHandresponseCodeType_Failed_NoNegotiation = 2
  4577. GLOBAL VARIABLES:
  4578. 1. ccs_handshake
  4579. 2. ShmCcsData
  4580. =============================================================================*/
  4581. int GetSchemaID_of_Protocol(unsigned char target)
  4582. {
  4583. int i = 0;
  4584. int ii = 0;
  4585. int id = 0;
  4586. //unsigned char tmp = 0;
  4587. unsigned char pri = 20; //priority = 1(highest)~20(lowerest)
  4588. char num[10];
  4589. //struct CCS_ProtocolNamespacestructCharacters pro;
  4590. //Choose the 1st protocol as default.
  4591. //id = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  4592. id = -1;
  4593. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4594. for(i = 0; i < CCS_HANDSHAKE_PROTOCOLS.arrayLen; i++)
  4595. {
  4596. //Checking for <ProtocolNamespace>urn:din:70121:2012:MsgDef</ProtocolNamespace>
  4597. //[To-Do] Ignoring the priority from EV and force DIN 70121 as our only option. (for temp)
  4598. //[CAUTION] The parsing method will not support those private protocols, such as "usr:tesla..."
  4599. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[8];
  4600. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[9];
  4601. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[10];
  4602. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[11];
  4603. num[4] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[12];
  4604. num[5] = '\0';
  4605. if (atoi(num) == 70121)
  4606. {
  4607. sprintf((char*)buf_log_evcomm,
  4608. "[GetSchemaID_of_Protocol]supported(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  4609. (i+1),
  4610. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4611. atoi(num),
  4612. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4613. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4614. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4615. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4616. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4617. if (target == V2GT_MSG_PROTOCOL_DIN70121)
  4618. {
  4619. sprintf((char*)buf_log_evcomm,
  4620. "[GetSchemaID_of_Protocol]selected(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  4621. (i+1),
  4622. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4623. atoi(num),
  4624. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4625. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4626. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4627. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4628. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4629. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == DIN_SPEC_70121_2012_VersionNumberMajor)
  4630. {
  4631. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == DIN_SPEC_70121_2012_VersionNumberMinor)
  4632. {
  4633. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4634. }
  4635. else
  4636. { //[TC_SECC_VTB_SupportedAppProtocol_005]
  4637. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4638. }
  4639. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4640. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4641. return id;
  4642. }
  4643. else
  4644. {
  4645. //keep looking for the suitable protocol
  4646. }
  4647. }
  4648. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4649. {
  4650. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4651. {
  4652. ii = i;
  4653. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4654. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4655. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4656. }
  4657. else
  4658. {
  4659. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4660. }
  4661. }
  4662. else
  4663. {
  4664. //null
  4665. }
  4666. }
  4667. else if (atoi(num) == 15118)
  4668. {
  4669. //urn:din:70121:2012:MsgDef
  4670. //urn:iso:15118:2:2013:MsgDef
  4671. memset(num, 0, sizeof(num));
  4672. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[16];
  4673. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[17];
  4674. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[18];
  4675. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[19];
  4676. num[4] = '\0';
  4677. if (atoi(num) < 2018 && atoi(num) >= 2010)
  4678. {
  4679. sprintf((char*)buf_log_evcomm,
  4680. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-2(ed1,%d:v%d.%d;id=%d,pri=%d)",
  4681. (i+1),
  4682. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4683. atoi(num),
  4684. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4685. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4686. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4687. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4688. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4689. if (target == V2GT_MSG_PROTOCOL_ISO15118_2014)
  4690. {
  4691. sprintf((char*)buf_log_evcomm,
  4692. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-2,ed1(%d:v%d.%d;id=%d,pri=%d)",
  4693. (i+1),
  4694. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4695. atoi(num),
  4696. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4697. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4698. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4699. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4700. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4701. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO1_15118_2013_VersionNumberMajor)
  4702. {
  4703. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO1_15118_2013_VersionNumberMinor)
  4704. {
  4705. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4706. }
  4707. else
  4708. {
  4709. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4710. }
  4711. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4712. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  4713. return id;
  4714. }
  4715. else
  4716. {
  4717. //keep looking for the suitable protocol
  4718. }
  4719. }
  4720. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4721. {
  4722. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4723. {
  4724. ii = i;
  4725. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4726. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4727. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  4728. }
  4729. else
  4730. {
  4731. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4732. }
  4733. }
  4734. else
  4735. {
  4736. //null
  4737. }
  4738. }
  4739. else if (atoi(num) >= 2018 && atoi(num) <= 2100) // >= 2018
  4740. {
  4741. sprintf((char*)buf_log_evcomm,
  4742. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-20(ed2,%d:v%d.%d;id=%d,pri=%d)",
  4743. (i+1),
  4744. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4745. atoi(num),
  4746. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4747. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4748. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4749. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4750. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4751. if (target == V2GT_MSG_PROTOCOL_ISO15118_2018)
  4752. {
  4753. sprintf((char*)buf_log_evcomm,
  4754. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-20,ed2(%d:v%d.%d;id=%d,pri=%d)",
  4755. (i+1),
  4756. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4757. atoi(num),
  4758. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4759. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4760. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4761. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4762. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4763. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO2_15118_2018_VersionNumberMajor)
  4764. {
  4765. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO2_15118_2018_VersionNumberMinor)
  4766. {
  4767. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4768. }
  4769. else
  4770. {
  4771. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4772. }
  4773. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4774. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  4775. return id;
  4776. }
  4777. else
  4778. {
  4779. //keep looking for the suitable protocol
  4780. }
  4781. }
  4782. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4783. {
  4784. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4785. {
  4786. ii = i;
  4787. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4788. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4789. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  4790. }
  4791. else
  4792. {
  4793. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4794. }
  4795. }
  4796. else
  4797. {
  4798. //null
  4799. }
  4800. }
  4801. else
  4802. {
  4803. //Unexpected Year
  4804. sprintf((char*)buf_log_evcomm,
  4805. "[GetSchemaID_of_Protocol]unsupported(%d-th/%d): ISO 15118-X(unexpected year:%d,v%d.%d),id=%d,pri=%d",
  4806. (i+1),
  4807. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4808. atoi(num),
  4809. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4810. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4811. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4812. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4813. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4814. //return -1;
  4815. }
  4816. }
  4817. else
  4818. {
  4819. sprintf((char*)buf_log_evcomm,
  4820. "[GetSchemaID_of_Protocol]unsupported protocol(%d-th/%d)(%d:v%d.%d;id=%d,pri=%d)",
  4821. (i+1),
  4822. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4823. atoi(num),
  4824. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4825. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4826. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4827. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4828. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4829. //return -1;
  4830. }
  4831. }
  4832. //The final result of highest priority protocol
  4833. sprintf((char*)buf_log_evcomm,
  4834. "[GetSchemaID_of_Protocol]selected(%d-th/%d): pro=%d(0:DIN,1:ISO1,2:ISO2);id=%d,pri=%d",
  4835. (ii+1),
  4836. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4837. ShmCcsData->CommProtocol,
  4838. id,
  4839. pri);
  4840. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4841. if (id < 0)
  4842. {
  4843. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_Failed_NoNegotiation;
  4844. }
  4845. return id;
  4846. }
  4847. /*===========================================================================
  4848. FUNCTION: Proc_supportedAppProtocolRes
  4849. DESCRIPTION:
  4850. PRE-CONDITION:
  4851. INPUT:
  4852. OUTPUT:
  4853. GLOBAL VARIABLES:
  4854. =============================================================================*/
  4855. int Proc_supportedAppProtocolRes(int AcceptFd)
  4856. {
  4857. int errn = 0;
  4858. bitstream_t v2g_tx_stream;
  4859. static struct ChargingInfoData *sys;
  4860. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  4861. //STEP 1: =========== Setting the Response Message ===========
  4862. init_appHandEXIDocument(&ccs_handshake);
  4863. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4864. ccs_handshake.supportedAppProtocolRes_isUsed = 1u;
  4865. //select the 1st one as the default
  4866. ccs_handshake.supportedAppProtocolRes.SchemaID = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  4867. ccs_handshake.supportedAppProtocolRes.SchemaID_isUsed = 1u;
  4868. int id = 0;
  4869. id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_PREFERENCE); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  4870. ccs_handshake.supportedAppProtocolRes.ResponseCode = EVCOMM_SYS_INFO.SupportedAppProtocol_result; //updating the response code
  4871. if (id < 0)
  4872. {
  4873. sprintf((char*)buf_log_evcomm,
  4874. "[Error]No avalible CCS protocol (id = %d, preference = %d)",
  4875. id,
  4876. V2GT_MSG_PROTOCOL_PREFERENCE);
  4877. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4878. }
  4879. else
  4880. {
  4881. //selected SchemaID
  4882. ccs_handshake.supportedAppProtocolRes.SchemaID = (unsigned char) id;
  4883. }
  4884. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  4885. {
  4886. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_supportedAppProtocolRes]EVSE_Shutdown => End_Process");
  4887. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  4888. errn = -1;
  4889. }
  4890. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  4891. {
  4892. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_supportedAppProtocolRes]EVSE_EmergencyShutdown => End_Process");
  4893. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  4894. errn = -1;
  4895. }
  4896. else
  4897. {
  4898. //null
  4899. }
  4900. //Check for Permission Changing from TRUE to FALSE
  4901. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  4902. ShmInternalComm->ChargingPermission == FALSE)
  4903. {
  4904. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][supportedAppProtocolRes]Permission OFF");
  4905. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  4906. //errn = -1;
  4907. }
  4908. #if (CP_PROTECTION_MECHANISM == ENABLE)
  4909. {
  4910. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  4911. {
  4912. //Detect for CP State should be 9V with 5% PWM or 100%PWM (State B1, B2)
  4913. if (sys->CpState != 2 && sys->CpState != 3) //State B1, B2
  4914. {
  4915. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  4916. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4917. Update_V2G_Flow_Status(Other_Fault);
  4918. sprintf((char*)buf_log_evcomm,
  4919. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  4920. sys->CpState,
  4921. sys->CpVoltage);
  4922. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4923. }
  4924. }
  4925. #else
  4926. {
  4927. //Detect for CP State should be 9V (State B)
  4928. if (sys->CpState != 3) //B2
  4929. {
  4930. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  4931. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4932. Update_V2G_Flow_Status(Other_Fault);
  4933. sprintf((char*)buf_log_evcomm,
  4934. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  4935. sys->CpState,
  4936. sys->CpVoltage);
  4937. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4938. }
  4939. }
  4940. #endif
  4941. }
  4942. #endif
  4943. //STEP 2: =========== Encode into EXI ===========
  4944. if ((errn = API_V2GMSG_EXI_Encoder_AppProtocol(&ccs_handshake, &v2g_tx_stream)) !=0)
  4945. {
  4946. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Error]API_V2GMSG_EXI_Encoder_AppProtocol\n");
  4947. return errn;
  4948. }
  4949. //STEP 3: =========== Send Response Packet ===========
  4950. int Rtn = 0;
  4951. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  4952. //Rtn = send(6, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  4953. DEBUG_PRINTF_EVCOMM_DETAIL("Send V2GTP Packet Size = %d, Rtn = %d (Bytes, DEC)\n", v2g_tx_stream.size, Rtn);
  4954. if (Rtn < 0)
  4955. {
  4956. return Rtn;
  4957. }
  4958. //STEP 4: =========== Save into Share Memory =========
  4959. //[Joseph, To-Do] Adding a mechanism to choose DIN 70121 as our 1st priority. (for multiple protocols)
  4960. //STEP 5: =========== Updating the Flow State Flag =========
  4961. if (id < 0)
  4962. {
  4963. errn = -1;
  4964. }
  4965. //STEP 6: =========== Reset Flags ============
  4966. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4967. init_appHandEXIDocument(&ccs_handshake);
  4968. return errn;
  4969. }
  4970. /*===========================================================================
  4971. FUNCTION: Proc_supportedAppProtocolReq
  4972. DESCRIPTION:
  4973. PRE-CONDITION:
  4974. INPUT:
  4975. OUTPUT:
  4976. GLOBAL VARIABLES:
  4977. =============================================================================*/
  4978. int Proc_supportedAppProtocolReq(int AcceptFd)
  4979. {
  4980. //[Joseph, To-Do] analysis on Req message and choose the prefered protocol
  4981. //Default: DIN 70121 (find SchemaID)
  4982. int errn = 0;
  4983. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]supportedAppProtocolReq");
  4984. SHM_Save_din_supportedAppProtocolReq(ShmCcsData, &ccs_handshake, ShmSysConfigAndInfo);
  4985. errn = Proc_supportedAppProtocolRes(AcceptFd);
  4986. if (errn == 0)
  4987. {
  4988. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]supportedAppProtocolRes");
  4989. }
  4990. else
  4991. {
  4992. DEBUG_PRINTF_EVCOMM_DETAIL("[Error]Proc_supportedAppProtocolRes(): %d (DEC)\n", errn);
  4993. }
  4994. return errn;
  4995. }
  4996. /*===========================================================================
  4997. FUNCTION: Proc_din_SessionSetupRes
  4998. DESCRIPTION:
  4999. PRE-CONDITION:
  5000. INPUT:
  5001. OUTPUT:
  5002. GLOBAL VARIABLES:
  5003. =============================================================================*/
  5004. int Proc_din_SessionSetupRes(int AcceptFd)
  5005. {
  5006. //int i = 0;
  5007. int errn = 0;
  5008. bitstream_t v2g_tx_stream;
  5009. static struct ChargingInfoData *sys;
  5010. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5011. size_t pos = 0;
  5012. v2g_tx_stream.pos = &pos;
  5013. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5014. v2g_tx_stream.data = V2GTP_Tx_buf;
  5015. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5016. init_dinSessionSetupResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes);
  5017. // ====== [BODY (1/2) ResponseCode ======
  5018. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5019. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_OK_NewSessionEstablished;
  5020. //[HEADER] Assign Res SessionID
  5021. ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytesLen = 8;
  5022. memset(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, 0, 8);
  5023. memcpy(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5024. //Check for SequenceError
  5025. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5026. {
  5027. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError;
  5028. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5029. errn = -1;
  5030. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5031. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5032. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5033. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5034. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5035. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5036. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5037. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5038. }
  5039. //#if PARAMETER_NORMAL_MODE == ENABLE
  5040. //SHM_Read_din_V2GMSG_Header(&ccs_exi_doc_DIN, ShmCcsData);
  5041. //#endif
  5042. //Detect for CP State should be 9V (State B)
  5043. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5044. {
  5045. #if CP_PROTECTION_MECHANISM == ENABLE
  5046. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5047. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5048. Update_V2G_Flow_Status(Other_Fault);
  5049. errn = -1;
  5050. sprintf((char*)buf_log_evcomm,
  5051. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5052. sys->CpState);
  5053. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5054. #else
  5055. sprintf((char*)buf_log_evcomm,
  5056. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5057. sys->CpState);
  5058. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5059. #endif
  5060. }
  5061. //Check for shutdown commands from EVSE(DC Main Board)
  5062. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5063. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5064. {
  5065. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5066. sprintf((char*)buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5067. EVSE_Shutdown,
  5068. EVSE_EmergencyShutdown,
  5069. sys->DC_EVSEStatus);
  5070. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5071. errn = -1;
  5072. }
  5073. //Check for Permission Changing from TRUE to FALSE
  5074. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5075. ShmInternalComm->ChargingPermission == FALSE)
  5076. {
  5077. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][SessionSetupRes]Permission OFF");
  5078. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5079. errn = -1;
  5080. }
  5081. // ====== [BODY (2/3) EVSEID ======
  5082. //EVSEID = all zero
  5083. memset(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes, 0, sizeof(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes));
  5084. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytesLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5085. // ====== [BODY (3/3) DateTimeNow ======
  5086. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow_isUsed = 1u;
  5087. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5088. #if PARAMETER_NORMAL_MODE == ENABLE
  5089. ///////////SHM_Read_din_SessionSetupRes(&ccs_exi_doc_DIN, ShmCcsData);
  5090. #endif
  5091. // ============ Encode and Send Response Message ===========
  5092. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5093. {
  5094. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_SessionSetupRes][Error]Tx encoded msg error");
  5095. errn = -1;
  5096. }
  5097. return errn;
  5098. }
  5099. /*===========================================================================
  5100. FUNCTION: Proc_iso1_SessionSetupRes
  5101. DESCRIPTION:
  5102. PRE-CONDITION:
  5103. INPUT:
  5104. OUTPUT:
  5105. GLOBAL VARIABLES:
  5106. =============================================================================*/
  5107. int Proc_iso1_SessionSetupRes(int AcceptFd)
  5108. {
  5109. //int i = 0;
  5110. int errn = 0;
  5111. bitstream_t v2g_tx_stream;
  5112. static struct ChargingInfoData *sys;
  5113. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5114. size_t pos = 0;
  5115. v2g_tx_stream.pos = &pos;
  5116. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5117. v2g_tx_stream.data = V2GTP_Tx_buf;
  5118. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5119. init_iso1SessionSetupResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes);
  5120. // ====== [BODY (1/2) ResponseCode ======
  5121. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5122. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_OK_NewSessionEstablished;
  5123. //[HEADER] Assign Res SessionID
  5124. ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytesLen = 8;
  5125. memset(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, 0, 8);
  5126. memcpy(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5127. //Check for SequenceError
  5128. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5129. {
  5130. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5131. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5132. errn = -1;
  5133. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5134. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5135. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5136. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5137. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5138. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5139. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5140. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5141. }
  5142. //#if PARAMETER_NORMAL_MODE == ENABLE
  5143. //SHM_Read_iso1_V2GMSG_Header(&ccs_exi_doc_ISO1, ShmCcsData);
  5144. //#endif
  5145. //Detect for CP State should be 9V (State B)
  5146. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5147. {
  5148. #if CP_PROTECTION_MECHANISM == ENABLE
  5149. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5150. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5151. Update_V2G_Flow_Status(Other_Fault);
  5152. errn = -1;
  5153. sprintf((char*)buf_log_evcomm,
  5154. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5155. sys->CpState);
  5156. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5157. #else
  5158. sprintf((char*)buf_log_evcomm,
  5159. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5160. sys->CpState);
  5161. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5162. #endif
  5163. }
  5164. //Check for shutdown commands from EVSE(DC Main Board)
  5165. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5166. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5167. {
  5168. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5169. sprintf((char*)buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5170. EVSE_Shutdown,
  5171. EVSE_EmergencyShutdown,
  5172. sys->DC_EVSEStatus);
  5173. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5174. errn = -1;
  5175. }
  5176. //Check for Permission Changing from TRUE to FALSE
  5177. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5178. ShmInternalComm->ChargingPermission == FALSE)
  5179. {
  5180. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][SessionSetupRes]Permission OFF");
  5181. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5182. errn = -1;
  5183. }
  5184. // ====== [BODY (2/3) EVSEID ======
  5185. //EVSEID = all zero
  5186. memset(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5187. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5188. // ====== [BODY (3/3) DateTimeNow ======
  5189. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5190. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5191. #if PARAMETER_NORMAL_MODE == ENABLE
  5192. ///////////SHM_Read_iso1_SessionSetupRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5193. #endif
  5194. // ============ Encode and Send Response Message ===========
  5195. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5196. {
  5197. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_SessionSetupRes][Error]Tx encoded msg error");
  5198. errn = -1;
  5199. }
  5200. return errn;
  5201. }
  5202. /*===========================================================================
  5203. FUNCTION: Proc_iso2_SessionSetupRes
  5204. DESCRIPTION:
  5205. PRE-CONDITION:
  5206. INPUT:
  5207. OUTPUT:
  5208. GLOBAL VARIABLES:
  5209. =============================================================================*/
  5210. int Proc_iso2_SessionSetupRes(int AcceptFd)
  5211. {
  5212. //int i = 0;
  5213. int errn = 0;
  5214. bitstream_t v2g_tx_stream;
  5215. static struct ChargingInfoData *sys;
  5216. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5217. size_t pos = 0;
  5218. v2g_tx_stream.pos = &pos;
  5219. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5220. v2g_tx_stream.data = V2GTP_Tx_buf;
  5221. init_iso2BodyType(&ccs_exi_doc_ISO2.V2G_Message.Body);
  5222. init_iso2SessionSetupResType(&ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes);
  5223. // ====== [BODY (1/2) ResponseCode ======
  5224. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5225. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_OK_NewSessionEstablished;
  5226. //[HEADER] Assign Res SessionID
  5227. ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytesLen = 8;
  5228. memset(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, 0, 8);
  5229. memcpy(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5230. //Check for SequenceError
  5231. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5232. {
  5233. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5234. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5235. errn = -1;
  5236. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5237. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5238. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5239. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5240. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5241. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5242. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5243. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5244. }
  5245. //#if PARAMETER_NORMAL_MODE == ENABLE
  5246. //SHM_Read_iso2_V2GMSG_Header(&ccs_exi_doc_ISO2, ShmCcsData);
  5247. //#endif
  5248. //Detect for CP State should be 9V (State B)
  5249. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5250. {
  5251. #if CP_PROTECTION_MECHANISM == ENABLE
  5252. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5253. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5254. Update_V2G_Flow_Status(Other_Fault);
  5255. errn = -1;
  5256. sprintf((char*)buf_log_evcomm,
  5257. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d)",
  5258. sys->CpState);
  5259. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5260. #else
  5261. sprintf((char*)buf_log_evcomm,
  5262. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d): ignored",
  5263. sys->CpState);
  5264. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5265. #endif
  5266. }
  5267. //Check for shutdown commands from EVSE(DC Main Board)
  5268. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5269. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5270. {
  5271. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5272. sprintf((char*)buf_log_evcomm, "[Proc_iso2_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5273. EVSE_Shutdown,
  5274. EVSE_EmergencyShutdown,
  5275. sys->DC_EVSEStatus);
  5276. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5277. errn = -1;
  5278. }
  5279. //Check for Permission Changing from TRUE to FALSE
  5280. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5281. ShmInternalComm->ChargingPermission == FALSE)
  5282. {
  5283. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO2][SessionSetupRes]Permission OFF");
  5284. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5285. errn = -1;
  5286. }
  5287. // ====== [BODY (2/3) EVSEID ======
  5288. //EVSEID = all zero
  5289. memset(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5290. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5291. // ====== [BODY (3/3) DateTimeNow ======
  5292. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5293. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5294. #if PARAMETER_NORMAL_MODE == ENABLE
  5295. ///////////SHM_Read_iso2_SessionSetupRes(&ccs_exi_doc_ISO2, ShmCcsData);
  5296. #endif
  5297. // ============ Encode and Send Response Message ===========
  5298. if (send_encoded_iso2_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO2) != 0)
  5299. {
  5300. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso2_SessionSetupRes][Error]Tx encoded msg error");
  5301. errn = -1;
  5302. }
  5303. return errn;
  5304. }
  5305. /*===========================================================================
  5306. FUNCTION: Proc_din_SessionSetupReq
  5307. DESCRIPTION:
  5308. PRE-CONDITION:
  5309. INPUT:
  5310. OUTPUT:
  5311. GLOBAL VARIABLES:
  5312. 2. ccs_exi_doc_DIN
  5313. =============================================================================*/
  5314. int Proc_din_SessionSetupReq(int AcceptFd)
  5315. {
  5316. int errn = 0;
  5317. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_din_SessionSetupReq]Got SessionSetupReq\n");
  5318. //Print the decoded XML Document
  5319. PRINT_XML_DOC_DIN_SessionSetupReq(&ccs_exi_doc_DIN);
  5320. //Save into Share Memory
  5321. SHM_Save_din_SessionSetupReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5322. errn = Proc_din_SessionSetupRes(AcceptFd);
  5323. if (errn == 0)
  5324. {
  5325. //successfully send response.
  5326. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]SessionSetupRes");
  5327. }
  5328. else
  5329. {
  5330. sprintf((char*)buf_log_evcomm,
  5331. "[Error]Proc_din_SessionSetupRes(): %d (DEC)",
  5332. errn);
  5333. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5334. }
  5335. return errn;
  5336. }
  5337. /*===========================================================================
  5338. FUNCTION: Proc_iso1_SessionSetupReq
  5339. DESCRIPTION:
  5340. PRE-CONDITION:
  5341. INPUT:
  5342. OUTPUT:
  5343. GLOBAL VARIABLES:
  5344. 2. ccs_exi_doc_ISO1
  5345. =============================================================================*/
  5346. int Proc_iso1_SessionSetupReq(int AcceptFd)
  5347. {
  5348. int errn = 0;
  5349. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso1_SessionSetupReq]Got SessionSetupReq\n");
  5350. //Print the decoded XML Document
  5351. PRINT_XML_DOC_ISO1_SessionSetupReq(&ccs_exi_doc_ISO1);
  5352. //Save into Share Memory
  5353. SHM_Save_iso1_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5354. errn = Proc_iso1_SessionSetupRes(AcceptFd);
  5355. if (errn == 0)
  5356. {
  5357. //successfully send response.
  5358. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]SessionSetupRes");
  5359. }
  5360. else
  5361. {
  5362. sprintf((char*)buf_log_evcomm,
  5363. "[Error]Proc_iso1_SessionSetupRes(): %d (DEC)",
  5364. errn);
  5365. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5366. }
  5367. return errn;
  5368. }
  5369. /*===========================================================================
  5370. FUNCTION: Proc_iso2_SessionSetupReq
  5371. DESCRIPTION:
  5372. PRE-CONDITION:
  5373. INPUT:
  5374. OUTPUT:
  5375. GLOBAL VARIABLES:
  5376. 2. ccs_exi_doc_ISO2
  5377. =============================================================================*/
  5378. int Proc_iso2_SessionSetupReq(int AcceptFd)
  5379. {
  5380. int errn = 0;
  5381. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso2_SessionSetupReq]Got SessionSetupReq\n");
  5382. //Print the decoded XML Document
  5383. PRINT_XML_DOC_ISO2_SessionSetupReq(&ccs_exi_doc_ISO2);
  5384. //Save into Share Memory
  5385. SHM_Save_iso2_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO2, ShmSysConfigAndInfo);
  5386. errn = Proc_iso2_SessionSetupRes(AcceptFd);
  5387. if (errn == 0)
  5388. {
  5389. //successfully send response.
  5390. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO2][V2G][Tx]SessionSetupRes");
  5391. }
  5392. else
  5393. {
  5394. sprintf((char*)buf_log_evcomm,
  5395. "[Error]Proc_iso2_SessionSetupRes(): %d (DEC)",
  5396. errn);
  5397. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5398. }
  5399. return errn;
  5400. }
  5401. /*===========================================================================
  5402. FUNCTION: Proc_din_ServiceDiscoveryRes
  5403. DESCRIPTION:
  5404. PRE-CONDITION:
  5405. INPUT:
  5406. OUTPUT:
  5407. GLOBAL VARIABLES:
  5408. =============================================================================*/
  5409. int Proc_din_ServiceDiscoveryRes(int AcceptFd)
  5410. {
  5411. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5412. //if it is not the same, the packet should be ignored.
  5413. //int i = 0;
  5414. int errn = 0;
  5415. bitstream_t v2g_tx_stream;
  5416. struct ChargingInfoData *sys;
  5417. //struct ServiceDiscoveryRequest_DIN70121 *req;
  5418. struct ServiceDiscoveryResponse_DIN70121 *res;
  5419. size_t pos = 0;
  5420. v2g_tx_stream.pos = &pos;
  5421. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5422. v2g_tx_stream.data = V2GTP_Tx_buf;
  5423. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5424. //req = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryRequest;
  5425. res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5426. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5427. init_dinServiceDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes);
  5428. //[1/4] Response Code
  5429. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5430. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_OK;
  5431. //[HEADER] Check Req SessionID
  5432. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5433. {
  5434. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5435. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5436. errn = -1;
  5437. }
  5438. //Check for SequenceError
  5439. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5440. {
  5441. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5442. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5443. errn = -1;
  5444. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5445. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5446. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5447. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5448. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5449. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5450. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5451. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5452. }
  5453. //Detect for CP State should be 9V (State B)
  5454. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5455. {
  5456. #if CP_PROTECTION_MECHANISM == ENABLE
  5457. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5458. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5459. Update_V2G_Flow_Status(Other_Fault);
  5460. errn = -1;
  5461. sprintf((char*)buf_log_evcomm, "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)", sys->CpState);
  5462. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5463. #else
  5464. sprintf((char*)buf_log_evcomm,
  5465. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5466. sys->CpState);
  5467. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5468. #endif
  5469. }
  5470. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5471. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5472. {
  5473. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5474. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5475. errn = -1;
  5476. }
  5477. //Check for Permission Changing from TRUE to FALSE
  5478. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5479. ShmInternalComm->ChargingPermission == FALSE)
  5480. {
  5481. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ServiceDiscoveryRes]Permission OFF");
  5482. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5483. errn = -1;
  5484. }
  5485. //[2/4] PaymentOptions
  5486. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.arrayLen = 1u;
  5487. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.array[0] = dinpaymentOptionType_ExternalPayment; //1
  5488. //[3/4] Charge Service
  5489. res->ChargeService_DIN70121.Services.ServiceTag.ServiceID = 1;
  5490. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceID = (unsigned short) res->ChargeService_DIN70121.Services.ServiceTag.ServiceID;
  5491. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceCategory = dinserviceCategoryType_EVCharging;
  5492. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5493. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.EnergyTransferType = dinEVSESupportedEnergyTransferType_DC_extended;
  5494. //[4/4] Service List (null, not be uesed for now.)
  5495. //#if PARAMETER_NORMAL_MODE == ENABLE
  5496. ///////////////SHM_Read_din_ServiceDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  5497. //#endif
  5498. // ============ Encode and Send Response Message ===========
  5499. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5500. {
  5501. errn = -1;
  5502. }
  5503. return errn;
  5504. }
  5505. /*===========================================================================
  5506. FUNCTION: Proc_iso1_ServiceDiscoveryRes
  5507. DESCRIPTION:
  5508. PRE-CONDITION:
  5509. INPUT:
  5510. OUTPUT:
  5511. GLOBAL VARIABLES:
  5512. =============================================================================*/
  5513. int Proc_iso1_ServiceDiscoveryRes(int AcceptFd)
  5514. {
  5515. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5516. //if it is not the same, the packet should be ignored.
  5517. //int i = 0;
  5518. int errn = 0;
  5519. bitstream_t v2g_tx_stream;
  5520. struct ChargingInfoData *sys;
  5521. //struct ServiceDiscoveryRequest_ISO15118_2014 *req;
  5522. struct ServiceDiscoveryResponse_ISO15118_2014 *res;
  5523. size_t pos = 0;
  5524. v2g_tx_stream.pos = &pos;
  5525. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5526. v2g_tx_stream.data = V2GTP_Tx_buf;
  5527. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5528. //req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryRequest;
  5529. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  5530. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5531. init_iso1ServiceDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes);
  5532. //[1/4] Response Code
  5533. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5534. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_OK;
  5535. //[HEADER] Check Req SessionID
  5536. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  5537. {
  5538. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  5539. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5540. errn = -1;
  5541. }
  5542. //Check for SequenceError
  5543. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5544. {
  5545. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5546. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5547. errn = -1;
  5548. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5549. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5550. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5551. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5552. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5553. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5554. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5555. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5556. }
  5557. //Detect for CP State should be 9V (State B)
  5558. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5559. {
  5560. #if CP_PROTECTION_MECHANISM == ENABLE
  5561. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5562. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5563. Update_V2G_Flow_Status(Other_Fault);
  5564. errn = -1;
  5565. sprintf((char*)buf_log_evcomm,
  5566. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  5567. sys->CpState);
  5568. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5569. #else
  5570. sprintf((char*)buf_log_evcomm,
  5571. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5572. sys->CpState);
  5573. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5574. #endif
  5575. }
  5576. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5577. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5578. {
  5579. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5580. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  5581. errn = -1;
  5582. }
  5583. //Check for Permission Changing from TRUE to FALSE
  5584. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5585. ShmInternalComm->ChargingPermission == FALSE)
  5586. {
  5587. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][ServiceDiscoveryRes]Permission OFF");
  5588. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5589. errn = -1;
  5590. }
  5591. //[2/4] PaymentOptionList
  5592. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 1u;
  5593. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = iso1paymentOptionType_ExternalPayment; //1
  5594. //[3/4] Charge Service
  5595. res->ChargeService.Services.ServiceID = 1;
  5596. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = (unsigned short) res->ChargeService.Services.ServiceID;
  5597. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1; //new in ISO1, not be used, yet.
  5598. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = xxx;
  5599. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[i] = xxx;
  5600. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = iso1serviceCategoryType_EVCharging;
  5601. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5602. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 1u; //[ISO1] max = 6
  5603. switch (ShmCcsData->EnergyTransferMode)
  5604. {
  5605. case DC_extended:
  5606. {
  5607. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  5608. break;
  5609. }
  5610. case AC_single_phase_core:
  5611. {
  5612. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_single_phase_core;
  5613. break;
  5614. }
  5615. case AC_three_phase_core:
  5616. {
  5617. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_three_phase_core;
  5618. break;
  5619. }
  5620. default:
  5621. {
  5622. sprintf((char*)buf_log_evcomm,
  5623. "[ISO1][ServiceDiscoveryRes][Warning]unexpected EnergyTransferMode(%d)",
  5624. ShmCcsData->EnergyTransferMode);
  5625. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5626. break;
  5627. }
  5628. }
  5629. //[4/4] Service List (null, not be uesed for now.)
  5630. //#if PARAMETER_NORMAL_MODE == ENABLE
  5631. ///////////////SHM_Read_iso1_ServiceDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5632. //#endif
  5633. // ============ Encode and Send Response Message ===========
  5634. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5635. {
  5636. errn = -1;
  5637. }
  5638. return errn;
  5639. }
  5640. /*===========================================================================
  5641. FUNCTION: Proc_din_ServiceDiscoveryReq
  5642. DESCRIPTION:
  5643. PRE-CONDITION:
  5644. INPUT:
  5645. OUTPUT:
  5646. GLOBAL VARIABLES:
  5647. =============================================================================*/
  5648. int Proc_din_ServiceDiscoveryReq(int AcceptFd)
  5649. {
  5650. int errn = 0;
  5651. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  5652. //Print the decoded XML Document
  5653. PRINT_XML_DOC_DIN_ServiceDiscoveryReq(&ccs_exi_doc_DIN);
  5654. //Save into Share Memory
  5655. SHM_Save_din_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5656. errn = Proc_din_ServiceDiscoveryRes(AcceptFd);
  5657. if (errn == 0)
  5658. {
  5659. //send response successfully.
  5660. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ServiceDiscoveryRes");
  5661. }
  5662. else
  5663. {
  5664. sprintf((char*)buf_log_evcomm,
  5665. "[Error][SeccComm][Proc_din_ServiceDiscoveryReq]Proc_din_ServiceDiscoveryRes(): %d (DEC)",
  5666. errn
  5667. );
  5668. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5669. }
  5670. return errn;
  5671. }
  5672. /*===========================================================================
  5673. FUNCTION: Proc_iso1_ServiceDiscoveryReq
  5674. DESCRIPTION:
  5675. PRE-CONDITION:
  5676. INPUT:
  5677. OUTPUT:
  5678. GLOBAL VARIABLES:
  5679. =============================================================================*/
  5680. int Proc_iso1_ServiceDiscoveryReq(int AcceptFd)
  5681. {
  5682. int errn = 0;
  5683. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  5684. //Print the decoded XML Document
  5685. PRINT_XML_DOC_ISO1_ServiceDiscoveryReq(&ccs_exi_doc_ISO1);
  5686. //Save into Share Memory
  5687. SHM_Save_iso1_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5688. errn = Proc_iso1_ServiceDiscoveryRes(AcceptFd);
  5689. if (errn == 0)
  5690. {
  5691. //send response successfully.
  5692. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ServiceDiscoveryRes");
  5693. }
  5694. else
  5695. {
  5696. sprintf((char*)buf_log_evcomm,
  5697. "[Error][SeccComm][Proc_iso1_ServiceDiscoveryReq]Proc_iso1_ServiceDiscoveryRes(): %d (DEC)",
  5698. errn
  5699. );
  5700. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5701. }
  5702. return errn;
  5703. }
  5704. /*===========================================================================
  5705. FUNCTION: Proc_din_ServiceAndPaymentSelectionRes
  5706. DESCRIPTION:
  5707. PRE-CONDITION:
  5708. INPUT:
  5709. OUTPUT:
  5710. GLOBAL VARIABLES:
  5711. =============================================================================*/
  5712. int Proc_din_ServiceAndPaymentSelectionRes(int AcceptFd)
  5713. {
  5714. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5715. //if it is not the same, the packet should be ignored.
  5716. //int i = 0;
  5717. int errn = 0;
  5718. bitstream_t v2g_tx_stream;
  5719. struct ServiceAndPaymentSelectionRequest_DIN70121 *req;
  5720. //struct ServiceAndPaymentSelectionResponse_DIN70121 *res;
  5721. struct ServiceDiscoveryResponse_DIN70121 *sd_res;
  5722. struct ChargingInfoData *sys;
  5723. size_t pos = 0;
  5724. v2g_tx_stream.pos = &pos;
  5725. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5726. v2g_tx_stream.data = V2GTP_Tx_buf;
  5727. req = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionRequest;
  5728. //res = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionResponse;
  5729. sd_res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5730. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5731. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5732. init_dinServicePaymentSelectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes);
  5733. //[1/1] Response Code
  5734. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes_isUsed = 1u;
  5735. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_OK;
  5736. //[HEADER] Check Req SessionID
  5737. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5738. {
  5739. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5740. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5741. errn = -1;
  5742. }
  5743. //Check for SequenceError
  5744. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5745. {
  5746. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5747. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5748. errn = -1;
  5749. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5750. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5751. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5752. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5753. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5754. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5755. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5756. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5757. }
  5758. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  5759. if (req->SelectedPaymentOption != ExternalPayment) //1
  5760. {
  5761. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_PaymentSelectionInvalid;
  5762. sprintf((char*)buf_log_evcomm,
  5763. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  5764. req->SelectedPaymentOption);
  5765. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5766. errn = -1;
  5767. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5768. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  5769. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5770. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5771. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5772. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5773. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  5774. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  5775. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5776. }
  5777. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  5778. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService_DIN70121.Services.ServiceTag.ServiceID)
  5779. {
  5780. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_ServiceSelectionInvalid; //8
  5781. sprintf((char*)buf_log_evcomm,
  5782. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  5783. req->SelectedServiceList.SelectedService[0].ServiceID);
  5784. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5785. errn = -1;
  5786. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5787. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  5788. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5789. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5790. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5791. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5792. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  5793. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  5794. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5795. }
  5796. //Detect for CP State should be 9V (State B)
  5797. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5798. {
  5799. #if CP_PROTECTION_MECHANISM == ENABLE
  5800. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  5801. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5802. Update_V2G_Flow_Status(Other_Fault);
  5803. errn = -1;
  5804. sprintf((char*)buf_log_evcomm,
  5805. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  5806. sys->CpState);
  5807. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5808. #else
  5809. sprintf((char*)buf_log_evcomm,
  5810. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  5811. sys->CpState);
  5812. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5813. #endif
  5814. }
  5815. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5816. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5817. {
  5818. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  5819. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  5820. errn = -1;
  5821. }
  5822. //Check for Permission Changing from TRUE to FALSE
  5823. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5824. ShmInternalComm->ChargingPermission == FALSE)
  5825. {
  5826. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ServicePaymentSelectionRes]Permission OFF");
  5827. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  5828. errn = -1;
  5829. }
  5830. // ============ Encode and Send Response Message ===========
  5831. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5832. {
  5833. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  5834. errn = -1;
  5835. }
  5836. return errn;
  5837. }
  5838. /*===========================================================================
  5839. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionRes
  5840. DESCRIPTION:
  5841. PRE-CONDITION:
  5842. INPUT:
  5843. OUTPUT:
  5844. GLOBAL VARIABLES:
  5845. =============================================================================*/
  5846. int Proc_iso1_ServiceAndPaymentSelectionRes(int AcceptFd)
  5847. {
  5848. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5849. //if it is not the same, the packet should be ignored.
  5850. //int i = 0;
  5851. int errn = 0;
  5852. bitstream_t v2g_tx_stream;
  5853. struct ServiceAndPaymentSelectionRequest_ISO15118_2014 *req;
  5854. //struct ServiceAndPaymentSelectionResponse_ISO15118_2014 *res;
  5855. struct ServiceDiscoveryResponse_ISO15118_2014 *sd_res;
  5856. static struct ChargingInfoData *sys;
  5857. size_t pos = 0;
  5858. v2g_tx_stream.pos = &pos;
  5859. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5860. v2g_tx_stream.data = V2GTP_Tx_buf;
  5861. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionRequest;
  5862. //res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionResponse;
  5863. sd_res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  5864. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5865. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5866. init_iso1PaymentServiceSelectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes);
  5867. //[1/1] Response Code
  5868. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes_isUsed = 1u;
  5869. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_OK;
  5870. //[HEADER] Check Req SessionID
  5871. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  5872. {
  5873. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  5874. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5875. errn = -1;
  5876. }
  5877. //Check for SequenceError
  5878. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5879. {
  5880. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5881. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5882. errn = -1;
  5883. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5884. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5885. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5886. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5887. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5888. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5889. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5890. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5891. }
  5892. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  5893. if (req->SelectedPaymentOption != ExternalPayment) //1
  5894. {
  5895. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  5896. sprintf((char*)buf_log_evcomm,
  5897. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  5898. req->SelectedPaymentOption);
  5899. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5900. errn = -1;
  5901. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5902. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  5903. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5904. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5905. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5906. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5907. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  5908. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  5909. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5910. }
  5911. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  5912. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService.Services.ServiceID)
  5913. {
  5914. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  5915. sprintf((char*)buf_log_evcomm,
  5916. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  5917. req->SelectedServiceList.SelectedService[0].ServiceID);
  5918. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5919. errn = -1;
  5920. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5921. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  5922. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5923. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5924. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5925. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5926. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  5927. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  5928. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5929. }
  5930. //Detect for CP State should be 9V (State B)
  5931. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5932. {
  5933. #if CP_PROTECTION_MECHANISM == ENABLE
  5934. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  5935. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5936. Update_V2G_Flow_Status(Other_Fault);
  5937. errn = -1;
  5938. sprintf((char*)buf_log_evcomm,
  5939. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  5940. sys->CpState);
  5941. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5942. #else
  5943. sprintf((char*)buf_log_evcomm,
  5944. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  5945. sys->CpState);
  5946. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5947. #endif
  5948. }
  5949. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5950. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5951. {
  5952. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  5953. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  5954. errn = -1;
  5955. }
  5956. //Check for Permission Changing from TRUE to FALSE
  5957. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5958. ShmInternalComm->ChargingPermission == FALSE)
  5959. {
  5960. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][PaymentServiceSelectionRes]Permission OFF");
  5961. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  5962. errn = -1;
  5963. }
  5964. // ============ Encode and Send Response Message ===========
  5965. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5966. {
  5967. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  5968. errn = -1;
  5969. }
  5970. return errn;
  5971. }
  5972. /*===========================================================================
  5973. FUNCTION: Proc_din_ServiceAndPaymentSelectionReq
  5974. DESCRIPTION:
  5975. PRE-CONDITION:
  5976. INPUT:
  5977. OUTPUT:
  5978. GLOBAL VARIABLES:
  5979. =============================================================================*/
  5980. int Proc_din_ServiceAndPaymentSelectionReq(int AcceptFd)
  5981. {
  5982. int errn = 0;
  5983. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_din_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  5984. //Print the decoded XML Document
  5985. PRINT_XML_DOC_DIN_ServiceAndPaymentSelectionReq(&ccs_exi_doc_DIN);
  5986. //Save into Share Memory
  5987. SHM_Save_din_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5988. errn = Proc_din_ServiceAndPaymentSelectionRes(AcceptFd);
  5989. if (errn == 0)
  5990. {
  5991. //send response successfully.
  5992. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ServiceAndPaymentSelectionRes");
  5993. }
  5994. else
  5995. {
  5996. sprintf((char*)buf_log_evcomm,
  5997. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  5998. errn);
  5999. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6000. }
  6001. return errn;
  6002. }
  6003. /*===========================================================================
  6004. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionReq
  6005. DESCRIPTION:
  6006. PRE-CONDITION:
  6007. INPUT:
  6008. OUTPUT:
  6009. GLOBAL VARIABLES:
  6010. =============================================================================*/
  6011. int Proc_iso1_ServiceAndPaymentSelectionReq(int AcceptFd)
  6012. {
  6013. int errn = 0;
  6014. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6015. //Print the decoded XML Document
  6016. PRINT_XML_DOC_ISO1_ServiceAndPaymentSelectionReq(&ccs_exi_doc_ISO1);
  6017. //Save into Share Memory
  6018. SHM_Save_iso1_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6019. errn = Proc_iso1_ServiceAndPaymentSelectionRes(AcceptFd);
  6020. if (errn == 0)
  6021. {
  6022. //send response successfully.
  6023. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ServiceAndPaymentSelectionRes");
  6024. }
  6025. else
  6026. {
  6027. sprintf((char*)buf_log_evcomm,
  6028. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6029. errn);
  6030. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6031. }
  6032. return errn;
  6033. }
  6034. /*===========================================================================
  6035. FUNCTION: Proc_din_ContractAuthenticationRes
  6036. DESCRIPTION:
  6037. PRE-CONDITION:
  6038. INPUT:
  6039. OUTPUT:
  6040. GLOBAL VARIABLES:
  6041. =============================================================================*/
  6042. int Proc_din_ContractAuthenticationRes(int AcceptFd)
  6043. {
  6044. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6045. //if it is not the same, the packet should be ignored.
  6046. //int i = 0;
  6047. int errn = 0;
  6048. bitstream_t v2g_tx_stream;
  6049. static struct ChargingInfoData *sys;
  6050. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6051. size_t pos = 0;
  6052. v2g_tx_stream.pos = &pos;
  6053. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6054. v2g_tx_stream.data = V2GTP_Tx_buf;
  6055. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6056. init_dinContractAuthenticationResType(&ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes);
  6057. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes_isUsed = 1u;
  6058. //[BODY (1/2)] ResponseCode
  6059. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_OK;
  6060. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6061. //[HEADER] Check Req SessionID
  6062. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6063. {
  6064. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6065. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6066. errn = -1;
  6067. }
  6068. //Check for SequenceError
  6069. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6070. {
  6071. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6072. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6073. errn = -1;
  6074. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6075. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6076. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6077. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6078. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6079. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6080. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6081. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6082. }
  6083. //Detect for CP State should be 9V (State B)
  6084. #if CP_PROTECTION_MECHANISM == ENABLE
  6085. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6086. {
  6087. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6088. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6089. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6090. Update_V2G_Flow_Status(Other_Fault);
  6091. errn = -1;
  6092. sprintf((char*)buf_log_evcomm,
  6093. "[Proc_din_ContractAuthenticationRes]Emergency Stop by CP Error (%d)",
  6094. sys->CpState);
  6095. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6096. }
  6097. #endif
  6098. //Check for CSU command of "Stop by EVSE"
  6099. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6100. {
  6101. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6102. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6103. errn = -1;
  6104. }
  6105. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6106. {
  6107. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6108. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6109. errn = -1;
  6110. }
  6111. //[BODY (2/2)] EVSEProcessing
  6112. if(ShmInternalComm->ChargingPermission == TRUE)
  6113. {
  6114. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6115. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CSU Permission: OK");
  6116. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6117. {
  6118. //Set PWM as 5% (for SLAC first case)
  6119. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Set PWM as 5%%");
  6120. SwitchCpStateE(DISABLE);
  6121. OutputCpPwmDuty(5);
  6122. }
  6123. #endif
  6124. }
  6125. //Check for Permission Changing from TRUE to FALSE
  6126. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  6127. ShmInternalComm->ChargingPermission == FALSE)
  6128. {
  6129. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ContractAuthenticationRes]Permission OFF");
  6130. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6131. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6132. errn = -1;
  6133. }
  6134. #if PARAMETER_NORMAL_MODE == ENABLE
  6135. ////////////SHM_Read_din_ContractAuthenticationRes(&ccs_exi_doc_DIN, ShmCcsData);
  6136. #endif
  6137. // ============ Encode and Send Response Message ===========
  6138. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6139. {
  6140. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6141. errn = -1;
  6142. }
  6143. return errn;
  6144. }
  6145. /*===========================================================================
  6146. FUNCTION: Proc_iso1_AuthorizationRes
  6147. DESCRIPTION:
  6148. PRE-CONDITION:
  6149. INPUT:
  6150. OUTPUT:
  6151. GLOBAL VARIABLES:
  6152. =============================================================================*/
  6153. int Proc_iso1_AuthorizationRes(int AcceptFd)
  6154. {
  6155. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6156. //if it is not the same, the packet should be ignored.
  6157. //int i = 0;
  6158. int errn = 0;
  6159. bitstream_t v2g_tx_stream;
  6160. static struct ChargingInfoData *sys;
  6161. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6162. size_t pos = 0;
  6163. v2g_tx_stream.pos = &pos;
  6164. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6165. v2g_tx_stream.data = V2GTP_Tx_buf;
  6166. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6167. init_iso1AuthorizationResType(&ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes);
  6168. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes_isUsed = 1u;
  6169. //[BODY (1/2)] ResponseCode
  6170. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_OK;
  6171. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Ongoing; //0
  6172. //[HEADER] Check Req SessionID
  6173. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6174. {
  6175. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6176. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6177. errn = -1;
  6178. }
  6179. //Check for SequenceError
  6180. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6181. {
  6182. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6183. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6184. errn = -1;
  6185. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6186. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6187. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6188. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6189. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6190. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6191. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6192. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6193. }
  6194. //Detect for CP State should be 9V (State B)
  6195. #if CP_PROTECTION_MECHANISM == ENABLE
  6196. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6197. {
  6198. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED;
  6199. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6200. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6201. Update_V2G_Flow_Status(Other_Fault);
  6202. errn = -1;
  6203. sprintf((char*)buf_log_evcomm,
  6204. "[Proc_iso1_AuthorizationRes]Emergency Stop by CP Error (%d)",
  6205. sys->CpState);
  6206. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6207. }
  6208. #endif
  6209. //Check for CSU command of "Stop by EVSE"
  6210. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6211. {
  6212. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6213. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6214. errn = -1;
  6215. }
  6216. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6217. {
  6218. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6219. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6220. errn = -1;
  6221. }
  6222. //[BODY (2/2)] EVSEProcessing
  6223. //Check for Permission from CSU
  6224. if(ShmInternalComm->ChargingPermission == TRUE)
  6225. {
  6226. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  6227. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CSU Permission: OK");
  6228. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6229. {
  6230. //Set PWM as 5% (for SLAC first case)
  6231. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Set PWM as 5%%");
  6232. SwitchCpStateE(DISABLE);
  6233. OutputCpPwmDuty(5);
  6234. }
  6235. #endif
  6236. }
  6237. //Check for Permission Changing from TRUE to FALSE
  6238. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  6239. ShmInternalComm->ChargingPermission == FALSE)
  6240. {
  6241. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][AuthorizationRes]Permission OFF");
  6242. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6243. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6244. errn = -1;
  6245. }
  6246. #if PARAMETER_NORMAL_MODE == ENABLE
  6247. ////////////SHM_Read_iso1_AuthorizationRes(&ccs_exi_doc_ISO1, ShmCcsData);
  6248. #endif
  6249. // ============ Encode and Send Response Message ===========
  6250. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6251. {
  6252. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6253. errn = -1;
  6254. }
  6255. return errn;
  6256. }
  6257. /*===========================================================================
  6258. FUNCTION: Proc_din_ContractAuthenticationReq
  6259. DESCRIPTION:
  6260. PRE-CONDITION:
  6261. INPUT:
  6262. OUTPUT:
  6263. GLOBAL VARIABLES:
  6264. =============================================================================*/
  6265. int Proc_din_ContractAuthenticationReq(int AcceptFd)
  6266. {
  6267. int errn = 0;
  6268. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ContractAuthenticationReq]Got Proc_din_ContractAuthenticationReq\n");
  6269. //Print the decoded XML Document
  6270. PRINT_XML_DOC_DIN_ContractAuthenticationReq(&ccs_exi_doc_DIN);
  6271. //Save into Share Memory
  6272. SHM_Save_din_ContractAuthenticationReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6273. errn = Proc_din_ContractAuthenticationRes(AcceptFd);
  6274. if (errn == 0)
  6275. {
  6276. //send response successfully.
  6277. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ContractAuthenticationRes");
  6278. }
  6279. else
  6280. {
  6281. sprintf((char*)buf_log_evcomm,
  6282. "[Error][SeccComm][Proc_din_ContractAuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  6283. errn);
  6284. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6285. }
  6286. return errn;
  6287. }
  6288. /*===========================================================================
  6289. FUNCTION: Proc_iso1_AuthenticationReq
  6290. DESCRIPTION:
  6291. PRE-CONDITION:
  6292. INPUT:
  6293. OUTPUT:
  6294. GLOBAL VARIABLES:
  6295. =============================================================================*/
  6296. int Proc_iso1_AuthenticationReq(int AcceptFd)
  6297. {
  6298. int errn = 0;
  6299. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_AuthenticationReq]Got AuthorizationReq\n");
  6300. //Print the decoded XML Document
  6301. PRINT_XML_DOC_ISO1_AuthorizationReq(&ccs_exi_doc_ISO1);
  6302. //Save into Share Memory
  6303. SHM_Save_iso1_AuthorizationReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6304. errn = Proc_iso1_AuthorizationRes(AcceptFd);
  6305. if (errn == 0)
  6306. {
  6307. //send response successfully.
  6308. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]AuthorizationRes");
  6309. }
  6310. else
  6311. {
  6312. sprintf((char*)buf_log_evcomm,
  6313. "[Error][SeccComm][Proc_iso1_AuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  6314. errn);
  6315. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6316. }
  6317. return errn;
  6318. }
  6319. /*===========================================================================
  6320. FUNCTION: SHM_Init_dinDC_EVSEStatusType
  6321. DESCRIPTION:
  6322. PRE-CONDITION:
  6323. INPUT:
  6324. 1. in
  6325. OUTPUT:
  6326. 2. out
  6327. GLOBAL VARIABLES:
  6328. =============================================================================*/
  6329. void SHM_Init_dinDC_EVSEStatusType(struct DC_EVSEStatusType_DIN70121 *in)
  6330. {
  6331. in->EVSEIsolationStatus = dinisolationLevelType_Valid;
  6332. // dinisolationLevelType_Invalid = 0,
  6333. // dinisolationLevelType_Valid = 1, (default)
  6334. // dinisolationLevelType_Warning = 2,
  6335. // dinisolationLevelType_Fault = 3
  6336. in->EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  6337. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6338. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1, (default)
  6339. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6340. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6341. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6342. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6343. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6344. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  6345. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  6346. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  6347. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  6348. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  6349. in->EVSENotification = dinEVSENotificationType_None;
  6350. // dinEVSENotificationType_None = 0, (default)
  6351. // dinEVSENotificationType_StopCharging = 1,
  6352. // dinEVSENotificationType_ReNegotiation = 2
  6353. }
  6354. /*===========================================================================
  6355. FUNCTION: SHM_Save_dinPhysicalValueType
  6356. DESCRIPTION:
  6357. PRE-CONDITION:
  6358. INPUT:
  6359. OUTPUT:
  6360. GLOBAL VARIABLES:
  6361. =============================================================================*/
  6362. void SHM_Save_dinPhysicalValueType(struct PhysicalValueType_DIN70121 *obj, short value, int multiplier, unsigned char unit)
  6363. {
  6364. obj->Value = value;
  6365. obj->Multiplier = multiplier;
  6366. obj->Unit =unit;
  6367. }
  6368. /*===========================================================================
  6369. FUNCTION: SHM_Init_din_ChargeParameterDiscoveryRes
  6370. DESCRIPTION:
  6371. PRE-CONDITION:
  6372. INPUT:
  6373. 1. shm_ccs
  6374. OUTPUT:
  6375. 2. shm_ccs
  6376. GLOBAL VARIABLES:
  6377. =============================================================================*/
  6378. void SHM_Init_din_ChargeParameterDiscoveryRes(struct CcsData *shm_ccs)
  6379. {
  6380. struct ChargeParameterDiscoveryResponse_DIN70121 *in;
  6381. in = &shm_ccs->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  6382. //----- [BODY (1/5)] ResponseCode -----
  6383. in->ResponseCode = dinresponseCodeType_OK;
  6384. //----- [BODY (2/5)] EVSEProcessing -----
  6385. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6386. // dinEVSEProcessingType_Finished = 0,
  6387. // dinEVSEProcessingType_Ongoing = 1
  6388. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6389. //be fixed in another function.
  6390. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6391. //ignore, since DIN doesn't support AC
  6392. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6393. struct DC_EVSEChargeParameterType_DIN70121 *in_para;
  6394. in_para = &in->DC_EVSEChargeParameter;
  6395. //DC_EVSEStatus
  6396. SHM_Init_dinDC_EVSEStatusType(&in_para->DC_EVSEStatus);
  6397. in_para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  6398. short value = 0; int multiplier = 0; unsigned char unit = 0;
  6399. //EVSEMaximumCurrentLimit
  6400. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  6401. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumCurrentLimit, value, multiplier, unit);
  6402. //EVSEMaximumPowerLimit
  6403. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  6404. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumPowerLimit, value, multiplier, unit);
  6405. //EVSEMaximumVoltageLimit
  6406. value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  6407. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumVoltageLimit, value, multiplier, unit);
  6408. //EVSEMinimumVoltageLimit
  6409. value = 1500; multiplier = -1; unit = V_DIN70121; //150V
  6410. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumVoltageLimit, value, multiplier, unit);
  6411. //EVSEMinimumCurrentLimit
  6412. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  6413. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumCurrentLimit, value, multiplier, unit);
  6414. //EVSECurrentRegulationTolerance
  6415. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  6416. SHM_Save_dinPhysicalValueType(&in_para->EVSECurrentRegulationTolerance, value, multiplier, unit);
  6417. //EVSEPeakCurrentRipple
  6418. value = 2; multiplier = -1; unit = A_DIN70121; //0.2A
  6419. SHM_Save_dinPhysicalValueType(&in_para->EVSEPeakCurrentRipple, value, multiplier, unit);
  6420. //EVSEEnergyToBeDelivered (optional)
  6421. //SHM_Save_dinPhysicalValueType(&out_para->EVSEEnergyToBeDelivered, &in_para->EVSEEnergyToBeDelivered);
  6422. }
  6423. /*===========================================================================
  6424. FUNCTION: Sudo_Parameter_din_ChargeParameterDiscoveryRes
  6425. DESCRIPTION:
  6426. PRE-CONDITION:
  6427. INPUT:
  6428. OUTPUT:
  6429. GLOBAL VARIABLES:
  6430. =============================================================================*/
  6431. void Sudo_Parameter_din_ChargeParameterDiscoveryRes()
  6432. {
  6433. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6434. init_dinChargeParameterDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes);
  6435. ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  6436. //----- [BODY (1/5)] ResponseCode -----
  6437. struct dinChargeParameterDiscoveryResType *res;
  6438. res = &ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes;
  6439. res->ResponseCode = dinresponseCodeType_OK;
  6440. //----- [BODY (2/5)] EVSEProcessing -----
  6441. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6442. // dinEVSEProcessingType_Finished = 0,
  6443. // dinEVSEProcessingType_Ongoing = 1
  6444. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6445. res->SAScheduleList_isUsed = 1u;
  6446. struct dinSAScheduleListType *list;
  6447. list = &res->SAScheduleList;
  6448. //
  6449. list->SAScheduleTuple.arrayLen = 1;
  6450. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  6451. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleID = 0;
  6452. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  6453. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  6454. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  6455. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  6456. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  6457. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  6458. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  6459. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  6460. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  6461. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6462. //ignore, since DIN doesn't support AC
  6463. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6464. res->DC_EVSEChargeParameter_isUsed = 1u;
  6465. struct dinDC_EVSEChargeParameterType *para;
  6466. para = &res->DC_EVSEChargeParameter;
  6467. //DC_EVSEStatus
  6468. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  6469. para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  6470. // dinisolationLevelType_Invalid = 0,
  6471. // dinisolationLevelType_Valid = 1,
  6472. // dinisolationLevelType_Warning = 2,
  6473. // dinisolationLevelType_Fault = 3
  6474. para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  6475. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6476. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  6477. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6478. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6479. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6480. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6481. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6482. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  6483. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  6484. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  6485. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  6486. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  6487. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  6488. para->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  6489. // dinEVSENotificationType_None = 0,
  6490. // dinEVSENotificationType_StopCharging = 1,
  6491. // dinEVSENotificationType_ReNegotiation = 2
  6492. //EVSEMaximumCurrentLimit
  6493. para->EVSEMaximumCurrentLimit.Value = 2400;
  6494. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  6495. para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  6496. para->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  6497. // dinunitSymbolType_h = 0,
  6498. // dinunitSymbolType_m = 1,
  6499. // dinunitSymbolType_s = 2,
  6500. // dinunitSymbolType_A = 3,
  6501. // dinunitSymbolType_Ah = 4,
  6502. // dinunitSymbolType_V = 5,
  6503. // dinunitSymbolType_VA = 6,
  6504. // dinunitSymbolType_W = 7,
  6505. // dinunitSymbolType_W_s = 8,
  6506. // dinunitSymbolType_Wh = 9
  6507. //EVSEMaximumPowerLimit
  6508. para->EVSEMaximumPowerLimit.Value = 6000;
  6509. para->EVSEMaximumPowerLimit.Multiplier = 1;
  6510. para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  6511. para->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  6512. //EVSEMaximumVoltageLimit
  6513. para->EVSEMaximumVoltageLimit.Value = 7500;
  6514. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  6515. para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  6516. para->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  6517. //EVSEMinimumVoltageLimit
  6518. para->EVSEMinimumVoltageLimit.Value = 1500;
  6519. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  6520. para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  6521. para->EVSEMinimumVoltageLimit.Unit = dinunitSymbolType_V;
  6522. //EVSEMinimumCurrentLimit
  6523. para->EVSEMinimumCurrentLimit.Value = 20;
  6524. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  6525. para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  6526. para->EVSEMinimumCurrentLimit.Unit = dinunitSymbolType_A;
  6527. //EVSECurrentRegulationTolerance_isUsed
  6528. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  6529. //EVSECurrentRegulationTolerance
  6530. para->EVSECurrentRegulationTolerance.Value = 10;
  6531. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  6532. para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  6533. para->EVSECurrentRegulationTolerance.Unit = dinunitSymbolType_A;
  6534. //EVSEEnergyToBeDelivered_isUsed
  6535. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  6536. //EVSEPeakCurrentRipple
  6537. para->EVSEPeakCurrentRipple.Value = 2;
  6538. para->EVSEPeakCurrentRipple.Multiplier = -1;
  6539. para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  6540. para->EVSEPeakCurrentRipple.Unit = dinunitSymbolType_A;
  6541. //EVSEEnergyToBeDelivered (optional)
  6542. /*
  6543. para->EVSEEnergyToBeDelivered.Value = 360;
  6544. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  6545. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  6546. para->EVSEEnergyToBeDelivered.Unit = dinunitSymbolType_Wh;
  6547. */
  6548. }
  6549. /*===========================================================================
  6550. FUNCTION: Sudo_Parameter_iso1_ChargeParameterDiscoveryRes
  6551. DESCRIPTION:
  6552. PRE-CONDITION:
  6553. INPUT:
  6554. OUTPUT:
  6555. GLOBAL VARIABLES:
  6556. =============================================================================*/
  6557. void Sudo_Parameter_iso1_ChargeParameterDiscoveryRes()
  6558. {
  6559. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6560. init_iso1ChargeParameterDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes);
  6561. ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  6562. //----- [BODY (1/5)] ResponseCode -----
  6563. struct iso1ChargeParameterDiscoveryResType *res;
  6564. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes;
  6565. res->ResponseCode = iso1responseCodeType_OK;
  6566. //----- [BODY (2/5)] EVSEProcessing -----
  6567. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  6568. // iso1EVSEProcessingType_Finished = 0,
  6569. // iso1EVSEProcessingType_Ongoing = 1
  6570. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6571. res->SAScheduleList_isUsed = 1u;
  6572. struct iso1SAScheduleListType *list;
  6573. list = &res->SAScheduleList;
  6574. //
  6575. list->SAScheduleTuple.arrayLen = 1;
  6576. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  6577. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  6578. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  6579. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  6580. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  6581. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  6582. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  6583. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  6584. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  6585. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  6586. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6587. //ignore, since our ISO1 doesn't support AC, yet
  6588. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6589. res->DC_EVSEChargeParameter_isUsed = 1u;
  6590. struct iso1DC_EVSEChargeParameterType *para;
  6591. para = &res->DC_EVSEChargeParameter;
  6592. //DC_EVSEStatus
  6593. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  6594. para->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  6595. // iso1isolationLevelType_Invalid = 0,
  6596. // iso1isolationLevelType_Valid = 1,
  6597. // iso1isolationLevelType_Warning = 2,
  6598. // iso1isolationLevelType_Fault = 3
  6599. para->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  6600. // iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6601. // iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  6602. // iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6603. // iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6604. // iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6605. // iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6606. // iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6607. // iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  6608. // iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  6609. // iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  6610. // iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  6611. // iso1DC_EVSEStatusCodeType_Reserved_C = 11
  6612. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  6613. para->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  6614. // iso1EVSENotificationType_None = 0,
  6615. // iso1EVSENotificationType_StopCharging = 1,
  6616. // iso1EVSENotificationType_ReNegotiation = 2
  6617. //EVSEMaximumCurrentLimit
  6618. para->EVSEMaximumCurrentLimit.Value = 2400;
  6619. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  6620. //para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  6621. para->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  6622. //iso1unitSymbolType_h = 0,
  6623. //iso1unitSymbolType_m = 1,
  6624. //iso1unitSymbolType_s = 2,
  6625. //iso1unitSymbolType_A = 3,
  6626. //iso1unitSymbolType_V = 4,
  6627. //iso1unitSymbolType_W = 5,
  6628. //iso1unitSymbolType_Wh = 6
  6629. //EVSEMaximumPowerLimit
  6630. para->EVSEMaximumPowerLimit.Value = 6000;
  6631. para->EVSEMaximumPowerLimit.Multiplier = 1;
  6632. //para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  6633. para->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  6634. //EVSEMaximumVoltageLimit
  6635. para->EVSEMaximumVoltageLimit.Value = 7500;
  6636. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  6637. //para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  6638. para->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  6639. //EVSEMinimumVoltageLimit
  6640. para->EVSEMinimumVoltageLimit.Value = 1500;
  6641. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  6642. //para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  6643. para->EVSEMinimumVoltageLimit.Unit = iso1unitSymbolType_V;
  6644. //EVSEMinimumCurrentLimit
  6645. para->EVSEMinimumCurrentLimit.Value = 20;
  6646. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  6647. //para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  6648. para->EVSEMinimumCurrentLimit.Unit = iso1unitSymbolType_A;
  6649. //EVSECurrentRegulationTolerance_isUsed
  6650. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  6651. //EVSECurrentRegulationTolerance
  6652. para->EVSECurrentRegulationTolerance.Value = 10;
  6653. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  6654. //para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  6655. para->EVSECurrentRegulationTolerance.Unit = iso1unitSymbolType_A;
  6656. //EVSEEnergyToBeDelivered_isUsed
  6657. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  6658. //EVSEPeakCurrentRipple
  6659. para->EVSEPeakCurrentRipple.Value = 2;
  6660. para->EVSEPeakCurrentRipple.Multiplier = -1;
  6661. //para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  6662. para->EVSEPeakCurrentRipple.Unit = iso1unitSymbolType_A;
  6663. //EVSEEnergyToBeDelivered (optional)
  6664. /*
  6665. para->EVSEEnergyToBeDelivered.Value = 360;
  6666. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  6667. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  6668. para->EVSEEnergyToBeDelivered.Unit = iso1unitSymbolType_Wh;
  6669. */
  6670. }
  6671. /*===========================================================================
  6672. FUNCTION: Proc_din_ChargeParameterDiscoveryRes
  6673. DESCRIPTION:
  6674. PRE-CONDITION:
  6675. INPUT:
  6676. OUTPUT:
  6677. GLOBAL VARIABLES:
  6678. =============================================================================*/
  6679. int Proc_din_ChargeParameterDiscoveryRes(int AcceptFd)
  6680. {
  6681. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6682. //if it is not the same, the packet should be ignored.
  6683. //STEP 1: ============ Initialize ============
  6684. int errn = 0;
  6685. bitstream_t v2g_tx_stream;
  6686. struct ChargeParameterDiscoveryResponse_DIN70121 *res;
  6687. struct ChargeParameterDiscoveryRequest_DIN70121 *req;
  6688. struct DC_EVSEChargeParameterType_DIN70121 *dc_para;
  6689. struct ChargingInfoData *sys;
  6690. size_t pos = 0;
  6691. v2g_tx_stream.pos = &pos;
  6692. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6693. v2g_tx_stream.data = V2GTP_Tx_buf;
  6694. res = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  6695. req = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest;
  6696. dc_para = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  6697. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6698. res->ResponseCode = OK_DIN70121;
  6699. res->EVSEProcessing = Ongoing_DIN70121;
  6700. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready; //1
  6701. //[HEADER] Check Req SessionID
  6702. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6703. {
  6704. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6705. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6706. errn = -1;
  6707. }
  6708. //Check for SequenceError
  6709. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6710. {
  6711. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6712. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6713. errn = -1;
  6714. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6715. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  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] = 5;
  6721. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6722. }
  6723. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  6724. if (sys->EvBatteryMaxCurrent < 0)
  6725. {
  6726. sprintf((char*)buf_log_evcomm,
  6727. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  6728. sys->EvBatteryMaxCurrent);
  6729. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6730. res->ResponseCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  6731. res->EVSEProcessing = Finished_DIN70121;
  6732. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6733. errn = -1;
  6734. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6735. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  6736. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6737. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6738. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6739. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6740. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  6741. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  6742. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6743. }
  6744. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  6745. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  6746. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  6747. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  6748. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumVoltageLimit, 1500, V_DIN70121); //150V
  6749. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumCurrentLimit, 10, A_DIN70121); //1A
  6750. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSECurrentRegulationTolerance, 10, A_DIN70121); //1A
  6751. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEPeakCurrentRipple, 2, A_DIN70121); //0.2A
  6752. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEEnergyToBeDelivered, 0, WH_DIN70121); //optional
  6753. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  6754. if (sys->EvBatteryMaxVoltage <= 500)
  6755. {
  6756. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  6757. }
  6758. #endif
  6759. //for test with Tesla Model 3, 10A
  6760. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_DIN70121); //10A, for testing with Tesla Model 3
  6761. //Check for EnergyTransferMode [TC_SECC_VTB_ChargeParameterDiscovery_004]
  6762. if (req->EVRequestedEnergyTransferType != DC_extended)
  6763. {
  6764. sprintf((char*)buf_log_evcomm,
  6765. "[ERROR]Wrong EVRequestedEnergyTransferType(%d,%d)",
  6766. req->EVRequestedEnergyTransferType,
  6767. dinEVSESupportedEnergyTransferType_DC_extended);
  6768. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6769. res->ResponseCode = FAILED_WrongEnergyTransferType_DIN70121;
  6770. res->EVSEProcessing = Finished_DIN70121;
  6771. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6772. errn = -1;
  6773. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6774. Update_V2G_Flow_Status(Other_Fault);
  6775. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6776. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  6777. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6778. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6779. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6780. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6781. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  6782. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6783. }
  6784. //Check for CSU command of "Stop by EVSE"
  6785. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6786. {
  6787. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  6788. res->ResponseCode = FAILED_DIN70121;
  6789. res->EVSEProcessing = Finished_DIN70121;
  6790. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6791. errn = -1;
  6792. }
  6793. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6794. {
  6795. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  6796. res->ResponseCode = FAILED_DIN70121;
  6797. res->EVSEProcessing = Finished_DIN70121;
  6798. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  6799. errn = -1;
  6800. }
  6801. //Detect for CP State should be 9V (State B)
  6802. #if CP_PROTECTION_MECHANISM == ENABLE
  6803. if (sys->CpState != 3) //State B1, B2
  6804. {
  6805. res->ResponseCode = FAILED_DIN70121;
  6806. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  6807. res->EVSEProcessing = Finished_DIN70121;
  6808. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6809. Update_V2G_Flow_Status(Other_Fault);
  6810. errn = -1;
  6811. sprintf((char*)buf_log_evcomm,
  6812. "[Proc_din_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  6813. sys->CpState,
  6814. sys->CpVoltage);
  6815. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6816. }
  6817. #endif
  6818. //Check for Permission from CSU
  6819. if (ShmInternalComm->ChargingPermission == TRUE)
  6820. {
  6821. res->EVSEProcessing = Finished_DIN70121;
  6822. }
  6823. //Check for Permission Off
  6824. if (ShmInternalComm->ChargingPermission == FALSE)
  6825. {
  6826. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ChargeParameterDiscoveryRes]Permission OFF");
  6827. res->ResponseCode = FAILED_DIN70121;
  6828. res->EVSEProcessing = Finished_DIN70121;
  6829. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6830. errn = -1;
  6831. }
  6832. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  6833. #if PARAMETER_NORMAL_MODE == ENABLE
  6834. SHM_Read_din_ChargeParameterDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  6835. #else
  6836. Sudo_Parameter_din_ChargeParameterDiscoveryRes();
  6837. #endif
  6838. //STEP 4: ============ Encode and Send Response Message ===========
  6839. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6840. {
  6841. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6842. errn = -1;
  6843. }
  6844. //STPE 5: ============ Update Flags ============
  6845. return errn;
  6846. }
  6847. /*===========================================================================
  6848. FUNCTION: Proc_iso1_ChargeParameterDiscoveryRes
  6849. DESCRIPTION:
  6850. PRE-CONDITION:
  6851. INPUT:
  6852. OUTPUT:
  6853. GLOBAL VARIABLES:
  6854. =============================================================================*/
  6855. int Proc_iso1_ChargeParameterDiscoveryRes(int AcceptFd)
  6856. {
  6857. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6858. //if it is not the same, the packet should be ignored.
  6859. //STEP 1: ============ Initialize ============
  6860. int errn = 0;
  6861. bitstream_t v2g_tx_stream;
  6862. struct ChargeParameterDiscoveryResponse_ISO15118_2014 *res;
  6863. struct ChargeParameterDiscoveryRequest_ISO15118_2014 *req;
  6864. struct DC_EVSEChargeParameterType_ISO15118_2014 *dc_para;
  6865. struct AC_EVSEChargeParameterType_ISO15118_2014 *ac_para;
  6866. struct ChargingInfoData *sys;
  6867. size_t pos = 0;
  6868. v2g_tx_stream.pos = &pos;
  6869. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6870. v2g_tx_stream.data = V2GTP_Tx_buf;
  6871. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse;
  6872. req = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest;
  6873. dc_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  6874. ac_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.AC_EVSEChargeParameter;
  6875. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6876. res->ResponseCode = OK_ISO15118_2014;
  6877. res->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  6878. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; //1
  6879. ac_para->AC_EVSEStatus.RCD = ShmInternalComm->AC_RcdStatus; //0:no error, 1:error
  6880. ac_para->AC_EVSEStatus.NotificationMaxDelay = 0; //unit: 1s
  6881. ac_para->AC_EVSEStatus.EVSENotification = ShmInternalComm->AC_EVSENotification; //0:none, 1:StopCharging, 2:RenNgotiation
  6882. //[HEADER] Check Req SessionID
  6883. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6884. {
  6885. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6886. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6887. errn = -1;
  6888. }
  6889. //Check for SequenceError
  6890. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6891. {
  6892. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6893. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6894. errn = -1;
  6895. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6896. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6897. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6898. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6899. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6900. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6901. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6902. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6903. }
  6904. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  6905. if (sys->EvBatteryMaxCurrent < 0)
  6906. {
  6907. sprintf((char*)buf_log_evcomm,
  6908. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  6909. sys->EvBatteryMaxCurrent);
  6910. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6911. res->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  6912. res->EVSEProcessing = Finished_ISO15118_2014;
  6913. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  6914. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  6915. errn = -1;
  6916. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6917. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  6918. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6919. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6920. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6921. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6922. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  6923. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  6924. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6925. }
  6926. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  6927. //DC
  6928. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  6929. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  6930. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  6931. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumVoltageLimit, 1500, V_ISO15118_2014); //150V
  6932. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumCurrentLimit, 10, A_ISO15118_2014); //1A
  6933. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSECurrentRegulationTolerance, 10, A_ISO15118_2014); //1A
  6934. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEPeakCurrentRipple, 2, A_ISO15118_2014); //0.2A
  6935. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEEnergyToBeDelivered, 0, Wh_ISO15118_2014); //optional
  6936. //AC
  6937. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSENominalVoltage, (int) (sys->AC_EVSENominalVoltage * 10), V_ISO15118_2014);
  6938. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  6939. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  6940. if (sys->EvBatteryMaxVoltage <= 500)
  6941. {
  6942. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  6943. }
  6944. #endif
  6945. //for test with Tesla Model 3, 10A
  6946. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_ISO15118_2014); //10A, for testing with Tesla Model 3
  6947. //Check for EnergyTransferMode
  6948. if (req->RequestedEnergyTransferMode != ShmCcsData->EnergyTransferMode) //[CAUTION] Their table should be kept as the same.
  6949. {
  6950. sprintf((char*)buf_log_evcomm,
  6951. "[ERROR]Unmatched RequestedEnergyTransferMode(%d,%d)",
  6952. req->RequestedEnergyTransferMode,
  6953. ShmCcsData->EnergyTransferMode);
  6954. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6955. res->ResponseCode = FAILED_WrongEnergyTransferMode_ISO15118_2014;
  6956. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  6957. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  6958. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  6959. errn = -1;
  6960. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6961. Update_V2G_Flow_Status(Other_Fault);
  6962. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6963. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  6964. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6965. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6966. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6967. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6968. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  6969. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6970. }
  6971. //Check for CSU command of "Stop by EVSE"
  6972. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6973. {
  6974. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  6975. res->ResponseCode = FAILED_ISO15118_2014;
  6976. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  6977. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  6978. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  6979. errn = -1;
  6980. }
  6981. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6982. {
  6983. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  6984. res->ResponseCode = FAILED_ISO15118_2014;
  6985. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  6986. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  6987. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  6988. errn = -1;
  6989. }
  6990. //Detect for CP State should be 9V (State B)
  6991. #if CP_PROTECTION_MECHANISM == ENABLE
  6992. if (sys->CpState != 3) //State B1, B2
  6993. {
  6994. res->ResponseCode = FAILED_ISO15118_2014;
  6995. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  6996. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  6997. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  6998. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6999. Update_V2G_Flow_Status(Other_Fault);
  7000. errn = -1;
  7001. sprintf((char*)buf_log_evcomm,
  7002. "[Proc_iso1_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7003. sys->CpState,
  7004. sys->CpVoltage);
  7005. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7006. }
  7007. #endif
  7008. //Check for Permission from CSU
  7009. if(ShmInternalComm->ChargingPermission == TRUE)
  7010. {
  7011. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7012. }
  7013. //Check for Permission Off
  7014. if (ShmInternalComm->ChargingPermission == FALSE)
  7015. {
  7016. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][ChargeParameterDiscoveryRes]Permission OFF");
  7017. res->ResponseCode = FAILED_ISO15118_2014;
  7018. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7019. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7020. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7021. errn = -1;
  7022. }
  7023. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7024. #if PARAMETER_NORMAL_MODE == ENABLE
  7025. SHM_Read_iso1_ChargeParameterDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7026. #else
  7027. Sudo_Parameter_iso1_ChargeParameterDiscoveryRes();
  7028. #endif
  7029. //STEP 4: ============ Encode and Send Response Message ===========
  7030. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7031. {
  7032. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7033. errn = -1;
  7034. }
  7035. //STPE 5: ============ Update Flags ============
  7036. return errn;
  7037. }
  7038. /*===========================================================================
  7039. FUNCTION: Proc_din_ChargeParameterDiscoveryReq
  7040. DESCRIPTION:
  7041. PRE-CONDITION:
  7042. INPUT:
  7043. OUTPUT:
  7044. GLOBAL VARIABLES:
  7045. =============================================================================*/
  7046. int Proc_din_ChargeParameterDiscoveryReq(int AcceptFd)
  7047. {
  7048. int errn = 0;
  7049. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7050. //ftime(&SeqStartTime);
  7051. //Print the decoded XML Document
  7052. PRINT_XML_DOC_DIN_ChargeParameterDiscoveryReq(&ccs_exi_doc_DIN);
  7053. //Save into Share Memory
  7054. SHM_Save_din_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7055. //Check for EV Error Code
  7056. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7057. errn = Proc_din_ChargeParameterDiscoveryRes(AcceptFd);
  7058. //ftime(&SeqEndTime);
  7059. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7060. if ( errn == 0)
  7061. {
  7062. //send response successfully.
  7063. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ChargeParameterDiscoveryRes");
  7064. }
  7065. else
  7066. {
  7067. sprintf((char*)buf_log_evcomm,
  7068. "[Error][DIN][ChargeParameterDiscoveryRes]%d (DEC)",
  7069. errn);
  7070. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7071. }
  7072. return errn;
  7073. }
  7074. /*===========================================================================
  7075. FUNCTION: Proc_iso1_ChargeParameterDiscoveryReq
  7076. DESCRIPTION:
  7077. PRE-CONDITION:
  7078. INPUT:
  7079. OUTPUT:
  7080. GLOBAL VARIABLES:
  7081. =============================================================================*/
  7082. int Proc_iso1_ChargeParameterDiscoveryReq(int AcceptFd)
  7083. {
  7084. int errn = 0;
  7085. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7086. //ftime(&SeqStartTime);
  7087. //Print the decoded XML Document
  7088. PRINT_XML_DOC_ISO1_ChargeParameterDiscoveryReq(&ccs_exi_doc_ISO1);
  7089. //Save into Share Memory
  7090. SHM_Save_iso1_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7091. //Check for EV Error Code
  7092. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7093. errn = Proc_iso1_ChargeParameterDiscoveryRes(AcceptFd);
  7094. //ftime(&SeqEndTime);
  7095. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7096. if (errn == 0)
  7097. {
  7098. //send response successfully.
  7099. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ChargeParameterDiscoveryRes");
  7100. }
  7101. else
  7102. {
  7103. sprintf((char*)buf_log_evcomm,
  7104. "[Error][ISO1][ChargeParameterDiscoveryRes]%d (DEC)",
  7105. errn);
  7106. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7107. }
  7108. return errn;
  7109. }
  7110. /*===========================================================================
  7111. FUNCTION: SHM_Init_din_CableCheckRes
  7112. DESCRIPTION:
  7113. PRE-CONDITION:
  7114. INPUT:
  7115. 1. shm_ccs
  7116. OUTPUT:
  7117. 1. shm_ccs
  7118. GLOBAL VARIABLES:
  7119. =============================================================================*/
  7120. void SHM_Init_din_CableCheckRes(struct CcsData *shm_ccs)
  7121. {
  7122. struct CableCheckResponse_DIN70121 *in;
  7123. in = &shm_ccs->V2GMessage_DIN70121.CableCheckResponse;
  7124. //----- [BODY (1/3)] ResponseCode -----
  7125. in->ResponseCode = dinresponseCodeType_OK;
  7126. //----- [BODY (2/3)] EVSEProcessing -----
  7127. //in->EVSEProcessing = dinEVSEProcessingType_Finished; //for test
  7128. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //default
  7129. // dinEVSEProcessingType_Finished = 0,
  7130. // dinEVSEProcessingType_Ongoing = 1
  7131. //----- [BODY (3/3)] DC_EVSEStatus -----
  7132. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7133. in->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0 (default)
  7134. // dinisolationLevelType_Invalid = 0,
  7135. // dinisolationLevelType_Valid = 1, (default)
  7136. // dinisolationLevelType_Warning = 2,
  7137. // dinisolationLevelType_Fault = 3
  7138. }
  7139. /*===========================================================================
  7140. FUNCTION: Sudo_Parameter_din_CableCheckRes
  7141. DESCRIPTION:
  7142. PRE-CONDITION:
  7143. INPUT:
  7144. OUTPUT:
  7145. GLOBAL VARIABLES:
  7146. =============================================================================*/
  7147. void Sudo_Parameter_din_CableCheckRes()
  7148. {
  7149. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7150. init_dinCableCheckResType(&ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes);
  7151. ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  7152. //----- [BODY (1/3)] ResponseCode -----
  7153. struct dinCableCheckResType *res;
  7154. res = &ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes;
  7155. res->ResponseCode = dinresponseCodeType_OK;
  7156. //----- [BODY (2/3)] EVSEProcessing -----
  7157. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  7158. // dinEVSEProcessingType_Finished = 0,
  7159. // dinEVSEProcessingType_Ongoing = 1
  7160. //----- [BODY (3/3)] DC_EVSEStatus -----
  7161. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7162. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7163. // dinisolationLevelType_Invalid = 0,
  7164. // dinisolationLevelType_Valid = 1,
  7165. // dinisolationLevelType_Warning = 2,
  7166. // dinisolationLevelType_Fault = 3
  7167. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7168. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7169. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7170. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7171. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7172. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7173. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7174. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7175. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7176. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7177. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7178. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7179. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7180. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7181. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  7182. // dinEVSENotificationType_None = 0,
  7183. // dinEVSENotificationType_StopCharging = 1,
  7184. // dinEVSENotificationType_ReNegotiation = 2
  7185. }
  7186. /*===========================================================================
  7187. FUNCTION: Sudo_Parameter_iso1_CableCheckRes
  7188. DESCRIPTION:
  7189. PRE-CONDITION:
  7190. INPUT:
  7191. OUTPUT:
  7192. GLOBAL VARIABLES:
  7193. =============================================================================*/
  7194. void Sudo_Parameter_iso1_CableCheckRes()
  7195. {
  7196. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  7197. init_iso1CableCheckResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes);
  7198. ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  7199. //----- [BODY (1/3)] ResponseCode -----
  7200. struct iso1CableCheckResType *res;
  7201. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes;
  7202. res->ResponseCode = iso1responseCodeType_OK;
  7203. //----- [BODY (2/3)] EVSEProcessing -----
  7204. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7205. //iso1EVSEProcessingType_Finished = 0,
  7206. //iso1EVSEProcessingType_Ongoing = 1,
  7207. //iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction = 2
  7208. //----- [BODY (3/3)] DC_EVSEStatus -----
  7209. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7210. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  7211. //iso1isolationLevelType_Invalid = 0,
  7212. //iso1isolationLevelType_Valid = 1,
  7213. //iso1isolationLevelType_Warning = 2,
  7214. //iso1isolationLevelType_Fault = 3,
  7215. //iso1isolationLevelType_No_IMD = 4
  7216. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7217. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7218. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  7219. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7220. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7221. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7222. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7223. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7224. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  7225. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  7226. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  7227. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  7228. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  7229. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7230. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  7231. //iso1EVSENotificationType_None = 0,
  7232. //iso1EVSENotificationType_StopCharging = 1,
  7233. //iso1EVSENotificationType_ReNegotiation = 2
  7234. }
  7235. /*===========================================================================
  7236. FUNCTION: Proc_din_CableCheckRes
  7237. DESCRIPTION:
  7238. PRE-CONDITION:
  7239. INPUT:
  7240. OUTPUT:
  7241. GLOBAL VARIABLES:
  7242. =============================================================================*/
  7243. int Proc_din_CableCheckRes(int AcceptFd)
  7244. {
  7245. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7246. //if it is not the same, the packet should be ignored.
  7247. //STEP 1: ============ Initialize ============
  7248. //int i = 0;
  7249. int errn = 0;
  7250. bitstream_t v2g_tx_stream;
  7251. static struct CableCheckResponse_DIN70121 *cab;
  7252. static struct ChargingInfoData *sys;
  7253. size_t pos = 0;
  7254. v2g_tx_stream.pos = &pos;
  7255. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7256. v2g_tx_stream.data = V2GTP_Tx_buf;
  7257. cab = &ShmCcsData->V2GMessage_DIN70121.CableCheckResponse;
  7258. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7259. cab->ResponseCode = OK_DIN70121;
  7260. cab->cnt++;
  7261. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  7262. sys->CpState,
  7263. sys->CpVoltage,
  7264. sys->PresentChargingVoltage,
  7265. sys->IsolationStatus,
  7266. cab->EVSEProcessing);
  7267. //[HEADER] Check Req SessionID
  7268. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  7269. {
  7270. cab->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  7271. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7272. errn = -1;
  7273. }
  7274. //Check for SequenceError
  7275. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7276. {
  7277. cab->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  7278. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7279. errn = -1;
  7280. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7281. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7282. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7283. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7284. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7285. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7286. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7287. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7288. }
  7289. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  7290. if (sys->IsolationStatus == GFD_Invalid) //0: on going
  7291. {
  7292. //For PSU
  7293. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  7294. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  7295. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7296. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive; //4
  7297. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  7298. }
  7299. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2: warning
  7300. {
  7301. //For PSU
  7302. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7303. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7304. if (sys->PresentChargingVoltage < 60) // < 60V
  7305. {
  7306. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  7307. sprintf((char*)buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  7308. sys->PresentChargingVoltage,
  7309. sys->IsolationStatus);
  7310. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7311. //IsolationStatus
  7312. if (sys->IsolationStatus == GFD_Valid)
  7313. {
  7314. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7315. }
  7316. else if (sys->IsolationStatus == GFD_Warning)
  7317. {
  7318. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning;
  7319. }
  7320. else
  7321. {
  7322. sprintf((char*)buf_log_evcomm,
  7323. "[WARNING]unexpected IsolationStatus(%d)",
  7324. sys->IsolationStatus);
  7325. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7326. }
  7327. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7328. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7329. }
  7330. else
  7331. {
  7332. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7333. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7334. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  7335. }
  7336. }
  7337. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  7338. {
  7339. //For PSU
  7340. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7341. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7342. cab->ResponseCode = FAILED_DIN70121;
  7343. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7344. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  7345. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7346. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]IsolationStatus = 3 (fault)");
  7347. errn = -1;
  7348. }
  7349. else
  7350. {
  7351. //For PSU
  7352. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7353. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7354. cab->ResponseCode = FAILED_DIN70121;
  7355. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7356. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  7357. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7358. sprintf((char*)buf_log_evcomm,
  7359. "[Proc_din_CableCheckRes]Undefined Isolation Status(%d)",
  7360. sys->IsolationStatus);
  7361. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7362. }
  7363. //Check for CSU command of "Stop by EVSE"
  7364. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7365. {
  7366. cab->ResponseCode = FAILED_DIN70121;
  7367. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7368. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7369. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7370. errn = -1;
  7371. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]EVSE_Shutdown");
  7372. }
  7373. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7374. {
  7375. cab->ResponseCode = FAILED_DIN70121;
  7376. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7377. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7378. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7379. errn = -1;
  7380. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]EVSE_EmergencyShutdown");
  7381. }
  7382. else if (ShmInternalComm->ChargingPermission == FALSE)
  7383. {
  7384. cab->ResponseCode = FAILED_DIN70121;
  7385. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7386. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7387. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7388. errn = -1;
  7389. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_CableCheckRes]ChargingPermission = FALSE");
  7390. }
  7391. else
  7392. {
  7393. //null
  7394. }
  7395. //Response to CP Error
  7396. #if CP_PROTECTION_MECHANISM == ENABLE
  7397. //#if 1
  7398. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  7399. {
  7400. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  7401. {
  7402. cab->ResponseCode = FAILED_DIN70121;
  7403. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7404. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7405. Update_V2G_Flow_Status(Other_Fault);
  7406. errn = -1;
  7407. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7408. //CCS_SECC_CP_State_Error (023889)
  7409. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7410. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7411. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7412. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  7413. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  7414. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  7415. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  7416. sprintf((char*)buf_log_evcomm,
  7417. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  7418. sys->CpState,
  7419. sys->CpVoltage,
  7420. cab->cnt
  7421. );
  7422. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7423. //cab->cnt = 0;
  7424. }
  7425. }
  7426. #endif
  7427. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7428. #if PARAMETER_NORMAL_MODE == ENABLE
  7429. SHM_Read_din_CableCheckRes(&ccs_exi_doc_DIN, ShmCcsData);
  7430. #else
  7431. Sudo_Parameter_din_CableCheckRes();
  7432. #endif
  7433. //STEP 4: ============ Encode and Send Response Message ===========
  7434. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  7435. {
  7436. errn = -1;
  7437. }
  7438. //STEP 5: ============ Update Flags ===========
  7439. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  7440. return errn;
  7441. }
  7442. /*===========================================================================
  7443. FUNCTION: Proc_iso1_CableCheckRes
  7444. DESCRIPTION:
  7445. PRE-CONDITION:
  7446. INPUT:
  7447. OUTPUT:
  7448. GLOBAL VARIABLES:
  7449. =============================================================================*/
  7450. int Proc_iso1_CableCheckRes(int AcceptFd)
  7451. {
  7452. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7453. //if it is not the same, the packet should be ignored.
  7454. //STEP 1: ============ Initialize ============
  7455. //int i = 0;
  7456. int errn = 0;
  7457. bitstream_t v2g_tx_stream;
  7458. static struct CableCheckResponse_ISO15118_2014 *cab;
  7459. static struct ChargingInfoData *sys;
  7460. size_t pos = 0;
  7461. v2g_tx_stream.pos = &pos;
  7462. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7463. v2g_tx_stream.data = V2GTP_Tx_buf;
  7464. cab = &ShmCcsData->V2GMessage_ISO15118_2014.CableCheckResponse;
  7465. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7466. cab->ResponseCode = OK_ISO15118_2014;
  7467. cab->cnt++;
  7468. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  7469. sys->CpState,
  7470. sys->CpVoltage,
  7471. sys->PresentChargingVoltage,
  7472. sys->IsolationStatus,
  7473. cab->EVSEProcessing);
  7474. //[HEADER] Check Req SessionID
  7475. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7476. {
  7477. cab->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7478. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7479. errn = -1;
  7480. }
  7481. //Check for SequenceError
  7482. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7483. {
  7484. cab->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7485. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7486. errn = -1;
  7487. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7488. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7489. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7490. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7491. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7492. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7493. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7494. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7495. }
  7496. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  7497. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  7498. {
  7499. //For PSU
  7500. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  7501. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  7502. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7503. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7504. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7505. }
  7506. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2:waring
  7507. {
  7508. //For PSU
  7509. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7510. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7511. if (sys->PresentChargingVoltage < 60) // < 60V
  7512. {
  7513. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  7514. sprintf((char*)buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  7515. sys->PresentChargingVoltage,
  7516. sys->IsolationStatus);
  7517. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7518. //IsolationStatus
  7519. if (sys->IsolationStatus == GFD_Valid)
  7520. {
  7521. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  7522. }
  7523. else if (sys->IsolationStatus == GFD_Warning)
  7524. {
  7525. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning;
  7526. }
  7527. else
  7528. {
  7529. sprintf((char*)buf_log_evcomm,
  7530. "[WARNING]unexpected IsolationStatus(%d)",
  7531. sys->IsolationStatus);
  7532. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7533. }
  7534. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7535. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7536. }
  7537. else
  7538. {
  7539. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7540. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7541. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7542. }
  7543. }
  7544. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  7545. {
  7546. //For PSU
  7547. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7548. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7549. cab->ResponseCode = FAILED_ISO15118_2014;
  7550. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7551. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  7552. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7553. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]IsolationStatus = 3 (fault)");
  7554. errn = -1;
  7555. }
  7556. //else if (sys->IsolationStatus == GFD_No_IMD){} //only for ISO15118
  7557. else
  7558. {
  7559. //For PSU
  7560. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7561. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7562. cab->ResponseCode = FAILED_ISO15118_2014;
  7563. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7564. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  7565. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7566. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]Undefined Isolation Status.");
  7567. }
  7568. //Check for CSU command of "Stop by EVSE"
  7569. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7570. {
  7571. cab->ResponseCode = FAILED_ISO15118_2014;
  7572. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7573. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7574. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7575. errn = -1;
  7576. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]EVSE_Shutdown");
  7577. }
  7578. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7579. {
  7580. cab->ResponseCode = FAILED_ISO15118_2014;
  7581. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7582. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7583. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7584. errn = -1;
  7585. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]EVSE_EmergencyShutdown");
  7586. }
  7587. else if (ShmInternalComm->ChargingPermission == FALSE)
  7588. {
  7589. cab->ResponseCode = FAILED_ISO15118_2014;
  7590. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7591. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7592. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7593. errn = -1;
  7594. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_CableCheckRes]ChargingPermission = FALSE");
  7595. }
  7596. else
  7597. {
  7598. //null
  7599. }
  7600. //Response to CP Error
  7601. #if CP_PROTECTION_MECHANISM == ENABLE
  7602. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  7603. {
  7604. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  7605. {
  7606. cab->ResponseCode = FAILED_ISO15118_2014;
  7607. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7608. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7609. Update_V2G_Flow_Status(Other_Fault);
  7610. errn = -1;
  7611. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7612. //CCS_SECC_CP_State_Error (023889)
  7613. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7614. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7615. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7616. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  7617. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  7618. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  7619. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  7620. sprintf((char*)buf_log_evcomm,
  7621. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  7622. sys->CpState,
  7623. sys->CpVoltage,
  7624. cab->cnt
  7625. );
  7626. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7627. //cab->cnt = 0;
  7628. }
  7629. }
  7630. #endif
  7631. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7632. #if PARAMETER_NORMAL_MODE == ENABLE
  7633. SHM_Read_iso1_CableCheckRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7634. #else
  7635. Sudo_Parameter_iso1_CableCheckRes();
  7636. #endif
  7637. //STEP 4: ============ Encode and Send Response Message ===========
  7638. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7639. {
  7640. errn = -1;
  7641. }
  7642. //STEP 5: ============ Update Flags ===========
  7643. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  7644. return errn;
  7645. }
  7646. /*===========================================================================
  7647. FUNCTION: Proc_din_CableCheckReq
  7648. DESCRIPTION:
  7649. PRE-CONDITION:
  7650. INPUT:
  7651. OUTPUT:
  7652. GLOBAL VARIABLES:
  7653. =============================================================================*/
  7654. int Proc_din_CableCheckReq(int AcceptFd)
  7655. {
  7656. int errn = 0;
  7657. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckReq] Got CableCheckReq\n");
  7658. //Print the decoded XML Document
  7659. PRINT_XML_DOC_DIN_CableCheckReq(&ccs_exi_doc_DIN);
  7660. //Save into Share Memory
  7661. SHM_Save_din_CableCheckReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7662. //Check for EV Error Code
  7663. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CableCheckRequest.DC_EVStatus.EVErrorCode);
  7664. errn = Proc_din_CableCheckRes(AcceptFd);
  7665. if (errn == 0)
  7666. {
  7667. //send response successfully.
  7668. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]CableCheckRes");
  7669. }
  7670. else
  7671. {
  7672. sprintf((char*)buf_log_evcomm,
  7673. "[Error][SeccComm][Proc_din_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  7674. errn);
  7675. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7676. }
  7677. return errn;
  7678. }
  7679. /*===========================================================================
  7680. FUNCTION: Proc_iso1_CableCheckReq
  7681. DESCRIPTION:
  7682. PRE-CONDITION:
  7683. INPUT:
  7684. OUTPUT:
  7685. GLOBAL VARIABLES:
  7686. =============================================================================*/
  7687. int Proc_iso1_CableCheckReq(int AcceptFd)
  7688. {
  7689. int errn = 0;
  7690. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckReq] Got CableCheckReq");
  7691. //Print the decoded XML Document
  7692. PRINT_XML_DOC_ISO1_CableCheckReq(&ccs_exi_doc_ISO1);
  7693. //Save into Share Memory
  7694. SHM_Save_iso1_CableCheckReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7695. //Check for EV Error Code
  7696. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CableCheckRequest.DC_EVStatus.EVErrorCode);
  7697. errn = Proc_iso1_CableCheckRes(AcceptFd);
  7698. if (errn == 0)
  7699. {
  7700. //send response successfully.
  7701. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]CableCheckRes");
  7702. }
  7703. else
  7704. {
  7705. sprintf((char*)buf_log_evcomm,
  7706. "[Error][SeccComm][Proc_iso1_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  7707. errn);
  7708. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7709. }
  7710. return errn;
  7711. }
  7712. /*===========================================================================
  7713. FUNCTION: SHM_Init_din_PreChargeRes
  7714. DESCRIPTION:
  7715. PRE-CONDITION:
  7716. INPUT:
  7717. 1. shm_ccs
  7718. OUTPUT:
  7719. 1. shm_ccs
  7720. GLOBAL VARIABLES:
  7721. =============================================================================*/
  7722. void SHM_Init_din_PreChargeRes(struct CcsData *shm_ccs)
  7723. {
  7724. struct PreChargeResponse_DIN70121 *in;
  7725. in = &shm_ccs->V2GMessage_DIN70121.PreChargeResponse;
  7726. //----- [BODY (1/3)] ResponseCode -----
  7727. in->ResponseCode = dinresponseCodeType_OK;
  7728. //----- [BODY (2/3)] EVSEPresentVoltage -----
  7729. short value = 0; int multiplier = 0; unsigned char unit = 0;
  7730. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for Test
  7731. value = 0; multiplier = 0; unit = V_DIN70121; //waiting for CsuComm to update V to fit EV Target
  7732. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  7733. //----- [BODY (3/3)] DC_EVSEStatus -----
  7734. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7735. }
  7736. /*===========================================================================
  7737. FUNCTION: Sudo_Parameter_din_PreChargeRes
  7738. DESCRIPTION:
  7739. PRE-CONDITION:
  7740. INPUT:
  7741. OUTPUT:
  7742. GLOBAL VARIABLES:
  7743. =============================================================================*/
  7744. void Sudo_Parameter_din_PreChargeRes()
  7745. {
  7746. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7747. init_dinPreChargeResType(&ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes);
  7748. ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  7749. //----- [BODY (1/3)] ResponseCode -----
  7750. struct dinPreChargeResType *res;
  7751. res = &ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes;
  7752. res->ResponseCode = dinresponseCodeType_OK;
  7753. //----- [BODY (2/3)] EVSEPresentVoltage -----
  7754. res->EVSEPresentVoltage.Value = 3820;
  7755. res->EVSEPresentVoltage.Multiplier = -1;
  7756. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  7757. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  7758. // dinunitSymbolType_h = 0,
  7759. // dinunitSymbolType_m = 1,
  7760. // dinunitSymbolType_s = 2,
  7761. // dinunitSymbolType_A = 3,
  7762. // dinunitSymbolType_Ah = 4,
  7763. // dinunitSymbolType_V = 5,
  7764. // dinunitSymbolType_VA = 6,
  7765. // dinunitSymbolType_W = 7,
  7766. // dinunitSymbolType_W_s = 8,
  7767. // dinunitSymbolType_Wh = 9
  7768. //----- [BODY (3/3)] DC_EVSEStatus -----
  7769. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7770. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7771. // dinisolationLevelType_Invalid = 0,
  7772. // dinisolationLevelType_Valid = 1,
  7773. // dinisolationLevelType_Warning = 2,
  7774. // dinisolationLevelType_Fault = 3
  7775. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7776. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7777. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7778. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7779. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7780. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7781. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7782. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7783. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7784. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7785. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7786. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7787. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7788. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7789. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  7790. // dinEVSENotificationType_None = 0,
  7791. // dinEVSENotificationType_StopCharging = 1,
  7792. // dinEVSENotificationType_ReNegotiation = 2
  7793. }
  7794. /*===========================================================================
  7795. FUNCTION: Sudo_Parameter_iso1_PreChargeRes
  7796. DESCRIPTION:
  7797. PRE-CONDITION:
  7798. INPUT:
  7799. OUTPUT:
  7800. GLOBAL VARIABLES:
  7801. =============================================================================*/
  7802. void Sudo_Parameter_iso1_PreChargeRes()
  7803. {
  7804. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  7805. init_iso1PreChargeResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes);
  7806. ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  7807. //----- [BODY (1/3)] ResponseCode -----
  7808. struct iso1PreChargeResType *res;
  7809. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes;
  7810. res->ResponseCode = iso1responseCodeType_OK;
  7811. //----- [BODY (2/3)] EVSEPresentVoltage -----
  7812. res->EVSEPresentVoltage.Value = 3820;
  7813. res->EVSEPresentVoltage.Multiplier = -1;
  7814. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  7815. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  7816. //iso1unitSymbolType_h = 0,
  7817. //iso1unitSymbolType_m = 1,
  7818. //iso1unitSymbolType_s = 2,
  7819. //iso1unitSymbolType_A = 3,
  7820. //iso1unitSymbolType_V = 4,
  7821. //iso1unitSymbolType_W = 5,
  7822. //iso1unitSymbolType_Wh = 6
  7823. //----- [BODY (3/3)] DC_EVSEStatus -----
  7824. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7825. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  7826. //iso1isolationLevelType_Invalid = 0,
  7827. //iso1isolationLevelType_Valid = 1,
  7828. //iso1isolationLevelType_Warning = 2,
  7829. //iso1isolationLevelType_Fault = 3,
  7830. //iso1isolationLevelType_No_IMD = 4
  7831. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7832. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7833. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  7834. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7835. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7836. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7837. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7838. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7839. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  7840. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  7841. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  7842. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  7843. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  7844. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7845. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  7846. //iso1EVSENotificationType_None = 0,
  7847. //iso1EVSENotificationType_StopCharging = 1,
  7848. //iso1EVSENotificationType_ReNegotiation = 2
  7849. }
  7850. /*===========================================================================
  7851. FUNCTION: Proc_din_PreChargeRes
  7852. DESCRIPTION:
  7853. PRE-CONDITION:
  7854. INPUT:
  7855. OUTPUT:
  7856. GLOBAL VARIABLES:
  7857. =============================================================================*/
  7858. int Proc_din_PreChargeRes(int AcceptFd)
  7859. {
  7860. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7861. //if it is not the same, the packet should be ignored.
  7862. //STEP 1: ============ Initialize ============
  7863. //int i = 0;
  7864. int errn = 0;
  7865. bitstream_t v2g_tx_stream;
  7866. static struct PreChargeResponse_DIN70121 *pre;
  7867. static struct ChargingInfoData *sys;
  7868. size_t pos = 0;
  7869. v2g_tx_stream.pos = &pos;
  7870. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7871. v2g_tx_stream.data = V2GTP_Tx_buf;
  7872. pre = &ShmCcsData->V2GMessage_DIN70121.PreChargeResponse;
  7873. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7874. pre->ResponseCode = OK_DIN70121;
  7875. //EVSE Status Code
  7876. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7877. //[HEADER] Check Req SessionID
  7878. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  7879. {
  7880. pre->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  7881. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7882. errn = -1;
  7883. }
  7884. //Check for SequenceError
  7885. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7886. {
  7887. pre->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  7888. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7889. errn = -1;
  7890. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7891. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7892. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7893. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7894. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7895. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7896. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7897. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7898. }
  7899. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  7900. SAVE_PhysicalValueType_DIN70121(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  7901. //Isolation Status
  7902. if (sys->IsolationStatus == GFD_Invalid) //0: invalid
  7903. {
  7904. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  7905. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7906. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7907. Update_V2G_Flow_Status(Other_Fault);
  7908. errn = -1;
  7909. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  7910. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7911. }
  7912. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  7913. {
  7914. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  7915. }
  7916. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  7917. {
  7918. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  7919. }
  7920. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  7921. {
  7922. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]GFD_Fault => Emergency Shutdown");
  7923. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  7924. pre->ResponseCode = FAILED_DIN70121;
  7925. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7926. errn = -1;
  7927. }
  7928. else //GFD_No_IMD or other unexpected status
  7929. {
  7930. pre->ResponseCode = FAILED_DIN70121;
  7931. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  7932. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7933. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7934. Update_V2G_Flow_Status(Other_Fault);
  7935. errn = -1;
  7936. sprintf((char*)buf_log_evcomm,
  7937. "[Error][Proc_din_PreChargeRes]IsolationStatus = %d (undefined)",
  7938. sys->IsolationStatus);
  7939. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7940. }
  7941. //Check for CSU command of "Stop by EVSE"
  7942. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7943. {
  7944. //Check for Alarm Code: CCS GFD trip (012235)
  7945. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  7946. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  7947. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  7948. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  7949. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  7950. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  7951. {
  7952. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  7953. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7954. }
  7955. else
  7956. {
  7957. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]EVSE_Shutdown");
  7958. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  7959. }
  7960. pre->ResponseCode = FAILED_DIN70121;
  7961. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7962. errn = -1;
  7963. }
  7964. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7965. {
  7966. //Check for Alarm Code: CCS GFD trip (012235)
  7967. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  7968. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  7969. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  7970. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  7971. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  7972. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  7973. {
  7974. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  7975. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7976. }
  7977. else
  7978. {
  7979. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]EVSE_EmergencyShutdown");
  7980. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  7981. }
  7982. pre->ResponseCode = FAILED_DIN70121;
  7983. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7984. errn = -1;
  7985. }
  7986. else if (ShmInternalComm->ChargingPermission == FALSE)
  7987. {
  7988. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]ChargingPermission = FALSE");
  7989. pre->ResponseCode = FAILED_DIN70121;
  7990. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  7991. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7992. errn = -1;
  7993. }
  7994. else
  7995. {
  7996. //null
  7997. }
  7998. //Response to CP Error
  7999. #if CP_PROTECTION_MECHANISM == ENABLE
  8000. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8001. {
  8002. pre->ResponseCode = FAILED_DIN70121;
  8003. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8004. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8005. Update_V2G_Flow_Status(Other_Fault);
  8006. errn = -1;
  8007. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8008. //CCS_SECC_CP_State_Error (023889)
  8009. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8010. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8011. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8012. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8013. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8014. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8015. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8016. sprintf((char*)buf_log_evcomm,
  8017. "[Error][Proc_din_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8018. sys->CpState,
  8019. sys->CpVoltage
  8020. );
  8021. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8022. }
  8023. #endif
  8024. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8025. #if PARAMETER_NORMAL_MODE == ENABLE
  8026. SHM_Read_din_PreChargeRes(&ccs_exi_doc_DIN, ShmCcsData);
  8027. #else
  8028. Sudo_Parameter_din_PreChargeRes();
  8029. #endif
  8030. //STEP 4: ============ Encode and Send Response Message ===========
  8031. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8032. {
  8033. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][send_encoded_din_V2GTP_Stream]:Tx encoded msg error");
  8034. errn = -1;
  8035. }
  8036. //STEP 5: ============ Update Flags ===========
  8037. return errn;
  8038. }
  8039. /*===========================================================================
  8040. FUNCTION: Proc_iso1_PreChargeRes
  8041. DESCRIPTION:
  8042. PRE-CONDITION:
  8043. INPUT:
  8044. OUTPUT:
  8045. GLOBAL VARIABLES:
  8046. =============================================================================*/
  8047. int Proc_iso1_PreChargeRes(int AcceptFd)
  8048. {
  8049. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8050. //if it is not the same, the packet should be ignored.
  8051. //STEP 1: ============ Initialize ============
  8052. //int i = 0;
  8053. int errn = 0;
  8054. bitstream_t v2g_tx_stream;
  8055. static struct PreChargeResponse_ISO15118_2014 *pre;
  8056. static struct ChargingInfoData *sys;
  8057. size_t pos = 0;
  8058. v2g_tx_stream.pos = &pos;
  8059. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8060. v2g_tx_stream.data = V2GTP_Tx_buf;
  8061. pre = &ShmCcsData->V2GMessage_ISO15118_2014.PreChargeResponse;
  8062. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8063. pre->ResponseCode = OK_ISO15118_2014;
  8064. //EVSE Status Code
  8065. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8066. //[HEADER] Check Req SessionID
  8067. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8068. {
  8069. pre->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8070. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8071. errn = -1;
  8072. }
  8073. //Check for SequenceError
  8074. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8075. {
  8076. pre->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8077. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8078. errn = -1;
  8079. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8080. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8081. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8082. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8083. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8084. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8085. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8086. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8087. }
  8088. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8089. SAVE_PhysicalValueType_ISO15118_2014(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  8090. //Isolation Status
  8091. if (sys->IsolationStatus == GFD_Invalid) //0: invalid(on going)
  8092. {
  8093. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  8094. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8095. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8096. Update_V2G_Flow_Status(Other_Fault);
  8097. errn = -1;
  8098. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8099. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8100. }
  8101. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8102. {
  8103. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8104. }
  8105. else if (sys->IsolationStatus == GFD_Warning) //2: waring
  8106. {
  8107. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //1
  8108. }
  8109. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8110. {
  8111. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8112. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8113. pre->ResponseCode = FAILED_ISO15118_2014;
  8114. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8115. errn = -1;
  8116. }
  8117. else
  8118. {
  8119. pre->ResponseCode = FAILED_ISO15118_2014;
  8120. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8121. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8122. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8123. Update_V2G_Flow_Status(Other_Fault);
  8124. errn = -1;
  8125. sprintf((char*)buf_log_evcomm,
  8126. "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d (undefined)",
  8127. sys->IsolationStatus);
  8128. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8129. }
  8130. //Check for CSU command of "Stop by EVSE"
  8131. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8132. {
  8133. //Check for Alarm Code: CCS GFD trip (012235)
  8134. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8135. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8136. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8137. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8138. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8139. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8140. {
  8141. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  8142. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8143. }
  8144. else
  8145. {
  8146. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]EVSE_Shutdown");
  8147. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8148. }
  8149. pre->ResponseCode = FAILED_ISO15118_2014;
  8150. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8151. errn = -1;
  8152. }
  8153. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8154. {
  8155. //Check for Alarm Code: CCS GFD trip (012235)
  8156. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8157. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8158. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8159. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8160. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8161. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8162. {
  8163. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  8164. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8165. }
  8166. else
  8167. {
  8168. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]EVSE_EmergencyShutdown");
  8169. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8170. }
  8171. pre->ResponseCode = FAILED_ISO15118_2014;
  8172. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8173. errn = -1;
  8174. }
  8175. else if (ShmInternalComm->ChargingPermission == FALSE)
  8176. {
  8177. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]ChargingPermission = FALSE");
  8178. pre->ResponseCode = FAILED_ISO15118_2014;
  8179. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8180. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8181. errn = -1;
  8182. }
  8183. else
  8184. {
  8185. //null
  8186. }
  8187. //Response to CP Error
  8188. #if CP_PROTECTION_MECHANISM == ENABLE
  8189. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8190. {
  8191. pre->ResponseCode = FAILED_ISO15118_2014;
  8192. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8193. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8194. Update_V2G_Flow_Status(Other_Fault);
  8195. errn = -1;
  8196. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8197. //CCS_SECC_CP_State_Error (023889)
  8198. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8199. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8200. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8201. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8202. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8203. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8204. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8205. sprintf((char*)buf_log_evcomm,
  8206. "[Error][Proc_iso1_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8207. sys->CpState,
  8208. sys->CpVoltage
  8209. );
  8210. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8211. }
  8212. #endif
  8213. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8214. #if PARAMETER_NORMAL_MODE == ENABLE
  8215. SHM_Read_iso1_PreChargeRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8216. #else
  8217. Sudo_Parameter_iso1_PreChargeRes();
  8218. #endif
  8219. //STEP 4: ============ Encode and Send Response Message ===========
  8220. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8221. {
  8222. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][send_encoded_iso1_V2GTP_Stream]:Tx encoded msg error");
  8223. errn = -1;
  8224. }
  8225. //STEP 5: ============ Update Flags ===========
  8226. return errn;
  8227. }
  8228. /*===========================================================================
  8229. FUNCTION: Proc_din_PreChargeReq
  8230. DESCRIPTION:
  8231. PRE-CONDITION:
  8232. INPUT:
  8233. OUTPUT:
  8234. GLOBAL VARIABLES:
  8235. =============================================================================*/
  8236. int Proc_din_PreChargeReq(int AcceptFd)
  8237. {
  8238. int errn = 0;
  8239. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PreChargeReq] Got PreChargeReq");
  8240. //Print the decoded XML Document
  8241. PRINT_XML_DOC_DIN_PreChargeReq(&ccs_exi_doc_DIN);
  8242. //Save into Share Memory
  8243. SHM_Save_din_PreChargeReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8244. //Check for EV Error Code
  8245. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PreChargeRequest.DC_EVStatus.EVErrorCode);
  8246. errn = Proc_din_PreChargeRes(AcceptFd);
  8247. if (errn == 0)
  8248. {
  8249. //send response successfully.
  8250. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PreChargeRes");
  8251. }
  8252. else
  8253. {
  8254. sprintf((char*)buf_log_evcomm,
  8255. "[Error][SeccComm][Proc_din_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  8256. errn);
  8257. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8258. }
  8259. return errn;
  8260. }
  8261. /*===========================================================================
  8262. FUNCTION: Proc_iso1_PreChargeReq
  8263. DESCRIPTION:
  8264. PRE-CONDITION:
  8265. INPUT:
  8266. OUTPUT:
  8267. GLOBAL VARIABLES:
  8268. =============================================================================*/
  8269. int Proc_iso1_PreChargeReq(int AcceptFd)
  8270. {
  8271. int errn = 0;
  8272. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PreChargeReq] Got PreChargeReq");
  8273. //Print the decoded XML Document
  8274. PRINT_XML_DOC_ISO1_PreChargeReq(&ccs_exi_doc_ISO1);
  8275. //Save into Share Memory
  8276. SHM_Save_iso1_PreChargeReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8277. //Check for EV Error Code
  8278. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PreChargeRequest.DC_EVStatus.EVErrorCode);
  8279. errn = Proc_iso1_PreChargeRes(AcceptFd);
  8280. if (errn == 0)
  8281. {
  8282. //send response successfully.
  8283. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PreChargeRes");
  8284. }
  8285. else
  8286. {
  8287. sprintf((char*)buf_log_evcomm,
  8288. "[Error][SeccComm][Proc_iso1_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  8289. errn);
  8290. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8291. }
  8292. return errn;
  8293. }
  8294. /*===========================================================================
  8295. FUNCTION: SHM_Init_din_PowerDeliveryRes
  8296. DESCRIPTION:
  8297. PRE-CONDITION:
  8298. INPUT:
  8299. 1. shm_ccs
  8300. OUTPUT:
  8301. 1. shm_ccs
  8302. GLOBAL VARIABLES:
  8303. =============================================================================*/
  8304. void SHM_Init_din_PowerDeliveryRes(struct CcsData *shm_ccs)
  8305. {
  8306. struct PowerDeliveryResponse_DIN70121 *in;
  8307. in = &shm_ccs->V2GMessage_DIN70121.PowerDeliveryResponse;
  8308. //----- [BODY (1/3)] ResponseCode -----
  8309. in->ResponseCode = dinresponseCodeType_OK;
  8310. //----- [BODY (2/3)] AC_EVSEStatus -----
  8311. //ignore, since DIN 70121 doesn't support AC, yet.
  8312. //----- [BODY (2/3)] DC_EVSEStatus -----
  8313. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8314. }
  8315. /*===========================================================================
  8316. FUNCTION: Sudo_Parameter_din_PowerDeliveryRes
  8317. DESCRIPTION:
  8318. PRE-CONDITION:
  8319. INPUT:
  8320. OUTPUT:
  8321. GLOBAL VARIABLES:
  8322. =============================================================================*/
  8323. void Sudo_Parameter_din_PowerDeliveryRes()
  8324. {
  8325. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8326. init_dinPowerDeliveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes);
  8327. ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  8328. //----- [BODY (1/3)] ResponseCode -----
  8329. struct dinPowerDeliveryResType *res;
  8330. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  8331. res->ResponseCode = dinresponseCodeType_OK;
  8332. //----- [BODY (2/3)] AC_EVSEStatus -----
  8333. //ignore, since DIN 70121 doesn't support AC, yet.
  8334. //----- [BODY (2/3)] DC_EVSEStatus -----
  8335. res->DC_EVSEStatus_isUsed = 1u;
  8336. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8337. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8338. // dinisolationLevelType_Invalid = 0,
  8339. // dinisolationLevelType_Valid = 1,
  8340. // dinisolationLevelType_Warning = 2,
  8341. // dinisolationLevelType_Fault = 3
  8342. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8343. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8344. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8345. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8346. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8347. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8348. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8349. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8350. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8351. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8352. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8353. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8354. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8355. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8356. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8357. // dinEVSENotificationType_None = 0,
  8358. // dinEVSENotificationType_StopCharging = 1,
  8359. // dinEVSENotificationType_ReNegotiation = 2
  8360. }
  8361. /*===========================================================================
  8362. FUNCTION: Sudo_Parameter_iso1_PowerDeliveryRes
  8363. DESCRIPTION:
  8364. PRE-CONDITION:
  8365. INPUT:
  8366. OUTPUT:
  8367. GLOBAL VARIABLES:
  8368. =============================================================================*/
  8369. void Sudo_Parameter_iso1_PowerDeliveryRes()
  8370. {
  8371. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8372. init_iso1PowerDeliveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes);
  8373. ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  8374. //----- [BODY (1/3)] ResponseCode -----
  8375. struct iso1PowerDeliveryResType *res;
  8376. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  8377. res->ResponseCode = iso1responseCodeType_OK;
  8378. //----- [BODY (2/3)] AC_EVSEStatus -----
  8379. //ignore, since our ISO1 70121 doesn't support AC, yet.
  8380. //----- [BODY (2/3)] DC_EVSEStatus -----
  8381. res->DC_EVSEStatus_isUsed = 1u;
  8382. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8383. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8384. //iso1isolationLevelType_Invalid = 0,
  8385. //iso1isolationLevelType_Valid = 1,
  8386. //iso1isolationLevelType_Warning = 2,
  8387. //iso1isolationLevelType_Fault = 3,
  8388. //iso1isolationLevelType_No_IMD = 4
  8389. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8390. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8391. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8392. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8393. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8394. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8395. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8396. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8397. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8398. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8399. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8400. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8401. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8402. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8403. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8404. //iso1EVSENotificationType_None = 0,
  8405. //iso1EVSENotificationType_StopCharging = 1,
  8406. //iso1EVSENotificationType_ReNegotiation = 2
  8407. }
  8408. /*===========================================================================
  8409. FUNCTION: Proc_din_PowerDeliveryStartRes
  8410. DESCRIPTION:
  8411. PRE-CONDITION:
  8412. INPUT:
  8413. OUTPUT:
  8414. GLOBAL VARIABLES:
  8415. =============================================================================*/
  8416. int Proc_din_PowerDeliveryStartRes(int AcceptFd)
  8417. {
  8418. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8419. //if it is not the same, the packet should be ignored.
  8420. //STEP 1: ============ Initialize ============
  8421. //int i = 0;
  8422. int errn = 0;
  8423. bitstream_t v2g_tx_stream;
  8424. struct dinPowerDeliveryResType *res;
  8425. struct ChargingInfoData *sys;
  8426. size_t pos = 0;
  8427. v2g_tx_stream.pos = &pos;
  8428. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8429. v2g_tx_stream.data = V2GTP_Tx_buf;
  8430. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  8431. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8432. res->ResponseCode = OK_DIN70121;
  8433. //[HEADER] Check Req SessionID
  8434. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8435. {
  8436. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8437. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8438. errn = -1;
  8439. }
  8440. //Check for SequenceError
  8441. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8442. {
  8443. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8444. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8445. errn = -1;
  8446. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8447. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8448. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8449. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8450. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8451. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8452. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8453. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8454. }
  8455. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8456. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8457. #if PARAMETER_NORMAL_MODE == ENABLE
  8458. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  8459. #else
  8460. Sudo_Parameter_din_PowerDeliveryRes();
  8461. #endif
  8462. //EVSE Status Code
  8463. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8464. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8465. //Check for CSU command of "Stop by EVSE"
  8466. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8467. {
  8468. //res->ResponseCode = FAILED_DIN70121;
  8469. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8470. }
  8471. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8472. {
  8473. //res->ResponseCode = FAILED_DIN70121;
  8474. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8475. }
  8476. else if (ShmInternalComm->ChargingPermission == FALSE)
  8477. {
  8478. //res->ResponseCode = FAILED_DIN70121;
  8479. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8480. }
  8481. //STEP 4: ============ Encode and Send Response Message ===========
  8482. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8483. {
  8484. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PowerDeliveryStartRes][Error]Tx encoded msg error");
  8485. errn = -1;
  8486. }
  8487. //STEP 5: ============ Update Flags ===========
  8488. return errn;
  8489. }
  8490. /*===========================================================================
  8491. FUNCTION: Proc_iso1_PowerDeliveryStartRes
  8492. DESCRIPTION:
  8493. PRE-CONDITION:
  8494. INPUT:
  8495. OUTPUT:
  8496. GLOBAL VARIABLES:
  8497. =============================================================================*/
  8498. int Proc_iso1_PowerDeliveryStartRes(int AcceptFd)
  8499. {
  8500. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8501. //if it is not the same, the packet should be ignored.
  8502. //STEP 1: ============ Initialize ============
  8503. //int i = 0;
  8504. int errn = 0;
  8505. bitstream_t v2g_tx_stream;
  8506. struct iso1PowerDeliveryResType *res;
  8507. struct ChargingInfoData *sys;
  8508. size_t pos = 0;
  8509. v2g_tx_stream.pos = &pos;
  8510. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8511. v2g_tx_stream.data = V2GTP_Tx_buf;
  8512. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  8513. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8514. res->ResponseCode = OK_ISO15118_2014;
  8515. //[HEADER] Check Req SessionID
  8516. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8517. {
  8518. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8519. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8520. errn = -1;
  8521. }
  8522. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8523. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8524. #if PARAMETER_NORMAL_MODE == ENABLE
  8525. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8526. #else
  8527. Sudo_Parameter_iso1_PowerDeliveryRes();
  8528. #endif
  8529. //EVSE Status Code
  8530. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8531. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8532. //Check for CSU command of "Stop by EVSE"
  8533. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8534. {
  8535. //res->ResponseCode = FAILED_ISO15118_2014;
  8536. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8537. }
  8538. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8539. {
  8540. //res->ResponseCode = FAILED_ISO15118_2014;
  8541. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8542. }
  8543. else if (ShmInternalComm->ChargingPermission == FALSE)
  8544. {
  8545. //res->ResponseCode = FAILED_ISO15118_2014;
  8546. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8547. }
  8548. //STEP 4: ============ Encode and Send Response Message ===========
  8549. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8550. {
  8551. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PowerDeliveryStartRes][Error]Tx encoded msg error");
  8552. errn = -1;
  8553. }
  8554. //STEP 5: ============ Update Flags ===========
  8555. return errn;
  8556. }
  8557. /*===========================================================================
  8558. FUNCTION: Proc_din_PowerDeliveryStartReq
  8559. DESCRIPTION:
  8560. PRE-CONDITION:
  8561. INPUT:
  8562. OUTPUT:
  8563. GLOBAL VARIABLES:
  8564. =============================================================================*/
  8565. int Proc_din_PowerDeliveryStartReq(int AcceptFd)
  8566. {
  8567. int errn = 0;
  8568. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryStartReq");
  8569. //Print the decoded XML Document
  8570. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  8571. //Save into Share Memory
  8572. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8573. //Check for EV Error Code
  8574. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  8575. errn = Proc_din_PowerDeliveryStartRes(AcceptFd);
  8576. if (errn == 0)
  8577. {
  8578. //send response successfully.
  8579. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PowerDeliveryStartRes");
  8580. }
  8581. else
  8582. {
  8583. sprintf((char*)buf_log_evcomm,
  8584. "[Error][Proc_din_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  8585. errn);
  8586. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8587. }
  8588. return errn;
  8589. }
  8590. /*===========================================================================
  8591. FUNCTION: Proc_iso1_PowerDeliveryStartReq
  8592. DESCRIPTION:
  8593. PRE-CONDITION:
  8594. INPUT:
  8595. OUTPUT:
  8596. GLOBAL VARIABLES:
  8597. =============================================================================*/
  8598. int Proc_iso1_PowerDeliveryStartReq(int AcceptFd)
  8599. {
  8600. int errn = 0;
  8601. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryStartReq");
  8602. //Print the decoded XML Document
  8603. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  8604. //Save into Share Memory
  8605. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8606. //Check for EV Error Code
  8607. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  8608. errn = Proc_iso1_PowerDeliveryStartRes(AcceptFd);
  8609. if (errn == 0)
  8610. {
  8611. //send response successfully.
  8612. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PowerDeliveryStartRes");
  8613. }
  8614. else
  8615. {
  8616. sprintf((char*)buf_log_evcomm,
  8617. "[Error][Proc_iso1_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  8618. errn);
  8619. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8620. }
  8621. return errn;
  8622. }
  8623. /*===========================================================================
  8624. FUNCTION: SHM_Init_din_CurrentDemandRes
  8625. DESCRIPTION:
  8626. PRE-CONDITION:
  8627. INPUT:
  8628. 1. shm_ccs
  8629. OUTPUT:
  8630. 1. shm_ccs
  8631. GLOBAL VARIABLES:
  8632. =============================================================================*/
  8633. void SHM_Init_din_CurrentDemandRes(struct CcsData *shm_ccs)
  8634. {
  8635. struct CurrentDemandResponse_DIN70121 *in;
  8636. in = &shm_ccs->V2GMessage_DIN70121.CurrentDemandResponse;
  8637. //----- [BODY (1/10)] ResponseCode -----
  8638. in->ResponseCode = dinresponseCodeType_OK;
  8639. //----- [BODY (2/10)] DC_EVSEStatus -----
  8640. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8641. //----- [BODY (3/10)] EVSEPresentVoltage -----
  8642. short value = 0; int multiplier = 0; unsigned char unit = 0;
  8643. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  8644. value = 0; multiplier = 0; unit = V_DIN70121;
  8645. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  8646. //----- [BODY (4/10)] EVSEPresentCurrent -----
  8647. //value = 600; multiplier = -1; unit = A_DIN70121; //60A, for test only.
  8648. value = 0; multiplier = 0; unit = A_DIN70121;
  8649. SHM_Save_dinPhysicalValueType(&in->EVSEPresentCurrent, value, multiplier, unit);
  8650. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  8651. in->EVSECurrentLimitAchieved = FALSE;
  8652. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  8653. in->EVSEVoltageLimitAchieved = FALSE;
  8654. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  8655. in->EVSEPowerLimitAchieved = FALSE;
  8656. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  8657. //value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  8658. value = 5000; multiplier = -1; unit = V_DIN70121; //500V
  8659. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumVoltageLimit, value, multiplier, unit);
  8660. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  8661. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  8662. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumCurrentLimit, value, multiplier, unit);
  8663. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  8664. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  8665. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumPowerLimit, value, multiplier, unit);
  8666. }
  8667. /*===========================================================================
  8668. FUNCTION: Sudo_Parameter_din_CurrentDemandRes
  8669. DESCRIPTION:
  8670. PRE-CONDITION:
  8671. INPUT:
  8672. OUTPUT:
  8673. GLOBAL VARIABLES:
  8674. =============================================================================*/
  8675. void Sudo_Parameter_din_CurrentDemandRes()
  8676. {
  8677. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8678. init_dinCurrentDemandResType(&ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes);
  8679. ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  8680. //----- [BODY (1/10)] ResponseCode -----
  8681. struct dinCurrentDemandResType *res;
  8682. res = &ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes;
  8683. res->ResponseCode = dinresponseCodeType_OK;
  8684. //----- [BODY (2/10)] DC_EVSEStatus -----
  8685. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8686. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8687. // dinisolationLevelType_Invalid = 0,
  8688. // dinisolationLevelType_Valid = 1,
  8689. // dinisolationLevelType_Warning = 2,
  8690. // dinisolationLevelType_Fault = 3
  8691. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8692. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8693. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8694. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8695. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8696. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8697. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8698. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8699. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8700. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8701. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8702. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8703. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8704. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8705. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8706. // dinEVSENotificationType_None = 0,
  8707. // dinEVSENotificationType_StopCharging = 1,
  8708. // dinEVSENotificationType_ReNegotiation = 2
  8709. //----- [BODY (3/10)] EVSEPresentVoltage -----
  8710. res->EVSEPresentVoltage.Value = 3820;
  8711. res->EVSEPresentVoltage.Multiplier = -1;
  8712. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8713. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  8714. //----- [BODY (4/10)] EVSEPresentCurrent -----
  8715. res->EVSEPresentCurrent.Value = 1200;
  8716. res->EVSEPresentCurrent.Multiplier = -1;
  8717. res->EVSEPresentCurrent.Unit_isUsed = 1u;
  8718. res->EVSEPresentCurrent.Unit = dinunitSymbolType_A;
  8719. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  8720. res->EVSECurrentLimitAchieved = 0;
  8721. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  8722. res->EVSEVoltageLimitAchieved = 0;
  8723. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  8724. res->EVSEPowerLimitAchieved = 0;
  8725. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  8726. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  8727. res->EVSEMaximumVoltageLimit.Value = 7500;
  8728. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  8729. res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  8730. res->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  8731. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  8732. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  8733. res->EVSEMaximumCurrentLimit.Value = 1200;
  8734. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  8735. res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  8736. res->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  8737. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  8738. res->EVSEMaximumPowerLimit_isUsed = 1u;
  8739. res->EVSEMaximumPowerLimit.Value = 6000;
  8740. res->EVSEMaximumPowerLimit.Multiplier = 1;
  8741. res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  8742. res->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  8743. }
  8744. /*===========================================================================
  8745. FUNCTION: Sudo_Parameter_iso1_CurrentDemandRes
  8746. DESCRIPTION:
  8747. PRE-CONDITION:
  8748. INPUT:
  8749. OUTPUT:
  8750. GLOBAL VARIABLES:
  8751. =============================================================================*/
  8752. void Sudo_Parameter_iso1_CurrentDemandRes()
  8753. {
  8754. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8755. init_iso1CurrentDemandResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes);
  8756. ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  8757. //----- [BODY (1/10)] ResponseCode -----
  8758. struct iso1CurrentDemandResType *res;
  8759. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes;
  8760. res->ResponseCode = iso1responseCodeType_OK;
  8761. //----- [BODY (2/10)] DC_EVSEStatus -----
  8762. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8763. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8764. //iso1isolationLevelType_Invalid = 0,
  8765. //iso1isolationLevelType_Valid = 1,
  8766. //iso1isolationLevelType_Warning = 2,
  8767. //iso1isolationLevelType_Fault = 3,
  8768. //iso1isolationLevelType_No_IMD = 4
  8769. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8770. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8771. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8772. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8773. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8774. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8775. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8776. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8777. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8778. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8779. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8780. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8781. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8782. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8783. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8784. //iso1EVSENotificationType_None = 0,
  8785. //iso1EVSENotificationType_StopCharging = 1,
  8786. //iso1EVSENotificationType_ReNegotiation = 2
  8787. //----- [BODY (3/10)] EVSEPresentVoltage -----
  8788. res->EVSEPresentVoltage.Value = 3820;
  8789. res->EVSEPresentVoltage.Multiplier = -1;
  8790. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8791. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  8792. //----- [BODY (4/10)] EVSEPresentCurrent -----
  8793. res->EVSEPresentCurrent.Value = 1200;
  8794. res->EVSEPresentCurrent.Multiplier = -1;
  8795. //res->EVSEPresentCurrent.Unit_isUsed = 1u;
  8796. res->EVSEPresentCurrent.Unit = iso1unitSymbolType_A;
  8797. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  8798. res->EVSECurrentLimitAchieved = 0;
  8799. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  8800. res->EVSEVoltageLimitAchieved = 0;
  8801. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  8802. res->EVSEPowerLimitAchieved = 0;
  8803. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  8804. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  8805. res->EVSEMaximumVoltageLimit.Value = 7500;
  8806. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  8807. //res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  8808. res->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  8809. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  8810. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  8811. res->EVSEMaximumCurrentLimit.Value = 1200;
  8812. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  8813. //res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  8814. res->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  8815. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  8816. res->EVSEMaximumPowerLimit_isUsed = 1u;
  8817. res->EVSEMaximumPowerLimit.Value = 6000;
  8818. res->EVSEMaximumPowerLimit.Multiplier = 1;
  8819. //res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  8820. res->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  8821. }
  8822. /*===========================================================================
  8823. FUNCTION: Sudo_Parameter_iso1_ChargingStatusRes
  8824. DESCRIPTION:
  8825. PRE-CONDITION:
  8826. INPUT:
  8827. OUTPUT:
  8828. GLOBAL VARIABLES:
  8829. =============================================================================*/
  8830. void Sudo_Parameter_iso1_ChargingStatusRes()
  8831. {
  8832. //int i = 0;
  8833. struct iso1ChargingStatusResType *res;
  8834. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8835. init_iso1ChargingStatusResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes);
  8836. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes;
  8837. ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes_isUsed = 1u;
  8838. //----- [BODY (1/10)] ResponseCode -----
  8839. res->ResponseCode = OK_ISO15118_2014;
  8840. //----- [BODY (2/10)] AC_EVSEStatus -----
  8841. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  8842. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  8843. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8844. // iso1EVSENotificationType_None = 0,
  8845. // iso1EVSENotificationType_StopCharging = 1,
  8846. // iso1EVSENotificationType_ReNegotiation = 2
  8847. //----- [BODY (3/10)] EVSEMaxCurrent -----
  8848. res->EVSEMaxCurrent_isUsed = 1u;
  8849. res->EVSEMaxCurrent.Value = 32;
  8850. res->EVSEMaxCurrent.Multiplier = 0;
  8851. res->EVSEMaxCurrent.Unit = iso1unitSymbolType_A;
  8852. //----- [BODY (4/10)] SAScheduleTupleID -----
  8853. res->SAScheduleTupleID = 0;
  8854. //----- [BODY (5/10)] EVSEID -----
  8855. res->EVSEID.charactersLen = 37;
  8856. memset(res->EVSEID.characters, 0, sizeof(res->EVSEID.characters));
  8857. //sprintf((char*)res->EVSEID.characters, CCS_AC_EVSEID);
  8858. //----- [BODY (6/10)] MeterInfo -----
  8859. res->MeterInfo_isUsed = 1u;
  8860. memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  8861. memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  8862. //[MeterInfo][1/5] MeterID
  8863. //sprintf((char*)res->MeterInfo.MeterID , CCS_AC_METER_ID);
  8864. //[MeterInfo][2/5] SigMeterReading (optional)
  8865. //sprintf((char*)res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  8866. //[MeterInfo][3/5] MeterStatus (optional)
  8867. res->MeterInfo.MeterStatus = 0;
  8868. //[MeterInfo][4/5] MeterReading (optional)
  8869. res->MeterInfo.MeterReading = 12345;
  8870. //[MeterInfo][5/5] TMeter (optional)
  8871. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  8872. //----- [BODY (7/10)] ReceiptRequired -----
  8873. res->ReceiptRequired_isUsed = 1u;
  8874. res->ReceiptRequired = FALSE; //optional
  8875. }
  8876. /*===========================================================================
  8877. FUNCTION: Check_EVErrorCode
  8878. DESCRIPTION:
  8879. PRE-CONDITION:
  8880. INPUT:
  8881. OUTPUT:
  8882. GLOBAL VARIABLES:
  8883. =============================================================================*/
  8884. void Check_EVErrorCode(int code)
  8885. {
  8886. if (code != NO_ERROR) //NO_ERROR = 0
  8887. {
  8888. //Asking CSU to Stop
  8889. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8890. //Update_V2G_Flow_Status(Other_Fault);
  8891. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  8892. sprintf((char*)buf_log_evcomm,
  8893. "Stop by EV (EVErrorCode = %d (DEC))",
  8894. code);
  8895. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8896. }
  8897. }
  8898. /*===========================================================================
  8899. FUNCTION: Proc_din_CurrentDemandRes
  8900. DESCRIPTION:
  8901. PRE-CONDITION:
  8902. INPUT:
  8903. OUTPUT:
  8904. GLOBAL VARIABLES:
  8905. =============================================================================*/
  8906. int Proc_din_CurrentDemandRes(int AcceptFd)
  8907. {
  8908. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8909. //if it is not the same, the packet should be ignored.
  8910. //STEP 1: ============ Initialize ============
  8911. int errn = 0;
  8912. bitstream_t v2g_tx_stream;
  8913. static struct CurrentDemandResponse_DIN70121 *cur;
  8914. static struct ChargingInfoData *sys;
  8915. // int i = 0;
  8916. // static int EVSE_max_current;
  8917. // int tmp = 0;
  8918. size_t pos = 0;
  8919. v2g_tx_stream.pos = &pos;
  8920. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8921. v2g_tx_stream.data = V2GTP_Tx_buf;
  8922. cur = &ShmCcsData->V2GMessage_DIN70121.CurrentDemandResponse;
  8923. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8924. cur->ResponseCode = OK_DIN70121;
  8925. //EVSE Status Code
  8926. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8927. //[HEADER] Check Req SessionID
  8928. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8929. {
  8930. cur->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8931. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8932. errn = -1;
  8933. }
  8934. //Check for SequenceError
  8935. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8936. {
  8937. cur->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8938. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8939. errn = -1;
  8940. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8941. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8942. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8943. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8944. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8945. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8946. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8947. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8948. }
  8949. //Check for negative EvBatteryMaxCurrent
  8950. if (sys->EvBatteryMaxCurrent < 0)
  8951. {
  8952. sprintf((char*)buf_log_evcomm,
  8953. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  8954. sys->EvBatteryMaxCurrent);
  8955. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8956. cur->DC_EVSEStatus.EVSEStatusCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  8957. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8958. errn = -1;
  8959. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8960. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  8961. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8962. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8963. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8964. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8965. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  8966. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  8967. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8968. }
  8969. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8970. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_DIN70121);
  8971. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  8972. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  8973. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  8974. #endif
  8975. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  8976. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  8977. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  8978. if (sys->EvBatteryMaxVoltage <= 500)
  8979. {
  8980. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  8981. }
  8982. #endif
  8983. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  8984. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  8985. {
  8986. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  8987. //[To-Do] Limit is achieved flag
  8988. }
  8989. //Isolation Status
  8990. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  8991. {
  8992. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  8993. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8994. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8995. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  8996. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8997. Update_V2G_Flow_Status(Other_Fault);
  8998. errn = -1;
  8999. }
  9000. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  9001. {
  9002. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  9003. }
  9004. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  9005. {
  9006. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  9007. }
  9008. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  9009. {
  9010. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  9011. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9012. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9013. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_CurrentDemandRes]GFD_Fault => Emergency Shutdown");
  9014. Update_V2G_Flow_Status(Other_Fault);
  9015. errn = -1;
  9016. }
  9017. else //GFD_No_IMD or other unexpected status
  9018. {
  9019. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  9020. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9021. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9022. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9023. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9024. Update_V2G_Flow_Status(Other_Fault);
  9025. errn = -1;
  9026. }
  9027. //For testing with Tesla Model 3
  9028. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  9029. //[CAUTION][To-Do] Decresement of Current is not implemented.
  9030. //SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, 10, A_DIN70121);
  9031. if (sys->EvBatterytargetCurrent <= 0)
  9032. {
  9033. EVSE_max_current = 50; //10A
  9034. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  9035. /*
  9036. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9037. sys->PresentChargingCurrent,
  9038. sys->EvBatterytargetCurrent,
  9039. EVSE_max_current,
  9040. cur->EVSEMaximumCurrentLimit.Value
  9041. );
  9042. */
  9043. }
  9044. else //1A
  9045. {
  9046. /*
  9047. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9048. sys->PresentChargingCurrent,
  9049. sys->EvBatterytargetCurrent,
  9050. EVSE_max_current,
  9051. cur->EVSEMaximumCurrentLimit.Value
  9052. );
  9053. */
  9054. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  9055. {
  9056. tmp = EVSE_max_current + 50; //10A
  9057. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  9058. {
  9059. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  9060. EVSE_max_current = tmp;
  9061. }
  9062. else
  9063. {
  9064. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  9065. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  9066. }
  9067. }
  9068. }
  9069. #endif
  9070. //Check for CSU command of "Stop by EVSE"
  9071. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9072. {
  9073. //Check for Alarm Code: CCS GFD trip (012235)
  9074. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9075. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9076. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9077. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9078. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9079. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9080. {
  9081. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  9082. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  9083. }
  9084. else
  9085. {
  9086. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]EVSE_Shutdown");
  9087. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9088. }
  9089. //cur->ResponseCode = FAILED_DIN70121;
  9090. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9091. //errn = -1;
  9092. }
  9093. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9094. {
  9095. //Check for Alarm Code: CCS GFD trip (012235)
  9096. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9097. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9098. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9099. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9100. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9101. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9102. {
  9103. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9104. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  9105. }
  9106. else
  9107. {
  9108. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  9109. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9110. }
  9111. //cur->ResponseCode = FAILED_DIN70121;
  9112. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9113. //errn = -1;
  9114. }
  9115. else if (ShmInternalComm->ChargingPermission == FALSE)
  9116. {
  9117. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]Permission OFF");
  9118. //cur->ResponseCode = FAILED_DIN70121;
  9119. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9120. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9121. //errn = -1;
  9122. }
  9123. else
  9124. {
  9125. //null
  9126. }
  9127. //Response to CP Error
  9128. #if CP_PROTECTION_MECHANISM == ENABLE
  9129. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9130. {
  9131. cur->ResponseCode = FAILED_DIN70121;
  9132. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9133. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9134. Update_V2G_Flow_Status(Other_Fault);
  9135. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9136. //CCS_SECC_CP_State_Error (023889)
  9137. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9138. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9139. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9140. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9141. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9142. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9143. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9144. sprintf((char*)buf_log_evcomm,
  9145. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  9146. sys->CpState,
  9147. sys->CpVoltage);
  9148. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9149. }
  9150. #endif
  9151. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9152. #if PARAMETER_NORMAL_MODE == ENABLE
  9153. SHM_Read_din_CurrentDemandRes(&ccs_exi_doc_DIN, ShmCcsData);
  9154. #else
  9155. Sudo_Parameter_din_CurrentDemandRes();
  9156. #endif
  9157. //STEP 4: ============ Encode and Send Response Message ===========
  9158. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9159. {
  9160. errn = -1;
  9161. }
  9162. //STEP 5: ============ Update Flags ===========
  9163. return errn;
  9164. }
  9165. /*===========================================================================
  9166. FUNCTION: Proc_iso1_CurrentDemandRes
  9167. DESCRIPTION:
  9168. PRE-CONDITION:
  9169. INPUT:
  9170. OUTPUT:
  9171. GLOBAL VARIABLES:
  9172. =============================================================================*/
  9173. int Proc_iso1_CurrentDemandRes(int AcceptFd)
  9174. {
  9175. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9176. //if it is not the same, the packet should be ignored.
  9177. //STEP 1: ============ Initialize ============
  9178. int errn = 0;
  9179. bitstream_t v2g_tx_stream;
  9180. static struct CurrentDemandResponse_ISO15118_2014 *cur;
  9181. static struct ChargingInfoData *sys;
  9182. // int i = 0;
  9183. // static int EVSE_max_current;
  9184. // int tmp = 0;
  9185. size_t pos = 0;
  9186. v2g_tx_stream.pos = &pos;
  9187. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9188. v2g_tx_stream.data = V2GTP_Tx_buf;
  9189. cur = &ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandResponse;
  9190. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9191. cur->ResponseCode = OK_ISO15118_2014;
  9192. //EVSE Status Code
  9193. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9194. //[HEADER] Check Req SessionID
  9195. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9196. {
  9197. cur->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9198. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9199. errn = -1;
  9200. }
  9201. //Check for SequenceError
  9202. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9203. {
  9204. cur->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  9205. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9206. errn = -1;
  9207. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9208. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9209. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9210. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9211. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9212. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9213. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9214. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9215. }
  9216. //Check for negative EvBatteryMaxCurrent
  9217. if (sys->EvBatteryMaxCurrent < 0)
  9218. {
  9219. sprintf((char*)buf_log_evcomm,
  9220. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  9221. sys->EvBatteryMaxCurrent);
  9222. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9223. cur->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  9224. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9225. errn = -1;
  9226. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9227. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  9228. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9229. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9230. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9231. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9232. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9233. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  9234. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9235. }
  9236. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9237. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_ISO15118_2014);
  9238. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  9239. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  9240. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  9241. #endif
  9242. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  9243. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  9244. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  9245. if (sys->EvBatteryMaxVoltage <= 500)
  9246. {
  9247. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  9248. }
  9249. #endif
  9250. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  9251. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  9252. {
  9253. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  9254. //[To-Do] Limit is achieved flag
  9255. }
  9256. //Isolation Status
  9257. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  9258. {
  9259. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  9260. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9261. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9262. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  9263. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9264. Update_V2G_Flow_Status(Other_Fault);
  9265. errn = -1;
  9266. }
  9267. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  9268. {
  9269. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  9270. }
  9271. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  9272. {
  9273. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  9274. }
  9275. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  9276. {
  9277. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  9278. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9279. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9280. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_CurrentDemandRes]GFD_Fault => EmergencyShutdown");
  9281. Update_V2G_Flow_Status(Other_Fault);
  9282. errn = -1;
  9283. }
  9284. else
  9285. {
  9286. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  9287. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9288. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9289. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9290. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9291. Update_V2G_Flow_Status(Other_Fault);
  9292. errn = -1;
  9293. }
  9294. //For testing with Tesla Model 3
  9295. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  9296. //[CAUTION][To-Do] Decresement of Current is not implemented.
  9297. //SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, 10, A_ISO15118_2014);
  9298. if (sys->EvBatterytargetCurrent <= 0)
  9299. {
  9300. EVSE_max_current = 50; //10A
  9301. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  9302. /*
  9303. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9304. sys->PresentChargingCurrent,
  9305. sys->EvBatterytargetCurrent,
  9306. EVSE_max_current,
  9307. cur->EVSEMaximumCurrentLimit.Value
  9308. );
  9309. */
  9310. }
  9311. else //1A
  9312. {
  9313. /*
  9314. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9315. sys->PresentChargingCurrent,
  9316. sys->EvBatterytargetCurrent,
  9317. EVSE_max_current,
  9318. cur->EVSEMaximumCurrentLimit.Value
  9319. );
  9320. */
  9321. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  9322. {
  9323. tmp = EVSE_max_current + 50; //10A
  9324. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  9325. {
  9326. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  9327. EVSE_max_current = tmp;
  9328. }
  9329. else
  9330. {
  9331. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  9332. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  9333. }
  9334. }
  9335. }
  9336. #endif
  9337. //Check for CSU command of "Stop by EVSE"
  9338. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9339. {
  9340. //Check for Alarm Code: CCS GFD trip (012235)
  9341. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9342. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9343. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9344. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9345. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9346. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9347. {
  9348. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  9349. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9350. }
  9351. else
  9352. {
  9353. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]EVSE_Shutdown");
  9354. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9355. }
  9356. //cur->ResponseCode = FAILED_ISO15118_2014;
  9357. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9358. //errn = -1;
  9359. }
  9360. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9361. {
  9362. //Check for Alarm Code: CCS GFD trip (012235)
  9363. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9364. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9365. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9366. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9367. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9368. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9369. {
  9370. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9371. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9372. }
  9373. else
  9374. {
  9375. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  9376. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9377. }
  9378. //cur->ResponseCode = FAILED_ISO15118_2014;
  9379. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9380. //errn = -1;
  9381. }
  9382. else if (ShmInternalComm->ChargingPermission == FALSE)
  9383. {
  9384. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]Permission OFF");
  9385. //cur->ResponseCode = FAILED_ISO15118_2014;
  9386. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9387. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9388. //errn = -1;
  9389. }
  9390. else
  9391. {
  9392. //null
  9393. }
  9394. //Response to CP Error
  9395. #if CP_PROTECTION_MECHANISM == ENABLE
  9396. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9397. {
  9398. cur->ResponseCode = FAILED_ISO15118_2014;
  9399. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9400. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9401. Update_V2G_Flow_Status(Other_Fault);
  9402. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9403. //CCS_SECC_CP_State_Error (023889)
  9404. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9405. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9406. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9407. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9408. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9409. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9410. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9411. sprintf((char*)buf_log_evcomm,
  9412. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  9413. sys->CpState,
  9414. sys->CpVoltage);
  9415. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9416. }
  9417. #endif
  9418. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9419. #if PARAMETER_NORMAL_MODE == ENABLE
  9420. SHM_Read_iso1_CurrentDemandRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9421. #else
  9422. Sudo_Parameter_iso1_CurrentDemandRes();
  9423. #endif
  9424. //STEP 4: ============ Encode and Send Response Message ===========
  9425. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9426. {
  9427. errn = -1;
  9428. }
  9429. //STEP 5: ============ Update Flags ===========
  9430. return errn;
  9431. }
  9432. /*===========================================================================
  9433. FUNCTION: Proc_iso1_ChargingStatusRes
  9434. DESCRIPTION:
  9435. PRE-CONDITION:
  9436. INPUT:
  9437. OUTPUT:
  9438. GLOBAL VARIABLES:
  9439. =============================================================================*/
  9440. int Proc_iso1_ChargingStatusRes(int AcceptFd)
  9441. {
  9442. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9443. //if it is not the same, the packet should be ignored.
  9444. //STEP 1: ============ Initialize ============
  9445. //int i = 0;
  9446. int errn = 0;
  9447. bitstream_t v2g_tx_stream;
  9448. static struct ChargingStatusResponse_ISO15118_2014 *res;
  9449. static struct ChargingInfoData *sys;
  9450. size_t pos = 0;
  9451. v2g_tx_stream.pos = &pos;
  9452. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9453. v2g_tx_stream.data = V2GTP_Tx_buf;
  9454. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargingStatusResponse;
  9455. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9456. //Init
  9457. res->ResponseCode = OK_ISO15118_2014;
  9458. res->ReceiptRequired = FALSE; //optional
  9459. res->SAScheduleTupleID = 0;
  9460. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9461. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  9462. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9463. // iso1EVSENotificationType_None = 0,
  9464. // iso1EVSENotificationType_StopCharging = 1,
  9465. // iso1EVSENotificationType_ReNegotiation = 2
  9466. //[HEADER] Check Req SessionID
  9467. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9468. {
  9469. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9470. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9471. errn = -1;
  9472. }
  9473. //Check for SequenceError
  9474. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9475. {
  9476. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  9477. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9478. errn = -1;
  9479. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9480. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9481. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9482. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9483. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9484. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9485. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9486. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9487. }
  9488. //EVSE ID
  9489. memset(res->EVSEID, 0, sizeof(res->EVSEID));
  9490. //sprintf((char*)res->EVSEID, CCS_AC_EVSEID);
  9491. //[MeterInfo][0/5] init
  9492. //memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  9493. //memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  9494. //[MeterInfo][1/5] MeterID
  9495. //sprintf((char*)res->MeterInfo.MeterID , CCS_AC_METER_ID);
  9496. //[MeterInfo][2/5] SigMeterReading (optional)
  9497. //sprintf((char*)res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  9498. //[MeterInfo][3/5] MeterStatus (optional)
  9499. res->MeterInfo.MeterStatus = 0;
  9500. //[MeterInfo][4/5] MeterReading (optional)
  9501. res->MeterInfo.MeterReading = 12345;
  9502. //[MeterInfo][5/5] TMeter (optional)
  9503. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  9504. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9505. SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  9506. //Isolation Status (RCD)
  9507. if (sys->IsolationStatus == 0) //Isolation is invalid
  9508. {
  9509. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  9510. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9511. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9512. sprintf((char*)buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d", sys->IsolationStatus);
  9513. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9514. Update_V2G_Flow_Status(Other_Fault);
  9515. errn = -1;
  9516. }
  9517. else if (sys->IsolationStatus == 1) //Isolation is valid
  9518. {
  9519. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9520. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9521. }
  9522. else
  9523. {
  9524. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  9525. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9526. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9527. sprintf((char*)buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9528. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9529. Update_V2G_Flow_Status(Other_Fault);
  9530. errn = -1;
  9531. }
  9532. //Check for CSU command of "Stop by EVSE"
  9533. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9534. {
  9535. //res->ResponseCode = FAILED_ISO15118_2014;
  9536. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9537. //errn = -1;
  9538. }
  9539. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9540. {
  9541. //res->ResponseCode = FAILED_ISO15118_2014;
  9542. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9543. //errn = -1;
  9544. }
  9545. else if (ShmInternalComm->ChargingPermission == FALSE)
  9546. {
  9547. //res->ResponseCode = FAILED_ISO15118_2014;
  9548. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9549. //errn = -1;
  9550. }
  9551. //Response to CP Error
  9552. #if CP_PROTECTION_MECHANISM == ENABLE
  9553. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9554. {
  9555. res->ResponseCode = FAILED_ISO15118_2014;
  9556. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9557. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9558. Update_V2G_Flow_Status(Other_Fault);
  9559. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9560. //CCS_SECC_CP_State_Error (023889)
  9561. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9562. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9563. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9564. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9565. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9566. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9567. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9568. sprintf((char*)buf_log_evcomm,
  9569. "[ChargingStatus]Emergency Stop by CP Error (%d, %.02f V)",
  9570. sys->CpState,
  9571. sys->CpVoltage);
  9572. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9573. }
  9574. #endif
  9575. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9576. #if PARAMETER_NORMAL_MODE == ENABLE
  9577. SHM_Read_iso1_ChargingStatusRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9578. #else
  9579. Sudo_Parameter_iso1_ChargingStatusRes();
  9580. #endif
  9581. //STEP 4: ============ Encode and Send Response Message ===========
  9582. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9583. {
  9584. errn = -1;
  9585. }
  9586. //STEP 5: ============ Update Flags ===========
  9587. return errn;
  9588. }
  9589. /*===========================================================================
  9590. FUNCTION: Proc_din_CurrentDemandReq
  9591. DESCRIPTION:
  9592. PRE-CONDITION:
  9593. INPUT:
  9594. OUTPUT:
  9595. GLOBAL VARIABLES:
  9596. =============================================================================*/
  9597. int Proc_din_CurrentDemandReq(int AcceptFd)
  9598. {
  9599. int errn = 0;
  9600. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CurrentDemandReq] Got CurrentDemandReq\n");
  9601. //Print the decoded XML Document
  9602. PRINT_XML_DOC_DIN_CurrentDemandReq(&ccs_exi_doc_DIN);
  9603. //Save into Share Memory
  9604. SHM_Save_din_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9605. //Check for EV Error Code
  9606. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  9607. errn = Proc_din_CurrentDemandRes(AcceptFd);
  9608. if (errn == 0)
  9609. {
  9610. //Response is sent successfully.
  9611. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]CurrentDemandRes");
  9612. }
  9613. else
  9614. {
  9615. sprintf((char*)buf_log_evcomm,
  9616. "[DIN][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  9617. errn);
  9618. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9619. }
  9620. return errn;
  9621. }
  9622. /*===========================================================================
  9623. FUNCTION: Proc_iso1_CurrentDemandReq
  9624. DESCRIPTION:
  9625. PRE-CONDITION:
  9626. INPUT:
  9627. OUTPUT:
  9628. GLOBAL VARIABLES:
  9629. =============================================================================*/
  9630. int Proc_iso1_CurrentDemandReq(int AcceptFd)
  9631. {
  9632. int errn = 0;
  9633. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CurrentDemandReq] Got CurrentDemandReq\n");
  9634. //Print the decoded XML Document
  9635. PRINT_XML_DOC_ISO1_CurrentDemandReq(&ccs_exi_doc_ISO1);
  9636. //Save into Share Memory
  9637. SHM_Save_iso1_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9638. //Check for EV Error Code
  9639. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  9640. errn = Proc_iso1_CurrentDemandRes(AcceptFd);
  9641. if (errn == 0)
  9642. {
  9643. //Response is sent successfully.
  9644. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]CurrentDemandRes");
  9645. }
  9646. else
  9647. {
  9648. sprintf((char*)buf_log_evcomm,
  9649. "[ISO1][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  9650. errn);
  9651. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9652. }
  9653. return errn;
  9654. }
  9655. /*===========================================================================
  9656. FUNCTION: Proc_iso1_ChargingStatusReq
  9657. DESCRIPTION:
  9658. PRE-CONDITION:
  9659. INPUT:
  9660. OUTPUT:
  9661. GLOBAL VARIABLES:
  9662. =============================================================================*/
  9663. int Proc_iso1_ChargingStatusReq(int AcceptFd)
  9664. {
  9665. int errn = 0;
  9666. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargingStatusReq] Got ChargingStatusReq\n");
  9667. //Print the decoded XML Document
  9668. PRINT_XML_DOC_ISO1_ChargingStatusReq(&ccs_exi_doc_ISO1);
  9669. //Save into Share Memory
  9670. SHM_Save_iso1_ChargingStatusReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9671. //Check for EV Error Code
  9672. //no content in ISO1
  9673. errn = Proc_iso1_ChargingStatusRes(AcceptFd);
  9674. if (errn == 0)
  9675. {
  9676. //Response is sent successfully.
  9677. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ChargingStatusRes");
  9678. }
  9679. else
  9680. {
  9681. sprintf((char*)buf_log_evcomm,
  9682. "[ISO1][Error][ChargingStatusReq]ChargingStatusRes: fail(%d,DEC)",
  9683. errn);
  9684. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9685. }
  9686. return errn;
  9687. }
  9688. /*===========================================================================
  9689. FUNCTION: Proc_din_PowerDeliveryStopRes
  9690. DESCRIPTION:
  9691. PRE-CONDITION:
  9692. INPUT:
  9693. OUTPUT:
  9694. GLOBAL VARIABLES:
  9695. =============================================================================*/
  9696. int Proc_din_PowerDeliveryStopRes(int AcceptFd)
  9697. {
  9698. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9699. //if it is not the same, the packet should be ignored.
  9700. //STEP 1: ============ Initialize ============
  9701. //int i = 0;
  9702. int errn = 0;
  9703. bitstream_t v2g_tx_stream;
  9704. struct dinPowerDeliveryResType *res;
  9705. struct ChargingInfoData *sys;
  9706. size_t pos = 0;
  9707. v2g_tx_stream.pos = &pos;
  9708. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9709. v2g_tx_stream.data = V2GTP_Tx_buf;
  9710. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9711. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9712. res->ResponseCode = OK_DIN70121;
  9713. //[HEADER] Check Req SessionID
  9714. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9715. {
  9716. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  9717. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9718. errn = -1;
  9719. }
  9720. //Check for SequenceError
  9721. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9722. {
  9723. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  9724. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9725. errn = -1;
  9726. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9727. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9728. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9729. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9730. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9731. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9732. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9733. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9734. }
  9735. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9736. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9737. #if PARAMETER_NORMAL_MODE == ENABLE
  9738. ShmCcsData->V2GMessage_DIN70121.PowerDeliveryResponse.DC_EVSEStatus.EVSEStatusCode = EVSE_NotReady;
  9739. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  9740. #else
  9741. Sudo_Parameter_din_PreChargeRes();
  9742. #endif
  9743. //EVSE Status Code
  9744. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9745. //Check for CSU command of "Stop by EVSE"
  9746. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9747. {
  9748. //res->ResponseCode = FAILED_DIN70121;
  9749. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9750. }
  9751. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9752. {
  9753. //res->ResponseCode = FAILED_DIN70121;
  9754. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9755. }
  9756. else if (ShmInternalComm->ChargingPermission == FALSE)
  9757. {
  9758. //res->ResponseCode = FAILED_DIN70121;
  9759. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9760. }
  9761. //STEP 4: ============ Encode and Send Response Message ===========
  9762. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9763. {
  9764. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PowerDeliveryStopRes][Error]Tx encoded msg error");
  9765. errn = -1;
  9766. }
  9767. //STEP 5: ============ Update Flags ===========
  9768. return errn;
  9769. }
  9770. /*===========================================================================
  9771. FUNCTION: Proc_iso1_PowerDeliveryStopRes
  9772. DESCRIPTION:
  9773. PRE-CONDITION:
  9774. INPUT:
  9775. OUTPUT:
  9776. GLOBAL VARIABLES:
  9777. =============================================================================*/
  9778. int Proc_iso1_PowerDeliveryStopRes(int AcceptFd)
  9779. {
  9780. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9781. //if it is not the same, the packet should be ignored.
  9782. //STEP 1: ============ Initialize ============
  9783. //int i = 0;
  9784. int errn = 0;
  9785. bitstream_t v2g_tx_stream;
  9786. struct iso1PowerDeliveryResType *res;
  9787. struct ChargingInfoData *sys;
  9788. size_t pos = 0;
  9789. v2g_tx_stream.pos = &pos;
  9790. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9791. v2g_tx_stream.data = V2GTP_Tx_buf;
  9792. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  9793. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9794. res->ResponseCode = OK_ISO15118_2014;
  9795. //[HEADER] Check Req SessionID
  9796. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9797. {
  9798. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9799. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9800. errn = -1;
  9801. }
  9802. //Check for SequenceError
  9803. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9804. {
  9805. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  9806. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9807. errn = -1;
  9808. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9809. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9810. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9811. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9812. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9813. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9814. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9815. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9816. }
  9817. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9818. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9819. #if PARAMETER_NORMAL_MODE == ENABLE
  9820. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryResponse.DC_EVSEStatus.DC_EVSEStatusCode = EVSE_NotReady;
  9821. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9822. #else
  9823. Sudo_Parameter_iso1_PreChargeRes();
  9824. #endif
  9825. //EVSE Status Code
  9826. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9827. //Check for CSU command of "Stop by EVSE"
  9828. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9829. {
  9830. //res->ResponseCode = FAILED_ISO15118_2014;
  9831. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9832. }
  9833. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9834. {
  9835. //res->ResponseCode = FAILED_ISO15118_2014;
  9836. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9837. }
  9838. else if (ShmInternalComm->ChargingPermission == FALSE)
  9839. {
  9840. //res->ResponseCode = FAILED_ISO15118_2014;
  9841. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9842. }
  9843. //STEP 4: ============ Encode and Send Response Message ===========
  9844. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9845. {
  9846. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PowerDeliveryStopRes][Error]Tx encoded msg error");
  9847. errn = -1;
  9848. }
  9849. //STEP 5: ============ Update Flags ===========
  9850. return errn;
  9851. }
  9852. /*===========================================================================
  9853. FUNCTION: Proc_din_PowerDeliveryStopReq
  9854. DESCRIPTION:
  9855. PRE-CONDITION:
  9856. INPUT:
  9857. OUTPUT:
  9858. GLOBAL VARIABLES:
  9859. =============================================================================*/
  9860. int Proc_din_PowerDeliveryStopReq(int AcceptFd)
  9861. {
  9862. int errn = 0;
  9863. //Request CSU to STOP
  9864. //This should be reponsed as soon as possible once this message is received.
  9865. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9866. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  9867. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  9868. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryReq (2nd)\n");
  9869. //Print the decoded XML Document
  9870. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  9871. //Save into Share Memory
  9872. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9873. //Check for EV Error Code
  9874. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  9875. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  9876. usleep(1500000); //1.5 seconds
  9877. //sleep(1); //1 second
  9878. errn = Proc_din_PowerDeliveryStopRes(AcceptFd);
  9879. if (errn == 0)
  9880. {
  9881. //send response successfully.
  9882. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PowerDeliveryRes (2nd)\n");
  9883. }
  9884. else
  9885. {
  9886. sprintf((char*)buf_log_evcomm,
  9887. "[Error][SeccComm][Proc_din_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  9888. errn);
  9889. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9890. }
  9891. return errn;
  9892. }
  9893. /*===========================================================================
  9894. FUNCTION: Proc_iso1_PowerDeliveryStopReq
  9895. DESCRIPTION:
  9896. PRE-CONDITION:
  9897. INPUT:
  9898. OUTPUT:
  9899. GLOBAL VARIABLES:
  9900. =============================================================================*/
  9901. int Proc_iso1_PowerDeliveryStopReq(int AcceptFd)
  9902. {
  9903. int errn = 0;
  9904. //Request CSU to STOP
  9905. //This should be reponsed as soon as possible once this message is received.
  9906. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9907. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  9908. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  9909. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryReq (2nd)\n");
  9910. //Print the decoded XML Document
  9911. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  9912. //Save into Share Memory
  9913. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9914. //Check for EV Error Code
  9915. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  9916. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  9917. usleep(1500000); //1.5 seconds
  9918. //sleep(1); //1 second
  9919. errn = Proc_iso1_PowerDeliveryStopRes(AcceptFd);
  9920. if (errn == 0)
  9921. {
  9922. //send response successfully.
  9923. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PowerDeliveryRes (2nd)");
  9924. }
  9925. else
  9926. {
  9927. sprintf((char*)buf_log_evcomm,
  9928. "[Error][SeccComm][Proc_iso1_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  9929. errn);
  9930. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9931. }
  9932. return errn;
  9933. }
  9934. /*===========================================================================
  9935. FUNCTION: SHM_Init_din_WeldingDetectionRes
  9936. DESCRIPTION:
  9937. PRE-CONDITION:
  9938. INPUT:
  9939. 1. shm_ccs
  9940. OUTPUT:
  9941. 1. shm_ccs
  9942. GLOBAL VARIABLES:
  9943. =============================================================================*/
  9944. void SHM_Init_din_WeldingDetectionRes(struct CcsData *shm_ccs)
  9945. {
  9946. struct WeldingDetectionResponse_DIN70121 *in;
  9947. in = &shm_ccs->V2GMessage_DIN70121.WeldingDetectionResponse;
  9948. //----- [BODY (1/3)] ResponseCode -----
  9949. in->ResponseCode = dinresponseCodeType_OK;
  9950. //----- [BODY (2/3)] EVSEPresentVoltage -----
  9951. short value = 0; int multiplier = 0; unsigned char unit = 0;
  9952. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  9953. value = 0; multiplier = 0; unit = V_DIN70121;
  9954. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  9955. //----- [BODY (3/3)] DC_EVSEStatus -----
  9956. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  9957. }
  9958. /*===========================================================================
  9959. FUNCTION: Sudo_Parameter_din_WeldingDetectionRes
  9960. DESCRIPTION:
  9961. PRE-CONDITION:
  9962. INPUT:
  9963. OUTPUT:
  9964. GLOBAL VARIABLES:
  9965. =============================================================================*/
  9966. void Sudo_Parameter_din_WeldingDetectionRes()
  9967. {
  9968. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  9969. init_dinWeldingDetectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes);
  9970. ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  9971. //----- [BODY (1/3)] ResponseCode -----
  9972. struct dinWeldingDetectionResType *res;
  9973. res = &ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes;
  9974. res->ResponseCode = dinresponseCodeType_OK;
  9975. //----- [BODY (2/3)] EVSEPresentVoltage -----
  9976. res->EVSEPresentVoltage.Value = 3820;
  9977. res->EVSEPresentVoltage.Multiplier = -1;
  9978. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  9979. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  9980. // dinunitSymbolType_h = 0,
  9981. // dinunitSymbolType_m = 1,
  9982. // dinunitSymbolType_s = 2,
  9983. // dinunitSymbolType_A = 3,
  9984. // dinunitSymbolType_Ah = 4,
  9985. // dinunitSymbolType_V = 5,
  9986. // dinunitSymbolType_VA = 6,
  9987. // dinunitSymbolType_W = 7,
  9988. // dinunitSymbolType_W_s = 8,
  9989. // dinunitSymbolType_Wh = 9
  9990. //----- [BODY (3/3)] DC_EVSEStatus -----
  9991. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  9992. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  9993. // dinisolationLevelType_Invalid = 0,
  9994. // dinisolationLevelType_Valid = 1,
  9995. // dinisolationLevelType_Warning = 2,
  9996. // dinisolationLevelType_Fault = 3
  9997. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9998. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  9999. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  10000. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  10001. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  10002. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  10003. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  10004. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  10005. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  10006. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  10007. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  10008. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  10009. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  10010. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  10011. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  10012. // dinEVSENotificationType_None = 0,
  10013. // dinEVSENotificationType_StopCharging = 1,
  10014. // dinEVSENotificationType_ReNegotiation = 2
  10015. }
  10016. /*===========================================================================
  10017. FUNCTION: Sudo_Parameter_iso1_WeldingDetectionRes
  10018. DESCRIPTION:
  10019. PRE-CONDITION:
  10020. INPUT:
  10021. OUTPUT:
  10022. GLOBAL VARIABLES:
  10023. =============================================================================*/
  10024. void Sudo_Parameter_iso1_WeldingDetectionRes()
  10025. {
  10026. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  10027. init_iso1WeldingDetectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes);
  10028. ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  10029. //----- [BODY (1/3)] ResponseCode -----
  10030. struct iso1WeldingDetectionResType *res;
  10031. res = &ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes;
  10032. res->ResponseCode = iso1responseCodeType_OK;
  10033. //----- [BODY (2/3)] EVSEPresentVoltage -----
  10034. res->EVSEPresentVoltage.Value = 3820;
  10035. res->EVSEPresentVoltage.Multiplier = -1;
  10036. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  10037. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  10038. //iso1unitSymbolType_h = 0,
  10039. //iso1unitSymbolType_m = 1,
  10040. //iso1unitSymbolType_s = 2,
  10041. //iso1unitSymbolType_A = 3,
  10042. //iso1unitSymbolType_V = 4,
  10043. //iso1unitSymbolType_W = 5,
  10044. //iso1unitSymbolType_Wh = 6
  10045. //----- [BODY (3/3)] DC_EVSEStatus -----
  10046. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  10047. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  10048. //iso1isolationLevelType_Invalid = 0,
  10049. //iso1isolationLevelType_Valid = 1,
  10050. //iso1isolationLevelType_Warning = 2,
  10051. //iso1isolationLevelType_Fault = 3,
  10052. //iso1isolationLevelType_No_IMD = 4
  10053. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10054. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  10055. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  10056. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  10057. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  10058. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  10059. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  10060. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  10061. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  10062. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  10063. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  10064. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  10065. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  10066. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  10067. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  10068. //iso1EVSENotificationType_None = 0,
  10069. //iso1EVSENotificationType_StopCharging = 1,
  10070. //iso1EVSENotificationType_ReNegotiation = 2
  10071. }
  10072. /*===========================================================================
  10073. FUNCTION: Proc_din_WeldingDetectionRes
  10074. DESCRIPTION:
  10075. PRE-CONDITION:
  10076. INPUT:
  10077. OUTPUT:
  10078. GLOBAL VARIABLES:
  10079. =============================================================================*/
  10080. int Proc_din_WeldingDetectionRes(int AcceptFd)
  10081. {
  10082. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10083. //if it is not the same, the packet should be ignored.
  10084. //STEP 1: ============ Initialize ============
  10085. //int i = 0;
  10086. int errn = 0;
  10087. bitstream_t v2g_tx_stream;
  10088. static struct WeldingDetectionResponse_DIN70121 *wel;
  10089. static struct ChargingInfoData *sys;
  10090. size_t pos = 0;
  10091. v2g_tx_stream.pos = &pos;
  10092. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10093. v2g_tx_stream.data = V2GTP_Tx_buf;
  10094. wel = &ShmCcsData->V2GMessage_DIN70121.WeldingDetectionResponse;
  10095. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10096. wel->ResponseCode = OK_DIN70121;
  10097. //[HEADER] Check Req SessionID
  10098. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10099. {
  10100. wel->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10101. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10102. errn = -1;
  10103. }
  10104. //Check for SequenceError
  10105. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10106. {
  10107. wel->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10108. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10109. errn = -1;
  10110. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10111. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10112. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10113. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10114. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10115. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10116. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10117. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10118. }
  10119. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10120. SAVE_PhysicalValueType_DIN70121(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  10121. //EVSE Status Code
  10122. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10123. //Check for CSU command of "Stop by EVSE"
  10124. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10125. {
  10126. //wel->ResponseCode = FAILED_DIN70121;
  10127. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10128. }
  10129. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10130. {
  10131. //wel->ResponseCode = FAILED_DIN70121;
  10132. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10133. }
  10134. else if (ShmInternalComm->ChargingPermission == FALSE)
  10135. {
  10136. //wel->ResponseCode = FAILED_DIN70121;
  10137. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10138. }
  10139. //Isolation Status
  10140. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  10141. {
  10142. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  10143. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10144. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10145. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  10146. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10147. Update_V2G_Flow_Status(Other_Fault);
  10148. errn = -1;
  10149. }
  10150. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10151. {
  10152. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10153. }
  10154. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10155. {
  10156. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10157. }
  10158. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10159. {
  10160. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10161. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10162. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10163. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_WeldingDetectionRes]GFD_Fault => Emergency Shutdown");
  10164. Update_V2G_Flow_Status(Other_Fault);
  10165. errn = -1;
  10166. }
  10167. else //GFD_No_IMD or other unexpected status
  10168. {
  10169. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10170. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10171. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10172. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10173. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10174. Update_V2G_Flow_Status(Other_Fault);
  10175. errn = -1;
  10176. }
  10177. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10178. #if PARAMETER_NORMAL_MODE == ENABLE
  10179. SHM_Read_din_WeldingDetectionRes(&ccs_exi_doc_DIN, ShmCcsData);
  10180. #else
  10181. Sudo_Parameter_din_WeldingDetectionRes();
  10182. #endif
  10183. //STEP 4: ============ Encode and Send Response Message ===========
  10184. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10185. {
  10186. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_WeldingDetectionRes][Error]Tx encoded msg error");
  10187. errn = -1;
  10188. }
  10189. //STEP 5: ============ Update Flags ===========
  10190. return errn;
  10191. }
  10192. /*===========================================================================
  10193. FUNCTION: Proc_iso1_WeldingDetectionRes
  10194. DESCRIPTION:
  10195. PRE-CONDITION:
  10196. INPUT:
  10197. OUTPUT:
  10198. GLOBAL VARIABLES:
  10199. =============================================================================*/
  10200. int Proc_iso1_WeldingDetectionRes(int AcceptFd)
  10201. {
  10202. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10203. //if it is not the same, the packet should be ignored.
  10204. //STEP 1: ============ Initialize ============
  10205. //int i = 0;
  10206. int errn = 0;
  10207. bitstream_t v2g_tx_stream;
  10208. static struct WeldingDetectionResponse_ISO15118_2014 *wel;
  10209. static struct ChargingInfoData *sys;
  10210. size_t pos = 0;
  10211. v2g_tx_stream.pos = &pos;
  10212. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10213. v2g_tx_stream.data = V2GTP_Tx_buf;
  10214. wel = &ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionResponse;
  10215. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10216. wel->ResponseCode = OK_ISO15118_2014;
  10217. //[HEADER] Check Req SessionID
  10218. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10219. {
  10220. wel->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10221. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10222. errn = -1;
  10223. }
  10224. //Check for SequenceError
  10225. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10226. {
  10227. wel->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10228. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10229. errn = -1;
  10230. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10231. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10232. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10233. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10234. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10235. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10236. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10237. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10238. }
  10239. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10240. SAVE_PhysicalValueType_ISO15118_2014(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  10241. //EVSE Status Code
  10242. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10243. //Check for CSU command of "Stop by EVSE"
  10244. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10245. {
  10246. //wel->ResponseCode = FAILED_ISO15118_2014;
  10247. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10248. }
  10249. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10250. {
  10251. //wel->ResponseCode = FAILED_ISO15118_2014;
  10252. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10253. }
  10254. else if (ShmInternalComm->ChargingPermission == FALSE)
  10255. {
  10256. //wel->ResponseCode = FAILED_ISO15118_2014;
  10257. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10258. }
  10259. //Isolation Status
  10260. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  10261. {
  10262. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  10263. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10264. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10265. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  10266. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10267. Update_V2G_Flow_Status(Other_Fault);
  10268. errn = -1;
  10269. }
  10270. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10271. {
  10272. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10273. }
  10274. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10275. {
  10276. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10277. }
  10278. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10279. {
  10280. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10281. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10282. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10283. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_WeldingDetectionRes]GFD_Fault => EmergencyShutdown");
  10284. Update_V2G_Flow_Status(Other_Fault);
  10285. errn = -1;
  10286. }
  10287. else
  10288. {
  10289. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10290. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10291. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10292. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10293. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10294. Update_V2G_Flow_Status(Other_Fault);
  10295. errn = -1;
  10296. }
  10297. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10298. #if PARAMETER_NORMAL_MODE == ENABLE
  10299. SHM_Read_iso1_WeldingDetectionRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10300. #else
  10301. Sudo_Parameter_iso1_WeldingDetectionRes();
  10302. #endif
  10303. //STEP 4: ============ Encode and Send Response Message ===========
  10304. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10305. {
  10306. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_WeldingDetectionRes][Error]Tx encoded msg error");
  10307. errn = -1;
  10308. }
  10309. //STEP 5: ============ Update Flags ===========
  10310. return errn;
  10311. }
  10312. /*===========================================================================
  10313. FUNCTION: Proc_din_WeldingDetectionReq
  10314. DESCRIPTION:
  10315. PRE-CONDITION:
  10316. INPUT:
  10317. OUTPUT:
  10318. GLOBAL VARIABLES:
  10319. =============================================================================*/
  10320. int Proc_din_WeldingDetectionReq(int AcceptFd)
  10321. {
  10322. int errn = 0;
  10323. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_WeldingDetectionReq] Got WeldingDetectionReq\n");
  10324. //Print the decoded XML Document
  10325. PRINT_XML_DOC_DIN_WeldingDetectionReq(&ccs_exi_doc_DIN);
  10326. //Save into Share Memory
  10327. SHM_Save_din_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10328. //Check for EV Error Code
  10329. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  10330. errn = Proc_din_WeldingDetectionRes(AcceptFd);
  10331. if (errn == 0)
  10332. {
  10333. //send response successfully.
  10334. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]WeldingDetectionRes");
  10335. }
  10336. else
  10337. {
  10338. sprintf((char*)buf_log_evcomm,
  10339. "[Error][SeccComm][Proc_din_WeldingDetectionReq]Proc_din_WeldingDetectionRes(): %d (DEC)",
  10340. errn);
  10341. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10342. }
  10343. return errn;
  10344. }
  10345. /*===========================================================================
  10346. FUNCTION: Proc_iso1_WeldingDetectionReq
  10347. DESCRIPTION:
  10348. PRE-CONDITION:
  10349. INPUT:
  10350. OUTPUT:
  10351. GLOBAL VARIABLES:
  10352. =============================================================================*/
  10353. int Proc_iso1_WeldingDetectionReq(int AcceptFd)
  10354. {
  10355. int errn = 0;
  10356. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_WeldingDetectionReq] Got WeldingDetectionReq\n");
  10357. //Print the decoded XML Document
  10358. PRINT_XML_DOC_ISO1_WeldingDetectionReq(&ccs_exi_doc_ISO1);
  10359. //Save into Share Memory
  10360. SHM_Save_iso1_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10361. //Check for EV Error Code
  10362. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  10363. errn = Proc_iso1_WeldingDetectionRes(AcceptFd);
  10364. if (errn == 0)
  10365. {
  10366. //send response successfully.
  10367. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]WeldingDetectionRes");
  10368. }
  10369. else
  10370. {
  10371. sprintf((char*)buf_log_evcomm,
  10372. "[Error][SeccComm][Proc_iso1_WeldingDetectionReq]Proc_iso1_WeldingDetectionRes(): %d (DEC)",
  10373. errn);
  10374. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10375. }
  10376. return errn;
  10377. }
  10378. /*===========================================================================
  10379. FUNCTION: SHM_Init_din_SessionStopRes
  10380. DESCRIPTION:
  10381. PRE-CONDITION:
  10382. INPUT:
  10383. 1. shm_ccs
  10384. OUTPUT:
  10385. 1. shm_ccs
  10386. GLOBAL VARIABLES:
  10387. =============================================================================*/
  10388. void SHM_Init_din_SessionStopRes(struct CcsData *shm_ccs)
  10389. {
  10390. struct SessionStopResponse_DIN70121 *in;
  10391. in = &shm_ccs->V2GMessage_DIN70121.SessionStopResponse;
  10392. //----- [BODY (1/3)] ResponseCode -----
  10393. in->ResponseCode = dinresponseCodeType_OK;
  10394. }
  10395. /*===========================================================================
  10396. FUNCTION: Sudo_Parameter_din_SessionStopRes
  10397. DESCRIPTION:
  10398. PRE-CONDITION:
  10399. INPUT:
  10400. OUTPUT:
  10401. GLOBAL VARIABLES:
  10402. =============================================================================*/
  10403. void Sudo_Parameter_din_SessionStopRes()
  10404. {
  10405. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  10406. init_dinSessionStopResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes);
  10407. ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  10408. //----- [BODY (1/3)] ResponseCode -----
  10409. struct dinSessionStopResType *res;
  10410. res = &ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes;
  10411. res->ResponseCode = dinresponseCodeType_OK;
  10412. }
  10413. /*===========================================================================
  10414. FUNCTION: Sudo_Parameter_iso1_SessionStopRes
  10415. DESCRIPTION:
  10416. PRE-CONDITION:
  10417. INPUT:
  10418. OUTPUT:
  10419. GLOBAL VARIABLES:
  10420. =============================================================================*/
  10421. void Sudo_Parameter_iso1_SessionStopRes()
  10422. {
  10423. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  10424. init_iso1SessionStopResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes);
  10425. ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  10426. //----- [BODY (1/3)] ResponseCode -----
  10427. struct iso1SessionStopResType *res;
  10428. res = &ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes;
  10429. res->ResponseCode = iso1responseCodeType_OK;
  10430. }
  10431. /*===========================================================================
  10432. FUNCTION: Proc_din_SessionStopRes
  10433. DESCRIPTION:
  10434. PRE-CONDITION:
  10435. INPUT:
  10436. OUTPUT:
  10437. GLOBAL VARIABLES:
  10438. =============================================================================*/
  10439. int Proc_din_SessionStopRes(int AcceptFd)
  10440. {
  10441. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10442. //if it is not the same, the packet should be ignored.
  10443. //STEP 1: ============ Initialize ============
  10444. //int i = 0;
  10445. int errn = 0;
  10446. bitstream_t v2g_tx_stream;
  10447. struct SessionStopResponse_DIN70121 *stp;
  10448. size_t pos = 0;
  10449. v2g_tx_stream.pos = &pos;
  10450. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10451. v2g_tx_stream.data = V2GTP_Tx_buf;
  10452. stp = &ShmCcsData->V2GMessage_DIN70121.SessionStopResponse;
  10453. stp->ResponseCode = OK_DIN70121;
  10454. //[HEADER] Check Req SessionID
  10455. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10456. {
  10457. stp->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10458. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10459. errn = -1;
  10460. }
  10461. //Check for SequenceError
  10462. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10463. {
  10464. stp->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10465. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10466. errn = -1;
  10467. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10468. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10469. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10470. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10471. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10472. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10473. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10474. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10475. }
  10476. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10477. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10478. #if PARAMETER_NORMAL_MODE == ENABLE
  10479. SHM_Read_din_SessionStopRes(&ccs_exi_doc_DIN, ShmCcsData);
  10480. #else
  10481. Sudo_Parameter_din_SessionStopRes();
  10482. #endif
  10483. //STEP 4: ============ Encode and Send Response Message ===========
  10484. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10485. {
  10486. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes: fail");
  10487. errn = -1;
  10488. }
  10489. else
  10490. {
  10491. //send response successfully.
  10492. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes");
  10493. }
  10494. //STEP 5: ============ Update Flags ===========
  10495. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  10496. //Once this is set, the CSU should
  10497. // =========== Annouce to CSU [To-Be Implemented]=============
  10498. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  10499. // =========== Re-initialized [To-Be Implemented]=============
  10500. //Keep 5% PWM for 2 seconds
  10501. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 2");
  10502. sleep(1);
  10503. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 1");
  10504. sleep(1);
  10505. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 0");
  10506. OutputCpPwmDuty(100);
  10507. //[To-Do] Reset All Share memory
  10508. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  10509. //system("reboot -f");
  10510. //sleep(5);
  10511. //system("reboot -f");
  10512. return errn;
  10513. }
  10514. /*===========================================================================
  10515. FUNCTION: Proc_iso1_SessionStopRes
  10516. DESCRIPTION:
  10517. PRE-CONDITION:
  10518. INPUT:
  10519. OUTPUT:
  10520. GLOBAL VARIABLES:
  10521. =============================================================================*/
  10522. int Proc_iso1_SessionStopRes(int AcceptFd)
  10523. {
  10524. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10525. //if it is not the same, the packet should be ignored.
  10526. //STEP 1: ============ Initialize ============
  10527. //int i = 0;
  10528. int errn = 0;
  10529. bitstream_t v2g_tx_stream;
  10530. struct SessionStopResponse_ISO15118_2014 *stp;
  10531. //struct ChargingInfoData *sys;
  10532. size_t pos = 0;
  10533. v2g_tx_stream.pos = &pos;
  10534. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10535. v2g_tx_stream.data = V2GTP_Tx_buf;
  10536. stp = &ShmCcsData->V2GMessage_ISO15118_2014.SessionStopResponse;
  10537. //sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10538. stp->ResponseCode = OK_ISO15118_2014;
  10539. //[HEADER] Check Req SessionID
  10540. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10541. {
  10542. stp->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10543. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10544. errn = -1;
  10545. }
  10546. //Check for SequenceError
  10547. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10548. {
  10549. stp->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10550. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10551. errn = -1;
  10552. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10553. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10554. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10555. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10556. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10557. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10558. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10559. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10560. }
  10561. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10562. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10563. #if PARAMETER_NORMAL_MODE == ENABLE
  10564. SHM_Read_iso1_SessionStopRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10565. #else
  10566. Sudo_Parameter_iso1_SessionStopRes();
  10567. #endif
  10568. //STEP 4: ============ Encode and Send Response Message ===========
  10569. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10570. {
  10571. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes: fail");
  10572. errn = -1;
  10573. }
  10574. else
  10575. {
  10576. //send response successfully.
  10577. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes");
  10578. }
  10579. //STEP 5: ============ Update Flags ===========
  10580. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  10581. //Once this is set, the CSU should
  10582. // =========== Annouce to CSU [To-Be Implemented]=============
  10583. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  10584. // =========== Re-initialized [To-Be Implemented]=============
  10585. //Keep 5% PWM for 2 seconds
  10586. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 2");
  10587. sleep(1);
  10588. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 1");
  10589. sleep(1);
  10590. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 0");
  10591. OutputCpPwmDuty(100);
  10592. //[To-Do] Reset All Share memory
  10593. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  10594. //system("reboot -f");
  10595. //sleep(5);
  10596. //system("reboot -f");
  10597. return errn;
  10598. }
  10599. /*===========================================================================
  10600. FUNCTION: Proc_din_SessionStopReq
  10601. DESCRIPTION:
  10602. PRE-CONDITION:
  10603. INPUT:
  10604. OUTPUT:
  10605. GLOBAL VARIABLES:
  10606. =============================================================================*/
  10607. int Proc_din_SessionStopReq(int AcceptFd)
  10608. {
  10609. int errn = 0;
  10610. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]SessionStopReq");
  10611. //Print the decoded XML Document
  10612. PRINT_XML_DOC_DIN_SessionStopReq(&ccs_exi_doc_DIN);
  10613. //Save into Share Memory
  10614. SHM_Save_din_SessionStopReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10615. errn = Proc_din_SessionStopRes(AcceptFd);
  10616. if (errn == 0)
  10617. {
  10618. //send response successfully.
  10619. }
  10620. else
  10621. {
  10622. sprintf((char*)buf_log_evcomm,
  10623. "[Error][SeccComm][Proc_din_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  10624. errn);
  10625. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10626. }
  10627. return errn;
  10628. }
  10629. /*===========================================================================
  10630. FUNCTION: Proc_iso1_SessionStopReq
  10631. DESCRIPTION:
  10632. PRE-CONDITION:
  10633. INPUT:
  10634. OUTPUT:
  10635. GLOBAL VARIABLES:
  10636. =============================================================================*/
  10637. int Proc_iso1_SessionStopReq(int AcceptFd)
  10638. {
  10639. int errn = 0;
  10640. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]SessionStopReq");
  10641. //Print the decoded XML Document
  10642. PRINT_XML_DOC_ISO1_SessionStopReq(&ccs_exi_doc_ISO1);
  10643. //Save into Share Memory
  10644. SHM_Save_iso1_SessionStopReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10645. errn = Proc_iso1_SessionStopRes(AcceptFd);
  10646. if (errn == 0)
  10647. {
  10648. //send response successfully.
  10649. }
  10650. else
  10651. {
  10652. sprintf((char*)buf_log_evcomm,
  10653. "[Error][SeccComm][Proc_iso1_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  10654. errn);
  10655. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10656. }
  10657. return errn;
  10658. }
  10659. /*===========================================================================
  10660. FUNCTION: V2gMsg_Process_din
  10661. DESCRIPTION:
  10662. PRE-CONDITION:
  10663. INPUT:
  10664. 1. V2gFlowStatus
  10665. OUTPUT:
  10666. GLOBAL VARIABLES:
  10667. 1. V2gFlowStatus
  10668. =============================================================================*/
  10669. int V2gMsg_Process_din(int AcceptFd)
  10670. {
  10671. unsigned char req_is_responsed = FALSE;
  10672. while (req_is_responsed == FALSE)
  10673. {
  10674. //Check if it is in End_Process
  10675. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  10676. {
  10677. break;
  10678. }
  10679. switch(V2gFlowStatus)
  10680. {
  10681. //-------------------------------------------
  10682. case SupportedAppProtocolRequest:
  10683. {
  10684. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  10685. {
  10686. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  10687. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  10688. {
  10689. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10690. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  10691. }
  10692. else
  10693. {
  10694. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  10695. Update_V2G_Flow_Status(Other_Fault);
  10696. }
  10697. }
  10698. req_is_responsed = TRUE;
  10699. break;
  10700. }
  10701. case SupportedAppProtocolResponse:
  10702. {
  10703. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  10704. {
  10705. Update_V2G_Flow_Status(SessionSetupRequest);
  10706. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10707. }
  10708. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10709. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10710. {
  10711. sprintf((char*)buf_log_evcomm,
  10712. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10713. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10714. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10715. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10716. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10717. }
  10718. else
  10719. {
  10720. }
  10721. break;
  10722. }
  10723. //-------------------------------------------
  10724. case SessionSetupRequest: //19
  10725. {
  10726. if (Proc_din_SessionSetupReq(AcceptFd) == 0)
  10727. {
  10728. Update_V2G_Flow_Status(SessionSetupResponse);
  10729. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10730. }
  10731. else
  10732. {
  10733. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  10734. Update_V2G_Flow_Status(Other_Fault);
  10735. }
  10736. req_is_responsed = TRUE;
  10737. break;
  10738. }
  10739. case SessionSetupResponse: //20
  10740. {
  10741. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  10742. {
  10743. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  10744. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10745. }
  10746. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10747. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10748. {
  10749. sprintf((char*)buf_log_evcomm,
  10750. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10751. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10752. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10753. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10754. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10755. }
  10756. else
  10757. {
  10758. }
  10759. break;
  10760. }
  10761. //-------------------------------------------
  10762. case ServiceDiscoveryRequest: //21
  10763. {
  10764. if (Proc_din_ServiceDiscoveryReq(AcceptFd) == 0)
  10765. {
  10766. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  10767. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10768. }
  10769. else
  10770. {
  10771. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  10772. Update_V2G_Flow_Status(Other_Fault);
  10773. }
  10774. req_is_responsed = TRUE;
  10775. break;
  10776. }
  10777. case ServiceDiscoveryResponse: //22
  10778. {
  10779. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  10780. {
  10781. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  10782. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10783. }
  10784. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10785. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10786. {
  10787. sprintf((char*)buf_log_evcomm, "[ERROR]SequenceError(%d) => Tx Res MSG", EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10788. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10789. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10790. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10791. }
  10792. else
  10793. {
  10794. }
  10795. break;
  10796. }
  10797. //-------------------------------------------
  10798. case ServiceAndPaymentSelectionRequest: //25
  10799. {
  10800. if (Proc_din_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  10801. {
  10802. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  10803. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10804. }
  10805. else
  10806. {
  10807. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  10808. Update_V2G_Flow_Status(Other_Fault);
  10809. }
  10810. req_is_responsed = TRUE;
  10811. break;
  10812. }
  10813. case ServiceAndPaymentSelectionResponse: //26
  10814. {
  10815. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  10816. {
  10817. Update_V2G_Flow_Status(AuthorizationRequest);
  10818. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10819. }
  10820. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10821. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10822. {
  10823. sprintf((char*)buf_log_evcomm,
  10824. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10825. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10826. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10827. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10828. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10829. }
  10830. else
  10831. {
  10832. }
  10833. break;
  10834. }
  10835. //-------------------------------------------
  10836. //case ContractAuthenticationReq:
  10837. case AuthorizationRequest: //29
  10838. {
  10839. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  10840. {
  10841. Update_V2G_Flow_Status(AuthorizationResponse);
  10842. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10843. }
  10844. else
  10845. {
  10846. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  10847. Update_V2G_Flow_Status(Other_Fault);
  10848. }
  10849. req_is_responsed = TRUE;
  10850. break;
  10851. }
  10852. case AuthorizationResponse: //30
  10853. {
  10854. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  10855. {
  10856. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10857. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  10858. {
  10859. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10860. }
  10861. else
  10862. {
  10863. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  10864. Update_V2G_Flow_Status(Other_Fault);
  10865. }
  10866. req_is_responsed = TRUE;
  10867. }
  10868. //Check for ChargeParameterDiscoveryReq
  10869. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  10870. {
  10871. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10872. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  10873. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  10874. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  10875. ftime(&SeqStartTime);
  10876. #endif
  10877. }
  10878. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10879. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10880. {
  10881. sprintf((char*)buf_log_evcomm,
  10882. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10883. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10884. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10885. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10886. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10887. }
  10888. else
  10889. {
  10890. }
  10891. break;
  10892. }
  10893. //-------------------------------------------
  10894. case ChargeParameterDiscoveryRequest: //35
  10895. {
  10896. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  10897. {
  10898. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  10899. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10900. }
  10901. else
  10902. {
  10903. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  10904. Update_V2G_Flow_Status(Other_Fault);
  10905. }
  10906. req_is_responsed = TRUE;
  10907. break;
  10908. }
  10909. case ChargeParameterDiscoveryResponse:
  10910. {
  10911. //STEP 1: Check for Process Timeout
  10912. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  10913. ftime(&SeqEndTime);
  10914. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  10915. {
  10916. sprintf((char*)buf_log_evcomm,
  10917. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  10918. DiffTimeb(SeqStartTime, SeqEndTime),
  10919. V2G_SECC_ChargingParameter_Performance_Time);
  10920. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10921. Update_V2G_Flow_Status(Sequence_Timeout);
  10922. break;
  10923. }
  10924. #endif
  10925. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  10926. {
  10927. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10928. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  10929. {
  10930. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10931. }
  10932. else
  10933. {
  10934. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  10935. Update_V2G_Flow_Status(Other_Fault);
  10936. }
  10937. req_is_responsed = TRUE;
  10938. break;
  10939. }
  10940. //STEP 2: Check for CableCheckReq message
  10941. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  10942. {
  10943. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10944. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  10945. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  10946. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  10947. Update_V2G_Flow_Status(CableCheckRequest);
  10948. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  10949. ftime(&SeqStartTime);
  10950. #endif
  10951. }
  10952. //STEP 3: Wait for PowerDeliveryReq Message
  10953. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  10954. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  10955. {
  10956. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  10957. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10958. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  10959. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  10960. ftime(&SeqStartTime);
  10961. #endif
  10962. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  10963. {
  10964. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  10965. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10966. }
  10967. else
  10968. {
  10969. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  10970. Update_V2G_Flow_Status(Other_Fault);
  10971. }
  10972. }
  10973. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10974. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10975. {
  10976. sprintf((char*)buf_log_evcomm,
  10977. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10978. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10979. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10980. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10981. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10982. }
  10983. else
  10984. {
  10985. }
  10986. break;
  10987. }
  10988. //-------------------------------------------
  10989. case CableCheckRequest: //37
  10990. {
  10991. //STEP 3: Execute Cable Check Process
  10992. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  10993. {
  10994. Update_V2G_Flow_Status(CableCheckResponse);
  10995. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10996. }
  10997. else
  10998. {
  10999. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  11000. Update_V2G_Flow_Status(Other_Fault);
  11001. }
  11002. req_is_responsed = TRUE;
  11003. break;
  11004. }
  11005. case CableCheckResponse: //38
  11006. {
  11007. //STEP 1: Check for Process Timeout
  11008. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11009. ftime(&SeqEndTime);
  11010. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  11011. {
  11012. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  11013. sprintf((char*)buf_log_evcomm,
  11014. "CableCheck Timeout - (%.02lf of %d ms)\n",
  11015. DiffTimeb(SeqStartTime, SeqEndTime),
  11016. V2G_SECC_CableCheck_Performance_Time);
  11017. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11018. Update_V2G_Flow_Status(Sequence_Timeout);
  11019. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11020. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  11021. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11022. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11023. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11024. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  11025. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  11026. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  11027. break;
  11028. }
  11029. #endif
  11030. //STEP 2: Check for CableCheckReq message
  11031. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11032. {
  11033. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11034. //STEP 3: Execute Cable Check Process
  11035. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  11036. {
  11037. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11038. }
  11039. else
  11040. {
  11041. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  11042. Update_V2G_Flow_Status(Other_Fault);
  11043. }
  11044. req_is_responsed = TRUE;
  11045. }
  11046. //STEP 3: Check for PreChargeReq message
  11047. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  11048. {
  11049. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11050. Update_V2G_Flow_Status(PreChargeRequest);
  11051. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  11052. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11053. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  11054. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11055. ftime(&SeqStartTime);
  11056. #endif
  11057. }
  11058. //STEP 3: Wait for PowerDeliveryReq Message
  11059. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11060. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11061. {
  11062. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11063. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11064. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11065. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11066. ftime(&SeqStartTime);
  11067. #endif
  11068. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  11069. {
  11070. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11071. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11072. }
  11073. else
  11074. {
  11075. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11076. Update_V2G_Flow_Status(Other_Fault);
  11077. }
  11078. }
  11079. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11080. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11081. {
  11082. sprintf((char*)buf_log_evcomm,
  11083. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11084. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11085. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11086. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11087. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11088. }
  11089. else
  11090. {
  11091. }
  11092. break;
  11093. }
  11094. //-------------------------------------------
  11095. case PreChargeRequest: //39
  11096. {
  11097. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  11098. {
  11099. Update_V2G_Flow_Status(PreChargeResponse);
  11100. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11101. }
  11102. else
  11103. {
  11104. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  11105. Update_V2G_Flow_Status(Other_Fault);
  11106. }
  11107. req_is_responsed = TRUE;
  11108. break;
  11109. }
  11110. case PreChargeResponse: //40
  11111. {
  11112. //STEP 1: Check for Process Timeout
  11113. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11114. ftime(&SeqEndTime);
  11115. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  11116. {
  11117. sprintf((char*)buf_log_evcomm,
  11118. "Precharge Timeout - (%.02lf of %d ms)\n",
  11119. DiffTimeb(SeqStartTime, SeqEndTime),
  11120. V2G_SECC_PreCharge_Performance_Time);
  11121. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11122. Update_V2G_Flow_Status(Sequence_Timeout);
  11123. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11124. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  11125. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11126. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11127. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11128. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  11129. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11130. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  11131. break;
  11132. }
  11133. #endif
  11134. //STEP 2: Check for PreChargeReq message
  11135. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  11136. {
  11137. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11138. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  11139. {
  11140. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11141. }
  11142. else
  11143. {
  11144. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  11145. Update_V2G_Flow_Status(Other_Fault);
  11146. }
  11147. req_is_responsed = TRUE;
  11148. }
  11149. //STEP 3: Check for PowerDeliveryReq message
  11150. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11151. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11152. {
  11153. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11154. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  11155. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  11156. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11157. ftime(&SeqStartTime);
  11158. #endif
  11159. }
  11160. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11161. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11162. {
  11163. sprintf((char*)buf_log_evcomm,
  11164. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11165. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11166. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11167. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11168. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11169. }
  11170. else
  11171. {
  11172. }
  11173. break;
  11174. }
  11175. //-------------------------------------------
  11176. case PowerDeliveryRequestStart: //41
  11177. {
  11178. if (Proc_din_PowerDeliveryStartReq(AcceptFd) == 0)
  11179. {
  11180. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  11181. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11182. }
  11183. else
  11184. {
  11185. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  11186. Update_V2G_Flow_Status(Other_Fault);
  11187. }
  11188. req_is_responsed = TRUE;
  11189. break;
  11190. }
  11191. case PowerDeliveryResponsetStart: //42
  11192. {
  11193. //STEP 1: Check for Process Timeout
  11194. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11195. if (ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  11196. {
  11197. ftime(&SeqEndTime);
  11198. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  11199. {
  11200. sprintf((char*)buf_log_evcomm,
  11201. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  11202. DiffTimeb(SeqStartTime, SeqEndTime),
  11203. 2000);
  11204. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11205. Update_V2G_Flow_Status(Sequence_Timeout);
  11206. }
  11207. break;
  11208. }
  11209. #endif
  11210. //STEP 2: Wait for CurrentDemandReq Message
  11211. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  11212. {
  11213. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11214. Update_V2G_Flow_Status(CurrentDemandRequest);
  11215. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  11216. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  11217. }
  11218. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11219. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11220. {
  11221. sprintf((char*)buf_log_evcomm,
  11222. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11223. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11224. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11225. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11226. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11227. }
  11228. else
  11229. {
  11230. }
  11231. break;
  11232. }
  11233. //-------------------------------------------
  11234. case CurrentDemandRequest: //45,
  11235. {
  11236. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  11237. {
  11238. Update_V2G_Flow_Status(CurrentDemandResponse);
  11239. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11240. }
  11241. else
  11242. {
  11243. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  11244. Update_V2G_Flow_Status(Other_Fault);
  11245. }
  11246. req_is_responsed = TRUE;
  11247. break;
  11248. }
  11249. case CurrentDemandResponse: //46,
  11250. {
  11251. //STEP 1: Wait for CurrentDemandReq Message
  11252. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  11253. {
  11254. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11255. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  11256. {
  11257. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11258. }
  11259. else
  11260. {
  11261. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  11262. Update_V2G_Flow_Status(Other_Fault);
  11263. }
  11264. req_is_responsed = TRUE;
  11265. break;
  11266. }
  11267. //STEP 2: Wait for PowerDeliveryReq Message
  11268. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11269. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11270. {
  11271. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11272. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11273. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  11274. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11275. ftime(&SeqStartTime);
  11276. #endif
  11277. }
  11278. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11279. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11280. {
  11281. sprintf((char*)buf_log_evcomm,
  11282. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11283. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11284. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11285. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11286. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11287. }
  11288. else
  11289. {
  11290. }
  11291. break;
  11292. }
  11293. //-------------------------------------------
  11294. case PowerDeliveryRequestStop: //49,
  11295. {
  11296. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  11297. {
  11298. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11299. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11300. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11301. ftime(&SeqStartTime);
  11302. #endif
  11303. }
  11304. else
  11305. {
  11306. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11307. Update_V2G_Flow_Status(Other_Fault);
  11308. }
  11309. req_is_responsed = TRUE;
  11310. break;
  11311. }
  11312. case PowerDeliveryResponseStop: //50,
  11313. {
  11314. //STEP 1: Check for Process Timeout
  11315. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11316. ftime(&SeqEndTime);
  11317. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  11318. {
  11319. sprintf((char*)buf_log_evcomm,
  11320. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  11321. DiffTimeb(SeqStartTime, SeqEndTime),
  11322. 2000);
  11323. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11324. Update_V2G_Flow_Status(Sequence_Timeout);
  11325. break;
  11326. }
  11327. #endif
  11328. //STEP 2: Check for WeldingDetectionReq Message
  11329. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  11330. {
  11331. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11332. Update_V2G_Flow_Status(WeldingDetectionRequest);
  11333. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  11334. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  11335. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11336. ftime(&SeqStartTime);
  11337. #endif
  11338. }
  11339. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  11340. {
  11341. Update_V2G_Flow_Status(SessionStopRequest);
  11342. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11343. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  11344. {
  11345. Update_V2G_Flow_Status(SessionStopResponse);
  11346. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11347. }
  11348. else
  11349. {
  11350. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  11351. Update_V2G_Flow_Status(Other_Fault);
  11352. }
  11353. break;
  11354. }
  11355. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11356. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11357. {
  11358. sprintf((char*)buf_log_evcomm,
  11359. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11360. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11361. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11362. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11363. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11364. }
  11365. else
  11366. {
  11367. }
  11368. break;
  11369. }
  11370. //-------------------------------------------
  11371. case WeldingDetectionRequest: //51,
  11372. {
  11373. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  11374. {
  11375. Update_V2G_Flow_Status(WeldingDetectionResponse);
  11376. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11377. }
  11378. else
  11379. {
  11380. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  11381. Update_V2G_Flow_Status(Other_Fault);
  11382. }
  11383. req_is_responsed = TRUE;
  11384. break;
  11385. }
  11386. case WeldingDetectionResponse: //52,
  11387. {
  11388. //STEP 1: Check for Process Timeout
  11389. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11390. ftime(&SeqEndTime);
  11391. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  11392. {
  11393. sprintf((char*)buf_log_evcomm,
  11394. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  11395. DiffTimeb(SeqStartTime, SeqEndTime),
  11396. V2G_SECC_WeldingDetection_Performance_Time);
  11397. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11398. Update_V2G_Flow_Status(Sequence_Timeout);
  11399. break;
  11400. }
  11401. #endif
  11402. //STEP 2: Check for WeldingDetectionReq Message
  11403. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  11404. {
  11405. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11406. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  11407. {
  11408. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11409. }
  11410. else
  11411. {
  11412. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  11413. Update_V2G_Flow_Status(Other_Fault);
  11414. }
  11415. req_is_responsed = TRUE;
  11416. }
  11417. //STEP 3: Check for SessionStopReq Message
  11418. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  11419. {
  11420. Update_V2G_Flow_Status(SessionStopRequest);
  11421. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11422. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  11423. }
  11424. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11425. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11426. {
  11427. sprintf((char*)buf_log_evcomm,
  11428. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11429. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11430. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11431. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11432. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11433. }
  11434. else
  11435. {
  11436. }
  11437. break;
  11438. }
  11439. //-------------------------------------------
  11440. case SessionStopRequest: //53,
  11441. {
  11442. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  11443. {
  11444. Update_V2G_Flow_Status(SessionStopResponse);
  11445. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11446. }
  11447. else
  11448. {
  11449. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  11450. Update_V2G_Flow_Status(Other_Fault);
  11451. }
  11452. req_is_responsed = TRUE;
  11453. break;
  11454. }
  11455. case SessionStopResponse: //54,
  11456. {
  11457. break;
  11458. }
  11459. //-------------------------------------------
  11460. default:
  11461. {
  11462. break;
  11463. }
  11464. }
  11465. }
  11466. return 0;
  11467. }
  11468. /*===========================================================================
  11469. FUNCTION: V2gMsg_Process_iso1_DC
  11470. DESCRIPTION:
  11471. PRE-CONDITION:
  11472. INPUT:
  11473. 1. V2gFlowStatus
  11474. OUTPUT:
  11475. GLOBAL VARIABLES:
  11476. 1. V2gFlowStatus
  11477. =============================================================================*/
  11478. int V2gMsg_Process_iso1_DC(int AcceptFd)
  11479. {
  11480. unsigned char req_is_responsed = FALSE;
  11481. while (req_is_responsed == FALSE)
  11482. {
  11483. //Check if it is in End_Process
  11484. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  11485. {
  11486. break;
  11487. }
  11488. switch(V2gFlowStatus)
  11489. {
  11490. //-------------------------------------------
  11491. case SupportedAppProtocolRequest:
  11492. {
  11493. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  11494. {
  11495. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  11496. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  11497. {
  11498. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11499. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  11500. }
  11501. else
  11502. {
  11503. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  11504. Update_V2G_Flow_Status(Other_Fault);
  11505. }
  11506. }
  11507. req_is_responsed = TRUE;
  11508. break;
  11509. }
  11510. case SupportedAppProtocolResponse:
  11511. {
  11512. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  11513. {
  11514. Update_V2G_Flow_Status(SessionSetupRequest);
  11515. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11516. }
  11517. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11518. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11519. {
  11520. sprintf((char*)buf_log_evcomm,
  11521. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11522. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11523. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11524. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11525. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11526. }
  11527. else
  11528. {
  11529. }
  11530. break;
  11531. }
  11532. //-------------------------------------------
  11533. case SessionSetupRequest: //19
  11534. {
  11535. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  11536. {
  11537. Update_V2G_Flow_Status(SessionSetupResponse);
  11538. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11539. }
  11540. else
  11541. {
  11542. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  11543. Update_V2G_Flow_Status(Other_Fault);
  11544. }
  11545. req_is_responsed = TRUE;
  11546. break;
  11547. }
  11548. case SessionSetupResponse: //20
  11549. {
  11550. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  11551. {
  11552. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  11553. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11554. }
  11555. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11556. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11557. {
  11558. sprintf((char*)buf_log_evcomm,
  11559. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11560. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11561. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11562. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11563. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11564. }
  11565. else
  11566. {
  11567. }
  11568. break;
  11569. }
  11570. //-------------------------------------------
  11571. case ServiceDiscoveryRequest: //21
  11572. {
  11573. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  11574. {
  11575. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  11576. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11577. }
  11578. else
  11579. {
  11580. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  11581. Update_V2G_Flow_Status(Other_Fault);
  11582. }
  11583. req_is_responsed = TRUE;
  11584. break;
  11585. }
  11586. case ServiceDiscoveryResponse: //22
  11587. {
  11588. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  11589. {
  11590. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  11591. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11592. }
  11593. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11594. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11595. {
  11596. sprintf((char*)buf_log_evcomm,
  11597. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11598. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11599. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11600. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11601. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11602. }
  11603. else
  11604. {
  11605. }
  11606. break;
  11607. }
  11608. //-------------------------------------------
  11609. case ServiceAndPaymentSelectionRequest: //25
  11610. {
  11611. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  11612. {
  11613. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  11614. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11615. }
  11616. else
  11617. {
  11618. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  11619. Update_V2G_Flow_Status(Other_Fault);
  11620. }
  11621. req_is_responsed = TRUE;
  11622. break;
  11623. }
  11624. case ServiceAndPaymentSelectionResponse: //26
  11625. {
  11626. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11627. {
  11628. Update_V2G_Flow_Status(AuthorizationRequest);
  11629. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11630. }
  11631. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11632. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11633. {
  11634. sprintf((char*)buf_log_evcomm,
  11635. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11636. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11637. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11638. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11639. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11640. }
  11641. else
  11642. {
  11643. }
  11644. break;
  11645. }
  11646. //-------------------------------------------
  11647. //case ContractAuthenticationReq:
  11648. case AuthorizationRequest: //29
  11649. {
  11650. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  11651. {
  11652. Update_V2G_Flow_Status(AuthorizationResponse);
  11653. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11654. }
  11655. else
  11656. {
  11657. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11658. Update_V2G_Flow_Status(Other_Fault);
  11659. }
  11660. req_is_responsed = TRUE;
  11661. break;
  11662. }
  11663. case AuthorizationResponse: //30
  11664. {
  11665. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11666. {
  11667. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11668. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  11669. {
  11670. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11671. }
  11672. else
  11673. {
  11674. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11675. Update_V2G_Flow_Status(Other_Fault);
  11676. }
  11677. req_is_responsed = TRUE;
  11678. }
  11679. //Check for ChargeParameterDiscoveryReq
  11680. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11681. {
  11682. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11683. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  11684. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  11685. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11686. ftime(&SeqStartTime);
  11687. #endif
  11688. }
  11689. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11690. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11691. {
  11692. sprintf((char*)buf_log_evcomm,
  11693. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11694. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11695. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11696. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11697. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11698. }
  11699. else
  11700. {
  11701. }
  11702. break;
  11703. }
  11704. //-------------------------------------------
  11705. case ChargeParameterDiscoveryRequest: //35
  11706. {
  11707. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11708. {
  11709. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  11710. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11711. }
  11712. else
  11713. {
  11714. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11715. Update_V2G_Flow_Status(Other_Fault);
  11716. }
  11717. req_is_responsed = TRUE;
  11718. break;
  11719. }
  11720. case ChargeParameterDiscoveryResponse:
  11721. {
  11722. //STEP 1: Check for Process Timeout
  11723. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11724. ftime(&SeqEndTime);
  11725. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  11726. {
  11727. sprintf((char*)buf_log_evcomm,
  11728. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  11729. DiffTimeb(SeqStartTime, SeqEndTime),
  11730. V2G_SECC_ChargingParameter_Performance_Time);
  11731. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11732. Update_V2G_Flow_Status(Sequence_Timeout);
  11733. break;
  11734. }
  11735. #endif
  11736. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11737. {
  11738. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11739. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11740. {
  11741. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11742. }
  11743. else
  11744. {
  11745. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11746. Update_V2G_Flow_Status(Other_Fault);
  11747. }
  11748. req_is_responsed = TRUE;
  11749. }
  11750. //STEP 2: Check for CableCheckReq message
  11751. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11752. {
  11753. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11754. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  11755. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  11756. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11757. Update_V2G_Flow_Status(CableCheckRequest);
  11758. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11759. ftime(&SeqStartTime);
  11760. #endif
  11761. }
  11762. //STEP 3: Wait for PowerDeliveryReq Message
  11763. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11764. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11765. {
  11766. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11767. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11768. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11769. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11770. ftime(&SeqStartTime);
  11771. #endif
  11772. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  11773. {
  11774. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11775. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11776. }
  11777. else
  11778. {
  11779. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11780. Update_V2G_Flow_Status(Other_Fault);
  11781. }
  11782. break;
  11783. }
  11784. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11785. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11786. {
  11787. sprintf((char*)buf_log_evcomm,
  11788. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11789. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11790. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11791. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11792. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11793. }
  11794. else
  11795. {
  11796. }
  11797. break;
  11798. }
  11799. //-------------------------------------------
  11800. case CableCheckRequest: //37
  11801. {
  11802. //STEP 3: Execute Cable Check Process
  11803. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  11804. {
  11805. Update_V2G_Flow_Status(CableCheckResponse);
  11806. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11807. }
  11808. else
  11809. {
  11810. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  11811. Update_V2G_Flow_Status(Other_Fault);
  11812. }
  11813. req_is_responsed = TRUE;
  11814. break;
  11815. }
  11816. case CableCheckResponse: //38
  11817. {
  11818. //STEP 1: Check for Process Timeout
  11819. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11820. ftime(&SeqEndTime);
  11821. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  11822. {
  11823. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  11824. sprintf((char*)buf_log_evcomm,
  11825. "CableCheck Timeout - (%.02lf of %d ms)\n",
  11826. DiffTimeb(SeqStartTime, SeqEndTime),
  11827. V2G_SECC_CableCheck_Performance_Time);
  11828. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11829. Update_V2G_Flow_Status(Sequence_Timeout);
  11830. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11831. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  11832. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11833. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11834. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11835. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  11836. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  11837. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  11838. break;
  11839. }
  11840. #endif
  11841. //STEP 2: Check for CableCheckReq message
  11842. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11843. {
  11844. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11845. //STEP 3: Execute Cable Check Process
  11846. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  11847. {
  11848. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11849. }
  11850. else
  11851. {
  11852. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  11853. Update_V2G_Flow_Status(Other_Fault);
  11854. }
  11855. req_is_responsed = TRUE;
  11856. }
  11857. //STEP 3: Check for PreChargeReq message
  11858. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  11859. {
  11860. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11861. Update_V2G_Flow_Status(PreChargeRequest);
  11862. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  11863. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11864. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  11865. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11866. ftime(&SeqStartTime);
  11867. #endif
  11868. }
  11869. //STEP 3: Wait for PowerDeliveryReq Message
  11870. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11871. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11872. {
  11873. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11874. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11875. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11876. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11877. ftime(&SeqStartTime);
  11878. #endif
  11879. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  11880. {
  11881. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11882. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11883. }
  11884. else
  11885. {
  11886. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11887. Update_V2G_Flow_Status(Other_Fault);
  11888. }
  11889. }
  11890. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11891. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11892. {
  11893. sprintf((char*)buf_log_evcomm,
  11894. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11895. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11896. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11897. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11898. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11899. }
  11900. else
  11901. {
  11902. }
  11903. break;
  11904. }
  11905. //-------------------------------------------
  11906. case PreChargeRequest: //39
  11907. {
  11908. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  11909. {
  11910. Update_V2G_Flow_Status(PreChargeResponse);
  11911. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11912. }
  11913. else
  11914. {
  11915. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  11916. Update_V2G_Flow_Status(Other_Fault);
  11917. }
  11918. req_is_responsed = TRUE;
  11919. break;
  11920. }
  11921. case PreChargeResponse: //40
  11922. {
  11923. //STEP 1: Check for Process Timeout
  11924. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11925. ftime(&SeqEndTime);
  11926. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  11927. {
  11928. sprintf((char*)buf_log_evcomm,
  11929. "Precharge Timeout - (%.02lf of %d ms)\n",
  11930. DiffTimeb(SeqStartTime, SeqEndTime),
  11931. V2G_SECC_PreCharge_Performance_Time);
  11932. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11933. Update_V2G_Flow_Status(Sequence_Timeout);
  11934. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11935. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  11936. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11937. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11938. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11939. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  11940. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11941. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  11942. break;
  11943. }
  11944. #endif
  11945. //STEP 2: Check for PreChargeReq message
  11946. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  11947. {
  11948. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11949. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  11950. {
  11951. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11952. }
  11953. else
  11954. {
  11955. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  11956. Update_V2G_Flow_Status(Other_Fault);
  11957. }
  11958. req_is_responsed = TRUE;
  11959. }
  11960. //STEP 3: Check for PowerDeliveryReq message
  11961. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11962. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11963. {
  11964. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11965. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  11966. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  11967. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11968. ftime(&SeqStartTime);
  11969. #endif
  11970. }
  11971. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11972. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11973. {
  11974. sprintf((char*)buf_log_evcomm,
  11975. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11976. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11977. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11978. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11979. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11980. }
  11981. else
  11982. {
  11983. }
  11984. break;
  11985. }
  11986. //-------------------------------------------
  11987. case PowerDeliveryRequestStart: //41
  11988. {
  11989. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  11990. {
  11991. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  11992. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11993. }
  11994. else
  11995. {
  11996. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  11997. Update_V2G_Flow_Status(Other_Fault);
  11998. }
  11999. req_is_responsed = TRUE;
  12000. break;
  12001. }
  12002. case PowerDeliveryResponsetStart: //42
  12003. {
  12004. //STEP 1: Check for Process Timeout
  12005. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12006. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12007. {
  12008. ftime(&SeqEndTime);
  12009. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12010. {
  12011. sprintf((char*)buf_log_evcomm,
  12012. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  12013. DiffTimeb(SeqStartTime, SeqEndTime),
  12014. 2000);
  12015. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12016. Update_V2G_Flow_Status(Sequence_Timeout);
  12017. }
  12018. break;
  12019. }
  12020. #endif
  12021. //STEP 2: Wait for CurrentDemandReq Message
  12022. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12023. {
  12024. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12025. Update_V2G_Flow_Status(CurrentDemandRequest);
  12026. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  12027. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  12028. }
  12029. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12030. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12031. {
  12032. sprintf((char*)buf_log_evcomm,
  12033. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12034. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12035. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12036. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12037. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12038. }
  12039. else
  12040. {
  12041. }
  12042. break;
  12043. }
  12044. //-------------------------------------------
  12045. case CurrentDemandRequest: //45,
  12046. {
  12047. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  12048. {
  12049. Update_V2G_Flow_Status(CurrentDemandResponse);
  12050. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12051. }
  12052. else
  12053. {
  12054. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  12055. Update_V2G_Flow_Status(Other_Fault);
  12056. }
  12057. req_is_responsed = TRUE;
  12058. break;
  12059. }
  12060. case CurrentDemandResponse: //46,
  12061. {
  12062. //STEP 1: Wait for CurrentDemandReq Message
  12063. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12064. {
  12065. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12066. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  12067. {
  12068. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12069. }
  12070. else
  12071. {
  12072. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  12073. Update_V2G_Flow_Status(Other_Fault);
  12074. }
  12075. req_is_responsed = TRUE;
  12076. }
  12077. //STEP 2: Wait for PowerDeliveryReq Message
  12078. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12079. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12080. {
  12081. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12082. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12083. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  12084. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12085. ftime(&SeqStartTime);
  12086. #endif
  12087. }
  12088. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12089. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12090. {
  12091. sprintf((char*)buf_log_evcomm,
  12092. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12093. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12094. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12095. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12096. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12097. }
  12098. else
  12099. {
  12100. }
  12101. break;
  12102. }
  12103. //-------------------------------------------
  12104. case PowerDeliveryRequestStop: //49,
  12105. {
  12106. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12107. {
  12108. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12109. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12110. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12111. ftime(&SeqStartTime);
  12112. #endif
  12113. }
  12114. else
  12115. {
  12116. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12117. Update_V2G_Flow_Status(Other_Fault);
  12118. }
  12119. req_is_responsed = TRUE;
  12120. break;
  12121. }
  12122. case PowerDeliveryResponseStop: //50,
  12123. {
  12124. //STEP 1: Check for Process Timeout
  12125. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12126. ftime(&SeqEndTime);
  12127. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12128. {
  12129. sprintf((char*)buf_log_evcomm,
  12130. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12131. DiffTimeb(SeqStartTime, SeqEndTime),
  12132. 2000);
  12133. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12134. Update_V2G_Flow_Status(Sequence_Timeout);
  12135. break;
  12136. }
  12137. #endif
  12138. //STEP 2: Check for WeldingDetectionReq Message
  12139. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12140. {
  12141. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12142. Update_V2G_Flow_Status(WeldingDetectionRequest);
  12143. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  12144. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  12145. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12146. ftime(&SeqStartTime);
  12147. #endif
  12148. }
  12149. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12150. {
  12151. Update_V2G_Flow_Status(SessionStopRequest);
  12152. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12153. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12154. {
  12155. Update_V2G_Flow_Status(SessionStopResponse);
  12156. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12157. }
  12158. else
  12159. {
  12160. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12161. Update_V2G_Flow_Status(Other_Fault);
  12162. }
  12163. }
  12164. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12165. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12166. {
  12167. sprintf((char*)buf_log_evcomm,
  12168. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12169. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12170. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12171. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12172. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12173. }
  12174. else
  12175. {
  12176. }
  12177. break;
  12178. }
  12179. //-------------------------------------------
  12180. case WeldingDetectionRequest: //51,
  12181. {
  12182. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  12183. {
  12184. Update_V2G_Flow_Status(WeldingDetectionResponse);
  12185. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12186. }
  12187. else
  12188. {
  12189. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  12190. Update_V2G_Flow_Status(Other_Fault);
  12191. }
  12192. req_is_responsed = TRUE;
  12193. break;
  12194. }
  12195. case WeldingDetectionResponse: //52,
  12196. {
  12197. //STEP 1: Check for Process Timeout
  12198. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12199. ftime(&SeqEndTime);
  12200. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  12201. {
  12202. sprintf((char*)buf_log_evcomm,
  12203. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12204. DiffTimeb(SeqStartTime, SeqEndTime),
  12205. V2G_SECC_WeldingDetection_Performance_Time);
  12206. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12207. Update_V2G_Flow_Status(Sequence_Timeout);
  12208. break;
  12209. }
  12210. #endif
  12211. //STEP 2: Check for WeldingDetectionReq Message
  12212. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12213. {
  12214. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12215. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  12216. {
  12217. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12218. }
  12219. else
  12220. {
  12221. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  12222. Update_V2G_Flow_Status(Other_Fault);
  12223. }
  12224. req_is_responsed = TRUE;
  12225. }
  12226. //STEP 3: Check for SessionStopReq Message
  12227. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12228. {
  12229. Update_V2G_Flow_Status(SessionStopRequest);
  12230. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12231. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  12232. }
  12233. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12234. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12235. {
  12236. sprintf((char*)buf_log_evcomm,
  12237. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12238. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12239. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12240. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12241. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12242. }
  12243. else
  12244. {
  12245. }
  12246. break;
  12247. }
  12248. //-------------------------------------------
  12249. case SessionStopRequest: //53,
  12250. {
  12251. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12252. {
  12253. Update_V2G_Flow_Status(SessionStopResponse);
  12254. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12255. }
  12256. else
  12257. {
  12258. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12259. Update_V2G_Flow_Status(Other_Fault);
  12260. }
  12261. req_is_responsed = TRUE;
  12262. break;
  12263. }
  12264. case SessionStopResponse: //54,
  12265. {
  12266. break;
  12267. }
  12268. //-------------------------------------------
  12269. default:
  12270. {
  12271. break;
  12272. }
  12273. }
  12274. }
  12275. return 0;
  12276. }
  12277. /*===========================================================================
  12278. FUNCTION: V2gMsg_Process_iso1_AC
  12279. DESCRIPTION:
  12280. PRE-CONDITION:
  12281. INPUT:
  12282. 1. V2gFlowStatus
  12283. OUTPUT:
  12284. GLOBAL VARIABLES:
  12285. 1. V2gFlowStatus
  12286. =============================================================================*/
  12287. int V2gMsg_Process_iso1_AC(int AcceptFd)
  12288. {
  12289. unsigned char req_is_responsed = FALSE;
  12290. while (req_is_responsed == FALSE)
  12291. {
  12292. //Check if it is in End_Process
  12293. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  12294. {
  12295. break;
  12296. }
  12297. switch(V2gFlowStatus)
  12298. {
  12299. //-------------------------------------------
  12300. case SupportedAppProtocolRequest: //17
  12301. {
  12302. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  12303. {
  12304. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  12305. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  12306. {
  12307. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12308. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  12309. }
  12310. else
  12311. {
  12312. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  12313. Update_V2G_Flow_Status(Other_Fault);
  12314. }
  12315. }
  12316. req_is_responsed = TRUE;
  12317. break;
  12318. }
  12319. case SupportedAppProtocolResponse: //18
  12320. {
  12321. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  12322. {
  12323. Update_V2G_Flow_Status(SessionSetupRequest);
  12324. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12325. }
  12326. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12327. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12328. {
  12329. sprintf((char*)buf_log_evcomm,
  12330. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12331. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12332. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12333. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12334. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12335. }
  12336. else
  12337. {
  12338. }
  12339. break;
  12340. }
  12341. //-------------------------------------------
  12342. case SessionSetupRequest: //19
  12343. {
  12344. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  12345. {
  12346. Update_V2G_Flow_Status(SessionSetupResponse);
  12347. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12348. }
  12349. else
  12350. {
  12351. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  12352. Update_V2G_Flow_Status(Other_Fault);
  12353. }
  12354. req_is_responsed = TRUE;
  12355. break;
  12356. }
  12357. case SessionSetupResponse: //20
  12358. {
  12359. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  12360. {
  12361. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  12362. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12363. }
  12364. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12365. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12366. {
  12367. sprintf((char*)buf_log_evcomm,
  12368. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12369. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12370. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12371. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12372. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12373. }
  12374. else
  12375. {
  12376. }
  12377. break;
  12378. }
  12379. //-------------------------------------------
  12380. case ServiceDiscoveryRequest: //21
  12381. {
  12382. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  12383. {
  12384. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  12385. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12386. }
  12387. else
  12388. {
  12389. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  12390. Update_V2G_Flow_Status(Other_Fault);
  12391. }
  12392. req_is_responsed = TRUE;
  12393. break;
  12394. }
  12395. case ServiceDiscoveryResponse: //22
  12396. {
  12397. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  12398. {
  12399. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  12400. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12401. }
  12402. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12403. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12404. {
  12405. sprintf((char*)buf_log_evcomm,
  12406. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12407. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12408. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12409. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12410. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12411. }
  12412. else
  12413. {
  12414. }
  12415. break;
  12416. }
  12417. //-------------------------------------------
  12418. case ServiceAndPaymentSelectionRequest: //25
  12419. {
  12420. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  12421. {
  12422. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  12423. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12424. }
  12425. else
  12426. {
  12427. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  12428. Update_V2G_Flow_Status(Other_Fault);
  12429. }
  12430. req_is_responsed = TRUE;
  12431. break;
  12432. }
  12433. case ServiceAndPaymentSelectionResponse://26
  12434. {
  12435. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12436. {
  12437. Update_V2G_Flow_Status(AuthorizationRequest);
  12438. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12439. }
  12440. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12441. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12442. {
  12443. sprintf((char*)buf_log_evcomm,
  12444. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12445. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12446. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12447. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12448. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12449. }
  12450. else
  12451. {
  12452. }
  12453. break;
  12454. }
  12455. //-------------------------------------------
  12456. //case ContractAuthenticationReq:
  12457. case AuthorizationRequest: //29
  12458. {
  12459. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  12460. {
  12461. Update_V2G_Flow_Status(AuthorizationResponse);
  12462. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12463. }
  12464. else
  12465. {
  12466. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  12467. Update_V2G_Flow_Status(Other_Fault);
  12468. }
  12469. break;
  12470. }
  12471. case AuthorizationResponse: //30
  12472. {
  12473. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12474. {
  12475. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12476. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  12477. {
  12478. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12479. }
  12480. else
  12481. {
  12482. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  12483. Update_V2G_Flow_Status(Other_Fault);
  12484. }
  12485. req_is_responsed = TRUE;
  12486. }
  12487. //Check for ChargeParameterDiscoveryReq
  12488. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12489. {
  12490. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12491. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  12492. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  12493. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12494. ftime(&SeqStartTime);
  12495. #endif
  12496. }
  12497. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12498. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12499. {
  12500. sprintf((char*)buf_log_evcomm,
  12501. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12502. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12503. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12504. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12505. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12506. }
  12507. else
  12508. {
  12509. }
  12510. break;
  12511. }
  12512. //-------------------------------------------
  12513. case ChargeParameterDiscoveryRequest: //35
  12514. {
  12515. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12516. {
  12517. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  12518. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12519. }
  12520. else
  12521. {
  12522. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  12523. Update_V2G_Flow_Status(Other_Fault);
  12524. }
  12525. req_is_responsed = TRUE;
  12526. break;
  12527. }
  12528. case ChargeParameterDiscoveryResponse: //36
  12529. {
  12530. //STEP 1: Check for Process Timeout
  12531. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12532. ftime(&SeqEndTime);
  12533. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  12534. {
  12535. sprintf((char*)buf_log_evcomm,
  12536. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  12537. DiffTimeb(SeqStartTime, SeqEndTime),
  12538. V2G_SECC_ChargingParameter_Performance_Time);
  12539. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12540. Update_V2G_Flow_Status(Sequence_Timeout);
  12541. break;
  12542. }
  12543. #endif
  12544. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12545. {
  12546. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12547. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12548. {
  12549. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12550. }
  12551. else
  12552. {
  12553. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  12554. Update_V2G_Flow_Status(Other_Fault);
  12555. }
  12556. req_is_responsed = TRUE;
  12557. }
  12558. //STEP 3: Wait for PowerDeliveryReq Message
  12559. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12560. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12561. {
  12562. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  12563. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12564. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12565. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12566. ftime(&SeqStartTime);
  12567. #endif
  12568. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12569. {
  12570. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12571. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12572. }
  12573. else
  12574. {
  12575. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12576. Update_V2G_Flow_Status(Other_Fault);
  12577. }
  12578. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12579. ftime(&SeqStartTime);
  12580. #endif
  12581. }
  12582. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12583. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12584. {
  12585. sprintf((char*)buf_log_evcomm,
  12586. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12587. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12588. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12589. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12590. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12591. }
  12592. else
  12593. {
  12594. }
  12595. break;
  12596. }
  12597. //-------------------------------------------
  12598. case PowerDeliveryRequestStart: //41
  12599. {
  12600. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  12601. {
  12602. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  12603. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12604. }
  12605. else
  12606. {
  12607. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  12608. Update_V2G_Flow_Status(Other_Fault);
  12609. }
  12610. req_is_responsed = TRUE;
  12611. break;
  12612. }
  12613. case PowerDeliveryResponsetStart: //42
  12614. {
  12615. //STEP 1: Check for Process Timeout
  12616. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12617. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12618. {
  12619. ftime(&SeqEndTime);
  12620. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12621. {
  12622. sprintf((char*)buf_log_evcomm,
  12623. "Wait for ChargingStatusReq Timeout - (%.02lf of %d ms)\n",
  12624. DiffTimeb(SeqStartTime, SeqEndTime),
  12625. 2000);
  12626. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12627. Update_V2G_Flow_Status(Sequence_Timeout);
  12628. }
  12629. break;
  12630. }
  12631. #endif
  12632. //STEP 2: Wait for ChargingStatusReq Message
  12633. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  12634. {
  12635. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12636. Update_V2G_Flow_Status(ChargingStatusRequest);
  12637. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargingStatusReq: energy transfering...");
  12638. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_Start);
  12639. }
  12640. else
  12641. {
  12642. }
  12643. break;
  12644. }
  12645. //-------------------------------------------
  12646. case ChargingStatusRequest: //43
  12647. {
  12648. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  12649. {
  12650. Update_V2G_Flow_Status(ChargingStatusResponse);
  12651. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12652. }
  12653. else
  12654. {
  12655. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargingStatusRes: fail");
  12656. Update_V2G_Flow_Status(Other_Fault);
  12657. }
  12658. req_is_responsed = TRUE;
  12659. break;
  12660. }
  12661. case ChargingStatusResponse: //44
  12662. {
  12663. //STEP 1: Wait for ChargingStatusReq Message
  12664. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  12665. {
  12666. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12667. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  12668. {
  12669. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12670. }
  12671. else
  12672. {
  12673. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargingStatusRes: fail");
  12674. Update_V2G_Flow_Status(Other_Fault);
  12675. }
  12676. req_is_responsed = TRUE;
  12677. }
  12678. //STEP 2: Wait for PowerDeliveryReq Message
  12679. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12680. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12681. {
  12682. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12683. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12684. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_End);
  12685. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12686. ftime(&SeqStartTime);
  12687. #endif
  12688. }
  12689. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12690. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12691. {
  12692. sprintf((char*)buf_log_evcomm,
  12693. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12694. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12695. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12696. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12697. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12698. }
  12699. else
  12700. {
  12701. }
  12702. break;
  12703. }
  12704. //-------------------------------------------
  12705. case PowerDeliveryRequestStop: //49
  12706. {
  12707. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12708. {
  12709. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12710. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12711. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12712. ftime(&SeqStartTime);
  12713. #endif
  12714. }
  12715. else
  12716. {
  12717. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12718. Update_V2G_Flow_Status(Other_Fault);
  12719. }
  12720. req_is_responsed = TRUE;
  12721. break;
  12722. }
  12723. case PowerDeliveryResponseStop: //50
  12724. {
  12725. //STEP 1: Check for Process Timeout
  12726. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12727. ftime(&SeqEndTime);
  12728. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12729. {
  12730. sprintf((char*)buf_log_evcomm,
  12731. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12732. DiffTimeb(SeqStartTime, SeqEndTime),
  12733. 2000);
  12734. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12735. Update_V2G_Flow_Status(Sequence_Timeout);
  12736. break;
  12737. }
  12738. #endif
  12739. //STEP 3: Check for SessionStopReq Message
  12740. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12741. {
  12742. Update_V2G_Flow_Status(SessionStopRequest);
  12743. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12744. }
  12745. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12746. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12747. {
  12748. sprintf((char*)buf_log_evcomm,
  12749. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12750. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12751. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12752. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12753. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12754. }
  12755. else
  12756. {
  12757. }
  12758. break;
  12759. }
  12760. //-------------------------------------------
  12761. case SessionStopRequest: //53
  12762. {
  12763. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12764. {
  12765. Update_V2G_Flow_Status(SessionStopResponse);
  12766. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12767. }
  12768. else
  12769. {
  12770. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12771. Update_V2G_Flow_Status(Other_Fault);
  12772. }
  12773. req_is_responsed = TRUE;
  12774. break;
  12775. }
  12776. case SessionStopResponse: //54
  12777. {
  12778. break;
  12779. }
  12780. //-------------------------------------------
  12781. default:
  12782. {
  12783. break;
  12784. }
  12785. }
  12786. }
  12787. return 0;
  12788. }
  12789. /*===========================================================================
  12790. FUNCTION: V2gMsg_Process_iso1
  12791. DESCRIPTION:
  12792. 1. EnergyTransferMode:
  12793. AC_single_phase_core = 0,
  12794. AC_three_phase_core = 1,
  12795. DC_core = 2,
  12796. DC_extended = 3,
  12797. DC_combo_core = 4,
  12798. DC_unique = 5
  12799. iso1EnergyTransferModeType_AC_single_phase_core = 0,
  12800. iso1EnergyTransferModeType_AC_three_phase_core = 1,
  12801. iso1EnergyTransferModeType_DC_core = 2,
  12802. iso1EnergyTransferModeType_DC_extended = 3,
  12803. iso1EnergyTransferModeType_DC_combo_core = 4,
  12804. iso1EnergyTransferModeType_DC_unique = 5
  12805. PRE-CONDITION:
  12806. INPUT:
  12807. 1. V2gFlowStatus
  12808. OUTPUT:
  12809. GLOBAL VARIABLES:
  12810. 1. V2gFlowStatus
  12811. =============================================================================*/
  12812. int V2gMsg_Process_iso1(int AcceptFd, unsigned char EnergyTransferMode)
  12813. {
  12814. switch (EnergyTransferMode)
  12815. {
  12816. case DC_extended:
  12817. {
  12818. V2gMsg_Process_iso1_DC(AcceptFd);
  12819. break;
  12820. }
  12821. case AC_single_phase_core:
  12822. case AC_three_phase_core:
  12823. {
  12824. V2gMsg_Process_iso1_AC(AcceptFd);
  12825. break;
  12826. }
  12827. default:
  12828. {
  12829. sprintf((char*)buf_log_evcomm,
  12830. "[ISO1][Warning]Unexpected EnergyTransferMode(%d)",
  12831. EnergyTransferMode);
  12832. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12833. break;
  12834. }
  12835. }
  12836. return 0;
  12837. }
  12838. /*===========================================================================
  12839. FUNCTION: V2gMsg_Process_iso2_DC
  12840. DESCRIPTION:
  12841. PRE-CONDITION:
  12842. INPUT:
  12843. 1. V2gFlowStatus
  12844. OUTPUT:
  12845. GLOBAL VARIABLES:
  12846. 1. V2gFlowStatus
  12847. =============================================================================*/
  12848. int V2gMsg_Process_iso2_DC(int AcceptFd)
  12849. {
  12850. unsigned char req_is_responsed = FALSE;
  12851. while (req_is_responsed == FALSE)
  12852. {
  12853. //Check if it is in End_Process
  12854. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  12855. {
  12856. break;
  12857. }
  12858. switch(V2gFlowStatus)
  12859. {
  12860. //-------------------------------------------
  12861. case SupportedAppProtocolRequest:
  12862. {
  12863. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  12864. {
  12865. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  12866. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  12867. {
  12868. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12869. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  12870. }
  12871. else
  12872. {
  12873. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  12874. Update_V2G_Flow_Status(Other_Fault);
  12875. }
  12876. }
  12877. req_is_responsed = TRUE;
  12878. break;
  12879. }
  12880. case SupportedAppProtocolResponse:
  12881. {
  12882. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  12883. {
  12884. Update_V2G_Flow_Status(SessionSetupRequest);
  12885. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12886. }
  12887. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12888. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12889. {
  12890. sprintf((char*)buf_log_evcomm,
  12891. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12892. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12893. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12894. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12895. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12896. }
  12897. else
  12898. {
  12899. }
  12900. break;
  12901. }
  12902. //-------------------------------------------
  12903. case SessionSetupRequest: //19
  12904. {
  12905. if (Proc_iso2_SessionSetupReq(AcceptFd) == 0)
  12906. {
  12907. Update_V2G_Flow_Status(SessionSetupResponse);
  12908. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12909. }
  12910. else
  12911. {
  12912. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  12913. Update_V2G_Flow_Status(Other_Fault);
  12914. }
  12915. req_is_responsed = TRUE;
  12916. break;
  12917. }
  12918. case SessionSetupResponse: //20
  12919. {
  12920. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  12921. {
  12922. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  12923. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12924. }
  12925. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12926. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12927. {
  12928. sprintf((char*)buf_log_evcomm,
  12929. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12930. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12931. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12932. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12933. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12934. }
  12935. else
  12936. {
  12937. }
  12938. break;
  12939. }
  12940. #if 0
  12941. //-------------------------------------------
  12942. case ServiceDiscoveryRequest: //21
  12943. {
  12944. if (Proc_iso2_ServiceDiscoveryReq(AcceptFd) == 0)
  12945. {
  12946. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  12947. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12948. }
  12949. else
  12950. {
  12951. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  12952. Update_V2G_Flow_Status(Other_Fault);
  12953. }
  12954. req_is_responsed = TRUE;
  12955. break;
  12956. }
  12957. case ServiceDiscoveryResponse: //22
  12958. {
  12959. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  12960. {
  12961. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  12962. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12963. }
  12964. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12965. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12966. {
  12967. sprintf((char*)buf_log_evcomm,
  12968. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12969. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12970. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12971. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12972. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12973. }
  12974. else
  12975. {
  12976. break;
  12977. }
  12978. }
  12979. //-------------------------------------------
  12980. case ServiceAndPaymentSelectionRequest: //25
  12981. {
  12982. if (Proc_iso2_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  12983. {
  12984. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  12985. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12986. }
  12987. else
  12988. {
  12989. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  12990. Update_V2G_Flow_Status(Other_Fault);
  12991. }
  12992. req_is_responsed = TRUE;
  12993. break;
  12994. }
  12995. case ServiceAndPaymentSelectionResponse: //26
  12996. {
  12997. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12998. {
  12999. Update_V2G_Flow_Status(AuthorizationRequest);
  13000. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13001. }
  13002. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13003. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13004. {
  13005. sprintf((char*)buf_log_evcomm,
  13006. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13007. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13008. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13009. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13010. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13011. }
  13012. else
  13013. {
  13014. break;
  13015. }
  13016. }
  13017. //-------------------------------------------
  13018. //case ContractAuthenticationReq:
  13019. case AuthorizationRequest: //29
  13020. {
  13021. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  13022. {
  13023. Update_V2G_Flow_Status(AuthorizationResponse);
  13024. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13025. }
  13026. else
  13027. {
  13028. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  13029. Update_V2G_Flow_Status(Other_Fault);
  13030. }
  13031. req_is_responsed = TRUE;
  13032. break;
  13033. }
  13034. case AuthorizationResponse: //30
  13035. {
  13036. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13037. {
  13038. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13039. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  13040. {
  13041. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13042. }
  13043. else
  13044. {
  13045. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  13046. Update_V2G_Flow_Status(Other_Fault);
  13047. }
  13048. req_is_responsed = TRUE;
  13049. break;
  13050. }
  13051. //Check for ChargeParameterDiscoveryReq
  13052. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13053. {
  13054. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13055. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  13056. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  13057. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13058. ftime(&SeqStartTime);
  13059. #endif
  13060. }
  13061. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13062. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13063. {
  13064. sprintf((char*)buf_log_evcomm,
  13065. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13066. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13067. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13068. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13069. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13070. }
  13071. else
  13072. {
  13073. break;
  13074. }
  13075. }
  13076. //-------------------------------------------
  13077. case ChargeParameterDiscoveryRequest: //35
  13078. {
  13079. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13080. {
  13081. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  13082. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13083. }
  13084. else
  13085. {
  13086. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  13087. Update_V2G_Flow_Status(Other_Fault);
  13088. }
  13089. req_is_responsed = TRUE;
  13090. break;
  13091. }
  13092. case ChargeParameterDiscoveryResponse:
  13093. {
  13094. //STEP 1: Check for Process Timeout
  13095. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13096. ftime(&SeqEndTime);
  13097. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  13098. {
  13099. sprintf((char*)buf_log_evcomm,
  13100. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  13101. DiffTimeb(SeqStartTime, SeqEndTime),
  13102. V2G_SECC_ChargingParameter_Performance_Time);
  13103. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13104. Update_V2G_Flow_Status(Sequence_Timeout);
  13105. break;
  13106. }
  13107. #endif
  13108. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13109. {
  13110. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13111. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13112. {
  13113. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13114. }
  13115. else
  13116. {
  13117. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  13118. Update_V2G_Flow_Status(Other_Fault);
  13119. }
  13120. req_is_responsed = TRUE;
  13121. break;
  13122. }
  13123. //STEP 2: Check for CableCheckReq message
  13124. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13125. {
  13126. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13127. Update_V2G_Flow_Status(CableCheckRequest);
  13128. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  13129. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  13130. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13131. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13132. ftime(&SeqStartTime);
  13133. #endif
  13134. }
  13135. //STEP 3: Wait for PowerDeliveryReq Message
  13136. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13137. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13138. {
  13139. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13140. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13141. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13142. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13143. ftime(&SeqStartTime);
  13144. #endif
  13145. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13146. {
  13147. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13148. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13149. }
  13150. else
  13151. {
  13152. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13153. Update_V2G_Flow_Status(Other_Fault);
  13154. }
  13155. break;
  13156. }
  13157. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13158. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13159. {
  13160. sprintf((char*)buf_log_evcomm,
  13161. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13162. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13163. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13164. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13165. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13166. }
  13167. else
  13168. {
  13169. break;
  13170. }
  13171. }
  13172. //-------------------------------------------
  13173. case CableCheckRequest: //37
  13174. {
  13175. //STEP 3: Execute Cable Check Process
  13176. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  13177. {
  13178. Update_V2G_Flow_Status(CableCheckResponse);
  13179. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13180. }
  13181. else
  13182. {
  13183. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  13184. Update_V2G_Flow_Status(Other_Fault);
  13185. }
  13186. req_is_responsed = TRUE;
  13187. break;
  13188. }
  13189. case CableCheckResponse: //38
  13190. {
  13191. //STEP 1: Check for Process Timeout
  13192. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13193. ftime(&SeqEndTime);
  13194. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  13195. {
  13196. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  13197. sprintf((char*)buf_log_evcomm,
  13198. "CableCheck Timeout - (%.02lf of %d ms)\n",
  13199. DiffTimeb(SeqStartTime, SeqEndTime),
  13200. V2G_SECC_CableCheck_Performance_Time);
  13201. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13202. Update_V2G_Flow_Status(Sequence_Timeout);
  13203. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13204. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  13205. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13206. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13207. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13208. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13209. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  13210. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  13211. break;
  13212. }
  13213. #endif
  13214. //STEP 2: Check for CableCheckReq message
  13215. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13216. {
  13217. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13218. //STEP 3: Execute Cable Check Process
  13219. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  13220. {
  13221. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13222. }
  13223. else
  13224. {
  13225. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  13226. Update_V2G_Flow_Status(Other_Fault);
  13227. }
  13228. req_is_responsed = TRUE;
  13229. break;
  13230. }
  13231. //STEP 3: Check for PreChargeReq message
  13232. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13233. {
  13234. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13235. Update_V2G_Flow_Status(PreChargeRequest);
  13236. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  13237. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13238. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  13239. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13240. ftime(&SeqStartTime);
  13241. #endif
  13242. }
  13243. //STEP 3: Wait for PowerDeliveryReq Message
  13244. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13245. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13246. {
  13247. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13248. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13249. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13250. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13251. ftime(&SeqStartTime);
  13252. #endif
  13253. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13254. {
  13255. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13256. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13257. }
  13258. else
  13259. {
  13260. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13261. Update_V2G_Flow_Status(Other_Fault);
  13262. }
  13263. break;
  13264. }
  13265. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13266. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13267. {
  13268. sprintf((char*)buf_log_evcomm,
  13269. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13270. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13271. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13272. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13273. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13274. }
  13275. else
  13276. {
  13277. break;
  13278. }
  13279. }
  13280. //-------------------------------------------
  13281. case PreChargeRequest: //39
  13282. {
  13283. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  13284. {
  13285. Update_V2G_Flow_Status(PreChargeResponse);
  13286. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13287. }
  13288. else
  13289. {
  13290. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  13291. Update_V2G_Flow_Status(Other_Fault);
  13292. }
  13293. req_is_responsed = TRUE;
  13294. break;
  13295. }
  13296. case PreChargeResponse: //40
  13297. {
  13298. //STEP 1: Check for Process Timeout
  13299. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13300. ftime(&SeqEndTime);
  13301. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  13302. {
  13303. sprintf((char*)buf_log_evcomm,
  13304. "Precharge Timeout - (%.02lf of %d ms)\n",
  13305. DiffTimeb(SeqStartTime, SeqEndTime),
  13306. V2G_SECC_PreCharge_Performance_Time);
  13307. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13308. Update_V2G_Flow_Status(Sequence_Timeout);
  13309. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13310. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  13311. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13312. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13313. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13314. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13315. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  13316. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  13317. break;
  13318. }
  13319. #endif
  13320. //STEP 2: Check for PreChargeReq message
  13321. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13322. {
  13323. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13324. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  13325. {
  13326. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13327. }
  13328. else
  13329. {
  13330. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  13331. Update_V2G_Flow_Status(Other_Fault);
  13332. }
  13333. req_is_responsed = TRUE;
  13334. break;
  13335. }
  13336. //STEP 3: Check for PowerDeliveryReq message
  13337. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13338. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13339. {
  13340. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13341. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  13342. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  13343. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13344. ftime(&SeqStartTime);
  13345. #endif
  13346. }
  13347. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13348. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13349. {
  13350. sprintf((char*)buf_log_evcomm,
  13351. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13352. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13353. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13354. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13355. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13356. }
  13357. else
  13358. {
  13359. break;
  13360. }
  13361. }
  13362. //-------------------------------------------
  13363. case PowerDeliveryRequestStart: //41
  13364. {
  13365. if (Proc_iso2_PowerDeliveryStartReq(AcceptFd) == 0)
  13366. {
  13367. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  13368. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13369. }
  13370. else
  13371. {
  13372. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  13373. Update_V2G_Flow_Status(Other_Fault);
  13374. }
  13375. req_is_responsed = TRUE;
  13376. break;
  13377. }
  13378. case PowerDeliveryResponsetStart: //42
  13379. {
  13380. //STEP 1: Check for Process Timeout
  13381. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13382. if (ccs_exi_doc_ISO2.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  13383. {
  13384. ftime(&SeqEndTime);
  13385. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  13386. {
  13387. sprintf((char*)buf_log_evcomm,
  13388. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  13389. DiffTimeb(SeqStartTime, SeqEndTime),
  13390. 2000);
  13391. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13392. Update_V2G_Flow_Status(Sequence_Timeout);
  13393. }
  13394. break;
  13395. }
  13396. #endif
  13397. //STEP 2: Wait for CurrentDemandReq Message
  13398. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13399. {
  13400. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13401. Update_V2G_Flow_Status(CurrentDemandRequest);
  13402. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  13403. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  13404. }
  13405. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13406. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13407. {
  13408. sprintf((char*)buf_log_evcomm,
  13409. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13410. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13411. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13412. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13413. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13414. }
  13415. else
  13416. {
  13417. break;
  13418. }
  13419. }
  13420. //-------------------------------------------
  13421. case CurrentDemandRequest: //45,
  13422. {
  13423. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  13424. {
  13425. Update_V2G_Flow_Status(CurrentDemandResponse);
  13426. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13427. }
  13428. else
  13429. {
  13430. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  13431. Update_V2G_Flow_Status(Other_Fault);
  13432. }
  13433. req_is_responsed = TRUE;
  13434. break;
  13435. }
  13436. case CurrentDemandResponse: //46,
  13437. {
  13438. //STEP 1: Wait for CurrentDemandReq Message
  13439. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13440. {
  13441. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13442. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  13443. {
  13444. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13445. }
  13446. else
  13447. {
  13448. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  13449. Update_V2G_Flow_Status(Other_Fault);
  13450. }
  13451. req_is_responsed = TRUE;
  13452. break;
  13453. }
  13454. //STEP 2: Wait for PowerDeliveryReq Message
  13455. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13456. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13457. {
  13458. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13459. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13460. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  13461. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13462. ftime(&SeqStartTime);
  13463. #endif
  13464. }
  13465. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13466. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13467. {
  13468. sprintf((char*)buf_log_evcomm,
  13469. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13470. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13471. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13472. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13473. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13474. }
  13475. else
  13476. {
  13477. break;
  13478. }
  13479. }
  13480. //-------------------------------------------
  13481. case PowerDeliveryRequestStop: //49,
  13482. {
  13483. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13484. {
  13485. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13486. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13487. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13488. ftime(&SeqStartTime);
  13489. #endif
  13490. }
  13491. else
  13492. {
  13493. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13494. Update_V2G_Flow_Status(Other_Fault);
  13495. }
  13496. req_is_responsed = TRUE;
  13497. break;
  13498. }
  13499. case PowerDeliveryResponseStop: //50,
  13500. {
  13501. //STEP 1: Check for Process Timeout
  13502. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13503. ftime(&SeqEndTime);
  13504. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  13505. {
  13506. sprintf((char*)buf_log_evcomm,
  13507. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13508. DiffTimeb(SeqStartTime, SeqEndTime),
  13509. 2000);
  13510. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13511. Update_V2G_Flow_Status(Sequence_Timeout);
  13512. break;
  13513. }
  13514. #endif
  13515. //STEP 2: Check for WeldingDetectionReq Message
  13516. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13517. {
  13518. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13519. Update_V2G_Flow_Status(WeldingDetectionRequest);
  13520. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  13521. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  13522. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13523. ftime(&SeqStartTime);
  13524. #endif
  13525. }
  13526. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13527. {
  13528. Update_V2G_Flow_Status(SessionStopRequest);
  13529. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13530. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  13531. {
  13532. Update_V2G_Flow_Status(SessionStopResponse);
  13533. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13534. }
  13535. else
  13536. {
  13537. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  13538. Update_V2G_Flow_Status(Other_Fault);
  13539. }
  13540. break;
  13541. }
  13542. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13543. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13544. {
  13545. sprintf((char*)buf_log_evcomm,
  13546. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13547. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13548. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13549. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13550. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13551. }
  13552. else
  13553. {
  13554. break;
  13555. }
  13556. }
  13557. //-------------------------------------------
  13558. case WeldingDetectionRequest: //51,
  13559. {
  13560. if (Proc_iso2_WeldingDetectionReq(AcceptFd) == 0)
  13561. {
  13562. Update_V2G_Flow_Status(WeldingDetectionResponse);
  13563. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13564. }
  13565. else
  13566. {
  13567. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  13568. Update_V2G_Flow_Status(Other_Fault);
  13569. }
  13570. req_is_responsed = TRUE;
  13571. break;
  13572. }
  13573. case WeldingDetectionResponse: //52,
  13574. {
  13575. //STEP 1: Check for Process Timeout
  13576. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13577. ftime(&SeqEndTime);
  13578. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  13579. {
  13580. sprintf((char*)buf_log_evcomm,
  13581. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13582. DiffTimeb(SeqStartTime, SeqEndTime),
  13583. V2G_SECC_WeldingDetection_Performance_Time);
  13584. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13585. Update_V2G_Flow_Status(Sequence_Timeout);
  13586. break;
  13587. }
  13588. #endif
  13589. //STEP 2: Check for WeldingDetectionReq Message
  13590. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13591. {
  13592. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13593. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13594. {
  13595. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13596. }
  13597. else
  13598. {
  13599. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  13600. Update_V2G_Flow_Status(Other_Fault);
  13601. }
  13602. req_is_responsed = TRUE;
  13603. break;
  13604. }
  13605. //STEP 3: Check for SessionStopReq Message
  13606. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13607. {
  13608. Update_V2G_Flow_Status(SessionStopRequest);
  13609. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13610. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  13611. }
  13612. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13613. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13614. {
  13615. sprintf((char*)buf_log_evcomm,
  13616. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13617. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13618. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13619. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13620. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13621. }
  13622. else
  13623. {
  13624. break;
  13625. }
  13626. }
  13627. //-------------------------------------------
  13628. case SessionStopRequest: //53,
  13629. {
  13630. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  13631. {
  13632. Update_V2G_Flow_Status(SessionStopResponse);
  13633. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13634. }
  13635. else
  13636. {
  13637. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  13638. Update_V2G_Flow_Status(Other_Fault);
  13639. }
  13640. req_is_responsed = TRUE;
  13641. //break;
  13642. }
  13643. case SessionStopResponse: //54,
  13644. {
  13645. break;
  13646. }
  13647. #endif
  13648. //-------------------------------------------
  13649. default:
  13650. {
  13651. break;
  13652. }
  13653. }
  13654. }
  13655. return 0;
  13656. }
  13657. /*===========================================================================
  13658. FUNCTION: V2gMsg_Process_iso2_AC
  13659. DESCRIPTION:
  13660. PRE-CONDITION:
  13661. INPUT:
  13662. 1. V2gFlowStatus
  13663. OUTPUT:
  13664. GLOBAL VARIABLES:
  13665. 1. V2gFlowStatus
  13666. =============================================================================*/
  13667. int V2gMsg_Process_iso2_AC(int AcceptFd)
  13668. {
  13669. return 0;
  13670. }
  13671. /*===========================================================================
  13672. FUNCTION: V2gMsg_Process_iso2
  13673. DESCRIPTION:
  13674. PRE-CONDITION:
  13675. INPUT:
  13676. 1. V2gFlowStatus
  13677. OUTPUT:
  13678. GLOBAL VARIABLES:
  13679. 1. V2gFlowStatus
  13680. =============================================================================*/
  13681. int V2gMsg_Process_iso2(int AcceptFd, unsigned char EnergyTransferMode)
  13682. {
  13683. switch (EnergyTransferMode)
  13684. {
  13685. case DC_extended:
  13686. {
  13687. V2gMsg_Process_iso2_DC(AcceptFd);
  13688. break;
  13689. }
  13690. case AC_single_phase_core:
  13691. case AC_three_phase_core:
  13692. {
  13693. V2gMsg_Process_iso2_AC(AcceptFd);
  13694. break;
  13695. }
  13696. default:
  13697. {
  13698. sprintf((char*)buf_log_evcomm,
  13699. "[ISO2][Warning]Unexpected EnergyTransferMode(%d)",
  13700. EnergyTransferMode);
  13701. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13702. break;
  13703. }
  13704. }
  13705. return 0;
  13706. }
  13707. /*===========================================================================
  13708. FUNCTION: V2gMsg_Process
  13709. DESCRIPTION:
  13710. PRE-CONDITION:
  13711. INPUT:
  13712. OUTPUT:
  13713. GLOBAL VARIABLES:
  13714. =============================================================================*/
  13715. int V2gMsg_Process(int AcceptFd)
  13716. {
  13717. int errn = 0;
  13718. switch (ShmCcsData->CommProtocol)
  13719. {
  13720. case V2GT_MSG_PROTOCOL_DIN70121: //0
  13721. {
  13722. V2gMsg_Process_din(AcceptFd);
  13723. break;
  13724. }
  13725. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  13726. {
  13727. V2gMsg_Process_iso1(AcceptFd, ShmCcsData->EnergyTransferMode);
  13728. break;
  13729. }
  13730. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  13731. {
  13732. V2gMsg_Process_iso2(AcceptFd, ShmCcsData->EnergyTransferMode);
  13733. break;
  13734. }
  13735. default:
  13736. {
  13737. sprintf((char*)buf_log_evcomm,
  13738. "[Warning]Unexpected CommProtocol(%d)",
  13739. ShmCcsData->CommProtocol);
  13740. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13741. break;
  13742. }
  13743. }
  13744. return errn;
  13745. }
  13746. /*===========================================================================
  13747. FUNCTION: V2gMsg_Rx
  13748. DESCRIPTION:
  13749. PRE-CONDITION:
  13750. INPUT:
  13751. OUTPUT:
  13752. GLOBAL VARIABLES:
  13753. =============================================================================*/
  13754. int V2gMsg_Rx(int AcceptFd)
  13755. {
  13756. int errn = 0;
  13757. unsigned int packet_size = 0;
  13758. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  13759. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  13760. //[CAUTION] Everytime recv() is called, it will take a default time to wait for TCP packets.
  13761. //The more time you call recv(), the more time you will waste here.
  13762. //Here it is suggested that response immediatedly once you receive any packets.
  13763. //For configuring the Rx waiting time, please use setsockopt().
  13764. if(packet_size > 0) //[Joseph] If there is no data, ignore. (TBD)
  13765. {
  13766. //DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got TCP V2GTP Message: size = %d Bytes\n", packet_size);
  13767. errn = V2gMsgDecoder(V2gtpMsgRxBuf, packet_size, V2gFlowStatus);
  13768. if (errn < 0)
  13769. {
  13770. sprintf((char*)buf_log_evcomm, "[ERROR]V2gMsgDecoder (%d)", errn);
  13771. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13772. }
  13773. }
  13774. return errn;
  13775. }
  13776. /*===========================================================================
  13777. FUNCTION: V2gComm
  13778. DESCRIPTION:
  13779. PRE-CONDITION:
  13780. 1. TCP socket is connected.
  13781. INPUT:
  13782. 1. AcceptFd //TCP Connection ID
  13783. 2. V2gtpMsgRxBuf[] //V2GTP Messages (Header + Payload)
  13784. 3. V2GTP_MSG_RX_BUFFER_SIZE //64*1024 = 65,536 = 65.5K (Bytes)
  13785. OUTPUT:
  13786. GLOBAL VARIABLES:
  13787. 1. V2gtpMsgRxBuf[]
  13788. =============================================================================*/
  13789. int V2gComm(int AcceptFd)
  13790. {
  13791. int errn = 0;
  13792. if (V2gMsg_Rx(AcceptFd) < 0)
  13793. {
  13794. Update_V2G_Flow_Status(Other_Fault);
  13795. errn = -1;
  13796. }
  13797. //following are the response message handling according to status flag
  13798. if (V2gMsg_Process(AcceptFd) < 0)
  13799. {
  13800. errn = -1;
  13801. }
  13802. //Error Check
  13803. //V2G_Error_Monitor();
  13804. return errn;
  13805. }
  13806. /*===========================================================================
  13807. FUNCTION: SdpUdpConnected
  13808. DESCRIPTION:
  13809. PRE-CONDITION:
  13810. INPUT:
  13811. OUTPUT:
  13812. GLOBAL VARIABLES:
  13813. =============================================================================*/
  13814. int SdpUdpConnected()
  13815. {
  13816. int packet_size,Rtn;
  13817. struct sockaddr_in6 ServerAddr,ClientAddr;
  13818. struct V2gtpHeader *header;
  13819. unsigned char *payload;
  13820. if(UdpSock <= 0)
  13821. {
  13822. if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
  13823. {
  13824. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SdpUdpConnected: Fail to open UdpSock");
  13825. return 0;
  13826. }
  13827. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  13828. ServerAddr.sin6_family = AF_INET6;
  13829. ServerAddr.sin6_addr = in6addr_any;
  13830. ServerAddr.sin6_port = htons(SdpUdpServerPort);
  13831. if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  13832. {
  13833. sprintf((char*)buf_log_evcomm,
  13834. "SdpUdpConnected: Fail to bind UdpSock(%d)",
  13835. UdpSock);
  13836. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13837. close(UdpSock);
  13838. UdpSock = -1;
  13839. return 0;
  13840. }
  13841. sprintf((char*)buf_log_evcomm, "[UdpSock]opend:%d", UdpSock);
  13842. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13843. sprintf((char*)buf_log_evcomm, "[SDP]Req from EVCC: waiting...(%d)", UdpSock);
  13844. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13845. }
  13846. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  13847. memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
  13848. Rtn = sizeof(struct sockaddr_in6);
  13849. packet_size = recvfrom(UdpSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, (socklen_t *)&Rtn);
  13850. if(packet_size > 0)
  13851. {
  13852. header = (struct V2gtpHeader *) V2gtpMsgRxBuf;
  13853. payload = V2gtpMsgRxBuf+sizeof(struct V2gtpHeader);
  13854. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  13855. {
  13856. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got UDP packet_size = %d (Bytes)\n", packet_size);
  13857. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
  13858. DEBUG_PRINTF_EVCOMM_DETAIL("***** Received SDP Packet *****\n");
  13859. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  13860. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  13861. for(Rtn = 0; Rtn < 16; Rtn += 2)
  13862. {
  13863. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  13864. }
  13865. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  13866. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n",ClientAddr.sin6_port);
  13867. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n",header->ProtocolVersion);
  13868. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n",header->InverseProtocolVersion);
  13869. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n",htons(header->PayloadType));
  13870. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n",htonl(header->PayloadLength));
  13871. DEBUG_PRINTF_EVCOMM_DETAIL("htons(header->PayloadType)=0x%x\n",htons(header->PayloadType));
  13872. }
  13873. #endif
  13874. if( (header->ProtocolVersion == 0x01) &&
  13875. (header->InverseProtocolVersion == 0xFE) &&
  13876. (htons(header->PayloadType) == V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
  13877. {
  13878. sprintf((char*)buf_log_evcomm, "[SDP][Rx]Req from EVCC: GOT(%d)", UdpSock);
  13879. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13880. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", *(payload + 0));
  13881. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", *(payload + 1));
  13882. header->PayloadType = htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
  13883. header->PayloadLength = htonl(20); //Fixed Length=20
  13884. memset(payload, 0, 20);
  13885. // MAC address[0:2] + FFFE + MAC address[3:5]
  13886. payload[0] = (IPV6_LINK_LOCAL_PREFIX>>8) & 0xFF;
  13887. payload[1] = IPV6_LINK_LOCAL_PREFIX & 0xFF;
  13888. payload[8 ]= CsuMac[0];
  13889. payload[8] ^= 0x02;// bit 1 should complemented.
  13890. payload[9] = CsuMac[1];
  13891. payload[10] = CsuMac[2];
  13892. payload[11] = 0xFF;
  13893. payload[12] = 0xFE;
  13894. payload[13] = CsuMac[3];
  13895. payload[14] = CsuMac[4];
  13896. payload[15] = CsuMac[5];
  13897. //TCP port
  13898. payload[16] = (EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active>>8) & 0xFF;
  13899. payload[17] = EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active & 0xFF;
  13900. payload[18] = SDP_PAYLOAD_SECURITY_NONE; //Security
  13901. payload[19] = SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
  13902. //[To-Do] Setup the TCP in advance to receive the coming TCP handshke messages after SDP response.
  13903. Rtn = sendto(UdpSock, V2gtpMsgRxBuf, sizeof(struct V2gtpHeader) + htonl(header->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
  13904. sprintf((char*)buf_log_evcomm, "[SDP][Tx]Res from SECC");
  13905. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13906. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  13907. {
  13908. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response SDP Packet *****\n");
  13909. DEBUG_PRINTF_EVCOMM_DETAIL("Send size=%d\n",Rtn);
  13910. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Address=");
  13911. for(Rtn = 0; Rtn < 16; Rtn++)
  13912. {
  13913. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ", ClientAddr.sin6_addr.s6_addr[Rtn]);
  13914. }
  13915. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  13916. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Port=%d\n", ClientAddr.sin6_port);
  13917. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n", header->ProtocolVersion);
  13918. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n", header->InverseProtocolVersion);
  13919. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n", htons(header->PayloadType));
  13920. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n", htonl(header->PayloadLength));
  13921. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Ipv6 Address=");
  13922. for(Rtn = 0; Rtn < 16; Rtn++)
  13923. {
  13924. DEBUG_PRINTF_EVCOMM_DETAIL("%02x:",payload[Rtn]);
  13925. }
  13926. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  13927. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Port=%d\n", (payload[16]<<8 | payload[17]));
  13928. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", payload[19]);
  13929. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", payload[20]);
  13930. }
  13931. #endif
  13932. if(Rtn > 0)
  13933. {
  13934. return 1;
  13935. }
  13936. }
  13937. }
  13938. return 0;
  13939. }
  13940. /*===========================================================================
  13941. FUNCTION: V2gTcpConnected
  13942. DESCRIPTION:
  13943. PRE-CONDITION:
  13944. INPUT:
  13945. OUTPUT:
  13946. GLOBAL VARIABLES:
  13947. =============================================================================*/
  13948. int V2gTcpConnected()
  13949. {
  13950. int Rtn,AcceptFd;
  13951. struct sockaddr_in6 ServerAddr,ClientAddr;
  13952. if(TcpSock <= 0)
  13953. {
  13954. if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) < 0)
  13955. {
  13956. sprintf((char*)buf_log_evcomm,
  13957. "V2gTcpConnected: Fail to open TcpSock (%s)",
  13958. strerror(errno));
  13959. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13960. usleep(100000); //100ms
  13961. return 0;
  13962. }
  13963. fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
  13964. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]socket set: DONE");
  13965. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  13966. ServerAddr.sin6_family = PF_INET6;
  13967. ServerAddr.sin6_addr = in6addr_any;
  13968. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  13969. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 10) + 1);
  13970. //printf("SdpTcpServerPort = %d(DEC)\n", htons(ServerAddr.sin6_port));
  13971. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  13972. {
  13973. sprintf((char*)buf_log_evcomm,
  13974. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  13975. strerror(errno),
  13976. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  13977. );
  13978. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13979. //Change to another TCP port
  13980. /*
  13981. memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
  13982. ServerAddr.sin6_family = PF_INET6;
  13983. ServerAddr.sin6_addr = in6addr_any;
  13984. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 1000) + 1);
  13985. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  13986. */
  13987. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  13988. {
  13989. sprintf((char*)buf_log_evcomm,
  13990. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  13991. strerror(errno),
  13992. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  13993. );
  13994. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13995. usleep(100000); //100ms
  13996. close(TcpSock);
  13997. TcpSock = -1;
  13998. return 0;
  13999. }
  14000. }
  14001. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]blid: DONE");
  14002. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]listen: START");
  14003. if(listen(TcpSock, 1) == -1) //only accept one connection
  14004. {
  14005. sprintf((char*)buf_log_evcomm,
  14006. "V2gTcpConnected: Fail to listen TcpSock (%s)",
  14007. strerror(errno));
  14008. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14009. usleep(100000); //100ms
  14010. close(TcpSock);
  14011. TcpSock = -1;
  14012. return 0;
  14013. }
  14014. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]listen: DONE");
  14015. sprintf((char*)buf_log_evcomm, "[TCP]TcpSock: opened(%d), port=%d", TcpSock, htons(ServerAddr.sin6_port));
  14016. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14017. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]accept: START");
  14018. }
  14019. Rtn = sizeof(struct sockaddr_in6);
  14020. if((AcceptFd = accept(TcpSock, (struct sockaddr *)&ClientAddr, (socklen_t *)&Rtn)) == -1)
  14021. {
  14022. static BOOL tmp = 0;
  14023. if (tmp == 0)
  14024. {
  14025. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]Wait TCP connection...");
  14026. tmp = 1;
  14027. }
  14028. else
  14029. {
  14030. //DEBUG_PRINTF_EVCOMM_DETAIL(".");
  14031. }
  14032. return 0;
  14033. }
  14034. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]accept: DONE\n");
  14035. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  14036. {
  14037. DEBUG_PRINTF_EVCOMM_DETAIL("\n\nAccept one TCP connection:\n");
  14038. DEBUG_PRINTF_EVCOMM_DETAIL("AcceptFd=%d\n",AcceptFd);
  14039. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  14040. for(Rtn = 0; Rtn < 16; Rtn += 2)
  14041. {
  14042. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:", ClientAddr.sin6_addr.s6_addr[Rtn], ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  14043. }
  14044. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14045. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n", ClientAddr.sin6_port);
  14046. }
  14047. #endif
  14048. return AcceptFd;
  14049. }
  14050. /*===========================================================================
  14051. FUNCTION: End_Process
  14052. DESCRIPTION:
  14053. PRE-CONDITION:
  14054. 1. <CAUTION> This function could only be used in SeccComm fork2.
  14055. INPUT:
  14056. OUTPUT:
  14057. GLOBAL VARIABLES:
  14058. =============================================================================*/
  14059. int End_Process()
  14060. {
  14061. if(EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  14062. {
  14063. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "End_Process has been triggered by another event.");
  14064. return -1;
  14065. }
  14066. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Entering...");
  14067. //STEP 1: Ask CSU to Stop
  14068. EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  14069. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  14070. EVCOMM_SYS_INFO.ConnectorLocked = FALSE;
  14071. ShmInternalComm->ChargingPermission = FALSE;
  14072. //Step 2: Close sockets
  14073. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Close sockets...");
  14074. if(RawSock > 0)
  14075. {
  14076. close(RawSock);
  14077. }
  14078. if(UdpSock > 0)
  14079. {
  14080. close(UdpSock);
  14081. }
  14082. if(TcpSock > 0)
  14083. {
  14084. close(TcpSock);
  14085. close(TcpAcceptFd);
  14086. }
  14087. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  14088. //STEP 3: Switch to State E
  14089. //SwitchCpStateE(ENABLE);
  14090. //STEP 4: Close tcpdump
  14091. Sniffer_Tcpdump(DISABLE);
  14092. //STEP 5: Keep 100% PWM for 5 seconds
  14093. OutputCpPwmDuty(100);
  14094. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 5");
  14095. sleep(1);
  14096. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 4");
  14097. sleep(1);
  14098. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 3");
  14099. sleep(1);
  14100. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 2");
  14101. sleep(1);
  14102. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 1");
  14103. sleep(1);
  14104. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 0");
  14105. AttenProfileCnt = 0;
  14106. init_appHandEXIDocument(&ccs_handshake);
  14107. //Qca7kPowerReset(); //reset QCA7000
  14108. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  14109. {
  14110. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[End_Process]1st sync...");
  14111. system("sync");
  14112. }
  14113. #endif
  14114. //STEP 4: Switch to State E
  14115. //Keep State E for 5 seconds
  14116. #if 0
  14117. SwitchCpStateE(ENABLE); //Set PWM Duty as 0 and set State as E (0V)
  14118. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 5");
  14119. sleep(1);
  14120. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 4");
  14121. sleep(1);
  14122. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 3");
  14123. sleep(1);
  14124. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 2");
  14125. sleep(1);
  14126. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 1");
  14127. sleep(1);
  14128. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 0");
  14129. #endif
  14130. //Reset Memory
  14131. unsigned char SlaveAddress_backup;
  14132. unsigned int matched_backup;
  14133. //unsigned char state_backup;
  14134. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Soft reset (closing SeccComm)...");
  14135. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14136. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "-- EVCOMM: END --");
  14137. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------\n");
  14138. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  14139. {
  14140. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "2nd sync...");
  14141. system("sync");
  14142. }
  14143. #endif
  14144. system("sleep 1");
  14145. //Backup CsuComm flags
  14146. SlaveAddress_backup = ShmInternalComm->SlaveAddress;
  14147. matched_backup = CSUCOMMDC_TASK_FLAG.matched;
  14148. //state_backup = Check_V2G_Flow_Status();
  14149. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  14150. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14151. memset(&ccs_handshake, 0, sizeof(struct appHandEXIDocument));
  14152. memset(&ccs_exi_doc_DIN, 0, sizeof(struct dinEXIDocument));
  14153. memset(V2GTP_Tx_buf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14154. memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  14155. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  14156. memset(ShmInternalComm, 0, sizeof(struct InternalComm));
  14157. memset(ShmCcsData, 0, sizeof(struct CcsData));
  14158. //Resume CsuComm flags
  14159. ShmInternalComm->SlaveAddress = SlaveAddress_backup;
  14160. CSUCOMMDC_TASK_FLAG.matched = matched_backup;
  14161. Sniffer_Candump(DISABLE);
  14162. Sniffer_Candump(ENABLE);
  14163. //memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo)); //EVCOMM_SYS_INFO.End_Process_inused = FALSE;
  14164. //EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  14165. //Update_V2G_Flow_Status(state_backup);
  14166. //CP_Detection_Pid = 0;
  14167. //PP_Detection_Pid = 0;
  14168. //Error_Monitor_Pid = 0;
  14169. //system("cd /root;./reset_soft.sh");
  14170. system("pkill Module_CCS");
  14171. while(1)
  14172. {
  14173. //wait for CSU configrm
  14174. }
  14175. }
  14176. /*===========================================================================
  14177. FUNCTION: Parameters_Init
  14178. DESCRIPTION:
  14179. PRE-CONDITION:
  14180. INPUT:
  14181. OUTPUT:
  14182. GLOBAL VARIABLES:
  14183. =============================================================================*/
  14184. int Parameters_Init()
  14185. {
  14186. //Step 0: Generate random number
  14187. unsigned int value_random;
  14188. struct timeb time_seed;
  14189. ftime(&time_seed);
  14190. srand(time_seed.millitm);
  14191. //Step 1: Init SDP TCP Port
  14192. value_random = rand();
  14193. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active = (unsigned short)(SdpTcpServerPort + (value_random % 10000) + 1);
  14194. sprintf((char*)buf_log_evcomm,
  14195. "[Init]TCP Port:OK(%d)",
  14196. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  14197. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14198. //Step 2: Init SessionID
  14199. value_random = rand();
  14200. memcpy(&EVCOMM_SYS_INFO.SessionID[0], &value_random, 4);
  14201. value_random = rand();
  14202. memcpy(&EVCOMM_SYS_INFO.SessionID[4], &value_random, 4);
  14203. sprintf((char*)buf_log_evcomm,
  14204. "[Init]SessionID:OK(%02X%02X%02X%02X%02X%02X%02X%02X)",
  14205. EVCOMM_SYS_INFO.SessionID[0],
  14206. EVCOMM_SYS_INFO.SessionID[1],
  14207. EVCOMM_SYS_INFO.SessionID[2],
  14208. EVCOMM_SYS_INFO.SessionID[3],
  14209. EVCOMM_SYS_INFO.SessionID[4],
  14210. EVCOMM_SYS_INFO.SessionID[5],
  14211. EVCOMM_SYS_INFO.SessionID[6],
  14212. EVCOMM_SYS_INFO.SessionID[7]);
  14213. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14214. return 0;
  14215. }
  14216. /*===========================================================================
  14217. FUNCTION: main
  14218. DESCRIPTION:
  14219. PRE-CONDITION:
  14220. INPUT:
  14221. OUTPUT:
  14222. GLOBAL VARIABLES:
  14223. =============================================================================*/
  14224. int main(int argc, char *argv[])
  14225. {
  14226. //unsigned char Rtn;
  14227. //Initialization
  14228. ShareMemory_Init();
  14229. memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
  14230. if(RawSock > 0)
  14231. {
  14232. close(RawSock);
  14233. }
  14234. if(UdpSock > 0)
  14235. {
  14236. close(UdpSock);
  14237. }
  14238. if(TcpSock > 0)
  14239. {
  14240. close(TcpSock);
  14241. }
  14242. RawSock = UdpSock = TcpSock = -1;
  14243. Update_V2G_Flow_Status(IDLE);
  14244. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14245. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "-- EVCOMM: START --");
  14246. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14247. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "init...");
  14248. //Init V2G TCP/IPv6 packets buffer
  14249. V2gtpMsgRxBuf = (unsigned char *)malloc(V2GTP_MSG_RX_BUFFER_SIZE);
  14250. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  14251. V2gtpMsgTxBuf = (unsigned char *)malloc(V2GTP_MSG_TX_BUFFER_SIZE);
  14252. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14253. //Release State E Control
  14254. SwitchCpStateE(DISABLE);
  14255. OutputCpPwmDuty(100);
  14256. //start to detect CP pilot state
  14257. CP_Detection_Pid = 0;
  14258. CP_Detection(); //fork1
  14259. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1]CP Detection: ON");
  14260. //start to detect errors
  14261. Error_Monitor(); //fork2
  14262. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Error Monitor: ON");
  14263. //start to detect PP
  14264. PP_Detection_Pid = 0;
  14265. #if (PP_PROTECTION_MECHANISM == ENABLE)
  14266. PP_Detection();
  14267. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork3]PP Detection: ON");
  14268. #else
  14269. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork3]PP Detection: OFF");
  14270. #endif
  14271. //Init communication parameters
  14272. GetEthMac((uint8_t*)QcaInterface, CsuMac);
  14273. AttenProfileCnt = 0;
  14274. init_appHandEXIDocument(&ccs_handshake);
  14275. //Init Energy transfer mode
  14276. //[To-Do] Parsing Model Name
  14277. ShmCcsData->EnergyTransferMode = CCS_ENERGY_TRANSFER_MODE;
  14278. //struct ChargingInfoData *ccs;
  14279. //ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  14280. Parameters_Init();
  14281. Sniffer_Tcpdump(ENABLE);
  14282. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  14283. sleep(1); //wait for tcpdump getting ready
  14284. #endif
  14285. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Init]DONE");
  14286. while(1)
  14287. {
  14288. //DEBUG_PRINTF_EVCOMM_DETAIL("\nV2gFlowStatus = %d\n", V2gFlowStatus);
  14289. //if((ShmInternalComm->ChargingPermission == 0x01) && (CheckConnectorPlugIn() == 1))
  14290. //if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
  14291. //if(ShmInternalComm->ChargingPermission == 0x01)
  14292. //if(CheckConnectorPlugIn() == TRUE)
  14293. if (EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  14294. {
  14295. if(V2gFlowStatus < SLACC_SDP_UDP_Connection)
  14296. {
  14297. SlacComm();
  14298. }
  14299. else if(V2gFlowStatus == SLACC_SDP_UDP_Connection)
  14300. {
  14301. if(SdpUdpConnected() == 1)
  14302. {
  14303. Update_V2G_Flow_Status(SLACC_SDP_TCP_Connection);
  14304. continue;
  14305. }
  14306. SlacComm(); //TC_SECC_VTB_CmSlacMatch_004
  14307. ftime(&SeqEndTime);
  14308. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  14309. {
  14310. sprintf((char*)buf_log_evcomm,
  14311. "Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join (%.02lf of %d ms)\n",
  14312. DiffTimeb(SeqStartTime, SeqEndTime),
  14313. TT_match_join);
  14314. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14315. Update_V2G_Flow_Status(Sequence_Timeout);
  14316. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14317. //CCS_SECC_TIMEOUT_SLACC_SDP_UDP_TT_match_join (023823)
  14318. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14319. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14320. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14321. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14322. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  14323. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  14324. //CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  14325. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  14326. }
  14327. }
  14328. else if(V2gFlowStatus == SLACC_SDP_TCP_Connection)
  14329. {
  14330. if((TcpAcceptFd = V2gTcpConnected()) > 0)
  14331. {
  14332. Update_V2G_Flow_Status(SupportedAppProtocolRequest);
  14333. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14334. continue;
  14335. }
  14336. SlacComm();
  14337. ftime(&SeqEndTime);
  14338. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  14339. {
  14340. sprintf((char*)buf_log_evcomm,
  14341. "Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join (%.02lf / %d ms)",
  14342. DiffTimeb(SeqStartTime, SeqEndTime),
  14343. TT_match_join);
  14344. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14345. Update_V2G_Flow_Status(Sequence_Timeout);
  14346. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14347. //CCS_SECC_TIMEOUT_SLACC_SDP_TCP_TT_match_join (023824)
  14348. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14349. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14350. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14351. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14352. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  14353. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  14354. //CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  14355. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  14356. }
  14357. }
  14358. else if(V2gFlowStatus <= SessionStopResponse)
  14359. {
  14360. if (V2gComm(TcpAcceptFd) < 0)
  14361. {
  14362. //error occours
  14363. }
  14364. }
  14365. else if (V2gFlowStatus >= Performance_Timeout)
  14366. {
  14367. //End_Process
  14368. }
  14369. else
  14370. {
  14371. //null
  14372. }
  14373. }
  14374. } //while
  14375. }//main while