Module_CCS.c 658 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398
  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. uint8_t get_V2G_Status_Name(uint8_t statusCode, char *statusName)
  42. {
  43. int result = PASS;
  44. switch(statusCode)
  45. {
  46. case IDLE:
  47. sprintf(statusName, "IDLE");
  48. break;
  49. case CM_SLAC_PARM_REQ:
  50. sprintf(statusName, "CM_SLAC_PARM_REQ");
  51. break;
  52. case CM_SLAC_PARM_CONF:
  53. sprintf(statusName, "CM_SLAC_PARM_CONF");
  54. break;
  55. case CM_START_ATTEN_CHAR_IND:
  56. sprintf(statusName, "CM_START_ATTEN_CHAR_IND");
  57. break;
  58. case CM_MNBC_SOUND_IND:
  59. sprintf(statusName, "CM_MNBC_SOUND_IND");
  60. break;
  61. case CM_ATTEN_CHAR_IND:
  62. sprintf(statusName, "CM_ATTEN_CHAR_IND");
  63. break;
  64. case CM_ATTEN_CHAR_RSP:
  65. sprintf(statusName, "CM_ATTEN_CHAR_RSP");
  66. break;
  67. case CM_VALIDATE_REQ:
  68. sprintf(statusName, "CM_VALIDATE_REQ");
  69. break;
  70. case CM_VALIDATE_CNF:
  71. sprintf(statusName, "CM_VALIDATE_CNF");
  72. break;
  73. case CM_SLAC_MATCH_REQ:
  74. sprintf(statusName, "CM_SLAC_MATCH_REQ");
  75. break;
  76. case CM_SLAC_MATCH_CNF:
  77. sprintf(statusName, "CM_SLAC_MATCH_CNF");
  78. break;
  79. case CM_AMP_MAP_REQ:
  80. sprintf(statusName, "CM_AMP_MAP_REQ");
  81. break;
  82. case CM_AMP_MAP_CNF:
  83. sprintf(statusName, "CM_AMP_MAP_CNF");
  84. break;
  85. case CM_SET_KEY_REQ:
  86. sprintf(statusName, "CM_SET_KEY_REQ");
  87. break;
  88. case CM_SET_KEY_CNF:
  89. sprintf(statusName, "CM_SET_KEY_CNF");
  90. break;
  91. case SLACC_SDP_UDP_Connection:
  92. sprintf(statusName, "SLACC_SDP_UDP_Connection");
  93. break;
  94. case SLACC_SDP_TCP_Connection:
  95. sprintf(statusName, "SLACC_SDP_TCP_Connection");
  96. break;
  97. case SupportedAppProtocolRequest:
  98. sprintf(statusName, "SupportedAppProtocolRequest");
  99. break;
  100. case SupportedAppProtocolResponse:
  101. sprintf(statusName, "SupportedAppProtocolResponse");
  102. break;
  103. case SessionSetupRequest:
  104. sprintf(statusName, "SessionSetupRequest");
  105. break;
  106. case SessionSetupResponse:
  107. sprintf(statusName, "UnSessionSetupResponseknown");
  108. break;
  109. case ServiceDiscoveryRequest:
  110. sprintf(statusName, "ServiceDiscoveryRequest");
  111. break;
  112. case ServiceDiscoveryResponse:
  113. sprintf(statusName, "ServiceDiscoveryResponse");
  114. break;
  115. case ServiceDetailRequest:
  116. sprintf(statusName, "ServiceDetailRequest");
  117. break;
  118. case ServiceDetailResponse:
  119. sprintf(statusName, "ServiceDetailResponse");
  120. break;
  121. case ServiceAndPaymentSelectionRequest:
  122. sprintf(statusName, "ServiceAndPaymentSelectionRequest");
  123. break;
  124. case ServiceAndPaymentSelectionResponse:
  125. sprintf(statusName, "ServiceAndPaymentSelectionResponse");
  126. break;
  127. case PaymentDetailsRequest:
  128. sprintf(statusName, "PaymentDetailsRequest");
  129. break;
  130. case PaymentDetailsResponse:
  131. sprintf(statusName, "PaymentDetailsResponse");
  132. break;
  133. case AuthorizationRequest:
  134. sprintf(statusName, "AuthorizationRequest");
  135. break;
  136. case AuthorizationResponse:
  137. sprintf(statusName, "AuthorizationResponse");
  138. break;
  139. case CertificateUpdateRequest:
  140. sprintf(statusName, "CertificateUpdateRequest");
  141. break;
  142. case CertificateUpdateResponse:
  143. sprintf(statusName, "CertificateUpdateResponse");
  144. break;
  145. case CertificateInstallationRequest:
  146. sprintf(statusName, "CertificateInstallationRequest");
  147. break;
  148. case CertificateInstallationResponse:
  149. sprintf(statusName, "CertificateInstallationResponse");
  150. break;
  151. case ChargeParameterDiscoveryRequest:
  152. sprintf(statusName, "ChargeParameterDiscoveryRequest");
  153. break;
  154. case ChargeParameterDiscoveryResponse:
  155. sprintf(statusName, "ChargeParameterDiscoveryResponse");
  156. break;
  157. case CableCheckRequest:
  158. sprintf(statusName, "CableCheckRequest");
  159. break;
  160. case CableCheckResponse:
  161. sprintf(statusName, "CableCheckResponse");
  162. break;
  163. case PreChargeRequest:
  164. sprintf(statusName, "PreChargeRequest");
  165. break;
  166. case PreChargeResponse:
  167. sprintf(statusName, "PreChargeResponse");
  168. break;
  169. case PowerDeliveryRequestStart:
  170. sprintf(statusName, "PowerDeliveryRequestStart");
  171. break;
  172. case PowerDeliveryResponsetStart:
  173. sprintf(statusName, "PowerDeliveryResponsetStart");
  174. break;
  175. case ChargingStatusRequest:
  176. sprintf(statusName, "ChargingStatusRequest");
  177. break;
  178. case ChargingStatusResponse:
  179. sprintf(statusName, "ChargingStatusResponse");
  180. break;
  181. case CurrentDemandRequest:
  182. sprintf(statusName, "CurrentDemandRequest");
  183. break;
  184. case CurrentDemandResponse:
  185. sprintf(statusName, "CurrentDemandResponse");
  186. break;
  187. case MeteringReceiptRequest:
  188. sprintf(statusName, "MeteringReceiptRequest");
  189. break;
  190. case MeteringReceiptResponse:
  191. sprintf(statusName, "MeteringReceiptResponse");
  192. break;
  193. case PowerDeliveryRequestStop:
  194. sprintf(statusName, "PowerDeliveryRequestStop");
  195. break;
  196. case PowerDeliveryResponseStop:
  197. sprintf(statusName, "PowerDeliveryResponseStop");
  198. break;
  199. case WeldingDetectionRequest:
  200. sprintf(statusName, "WeldingDetectionRequest");
  201. break;
  202. case WeldingDetectionResponse:
  203. sprintf(statusName, "WeldingDetectionResponse");
  204. break;
  205. case SessionStopRequest:
  206. sprintf(statusName, "SessionStopRequest");
  207. break;
  208. case SessionStopResponse:
  209. sprintf(statusName, "SessionStopResponse");
  210. break;
  211. case Performance_Timeout:
  212. sprintf(statusName, "Performance_Timeout");
  213. break;
  214. case Sequence_Timeout:
  215. sprintf(statusName, "Sequence_Timeout");
  216. break;
  217. case Other_Fault:
  218. sprintf(statusName, "Other_Fault");
  219. break;
  220. default:
  221. sprintf(statusName, "Unknown");
  222. result = FAIL;
  223. break;
  224. }
  225. return result;
  226. }
  227. /*===========================================================================
  228. FUNCTION: Check_V2G_Flow_Status
  229. DESCRIPTION:
  230. PRE-CONDITION:
  231. INPUT:
  232. OUTPUT:
  233. GLOBAL VARIABLES:
  234. =============================================================================*/
  235. unsigned char Check_V2G_Flow_Status()
  236. {
  237. unsigned char result = 0;
  238. switch (ShmCcsData->CommProtocol)
  239. {
  240. case V2GT_MSG_PROTOCOL_DIN70121: //0
  241. {
  242. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  243. break;
  244. }
  245. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  246. {
  247. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  248. break;
  249. }
  250. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  251. {
  252. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  253. break;
  254. }
  255. default:
  256. break;
  257. }
  258. return result;
  259. }
  260. /*===========================================================================
  261. FUNCTION: CAN_Tx_MSG
  262. DESCRIPTION:
  263. PRE-CONDITION:
  264. INPUT:
  265. OUTPUT:
  266. GLOBAL VARIABLES:
  267. =============================================================================*/
  268. int CAN_Tx_MSG(int Fd, unsigned int MsgId, unsigned char SlaveAddress, unsigned char DataLength, unsigned char *SendData)
  269. {
  270. #if 0
  271. struct can_frame frame;
  272. struct timeb StartTime, EndTime;
  273. unsigned int tmp = 0;
  274. int nbytes = 0;
  275. int i = 0;
  276. //Protection: To avoid unexpected length for CAN bus payload.
  277. if (DataLength > 8)
  278. {
  279. DataLength = 8;
  280. }
  281. memset(&frame, 0, sizeof(struct can_frame));
  282. frame.can_id = 0x80000000 | CAN_SEND_DIRECTION | MsgId | SlaveAddress; //0x80000000: extension ID format
  283. frame.can_dlc = DataLength;
  284. memcpy(frame.data, SendData, DataLength);
  285. nbytes = write(Fd, &frame, sizeof(struct can_frame));
  286. #if 0
  287. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][CAN_Tx_MSG] <%X> ", frame.can_id);
  288. for (i = 0; i < frame.can_dlc; i++)
  289. {
  290. DEBUG_PRINTF_EVCOMM_DETAIL("%02X ", frame.data[i]);
  291. }
  292. DEBUG_PRINTF_EVCOMM_DETAIL("(%d Bytes)\n", frame.can_dlc);
  293. #endif
  294. return nbytes;
  295. #else
  296. return -1;
  297. #endif
  298. }
  299. /*===========================================================================
  300. FUNCTION: Proc_EVStopRes
  301. DESCRIPTION:
  302. PRE-CONDITION:
  303. INPUT:
  304. OUTPUT:
  305. GLOBAL VARIABLES:
  306. =============================================================================*/
  307. int Proc_EVStopRes(int Fd)
  308. {
  309. int nbytes;
  310. unsigned char Buffer[8];
  311. memset(Buffer, 0, sizeof(Buffer));
  312. if (CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency == TRUE)
  313. {
  314. Buffer[0] = EV_EMERGENCY_STOP; //2
  315. }
  316. else
  317. {
  318. Buffer[0] = EV_NORMAL_STOP; //1
  319. }
  320. /*
  321. if(strlen(ShmStatusCodeData->PresentStatusCode[0]) > 0)
  322. {
  323. memcpy(Buffer + 2, ShmStatusCodeData->PresentStatusCode[0], 6);
  324. }
  325. */
  326. Buffer[1] = ShmStatusCodeData->PresentStatusCode[0][0];
  327. Buffer[2] = ShmStatusCodeData->PresentStatusCode[0][1];
  328. Buffer[3] = ShmStatusCodeData->PresentStatusCode[0][2];
  329. Buffer[4] = ShmStatusCodeData->PresentStatusCode[0][3];
  330. Buffer[5] = ShmStatusCodeData->PresentStatusCode[0][4];
  331. Buffer[6] = ShmStatusCodeData->PresentStatusCode[0][5];
  332. nbytes = CAN_Tx_MSG(Fd, CAN_CMD_EV_STOP_EVENT, ShmInternalComm->SlaveAddress, 7, Buffer);
  333. //system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); //for test only
  334. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  335. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_EVStopRes] Sending STOP Command to CSU");
  336. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = FALSE;
  337. return nbytes;
  338. }
  339. /*===========================================================================
  340. FUNCTION: Sniffer_Candump
  341. DESCRIPTION:
  342. 1. Only used in End_Process(), which is in fork2 of SeccComm task.
  343. PRE-CONDITION:
  344. INPUT:
  345. OUTPUT:
  346. 0: accept
  347. -1: invalid
  348. GLOBAL VARIABLES:
  349. =============================================================================*/
  350. int Sniffer_Candump(char cmd)
  351. {
  352. #if (CANDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  353. if (cmd == ENABLE)
  354. {
  355. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]init");
  356. system("cd /mnt/;rm -rf candump/");
  357. system("cd /mnt/;mkdir candump");
  358. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]on");
  359. system("cd /mnt/candump;candump -l can0 &");
  360. return 0;
  361. }
  362. else if (cmd == DISABLE)
  363. {
  364. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]off");
  365. system("killall candump");
  366. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]save");
  367. system("cd /;cp -rfv /mnt/candump /Storage/SystemLog/");
  368. return 0;
  369. }
  370. else
  371. {
  372. sprintf((char*)buf_log_evcomm_fork2, "[candump]unexpected cmd(%d)", cmd);
  373. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  374. return -1;
  375. }
  376. #endif
  377. return 0;
  378. }
  379. /*===========================================================================
  380. FUNCTION: Sniffer_Tcpdump
  381. DESCRIPTION:
  382. PRE-CONDITION:
  383. INPUT:
  384. OUTPUT:
  385. GLOBAL VARIABLES:
  386. =============================================================================*/
  387. int Sniffer_Tcpdump(char cmd)
  388. {
  389. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  390. if (cmd == ENABLE)
  391. {
  392. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]init...");
  393. system("cd /mnt/;rm -rf tcpdump/");
  394. system("cd /mnt/;mkdir tcpdump");
  395. unsigned char buf[256];
  396. time_t CurrentTime;
  397. struct tm *tm;
  398. struct timeval tv;
  399. memset(buf, 0, sizeof(buf));
  400. CurrentTime = time(NULL);
  401. tm = localtime(&CurrentTime);
  402. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  403. sprintf((char*)buf,
  404. "tcpdump -i eth1 -w /mnt/tcpdump/[%s][%04d%02d%02d-%02d:%02d:%02d.%06d]packets.pcap&",
  405. FIRMWARE_VERSION,
  406. tm->tm_year + 1900,
  407. tm->tm_mon + 1,
  408. tm->tm_mday,
  409. tm->tm_hour,
  410. tm->tm_min,
  411. tm->tm_sec,
  412. tv.tv_usec
  413. );
  414. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]on");
  415. system(buf);
  416. return 0;
  417. }
  418. else if (cmd == DISABLE)
  419. {
  420. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]off");
  421. system("killall tcpdump");
  422. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]wait: 2s");
  423. sleep(1);
  424. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]wait: 1s");
  425. sleep(1);
  426. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]save");
  427. system("cd /;cp -rfv /mnt/tcpdump /Storage/SystemLog/");
  428. return 0;
  429. }
  430. else
  431. {
  432. sprintf((char*)buf_log_evcomm, "[tcpdump]unexpected cmd(%d)", cmd);
  433. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  434. return -1;
  435. }
  436. #endif
  437. return 0;
  438. }
  439. /*===========================================================================
  440. FUNCTION: Check_V2G_Flow_Status_pre
  441. DESCRIPTION:
  442. PRE-CONDITION:
  443. INPUT:
  444. OUTPUT:
  445. GLOBAL VARIABLES:
  446. =============================================================================*/
  447. unsigned char Check_V2G_Flow_Status_pre()
  448. {
  449. unsigned char result = 0;
  450. switch (ShmCcsData->CommProtocol)
  451. {
  452. case V2GT_MSG_PROTOCOL_DIN70121: //0
  453. {
  454. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre;
  455. break;
  456. }
  457. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  458. {
  459. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre;
  460. break;
  461. }
  462. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  463. {
  464. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre;
  465. break;
  466. }
  467. default:
  468. break;
  469. }
  470. return result;
  471. }
  472. /*===========================================================================
  473. FUNCTION: Update_V2G_Flow_Status
  474. DESCRIPTION:
  475. PRE-CONDITION:
  476. INPUT:
  477. OUTPUT:
  478. 1. V2gFlowStatus
  479. GLOBAL VARIABLES:
  480. 1. V2gFlowStatus
  481. =============================================================================*/
  482. int Update_V2G_Flow_Status(unsigned int state_new)
  483. {
  484. unsigned char state_now;
  485. char nameNow[64], nameNew[64];
  486. state_now = Check_V2G_Flow_Status();
  487. get_V2G_Status_Name(state_now, nameNow);
  488. get_V2G_Status_Name(state_new, nameNew);
  489. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE ||
  490. CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused == TRUE)
  491. {
  492. if (state_now != Performance_Timeout && //253
  493. state_now != Sequence_Timeout && //254
  494. state_now != Other_Fault) //255
  495. {
  496. sprintf((char*)buf_log_evcomm,
  497. "[Warning]state-%s(%d) change: ignored (End_Process_inused:%d, FW_Update_Task_inused:%d)",
  498. nameNew, state_new,
  499. EVCOMM_SYS_INFO.End_Process_inused,
  500. CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused
  501. );
  502. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  503. return -1;
  504. }
  505. }
  506. if (state_now != state_new)
  507. {
  508. //Step 1: Check if Error Occours
  509. if (state_now == Performance_Timeout || //253
  510. state_now == Sequence_Timeout || //254
  511. state_now == Other_Fault) //255
  512. {
  513. if (state_new != IDLE)
  514. {
  515. if (EVCOMM_SYS_INFO.State_Change_Ignored_Notice == FALSE)
  516. {
  517. EVCOMM_SYS_INFO.State_Change_Ignored_Notice = TRUE;
  518. sprintf((char*)buf_log_evcomm,
  519. "[Warning]state-%s(%d) change: ignored(now in error state-%s(%d))",
  520. nameNow, state_new,
  521. nameNew, state_now);
  522. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  523. }
  524. return -1;
  525. }
  526. }
  527. //Updating the state formally.
  528. sprintf((char*)buf_log_evcomm,
  529. "%s(%02d) >> %s(%02d)",
  530. nameNow, state_now,
  531. nameNew, state_new
  532. );
  533. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  534. V2gFlowStatus = state_new;
  535. state_now = state_new;
  536. switch (ShmCcsData->CommProtocol)
  537. {
  538. case V2GT_MSG_PROTOCOL_DIN70121: //0
  539. {
  540. ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  541. ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus = V2gFlowStatus;
  542. break;
  543. }
  544. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  545. {
  546. ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  547. ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus = V2gFlowStatus;
  548. break;
  549. }
  550. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  551. {
  552. ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  553. ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus = V2gFlowStatus;
  554. break;
  555. }
  556. default:
  557. break;
  558. }
  559. }
  560. return 0;
  561. }
  562. double DiffTimeb(struct timeb ST, struct timeb ET)
  563. {
  564. //return milli-second
  565. double StartTime, EndTime;
  566. double t_diff;
  567. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  568. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  569. t_diff = EndTime - StartTime;
  570. if (t_diff < 0)
  571. {
  572. #if 0
  573. if (t_diff < -1000) //1000ms
  574. {
  575. sprintf((char*)buf_log_evcomm,
  576. "[Warning]StartTime(%.02lf) > EndTime(%.02lf), d(%.02lf)",
  577. StartTime,
  578. EndTime,
  579. t_diff);
  580. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  581. }
  582. #endif
  583. return -1;
  584. }
  585. return t_diff;
  586. }
  587. double DiffTimeb_fork1_Error_Monitor(struct timeb ST, struct timeb ET)
  588. {
  589. //return milli-second
  590. static double StartTime, EndTime;
  591. static double t_diff;
  592. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  593. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  594. t_diff = EndTime - StartTime;
  595. if (t_diff < 0)
  596. {
  597. #if 0
  598. if (t_diff < -1000) //1000ms
  599. {
  600. sprintf((char*)buf_log_evcomm_fork2,
  601. "[fork1][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
  602. StartTime,
  603. EndTime,
  604. t_diff);
  605. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  606. }
  607. #endif
  608. return -1;
  609. }
  610. return t_diff;
  611. }
  612. double DiffTimeb_fork2_Error_Monitor(struct timeb ST, struct timeb ET)
  613. {
  614. //return milli-second
  615. static double StartTime, EndTime;
  616. static double t_diff;
  617. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  618. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  619. t_diff = EndTime - StartTime;
  620. if (t_diff < 0)
  621. {
  622. #if 0
  623. if (t_diff < -1000) //1000ms
  624. {
  625. sprintf((char*)buf_log_evcomm_fork2,
  626. "[fork2][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
  627. StartTime,
  628. EndTime,
  629. t_diff);
  630. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  631. }
  632. #endif
  633. return -1;
  634. }
  635. return t_diff;
  636. }
  637. int CreateShareMemory()
  638. {
  639. int MeterSMId;
  640. //create ShmSysConfigAndInfo
  641. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  642. {
  643. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmget ShmSysConfigAndInfo NG");
  644. return 0;
  645. }
  646. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  647. {
  648. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmat ShmSysConfigAndInfo NG");
  649. return 0;
  650. }
  651. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  652. //create ShmStatusCodeData
  653. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  654. {
  655. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmget ShmStatusCodeData NG");
  656. return 0;
  657. }
  658. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  659. {
  660. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmat ShmStatusCodeData NG");
  661. return 0;
  662. }
  663. memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData));
  664. //create ShmCcsData
  665. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  666. {
  667. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmget ShmCcsData NG");
  668. return 0;
  669. }
  670. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  671. {
  672. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[main]CreateShareMemory:shmat ShmCcsData NG");
  673. return 0;
  674. }
  675. memset(ShmCcsData,0,sizeof(struct CcsData));
  676. return 1;
  677. }
  678. /*===========================================================================
  679. FUNCTION: ShareMemory_Init
  680. DESCRIPTION:
  681. PRE-CONDITION:
  682. INPUT:
  683. OUTPUT:
  684. GLOBAL VARIABLES:
  685. =============================================================================*/
  686. int ShareMemory_Init()
  687. {
  688. int MeterSMId;
  689. //create ShmSysConfigAndInfo
  690. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  691. {
  692. DEBUG_ERROR("ShareMemory_Init:shmget ShmSysConfigAndInfo NG");
  693. return 0;
  694. }
  695. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  696. {
  697. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "ShareMemory_Init:shmat ShmSysConfigAndInfo NG");
  698. return 0;
  699. }
  700. //create ShmStatusCodeData
  701. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  702. {
  703. DEBUG_ERROR("ShareMemory_Init:shmget ShmStatusCodeData NG");
  704. return 0;
  705. }
  706. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  707. {
  708. DEBUG_ERROR("ShareMemory_Init:shmat ShmStatusCodeData NG");
  709. return 0;
  710. }
  711. //create ShmCcsData
  712. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  713. {
  714. DEBUG_ERROR("ShareMemory_Init:shmget ShmCcsData NG");
  715. return 0;
  716. }
  717. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  718. {
  719. DEBUG_ERROR("ShareMemory_Init:shmat ShmCcsData NG");
  720. return 0;
  721. }
  722. //create ShmInternalComm
  723. if ((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), IPC_CREAT | 0777)) < 0)
  724. {
  725. DEBUG_ERROR("ShareMemory_Init:shmget ShmInternalComm NG");
  726. return 0;
  727. }
  728. else if ((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  729. {
  730. DEBUG_ERROR("ShareMemory_Init:shmat ShmInternalComm NG");
  731. return 0;
  732. }
  733. //Initial ShmCharger
  734. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0)
  735. {
  736. DEBUG_ERROR("shmget ShmChargerKey NG\r\n");
  737. return 0;
  738. }
  739. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  740. {
  741. DEBUG_ERROR("shmat ShmChargerKey NG\r\n");
  742. return 0;
  743. }
  744. //[To-Do] The initialization here is reduntant and should be removed partially.
  745. //SHM_Init_supportedAppProtocolRes(ShmCcsData);
  746. //SHM_Init_din_SessionSetupRes(ShmCcsData);
  747. //SHM_Init_din_ServiceDiscoveryRes(ShmCcsData);
  748. //SHM_Init_din_ServiceAndPaymentSelectionRes(ShmCcsData);
  749. //SHM_Init_din_ContractAuthenticationRes(ShmCcsData);
  750. SHM_Init_din_ChargeParameterDiscoveryRes(ShmCcsData);
  751. SHM_Init_din_CableCheckRes(ShmCcsData);
  752. SHM_Init_din_PreChargeRes(ShmCcsData);
  753. SHM_Init_din_PowerDeliveryRes(ShmCcsData);
  754. SHM_Init_din_CurrentDemandRes(ShmCcsData);
  755. SHM_Init_din_WeldingDetectionRes(ShmCcsData);
  756. SHM_Init_din_SessionStopRes(ShmCcsData);
  757. return 1;
  758. }
  759. /*===========================================================================
  760. FUNCTION: GetEthMac
  761. DESCRIPTION:
  762. 1. Accessing current CsuMac address, if Eth = eth1
  763. 2. The address of eth1(for QCA7000) is a random number, which will be modified
  764. after each time of booting up system.
  765. PRE-CONDITION:
  766. INPUT:
  767. OUTPUT:
  768. GLOBAL VARIABLES:
  769. =============================================================================*/
  770. int GetEthMac(unsigned char *Eth, unsigned char *mac)
  771. {
  772. //Parameters:MAC,IP,Mask,Gateway
  773. int fd;
  774. unsigned char addr[18], Buffer[128];
  775. memset(Buffer, 0, sizeof(Buffer));
  776. sprintf((char*)Buffer, "cat /sys/class/net/%s/address > /mnt/GetEthInfo", Eth); //CsuMac (Eth = eth1)
  777. system((char*)Buffer);
  778. fd = open("/mnt/GetEthInfo", O_RDONLY);
  779. if(fd < 0)
  780. {
  781. system("rm -f /mnt/GetEthInfo");
  782. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "GetEthMac: MAC Address open error");
  783. return 0;
  784. }
  785. memset(mac, 0, 6);
  786. memset(addr, 0, sizeof(addr));
  787. read(fd, addr, 17);
  788. close(fd);
  789. system("rm -f /mnt/GetEthInfo");
  790. 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)
  791. sprintf((char*)buf_log_evcomm,
  792. "[GetEthMac]EVSE MACAddr(CsuMac): %02x:%02x:%02x:%02x:%02x:%02x",
  793. mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); //CsuMac (Eth = eth1)
  794. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  795. return 1;
  796. }
  797. /*===========================================================================
  798. FUNCTION: ReadAdcVolt
  799. DESCRIPTION:
  800. 1. fork1
  801. PRE-CONDITION:
  802. INPUT:
  803. OUTPUT:
  804. GLOBAL VARIABLES:
  805. =============================================================================*/
  806. float ReadAdcVolt(unsigned char AdcChannel)
  807. {
  808. //AIN0=CCS GUN Temp 1
  809. //AIN1=CCS GUN Temp 2
  810. //AIN2=CCS_Proximity/2
  811. //AIN3=pilot voltage
  812. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  813. return 0;
  814. #else
  815. if(AdcChannel == 3)
  816. {
  817. int fd,count,AvgTimes;
  818. unsigned char SampleBuf[4];
  819. float TmpVolt, MinSample, AvgSample = 0;
  820. fd = open("/sys/bus/iio/devices/iio\\:device0/in_voltage3_raw", O_RDONLY);
  821. if(fd > 0)
  822. {
  823. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  824. for(AvgTimes = 0; AvgTimes < 3; AvgTimes++) //period = 60~91 ms(renice -10, , CurrentDemand())
  825. {
  826. count = 0;
  827. MinSample = 2306;
  828. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  829. while(count < 30) //period = 21~42ms (renice -10, CurrentDemand())
  830. {
  831. //re-sampling period = 3~13ms (renice -10, SLAC())
  832. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  833. read(fd, SampleBuf, 4); //period = 3.2~10ms (renice -10, SLAC())
  834. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  835. TmpVolt = atoi((char*)SampleBuf);
  836. if((TmpVolt < 2306) && (TmpVolt > 0))//positive voltage
  837. {
  838. if(TmpVolt < MinSample)
  839. {
  840. MinSample = TmpVolt;
  841. }
  842. count++;
  843. }
  844. lseek(fd, 0, SEEK_SET);
  845. }
  846. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  847. AvgSample += MinSample;
  848. }
  849. AvgSample /= AvgTimes;
  850. close(fd);
  851. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  852. return ((0.954-(1.8*AvgSample/4095))/0.06);
  853. }
  854. else
  855. {
  856. return -1;
  857. }
  858. }
  859. else
  860. {
  861. FILE *fp;
  862. unsigned char str[64];
  863. unsigned char AdcValue[8];
  864. if(AdcChannel > 7)
  865. {
  866. return -1;
  867. }
  868. memset(str,0,sizeof(str));
  869. memset(AdcValue,0,sizeof(AdcValue));
  870. sprintf((char*)str, "cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw", AdcChannel);
  871. fp=popen((char*)str, "r");
  872. if(fgets((char*)AdcValue,sizeof(AdcValue),fp) == NULL)
  873. {
  874. pclose(fp);
  875. return -1;
  876. }
  877. pclose(fp);
  878. //Vin = Vref *D / (2^n - 1)
  879. return ((float)1.8*(float)atoi((char*)AdcValue))/4095;
  880. }
  881. #endif
  882. }
  883. /*===========================================================================
  884. FUNCTION: ReadAdcVolt
  885. DESCRIPTION:
  886. //AIN0=CCS GUN Temp 1
  887. //AIN1=CCS GUN Temp 2
  888. //AIN2=CCS_Proximity/2
  889. //AIN3=pilot voltage
  890. PRE-CONDITION:
  891. INPUT:
  892. OUTPUT:
  893. GLOBAL VARIABLES:
  894. =============================================================================*/
  895. float ReadAdcVolt_PP_fork3()
  896. {
  897. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  898. return 0;
  899. #else
  900. int fd, AvgTimes;
  901. unsigned char SampleBuf[4];
  902. float TmpVolt = 0;
  903. float AvgSample = 0;
  904. float V_pp = 0;
  905. fd = open("/sys/bus/iio/devices/iio\\:device0/in_voltage2_raw", O_RDONLY); //PP
  906. if(fd > 0)
  907. {
  908. for(AvgTimes = 0; AvgTimes < 5; AvgTimes++) //get 5 samples
  909. {
  910. read(fd, SampleBuf, 4);
  911. TmpVolt = atoi((char*)SampleBuf);
  912. lseek(fd, 0, SEEK_SET);
  913. AvgSample += TmpVolt;
  914. }
  915. close(fd);
  916. AvgSample /= AvgTimes;
  917. V_pp = (3.6*AvgSample)/4095; //PP
  918. #if 0
  919. printf("PP_adc = %.02f, PP_v = %.02f\n", AvgSample, V_pp);
  920. usleep(3000000); //300ms
  921. #endif
  922. usleep(20000); //20ms
  923. return V_pp;
  924. }
  925. else
  926. {
  927. return -1;
  928. }
  929. #endif
  930. }
  931. /*===========================================================================
  932. FUNCTION: Qca7kPowerReset
  933. DESCRIPTION:
  934. PRE-CONDITION:
  935. INPUT:
  936. OUTPUT:
  937. GLOBAL VARIABLES:
  938. =============================================================================*/
  939. void Qca7kPowerReset()
  940. {
  941. printf("\n[CCS Board]Reset QCA7000...\n");
  942. system("echo 1 > /sys/class/gpio/gpio88/value");
  943. usleep(500000);
  944. system("echo 0 > /sys/class/gpio/gpio88/value");
  945. }
  946. /*===========================================================================
  947. FUNCTION: SwitchCpStateE
  948. DESCRIPTION:
  949. PRE-CONDITION:
  950. INPUT:
  951. OUTPUT:
  952. GLOBAL VARIABLES:
  953. =============================================================================*/
  954. int SwitchCpStateE(unsigned char OnOff)
  955. {
  956. /*
  957. * TODO: Request CP change to state E
  958. */
  959. if((OnOff != ENABLE) && (OnOff != DISABLE))
  960. {
  961. return -1;
  962. }
  963. struct ChargingInfoData *ccs;
  964. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  965. ccs->SwitchCpStateE_status = OnOff;
  966. //OnOff = 1 => switch State to E
  967. //OnOff = 0 => return noraml
  968. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  969. {
  970. if(OnOff == DISABLE)
  971. {
  972. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: released\n");
  973. CSUCOMMAC_SHM.CpSetStateE = DISABLE;
  974. }
  975. else
  976. {
  977. OutputCpPwmDuty(100); //set CP duty as 100, firstly.
  978. CSUCOMMAC_SHM.CpSetStateE = ENABLE;
  979. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: enabled!\n");
  980. }
  981. }
  982. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  983. {
  984. if(OnOff == DISABLE)
  985. {
  986. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: released\n");
  987. system("echo 0 > /sys/class/gpio/gpio86/value");
  988. }
  989. else
  990. {
  991. OutputCpPwmDuty(100); //set CP duty as 100, firstly.
  992. system("echo 1 > /sys/class/gpio/gpio86/value");
  993. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: enabled!\n");
  994. }
  995. }
  996. #endif
  997. if (ccs->SwitchCpStateE_status_pre != ccs->SwitchCpStateE_status)
  998. {
  999. sprintf((char*)buf_log_evcomm,
  1000. "SwitchCpStateE: %d >> %d",
  1001. ccs->SwitchCpStateE_status_pre,
  1002. ccs->SwitchCpStateE_status
  1003. );
  1004. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  1005. ccs->SwitchCpStateE_status_pre = ccs->SwitchCpStateE_status;
  1006. }
  1007. return 0;
  1008. }
  1009. /*===========================================================================
  1010. FUNCTION: OutputCpPwmDuty
  1011. DESCRIPTION:
  1012. PRE-CONDITION:
  1013. INPUT:
  1014. OUTPUT:
  1015. GLOBAL VARIABLES:
  1016. =============================================================================*/
  1017. int OutputCpPwmDuty(unsigned char Duty)
  1018. {
  1019. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  1020. int DutyInNanoSec;
  1021. #endif
  1022. struct ChargingInfoData *ccs;
  1023. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1024. if((Duty < 0)||(Duty > 100))
  1025. {
  1026. return -1;
  1027. }
  1028. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  1029. {
  1030. CSUCOMMAC_SHM.CpSetPWMDuty = Duty;
  1031. }
  1032. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  1033. {
  1034. DutyInNanoSec = 10000 * Duty;
  1035. sprintf((char*)buf_log_evcomm, "echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle", DutyInNanoSec);//nanoseconds
  1036. system((char*)buf_log_evcomm);
  1037. }
  1038. #endif
  1039. ccs->CpDuty = Duty;
  1040. //CP Duty
  1041. if (ccs->CpDuty != ccs->CpDuty_pre)
  1042. {
  1043. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  1044. sprintf((char*)buf_log_evcomm, "CP Duty: %d %% >> %d %%", ccs->CpDuty_pre, ccs->CpDuty);
  1045. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  1046. ccs->CpDuty_pre = ccs->CpDuty;
  1047. }
  1048. return 0;
  1049. }
  1050. /*===========================================================================
  1051. FUNCTION: Check_Plugin_Status_Update_fork1
  1052. DESCRIPTION:
  1053. PRE-CONDITION:
  1054. INPUT:
  1055. OUTPUT:
  1056. GLOBAL VARIABLES:
  1057. =============================================================================*/
  1058. //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  1059. void Check_Plugin_Status_Update_fork1(struct ChargingInfoData *ccs)
  1060. {
  1061. if (ccs->ConnectorPlugIn != ccs->ConnectorPlugIn_new)
  1062. {
  1063. sprintf((char*)buf_log_evcomm_fork1, "[fork1]Plugin: %d >> %d (CP=%.2fV, PP=%.2fV)",
  1064. ccs->ConnectorPlugIn,
  1065. ccs->ConnectorPlugIn_new,
  1066. ccs->CpVoltage,
  1067. ccs->PpVoltage
  1068. );
  1069. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1070. ccs->ConnectorPlugIn_pre = ccs->ConnectorPlugIn;
  1071. ccs->ConnectorPlugIn = ccs->ConnectorPlugIn_new;
  1072. //ccs->CpVoltage_pre = ccs->CpVoltage;
  1073. }
  1074. }
  1075. //#endif
  1076. /*===========================================================================
  1077. FUNCTION: ConnectorPlugIn
  1078. DESCRIPTION:
  1079. PRE-CONDITION:
  1080. INPUT:
  1081. OUTPUT:
  1082. 0: Unplug
  1083. 1: Plug-in
  1084. GLOBAL VARIABLES:
  1085. =============================================================================*/
  1086. int CheckConnectorPlugIn()
  1087. {
  1088. /*
  1089. * TODO: Return connector status depedon CP
  1090. */
  1091. static struct ChargingInfoData *ccs;
  1092. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1093. #if (CP_PROTECTION_MECHANISM == ENABLE)
  1094. return (int)ccs->ConnectorPlugIn;
  1095. #else
  1096. return TRUE;
  1097. #endif
  1098. }
  1099. /*===========================================================================
  1100. FUNCTION: Check_CP_State_Error_fork1
  1101. DESCRIPTION:
  1102. PRE-CONDITION:
  1103. INPUT:
  1104. OUTPUT:
  1105. GLOBAL VARIABLES:
  1106. =============================================================================*/
  1107. int Check_CP_State_Error_fork1(struct ChargingInfoData *ccs)
  1108. {
  1109. #if (CP_PROTECTION_MECHANISM == DISABLE)
  1110. {
  1111. return -1;
  1112. }
  1113. #endif
  1114. unsigned char state = 0;
  1115. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  1116. double time_diff = 0;
  1117. #endif
  1118. state = Check_V2G_Flow_Status();
  1119. //SLAC, SLAAC, SDP, ..., ChargeParameterDiscovery
  1120. if (state >= CM_SLAC_PARM_CONF && //by considering 15118(SLAC first)
  1121. state < ChargeParameterDiscoveryRequest &&
  1122. state != IDLE &&
  1123. state != CM_SET_KEY_REQ &&
  1124. state != CM_SET_KEY_CNF &&
  1125. state != CM_VALIDATE_REQ &&
  1126. state != CM_VALIDATE_CNF)
  1127. {
  1128. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  1129. {
  1130. if((ccs->CpState != 2) && (ccs->CpState != 3))
  1131. {
  1132. if (ccs->CpState_err == FALSE)
  1133. {
  1134. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  1135. //CPD: ChargeParameterDiscovery
  1136. }
  1137. ccs->CpState_err = TRUE;
  1138. }
  1139. }
  1140. #else
  1141. {
  1142. if(ccs->CpState != 3)
  1143. {
  1144. if (ccs->CpState_err == FALSE)
  1145. {
  1146. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  1147. //CPD: ChargeParameterDiscovery
  1148. }
  1149. ccs->CpState_err = TRUE;
  1150. }
  1151. }
  1152. #endif
  1153. }
  1154. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  1155. {
  1156. //ChargeParameterDiscovery
  1157. if(state >= ChargeParameterDiscoveryRequest && //35
  1158. state <= ChargeParameterDiscoveryResponse) //36
  1159. {
  1160. if(ccs->CpState != 3)
  1161. {
  1162. if (ccs->CpState_err == FALSE)
  1163. {
  1164. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD");
  1165. //PRC: Precharge
  1166. //CUD: CurrentDemand
  1167. }
  1168. ccs->CpState_err = TRUE;
  1169. }
  1170. }
  1171. //ChargingStatus
  1172. if(state >= ChargingStatusRequest && //43
  1173. state <= ChargingStatusResponse) //44
  1174. {
  1175. if(ccs->CpState != 4 && ccs->CpState != 5)
  1176. {
  1177. if (ccs->CpState_err == FALSE)
  1178. {
  1179. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CGS");
  1180. //PRC: Precharge
  1181. //CUD: CurrentDemand
  1182. }
  1183. ccs->CpState_err = TRUE;
  1184. }
  1185. }
  1186. }
  1187. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  1188. {
  1189. //ChargeParameterDiscovery, CableCheck
  1190. if (state >= ChargeParameterDiscoveryRequest && //35
  1191. state <= CableCheckResponse) //38
  1192. {
  1193. if(ccs->CableCheckPreCountDownDone == FALSE &&
  1194. state >= CableCheckRequest)
  1195. {
  1196. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  1197. time_diff = DiffTimeb_fork1_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  1198. if(time_diff >= V2G_SECC_CP_Timeout_CableCheck) //2 sec
  1199. {
  1200. sprintf((char*)buf_log_evcomm_fork1,
  1201. "[fork1][CP]check C(4),D(5): ON (%.02lf of %dms)",
  1202. time_diff,
  1203. V2G_SECC_CP_Timeout_CableCheck);
  1204. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1205. ccs->CableCheckPreCountDownDone = TRUE;
  1206. }
  1207. }
  1208. if(ccs->CableCheckPreCountDownDone == TRUE)
  1209. {
  1210. if(ccs->CpState != 4 && ccs->CpState != 5)
  1211. {
  1212. if (ccs->CpState_err == FALSE)
  1213. {
  1214. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD and CCK (after CNT)");
  1215. //CPD: ChargeParameterDiscovery
  1216. //CCK: CableCheck
  1217. //CNT: count down
  1218. }
  1219. ccs->CpState_err = TRUE;
  1220. }
  1221. }
  1222. else
  1223. {
  1224. if(ccs->CpState != 3 && ccs->CpState != 4 && ccs->CpState != 5)
  1225. {
  1226. if (ccs->CpState_err == FALSE)
  1227. {
  1228. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD and CCK (before CNT)");
  1229. //CPD: ChargeParameterDiscovery
  1230. //CCK: CableCheck
  1231. //CNT: count down
  1232. }
  1233. ccs->CpState_err = TRUE;
  1234. }
  1235. }
  1236. }
  1237. //Precharge, CurrentDemand
  1238. if(state >= PreChargeRequest && //39
  1239. state <= CurrentDemandResponse) //46
  1240. {
  1241. if(ccs->CpState != 4 && ccs->CpState != 5)
  1242. {
  1243. if (ccs->CpState_err == FALSE)
  1244. {
  1245. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]PRC and CUD");
  1246. //PRC: Precharge
  1247. //CUD: CurrentDemand
  1248. }
  1249. ccs->CpState_err = TRUE;
  1250. }
  1251. }
  1252. }
  1253. #endif
  1254. if(ccs->CpState_err == TRUE && ccs->CpState_err_logged == FALSE)
  1255. {
  1256. OutputCpPwmDuty(100);
  1257. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  1258. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1259. //CCS_SECC_CP_State_Error (023889)
  1260. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1261. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1262. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1263. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1264. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1265. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1266. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1267. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1268. sprintf((char*)buf_log_evcomm_fork1, "[fork1][Erorr]CP(%d) Error in state %d(%d)",
  1269. ccs->CpState,
  1270. state,
  1271. ccs->CableCheckPreCountDownDone
  1272. );
  1273. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1274. ccs->CpState_err_logged = TRUE;
  1275. }
  1276. return 0;
  1277. }
  1278. /*===========================================================================
  1279. FUNCTION: Check_CP_State_Update_fork1
  1280. DESCRIPTION:
  1281. PRE-CONDITION:
  1282. INPUT:
  1283. OUTPUT:
  1284. GLOBAL VARIABLES:
  1285. =============================================================================*/
  1286. //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  1287. void Check_CP_State_Update_fork1(struct ChargingInfoData *ccs)
  1288. {
  1289. //CP State
  1290. if (ccs->CpState != ccs->CpState_pre)
  1291. {
  1292. sprintf((char*)buf_log_evcomm_fork1, "[fork1]CP State: %d >> %d (%.2fV)",
  1293. ccs->CpState_pre,
  1294. ccs->CpState,
  1295. ccs->CpVoltage
  1296. );
  1297. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1298. ccs->CpState_pre = ccs->CpState;
  1299. }
  1300. }
  1301. //#endif
  1302. /*===========================================================================
  1303. FUNCTION: CP_Detection
  1304. DESCRIPTION:
  1305. 1. In order to detect CP in efficient response time, we creat an independent
  1306. thead for this procedure.
  1307. 2. The priority of this thread is set as the same as other tasks.
  1308. 3. fork1
  1309. PRE-CONDITION:
  1310. INPUT:
  1311. OUTPUT:
  1312. GLOBAL VARIABLES:
  1313. =============================================================================*/
  1314. void CP_Detection()
  1315. {
  1316. pid_t tmp = 0;
  1317. // struct timeb StartTime, EndTime;
  1318. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  1319. unsigned char Statetmp;
  1320. float TotalTmpVolt;
  1321. #endif
  1322. struct ChargingInfoData *ccs;
  1323. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1324. if(CP_Detection_Pid == 0)
  1325. {
  1326. tmp = fork();
  1327. if(tmp > 0)
  1328. {
  1329. CP_Detection_Pid = tmp;
  1330. #if 1
  1331. unsigned char buf[64];
  1332. memset(buf, 0, sizeof(buf));
  1333. //sprintf((char*)buf, "renice -20 -p %d", tmp);
  1334. sprintf((char*)buf, "renice -10 -p %d", tmp);
  1335. system((char*)buf);
  1336. #endif
  1337. return;
  1338. }
  1339. }
  1340. while(1)
  1341. {
  1342. //ADC_Voltage = (1+RE62/RE63)*0.9 - (RE62/RE63)*Pilot_Voltage, RE62/RE63=0.06
  1343. //=>Pilot_Voltage=(0.954-ADC_Voltage)/0.06
  1344. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  1345. {
  1346. ccs->CpVoltage = ShmInternalComm->AC_CpPositiveVoltage;
  1347. ccs->CpState = ShmInternalComm->AC_CpPresentState;
  1348. }
  1349. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  1350. {
  1351. TotalTmpVolt = ReadAdcVolt(3);
  1352. ccs->CpVoltage = TotalTmpVolt;
  1353. if (ccs->CpVoltage_pre != ccs->CpVoltage)
  1354. {
  1355. ccs->CpVoltage_pre = ccs->CpVoltage;
  1356. }
  1357. //printf("TotalTmpVolt = %.02f\n", TotalTmpVolt);
  1358. //If CP voltage is higer than 13.5V
  1359. if(TotalTmpVolt >= 13.5)
  1360. {
  1361. //Pilot Error
  1362. if((ccs->CpState == 1) &&
  1363. (TotalTmpVolt < 13.75))
  1364. {
  1365. //V_cp = 13.5 ~ 13.75
  1366. Statetmp = 1;
  1367. }
  1368. else
  1369. {
  1370. //V_cp = 13.5 ~
  1371. Statetmp = 8;
  1372. }
  1373. }
  1374. else if((TotalTmpVolt >= 10.5) && (TotalTmpVolt < 13.5)) //V_cp = 10.5 ~ 13.5
  1375. {
  1376. //State A (12V)
  1377. if((ccs->CpState >= 2) &&
  1378. (ccs->CpState <= 3) &&
  1379. (TotalTmpVolt < 10.75))
  1380. {
  1381. if((ccs->CpDuty >= 5) &&
  1382. (ccs->CpDuty < 100))
  1383. {
  1384. Statetmp = 3;
  1385. }
  1386. else
  1387. {
  1388. Statetmp = 2;
  1389. }
  1390. }
  1391. else if((ccs->CpState == 8) &&
  1392. (TotalTmpVolt >= 13.25))
  1393. {
  1394. Statetmp = 8;
  1395. }
  1396. else
  1397. {
  1398. Statetmp = 1;
  1399. }
  1400. }
  1401. else if((TotalTmpVolt >= 7.5) && (TotalTmpVolt < 10.5))
  1402. {
  1403. //State B (9V)
  1404. if((ccs->CpState == 4) && (TotalTmpVolt < 7.75))
  1405. {
  1406. Statetmp = 4;
  1407. }
  1408. else if((ccs->CpState == 1) && (TotalTmpVolt >= 10.25))
  1409. {
  1410. Statetmp = 1;
  1411. }
  1412. else
  1413. {
  1414. if((ccs->CpDuty >= 5) && (ccs->CpDuty < 100))
  1415. {
  1416. Statetmp = 3;
  1417. }
  1418. else
  1419. {
  1420. Statetmp = 2;
  1421. }
  1422. }
  1423. }
  1424. else if((TotalTmpVolt >= 4.5) && (TotalTmpVolt < 7.5))
  1425. {
  1426. //State C (6V)
  1427. if((ccs->CpState == 5) && (TotalTmpVolt < 4.75))
  1428. {
  1429. Statetmp = 5;
  1430. }
  1431. else if((ccs->CpState >= 2) && (ccs->CpState <= 3) && (TotalTmpVolt >= 7.25))
  1432. {
  1433. if((ccs->CpDuty >= 5)&&(ccs->CpDuty < 100))
  1434. {
  1435. Statetmp = 3;
  1436. }
  1437. else
  1438. {
  1439. Statetmp = 2;
  1440. }
  1441. }
  1442. else
  1443. {
  1444. Statetmp = 4;
  1445. }
  1446. }
  1447. else if((TotalTmpVolt >= 1.5) && (TotalTmpVolt < 4.5))
  1448. {
  1449. //State D (3V)
  1450. if((ccs->CpState == 6)&&(TotalTmpVolt < 1.75))
  1451. {
  1452. Statetmp = 6;
  1453. }
  1454. else if((ccs->CpState == 4)&&(TotalTmpVolt >= 4.25))
  1455. {
  1456. Statetmp = 4;
  1457. }
  1458. else
  1459. {
  1460. Statetmp = 5;
  1461. }
  1462. }
  1463. else if((TotalTmpVolt >= -1.5) && (TotalTmpVolt < 1.5)) //V_cp = -1.5V ~ 1.5V
  1464. {
  1465. //State E (0V)
  1466. if((ccs->CpState == 8) &&
  1467. (TotalTmpVolt < -1.25))
  1468. {
  1469. Statetmp = 8;
  1470. }
  1471. else if((ccs->CpState == 5) &&
  1472. (TotalTmpVolt >= 1.25))
  1473. {
  1474. Statetmp = 5;
  1475. }
  1476. else
  1477. {
  1478. Statetmp = 6;
  1479. }
  1480. }
  1481. else if((TotalTmpVolt >= -13.5) && (TotalTmpVolt < -10.5)) //V_cp = -10.5V ~ -13.5V
  1482. {
  1483. //State F (-12V)
  1484. if((ccs->CpState == 8) &&
  1485. (TotalTmpVolt >= -10.75))
  1486. {
  1487. Statetmp = 8;
  1488. }
  1489. else
  1490. {
  1491. Statetmp = 7;
  1492. }
  1493. }
  1494. else
  1495. {
  1496. //null
  1497. }
  1498. ccs->CpState = Statetmp;
  1499. }
  1500. #endif
  1501. Check_CP_State_Update_fork1(ccs);
  1502. Check_CP_State_Error_fork1(ccs);
  1503. //Updating Plugin status
  1504. #if (PP_PROTECTION_MECHANISM == ENABLE)
  1505. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ) && (ccs->PpVoltage >= 1.0)) //PP >= 1.0V
  1506. #else
  1507. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ))
  1508. #endif
  1509. {
  1510. ccs->ConnectorPlugIn_new = TRUE;
  1511. }
  1512. else
  1513. {
  1514. ccs->ConnectorPlugIn_new = FALSE;
  1515. OutputCpPwmDuty(100);
  1516. }
  1517. Check_Plugin_Status_Update_fork1(ccs);
  1518. //ftime(&EndTime);
  1519. //DEBUG_PRINTF_EVCOMM_DETAIL("duration:%.02lf\n", DiffTimeb(StartTime, EndTime));
  1520. usleep(100000);
  1521. }//while
  1522. }
  1523. /*===========================================================================
  1524. FUNCTION: PP_Detection
  1525. DESCRIPTION:
  1526. 0. SeccComm fork3
  1527. 1. In order to detect CP in efficient response time, we creat an independent
  1528. thead for this procedure.
  1529. 2. The priority of this thread is set as the same as other tasks.
  1530. PRE-CONDITION:
  1531. INPUT:
  1532. OUTPUT:
  1533. GLOBAL VARIABLES:
  1534. =============================================================================*/
  1535. void PP_Detection()
  1536. {
  1537. pid_t tmp = 0;
  1538. // struct timeb StartTime, EndTime;
  1539. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED))
  1540. //unsigned char Statetmp;
  1541. #endif
  1542. float TotalTmpVolt;
  1543. if(PP_Detection_Pid == 0)
  1544. {
  1545. tmp = fork();
  1546. if(tmp > 0)
  1547. {
  1548. PP_Detection_Pid = tmp;
  1549. #if 0
  1550. unsigned char buf[64];
  1551. memset(buf, 0, sizeof(buf));
  1552. sprintf((char*)buf, "renice -20 -p %d", tmp);
  1553. system(buf);
  1554. #endif
  1555. return;
  1556. }
  1557. }
  1558. while(1)
  1559. {
  1560. TotalTmpVolt = ReadAdcVolt_PP_fork3();
  1561. EVCOMM_SYS_INFO.PpVoltage = TotalTmpVolt;
  1562. if (EVCOMM_SYS_INFO.PpVoltage_pre != EVCOMM_SYS_INFO.PpVoltage)
  1563. {
  1564. if ((EVCOMM_SYS_INFO.PpVoltage_pre < 0.5 && EVCOMM_SYS_INFO.PpVoltage >= 1.0) ||
  1565. (EVCOMM_SYS_INFO.PpVoltage_pre >= 1.0 && EVCOMM_SYS_INFO.PpVoltage < 0.5))
  1566. {
  1567. sprintf((char*)buf_log_evcomm_fork3,
  1568. "[fork3]PP(%.2f >> %.2fV)",
  1569. EVCOMM_SYS_INFO.PpVoltage_pre,
  1570. EVCOMM_SYS_INFO.PpVoltage
  1571. );
  1572. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork3);
  1573. EVCOMM_SYS_INFO.PpVoltage_pre = EVCOMM_SYS_INFO.PpVoltage;
  1574. }
  1575. }
  1576. #if 0
  1577. sleep(5);
  1578. printf("V_pp = %.02f\n", TotalTmpVolt);
  1579. #endif
  1580. usleep(100000);
  1581. }//while
  1582. }
  1583. /*===========================================================================
  1584. FUNCTION: Error_Monitor
  1585. DESCRIPTION:
  1586. 1. This function only works in SeccComm fork2.
  1587. PRE-CONDITION:
  1588. INPUT:
  1589. OUTPUT:
  1590. GLOBAL VARIABLES:
  1591. =============================================================================*/
  1592. void Error_Monitor()
  1593. {
  1594. pid_t tmp = 0;
  1595. double time_diff = 0;
  1596. unsigned char status = 0;
  1597. struct ChargingInfoData *ccs;
  1598. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1599. if(Error_Monitor_Pid == 0)
  1600. {
  1601. tmp = fork(); //SeccComm fork2
  1602. if(tmp > 0)
  1603. {
  1604. Error_Monitor_Pid = tmp;
  1605. #if 0
  1606. unsigned char buf[64];
  1607. memset(buf, 0, sizeof(buf));
  1608. sprintf((char*)buf, "renice -20 -p %d", tmp);
  1609. system(buf);
  1610. #endif
  1611. return;
  1612. }
  1613. }
  1614. while(1)
  1615. {
  1616. //Step 0
  1617. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  1618. {
  1619. //If the End_Process is in processing, disable Error_Monitor.
  1620. continue;
  1621. }
  1622. //Step1 1: Check and Response to Plugin Status
  1623. if(CheckConnectorPlugIn() == FALSE)
  1624. {
  1625. status = Check_V2G_Flow_Status();
  1626. if (status > IDLE &&
  1627. status < Performance_Timeout &&
  1628. status != CM_SET_KEY_REQ &&
  1629. status != CM_SET_KEY_CNF &&
  1630. EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  1631. {
  1632. #if (CP_PROTECTION_MECHANISM == ENABLE)
  1633. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2] Emergency Stop (due to Connector is plugged out during communication.)");
  1634. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Plug out Error => End_Process");
  1635. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1636. //CCS_SECC_CP_State_Error (023889)
  1637. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1638. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1639. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1640. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1641. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1642. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1643. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1644. End_Process();
  1645. #else
  1646. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CP_PROTECTION_MECHANISM is disabled. Emergency Stop: skipped" );
  1647. #endif
  1648. }
  1649. }
  1650. //Step 2: Check for V2G_SECC_Sequence_Timeout
  1651. //#if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  1652. #if 1
  1653. status = Check_V2G_Flow_Status();
  1654. if (status >= SupportedAppProtocolRequest &&
  1655. status < SessionStopRequest)
  1656. {
  1657. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1658. time_diff = DiffTimeb_fork2_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1659. if(time_diff > V2G_SECC_Sequence_Timeout) //60s
  1660. {
  1661. sprintf((char*)buf_log_evcomm_fork2,
  1662. "[fork2]V2G_SECC_Sequence_Timeout in state %d - (%.02lf of %d ms)\n",
  1663. status,
  1664. time_diff,
  1665. V2G_SECC_Sequence_Timeout);
  1666. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1667. Update_V2G_Flow_Status(Sequence_Timeout);
  1668. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1669. //CCS_SECC_TIMEOUT_V2G_Sequence_Time (023844)
  1670. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1671. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1672. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1673. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1674. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  1675. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  1676. End_Process();
  1677. break;
  1678. }
  1679. else if (time_diff > 4000) //4s
  1680. {
  1681. //Check for CSU command of "Stop by EVSE"
  1682. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown)
  1683. {
  1684. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]EVSE_Shutdown");
  1685. Update_V2G_Flow_Status(Other_Fault);
  1686. }
  1687. else if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1688. {
  1689. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]EVSE_EmergencyShutdown");
  1690. Update_V2G_Flow_Status(Other_Fault);
  1691. }
  1692. else if (ShmInternalComm->ChargingPermission == FALSE)
  1693. {
  1694. if (status >= ChargeParameterDiscoveryRequest) //&& status < SessionStopRequest
  1695. {
  1696. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]ChargingPermission = FALSE");
  1697. Update_V2G_Flow_Status(Other_Fault);
  1698. }
  1699. }
  1700. else
  1701. {
  1702. //null
  1703. }
  1704. }
  1705. else
  1706. {
  1707. //null
  1708. }
  1709. }
  1710. #endif
  1711. //Step 3: Check and Response to Error V2gFlowStatus
  1712. status = Check_V2G_Flow_Status();
  1713. if (status == Performance_Timeout ||
  1714. status == Sequence_Timeout ||
  1715. status == Other_Fault)
  1716. {
  1717. sprintf((char*)buf_log_evcomm_fork2,
  1718. "[fork2]Timeout or Fault State(%d) => End_Process",
  1719. status);
  1720. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1721. //Normal Stop
  1722. //alarm and duty to 100%
  1723. //OutputCpPwmDuty(100);
  1724. //SwitchCpStateE(ENABLE); //Set CP duty as 100% and set CP state as E (0V).
  1725. //[Joseph/ To-Do] Set State E (0V) via GPIO setting
  1726. End_Process();
  1727. }
  1728. //Step 4: Check and Response to CP State Error
  1729. if(ccs->CpState_err == TRUE)
  1730. {
  1731. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]CP Error => End_Process");
  1732. Update_V2G_Flow_Status(Other_Fault);
  1733. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1734. //CCS_SECC_CP_State_Error (023889)
  1735. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1736. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1737. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1738. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1739. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1740. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1741. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1742. End_Process();
  1743. }
  1744. //Step 5: Check and Response to Shutdown Commnad from CSU
  1745. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown ||
  1746. EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1747. {
  1748. if (Check_V2G_Flow_Status() <= SLACC_SDP_TCP_Connection)
  1749. {
  1750. sprintf((char*)buf_log_evcomm_fork2,
  1751. "[fork2]EVSE Shutdown(%d) => End_Process",
  1752. EVCOMM_SYS_INFO.DC_EVSEStatus);
  1753. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1754. Update_V2G_Flow_Status(Other_Fault);
  1755. End_Process();
  1756. }
  1757. }
  1758. //Step 6: Check and Response to SessionStop
  1759. status = Check_V2G_Flow_Status();
  1760. if (status == SessionStopResponse)
  1761. {
  1762. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]SessionStopResponse => End_Process");
  1763. End_Process();
  1764. }
  1765. //Step 7: Check for ChargingPermission from TRUE to FALSE before V2G Messages
  1766. if ((ShmInternalComm->ChargingPermission == FALSE) &&
  1767. (ShmInternalComm->ChargingPermission_pre == TRUE) &&
  1768. (ccs->CpState >= 3) && (ccs->CpState <=5))
  1769. {
  1770. if (status >= CM_SLAC_PARM_REQ &&
  1771. status != CM_SET_KEY_REQ &&
  1772. status != CM_SET_KEY_CNF &&
  1773. status <= SLACC_SDP_TCP_Connection)
  1774. {
  1775. sprintf((char*)buf_log_evcomm_fork2,
  1776. "[fork2]Permission OFF before V2G msg(%d) => End_Process",
  1777. ShmInternalComm->ChargingPermission);
  1778. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1779. Update_V2G_Flow_Status(Other_Fault);
  1780. End_Process();
  1781. }
  1782. }
  1783. //Step 8: DC OVP Protection
  1784. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1785. status > CableCheckResponse &&
  1786. status <= SessionStopRequest &&
  1787. status != ChargingStatusRequest &&
  1788. status != ChargingStatusResponse &&
  1789. EVCOMM_SYS_INFO.EvBatteryMaxVoltage != 0)
  1790. {
  1791. //Part A: OVP Protection
  1792. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)) // 2%
  1793. {
  1794. sprintf((char*)buf_log_evcomm_fork2,
  1795. "[fork2][Error]OVP => End_Process (%.02f > %.02f)",
  1796. EVCOMM_SYS_INFO.PresentChargingVoltage,
  1797. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02));
  1798. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1799. Update_V2G_Flow_Status(Other_Fault);
  1800. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1801. //System CCS output OVP (012219)
  1802. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1803. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1804. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1805. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1806. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1807. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1808. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1809. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1810. End_Process();
  1811. }
  1812. //Part B: Over Voltage Request Protection
  1813. if (EVCOMM_SYS_INFO.EvBatterytargetVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02))
  1814. {
  1815. sprintf((char*)buf_log_evcomm_fork2,
  1816. "[fork2]Over V Req => End_Process (%.02f > %.02f)",
  1817. EVCOMM_SYS_INFO.EvBatterytargetVoltage,
  1818. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)
  1819. );
  1820. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1821. Update_V2G_Flow_Status(Other_Fault);
  1822. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1823. //System CCS output OVP (012219)
  1824. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1825. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1826. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1827. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1828. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1829. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1830. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1831. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1832. End_Process();
  1833. }
  1834. }
  1835. //Step 9: Check 60V
  1836. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1837. ShmInternalComm->ChargingPermission == TRUE &&
  1838. status < CableCheckRequest)
  1839. {
  1840. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= 60) //60V
  1841. {
  1842. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]DC Output Voltage is over 60V => End_Process");
  1843. Update_V2G_Flow_Status(Other_Fault);
  1844. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1845. //CCS_SECC_Unexpected_60V_Before_Charing_Error (023890)
  1846. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1847. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1848. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1849. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1850. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  1851. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  1852. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1853. //Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1854. End_Process();
  1855. }
  1856. }
  1857. //Step 10: Check if the connector is unplug from plugin
  1858. if (EVCOMM_SYS_INFO.ConnectorPlugIn_pre == TRUE && EVCOMM_SYS_INFO.ConnectorPlugIn == FALSE)
  1859. {
  1860. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Unplug Reset => End_Process");
  1861. Update_V2G_Flow_Status(Other_Fault);
  1862. End_Process();
  1863. }
  1864. usleep(100000);
  1865. }//while
  1866. }
  1867. /*===========================================================================
  1868. FUNCTION: SendSetKey
  1869. DESCRIPTION:
  1870. PRE-CONDITION:
  1871. INPUT:
  1872. OUTPUT:
  1873. GLOBAL VARIABLES:
  1874. =============================================================================*/
  1875. int SendSetKey()
  1876. {
  1877. int i = 0;
  1878. unsigned char nRandValue = 0x0;
  1879. unsigned char ConstString[16] = "PhihongKey000000";
  1880. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  1881. memcpy(SendMmePacket.ODA,QcaMac,6);
  1882. memcpy(SendMmePacket.OSA,CsuMac,6);
  1883. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  1884. SendMmePacket.MMV = 0x01;
  1885. SendMmePacket.MMTYPE = MMTYPE_CM_SET_KEY_REQ;
  1886. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  1887. SendMmePacketSize = 0;
  1888. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate ��NMK��
  1889. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
  1890. SendMmePacketSize+=4;
  1891. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
  1892. SendMmePacketSize+=4;
  1893. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
  1894. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
  1895. SendMmePacketSize+=2;
  1896. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00;//PMN, Fixed value(0x00) encrypted payload not used
  1897. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//CCo Capablility
  1898. srand(time(NULL));
  1899. for (i = 10; i < 16; i++)
  1900. {
  1901. nRandValue = (rand()%62) + 1;
  1902. if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
  1903. {
  1904. ConstString[i]= nRandValue + 0x30;
  1905. }
  1906. else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
  1907. {
  1908. ConstString[i]= nRandValue -10 + 0x41;
  1909. }
  1910. else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
  1911. {
  1912. ConstString[i]= nRandValue -37 + 0x61;
  1913. }
  1914. else
  1915. {
  1916. ConstString[i]= 0x30;
  1917. }
  1918. }
  1919. memset(NewNmkKey,0,sizeof(NewNmkKey));
  1920. memset(Nid,0,sizeof(Nid));
  1921. HPAVKeyNMK(NewNmkKey, (char*)ConstString);
  1922. HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
  1923. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid)); //NID, 54 LSBs contain the NID 2 MSBs = 0b00
  1924. SendMmePacketSize+=sizeof(Nid);
  1925. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
  1926. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
  1927. SendMmePacketSize += sizeof(NewNmkKey);
  1928. SendMmePacketSize += 19; //the size before MMENTRY
  1929. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Tx]CM_SET_KEY_REQ");
  1930. i = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1931. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  1932. DEBUG_PRINTF_EVCOMM_DETAIL("SendSetKey: send size =%d\n",i);
  1933. return 0;
  1934. }
  1935. /*===========================================================================
  1936. FUNCTION: GetQca7kMac
  1937. DESCRIPTION:
  1938. PRE-CONDITION:
  1939. INPUT:
  1940. OUTPUT:
  1941. GLOBAL VARIABLES:
  1942. =============================================================================*/
  1943. int GetQca7kMac()
  1944. {
  1945. struct QcaVendorMmeHeader SendPacket;
  1946. memset(&SendPacket, 0, sizeof(struct QcaVendorMmeHeader));
  1947. memset(SendPacket.ODA, 0xFF, 6); //broadcast
  1948. memcpy(SendPacket.OSA, CsuMac, 6);
  1949. SendPacket.MTYPE = htons(EtherType_HomePlug);
  1950. SendPacket.MMV = 0x00;
  1951. SendPacket.MMTYPE = MMTYPE_VENDOR_VS_NW_INFO;
  1952. SendPacket.OUI[0] = 0x00;
  1953. SendPacket.OUI[1] = 0xB0;
  1954. SendPacket.OUI[2] = 0x52;
  1955. DEBUG_PRINTF_EVCOMM_DETAIL("GetQca7kMac: send size =%d\n", sendto(RawSock, &SendPacket, 20, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll)));
  1956. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Req for QCA7K MacAddr");
  1957. return 0;
  1958. }
  1959. /*===========================================================================
  1960. FUNCTION: Array_Check_All_Zero
  1961. DESCRIPTION:
  1962. PRE-CONDITION:
  1963. INPUT:
  1964. OUTPUT:
  1965. result:
  1966. (1) TRUE: all zero
  1967. (2) FALSE: not all zero
  1968. GLOBAL VARIABLES:
  1969. =============================================================================*/
  1970. int Array_Check_All_Zero(unsigned char *ptr, int size)
  1971. {
  1972. int result = TRUE;
  1973. int i = 0;
  1974. for (i = 0; i < size; i++)
  1975. {
  1976. if (ptr[i] != 0)
  1977. {
  1978. result = FALSE;
  1979. break;
  1980. }
  1981. }
  1982. return result;
  1983. }
  1984. /*===========================================================================
  1985. FUNCTION: Array_Compare_Identity
  1986. DESCRIPTION:
  1987. PRE-CONDITION:
  1988. INPUT:
  1989. OUTPUT:
  1990. result = FALSE (not identical)
  1991. result = TRUE (identical)
  1992. GLOBAL VARIABLES:
  1993. =============================================================================*/
  1994. int Array_Compare_Identity(unsigned char *ptrA, unsigned char *ptrB, int size)
  1995. {
  1996. int result = TRUE;
  1997. int i = 0;
  1998. for (i = 0; i < size; i++)
  1999. {
  2000. if (ptrA[i] != ptrB[i])
  2001. {
  2002. result = FALSE;
  2003. #if 0
  2004. sprintf((char*)buf_log_evcomm,
  2005. "[Array_Compare_Identity]%02X%02X%02X%02X%02X%02X,%02X%02X%02X%02X%02X%02X(%d)\n",
  2006. ptrA[0], ptrA[1], ptrA[2], ptrA[3], ptrA[4], ptrA[5],
  2007. ptrB[0], ptrB[1], ptrB[2], ptrB[3], ptrB[4], ptrB[5],
  2008. result);
  2009. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2010. #endif
  2011. break;
  2012. }
  2013. }
  2014. return result;
  2015. }
  2016. /*===========================================================================
  2017. FUNCTION: SLAC_DB_Search_EvMac_idx
  2018. DESCRIPTION:
  2019. PRE-CONDITION:
  2020. INPUT:
  2021. OUTPUT:
  2022. idx = -1 (not found)
  2023. GLOBAL VARIABLES:
  2024. =============================================================================*/
  2025. int SLAC_DB_Search_EvMac_idx(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in)
  2026. {
  2027. int idx = -1;
  2028. int i = 0;
  2029. if (evcc->arrayLen == 0)
  2030. {
  2031. //printf("[SLAC_DB_Search_EvMac_idx]arrayLen is empty (%d)\n", evcc->arrayLen);
  2032. //no need to search
  2033. }
  2034. else if (evcc->arrayLen > EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE)
  2035. {
  2036. //error
  2037. sprintf((char*)buf_log_evcomm,
  2038. "[ERROR][SLAC_DB_Search_EvMac_idx]DB length(%d) > %d",
  2039. evcc->arrayLen,
  2040. EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE);
  2041. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2042. evcc->arrayLen = 0; //reset
  2043. }
  2044. else
  2045. {
  2046. //start searching
  2047. for (i = 0; i < evcc->arrayLen; i++)
  2048. {
  2049. //printf("[SLAC_DB_Search_EvMac_idx]checking DB[%d]...\n", i);
  2050. if (Array_Compare_Identity(evcc->array[i].EvMac, EvMac_in, SLAC_EVMAC_LENGTH) == TRUE)
  2051. {
  2052. //printf("[SLAC_DB_Search_EvMac_idx]identical at DB[%d]...\n", i);
  2053. idx = i;
  2054. break;
  2055. }
  2056. }
  2057. }
  2058. //printf("[SLAC_DB_Search_EvMac_idx]return = %d\n", idx);
  2059. return idx;
  2060. }
  2061. /*===========================================================================
  2062. FUNCTION: SLAC_DB_Check_EvMac_RunID_Matching
  2063. DESCRIPTION:
  2064. PRE-CONDITION:
  2065. INPUT:
  2066. OUTPUT:
  2067. res = FALSE (unmatched)
  2068. res = TRUE (matched)
  2069. GLOBAL VARIABLES:
  2070. =============================================================================*/
  2071. int SLAC_DB_Check_EvMac_RunID_Matching(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in, unsigned char *RunID_in)
  2072. {
  2073. int res = FALSE;
  2074. int idx = -1;
  2075. idx = SLAC_DB_Search_EvMac_idx(evcc, EvMac_in);
  2076. if (idx >= 0)
  2077. {
  2078. res = Array_Compare_Identity(evcc->array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2079. }
  2080. else
  2081. {
  2082. //not found the EvMac data in DB
  2083. res = FALSE;
  2084. }
  2085. return res;
  2086. }
  2087. /*===========================================================================
  2088. FUNCTION: SLAC_DB_Add
  2089. DESCRIPTION:
  2090. 1. Saving each CM_SLAC_PARM_REQ data into EVCC database if its
  2091. EvMac and RunID data are different, respectively.
  2092. PRE-CONDITION:
  2093. INPUT:
  2094. OUTPUT:
  2095. idx = saved index (must be a positive value)
  2096. GLOBAL VARIABLES:
  2097. =============================================================================*/
  2098. int SLAC_DB_Add(unsigned char *EvMac_in, unsigned char *RunID_in)
  2099. {
  2100. int idx = -1;
  2101. //Search if this EvMac and RunID already exists
  2102. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2103. if (idx < 0) //not exist, yet.
  2104. {
  2105. if (SLAC_INFO.arrayLen < EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE) //20
  2106. {
  2107. sprintf((char*)buf_log_evcomm,
  2108. "[SLAC_DB_Add]data does not exist => added to %d-th",
  2109. SLAC_INFO.arrayLen);
  2110. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  2111. if (SLAC_INFO.arrayLen >= 0)
  2112. {
  2113. memset(&SLAC_INFO.array[SLAC_INFO.arrayLen], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  2114. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  2115. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2116. idx = SLAC_INFO.arrayLen;
  2117. SLAC_INFO.arrayLen++;
  2118. }
  2119. else
  2120. {
  2121. sprintf((char*)buf_log_evcomm,
  2122. "[ERROR][SLAC_DB_Add]arrayLen: unexpected(%d)",
  2123. SLAC_INFO.arrayLen);
  2124. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  2125. SLAC_INFO.arrayLen = 0;
  2126. }
  2127. }
  2128. else
  2129. {
  2130. //DB is full
  2131. sprintf((char*)buf_log_evcomm,
  2132. "[SLAC_DB_Add]DB is full(%d) => bypass",
  2133. SLAC_INFO.arrayLen);
  2134. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  2135. }
  2136. }
  2137. else
  2138. {
  2139. #if 0
  2140. sprintf((char*)buf_log_evcomm,
  2141. "[SLAC_DB_Add]EvMac: existed (%d)",
  2142. idx);
  2143. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2144. #endif
  2145. //Check RunID
  2146. if (Array_Compare_Identity(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH) == TRUE)
  2147. {
  2148. //RunID is the same
  2149. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Add]RunID: same");
  2150. }
  2151. else
  2152. {
  2153. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Add]RunID: diff");
  2154. }
  2155. //Reset all corresponding parameters
  2156. #if 0
  2157. sprintf((char*)buf_log_evcomm,
  2158. "[SLAC_DB_Add]EvMac: reset para(%d)",
  2159. idx);
  2160. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2161. #endif
  2162. memset(&SLAC_INFO.array[idx], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  2163. memcpy(SLAC_INFO.array[idx].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  2164. memcpy(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2165. }
  2166. return idx;
  2167. }
  2168. /*===========================================================================
  2169. FUNCTION: SLAC_DB_Reset
  2170. DESCRIPTION:
  2171. PRE-CONDITION:
  2172. INPUT:
  2173. OUTPUT:
  2174. GLOBAL VARIABLES:
  2175. =============================================================================*/
  2176. int SLAC_DB_Reset()
  2177. {
  2178. memset(&SLAC_INFO, 0, sizeof(struct EVCC_SLAC_DATA_TYPE));
  2179. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Reset]DONE");
  2180. return 0;
  2181. }
  2182. /*===========================================================================
  2183. FUNCTION: MmeProcess
  2184. DESCRIPTION:
  2185. PRE-CONDITION:
  2186. INPUT:
  2187. OUTPUT:
  2188. GLOBAL VARIABLES:
  2189. =============================================================================*/
  2190. int MmeProcess(unsigned char *Buffer, int DataLength)
  2191. {
  2192. //struct ethhdr *EthPacket;
  2193. struct MmeHeader *MmePacket;
  2194. static unsigned char counter;
  2195. unsigned char state = 0;
  2196. unsigned char *EvMac_in;
  2197. unsigned char *RunID_in;
  2198. int Rtn = 0;
  2199. int idx = 0;
  2200. MmePacket = (struct MmeHeader *)Buffer;
  2201. state = Check_V2G_Flow_Status();
  2202. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2203. {
  2204. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  2205. DEBUG_PRINTF_EVCOMM_DETAIL("******* Received MME Packet *******\n");
  2206. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  2207. DEBUG_PRINTF_EVCOMM_DETAIL("DataLength=%d\n",DataLength);
  2208. DEBUG_PRINTF_EVCOMM_DETAIL("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Destination MAC Address
  2209. MmePacket->ODA[0], MmePacket->ODA[1],
  2210. MmePacket->ODA[2], MmePacket->ODA[3],
  2211. MmePacket->ODA[4], MmePacket->ODA[5]);
  2212. DEBUG_PRINTF_EVCOMM_DETAIL("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Source MAC Address (EV MAC)
  2213. MmePacket->OSA[0], MmePacket->OSA[1],
  2214. MmePacket->OSA[2], MmePacket->OSA[3],
  2215. MmePacket->OSA[4], MmePacket->OSA[5]);
  2216. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  2217. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", MmePacket->MMV);
  2218. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  2219. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n",
  2220. MmePacket->FMI[0],MmePacket->FMI[1]);
  2221. }
  2222. #endif
  2223. #if (SLAC_FIRST_RESPONSE_METHOD == SET_NO_PWM_IF_NOT_GET_PERMISSION)
  2224. {
  2225. //Check CP as 5%
  2226. if (EVCOMM_SYS_INFO.CpState != 3 &&
  2227. EVCOMM_SYS_INFO.CpState != 4 &&
  2228. MmePacket->MMTYPE != MMTYPE_CM_SET_KEY_CNF &&
  2229. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_HOST_ACTION &&
  2230. MmePacket->MMTYPE != MMTYPE_VENDOR_ATTEN_CHAR &&
  2231. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_NW_INFO_CNF
  2232. )
  2233. {
  2234. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC]ignored(wrong CP state)");
  2235. return 0;
  2236. }
  2237. }
  2238. #endif
  2239. //[To-Do] Adding a pre-check filter mechanism for Source and Destination MAC Address
  2240. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  2241. switch(MmePacket->MMTYPE)
  2242. {
  2243. case MMTYPE_CM_SET_KEY_CNF:
  2244. {
  2245. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SET_KEY_CNF ---\n");
  2246. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[0]);
  2247. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Rx]CM_SET_KEY_CNF (SetKey: DONE)");
  2248. Update_V2G_Flow_Status(CM_SET_KEY_CNF);
  2249. break;
  2250. }
  2251. case MMTYPE_CM_SLAC_PARM_REQ:
  2252. {
  2253. //Check QCA7000 status
  2254. if (EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  2255. {
  2256. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(QCA7K init...)");
  2257. break;
  2258. }
  2259. //Check error state
  2260. state = Check_V2G_Flow_Status();
  2261. if (state == Performance_Timeout || //253
  2262. state == Sequence_Timeout || //254
  2263. state == Other_Fault) //255
  2264. {
  2265. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(in error state)");
  2266. break;
  2267. }
  2268. //Printing EV MAC Address
  2269. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ");
  2270. //Avoid Coupled SLAC_PARM_REQ
  2271. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2272. {
  2273. #if 0
  2274. sprintf((char*)buf_log_evcomm,
  2275. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(coupled SLAC,%d)",
  2276. CheckConnectorPlugIn());
  2277. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2278. #endif
  2279. break;
  2280. }
  2281. //[TC_SECC_VTB_CmSlacParm_003] SECURITY_TYPE needs to be 0x00 (no security)
  2282. if (MmePacket->MMENTRY[1] != 0)
  2283. {
  2284. sprintf((char*)buf_log_evcomm,
  2285. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(invalid SECURITY_TYPE,%d)", //Source MAC Address (EV MAC)
  2286. MmePacket->MMENTRY[1]);
  2287. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2288. break;
  2289. }
  2290. //=================== Legal CM_SLAC_PARM_REQ Zone =================
  2291. Update_V2G_Flow_Status(CM_SLAC_PARM_REQ);
  2292. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_RX_CM_SLAC_PARM_REQ)
  2293. {
  2294. //Once receiving CM_SLAC_PARM_REQ, set PWM as 5%
  2295. SwitchCpStateE(DISABLE);
  2296. OutputCpPwmDuty(5);
  2297. }
  2298. #endif
  2299. //Checking if this SLAC Req comes before 5% PWM (for 15118)
  2300. if(ShmInternalComm->ChargingPermission == FALSE)
  2301. {
  2302. //Sniffer_Tcpdump(ENABLE);
  2303. sprintf((char*)buf_log_evcomm, "Check Permission: %d (SLAC first => START)", ShmInternalComm->ChargingPermission);
  2304. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2305. }
  2306. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2307. {
  2308. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
  2309. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2310. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2311. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2312. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2313. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2314. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2315. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2316. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  2317. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuite [1]: 0x%x,0x%x\n",
  2318. MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  2319. }
  2320. #endif
  2321. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2322. {
  2323. //Saving each CM_SLAC_PARM_REQ data into EVCC database
  2324. EvMac_in = &MmePacket->OSA[0];
  2325. RunID_in = &MmePacket->MMENTRY[2];
  2326. idx = SLAC_DB_Add(EvMac_in, RunID_in); //(EvMac, RunID)
  2327. if (idx < 0)
  2328. {
  2329. sprintf((char*)buf_log_evcomm,
  2330. "[WARNING][CM_SLAC_PARM_REQ]DB is full or errors occour(%d) => ignore",
  2331. idx);
  2332. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2333. break;
  2334. }
  2335. //Select the 1st EV MAC address
  2336. if (SLAC_INFO.arrayLen == 1) //1st Req
  2337. {
  2338. #if 1
  2339. sprintf((char*)buf_log_evcomm,
  2340. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):selected",
  2341. (idx + 1),
  2342. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2343. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2344. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2345. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2346. #endif
  2347. /*
  2348. sprintf((char*)buf_log_evcomm,
  2349. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (selected)", //Source MAC Address (EV MAC)
  2350. SLAC_INFO.arrayLen,
  2351. MmePacket->OSA[0], MmePacket->OSA[1],
  2352. MmePacket->OSA[2], MmePacket->OSA[3],
  2353. MmePacket->OSA[4], MmePacket->OSA[5]);
  2354. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2355. sprintf((char*)buf_log_evcomm,
  2356. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (selected)", //RunID (from EVCC)
  2357. SLAC_INFO.arrayLen,
  2358. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2359. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2360. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2361. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2362. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2363. */
  2364. }
  2365. else //2nd Req
  2366. {
  2367. #if 1
  2368. sprintf((char*)buf_log_evcomm,
  2369. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):not selected",
  2370. (idx + 1),
  2371. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2372. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2373. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2374. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2375. #endif
  2376. /*
  2377. sprintf((char*)buf_log_evcomm,
  2378. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (not selected)", //Source MAC Address (EV MAC)
  2379. SLAC_INFO.arrayLen,
  2380. MmePacket->OSA[0], MmePacket->OSA[1],
  2381. MmePacket->OSA[2], MmePacket->OSA[3],
  2382. MmePacket->OSA[4], MmePacket->OSA[5]);
  2383. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2384. sprintf((char*)buf_log_evcomm,
  2385. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (not selected)", //RunID (from EVCC)
  2386. SLAC_INFO.arrayLen,
  2387. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2388. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2389. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2390. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2391. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2392. */
  2393. }
  2394. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2395. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, SLAC_EVMAC_LENGTH);
  2396. memcpy(SlacRunId, MmePacket->MMENTRY + 2, SLAC_RUNID_LENGTH);
  2397. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2398. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2399. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2400. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2401. SendMmePacket.MMV = MmePacket->MMV;
  2402. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2403. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2404. SendMmePacketSize = 0;
  2405. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2406. SendMmePacketSize += 6;
  2407. 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
  2408. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2409. 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
  2410. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SLAC_INFO.array[idx].EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2411. SendMmePacketSize += 6;
  2412. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2413. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2414. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, SLAC_RUNID_LENGTH); //RunID (8-byte)
  2415. SendMmePacketSize += SLAC_RUNID_LENGTH;
  2416. SendMmePacketSize += 19; //the size before MMENTRY
  2417. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2418. {
  2419. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2420. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2421. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2422. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2423. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2424. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2425. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2426. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2427. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2428. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2429. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2430. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2431. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2432. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2433. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2434. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2435. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2436. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2437. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2438. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2439. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2440. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2441. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2442. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2443. }
  2444. #endif
  2445. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2446. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2447. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2448. ftime(&SeqStartTime);
  2449. break;
  2450. }
  2451. #else
  2452. {
  2453. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2454. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, sizeof(EvMac));
  2455. memcpy(SlacRunId,MmePacket->MMENTRY + 2, sizeof(SlacRunId));
  2456. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2457. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2458. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2459. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2460. SendMmePacket.MMV = MmePacket->MMV;
  2461. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2462. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2463. SendMmePacketSize = 0;
  2464. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2465. SendMmePacketSize += 6;
  2466. 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
  2467. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2468. 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
  2469. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2470. SendMmePacketSize += 6;
  2471. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2472. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2473. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, sizeof(SlacRunId)); //RunID (8-byte)
  2474. SendMmePacketSize += sizeof(SlacRunId);
  2475. SendMmePacketSize += 19; //the size before MMENTRY
  2476. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2477. {
  2478. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2479. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2480. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2481. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2482. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2483. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2484. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2485. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2486. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2487. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2488. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2489. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2490. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2491. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2492. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2493. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2494. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2495. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2496. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2497. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2498. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2499. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2500. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2501. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2502. }
  2503. #endif
  2504. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2505. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2506. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2507. ftime(&SeqStartTime);
  2508. counter = 0;
  2509. break;
  2510. }
  2511. #endif
  2512. }
  2513. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  2514. {
  2515. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2516. {
  2517. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(timeup)");
  2518. break;
  2519. }
  2520. //Avoid Coupled CM_START_ATTEN_CHAR_IND
  2521. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2522. {
  2523. sprintf((char*)buf_log_evcomm,
  2524. "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(coupled SLAC,%d)",
  2525. CheckConnectorPlugIn());
  2526. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2527. break;
  2528. }
  2529. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2530. {
  2531. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n",counter + 1);
  2532. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2533. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2534. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  2535. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  2536. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]); //Fixed value (0x01) indicating ��other Green PHY station��
  2537. DEBUG_PRINTF_EVCOMM_DETAIL("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2538. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  2539. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  2540. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2541. MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
  2542. MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
  2543. }
  2544. #endif
  2545. //New SLAC architecture designed by Joseph
  2546. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2547. {
  2548. EvMac_in = &MmePacket->OSA[0];
  2549. RunID_in = &MmePacket->MMENTRY[11];
  2550. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2551. if (idx >= 0)
  2552. {
  2553. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2554. //[TC_SECC_VTB_AttenuationCharacterization_013]
  2555. if (MmePacket->MMENTRY[0] != 0) //APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  2556. {
  2557. sprintf((char*)buf_log_evcomm,
  2558. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]APPLICATION_TYPE(%d): invalid => ignore Req",
  2559. MmePacket->MMENTRY[0]);
  2560. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2561. break;
  2562. }
  2563. //[TC_SECC_VTB_AttenuationCharacterization_014]
  2564. if (MmePacket->MMENTRY[1] != 0) //SECURITY_TYPE must be 0x00(No Security)
  2565. {
  2566. sprintf((char*)buf_log_evcomm,
  2567. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]SECURITY_TYPE(%d): invalid => ignore Req",
  2568. MmePacket->MMENTRY[1]);
  2569. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2570. break;
  2571. }
  2572. //[TC_SECC_VTB_AttenuationCharacterization_017]
  2573. if (MmePacket->MMENTRY[4] != 0x01) //RESP_TYPE must be 0x01(Send to another GP STA(EV))
  2574. {
  2575. sprintf((char*)buf_log_evcomm,
  2576. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]RESP_TYPE(%d): invalid => ignore Req",
  2577. MmePacket->MMENTRY[4]);
  2578. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2579. break;
  2580. }
  2581. //[TC_SECC_VTB_AttenuationCharacterization_021]
  2582. //FORWARDING_STA: MAC Address of the EV HLE (station which the measurement results shall be sent to)
  2583. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[5], SLAC_EVMAC_LENGTH) == FALSE)
  2584. {
  2585. sprintf((char*)buf_log_evcomm,
  2586. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]FORWARDING_STA(%02X:%02X:%02X:%02X:%02X:%02X): invalid => ignore Req",
  2587. MmePacket->MMENTRY[5], MmePacket->MMENTRY[6],
  2588. MmePacket->MMENTRY[7], MmePacket->MMENTRY[8],
  2589. MmePacket->MMENTRY[9], MmePacket->MMENTRY[10]);
  2590. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2591. SLAC_INFO.array[idx].StartAttenCharErr = TRUE;
  2592. break;
  2593. }
  2594. //Check RunID
  2595. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2596. {
  2597. SLAC_INFO.array[idx].MnbcSoundNum = MmePacket->MMENTRY[2];
  2598. SLAC_INFO.array[idx].StartAttenCharCnt++;
  2599. #if 0
  2600. sprintf((char*)buf_log_evcomm,
  2601. "[SLAC][Rx]CM_START_ATTEN_CHAR_IND[%d]:%d-th",
  2602. (idx + 1),
  2603. SLAC_INFO.array[idx].StartAttenCharCnt);
  2604. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2605. #endif
  2606. if (SLAC_INFO.array[idx].StartAttenCharCnt == 1)
  2607. {
  2608. memset(SLAC_INFO.array[idx].AAG, 0, sizeof(SLAC_INFO.array[idx].AAG));
  2609. SLAC_INFO.array[idx].AttenProfileCnt = 0;
  2610. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2611. }
  2612. else if (SLAC_INFO.array[idx].StartAttenCharCnt >= 3)
  2613. {
  2614. sprintf((char*)buf_log_evcomm,
  2615. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]counter(%d): unexpected",
  2616. SLAC_INFO.array[idx].StartAttenCharCnt);
  2617. }
  2618. else
  2619. {
  2620. //null
  2621. }
  2622. }
  2623. else
  2624. {
  2625. //This RunID is not matched with this EvMac,
  2626. //or this RunID is not found in DB.
  2627. sprintf((char*)buf_log_evcomm,
  2628. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]EvMac-RunID: unmatched => ignore Req");
  2629. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2630. //Response: ignore
  2631. }
  2632. }
  2633. else
  2634. {
  2635. //this msg source is not in database
  2636. //ignore
  2637. }
  2638. break;
  2639. }
  2640. #else //Old SLAC architecture designed by Vern
  2641. {
  2642. MnbcSoundNum = MmePacket->MMENTRY[2];
  2643. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2644. counter++;
  2645. if(counter == 1)
  2646. {
  2647. memset(Aag, 0, sizeof(Aag));
  2648. AttenProfileCnt = 0;
  2649. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2650. }
  2651. else if(counter >= 3)
  2652. {
  2653. counter = 0;
  2654. }
  2655. break;
  2656. }
  2657. #endif
  2658. }
  2659. case MMTYPE_CM_MNBC_SOUND_IND:
  2660. {
  2661. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2662. {
  2663. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(timeup)");
  2664. break;
  2665. }
  2666. //Avoid Coupled CM_MNBC_SOUND_IND
  2667. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2668. {
  2669. sprintf((char*)buf_log_evcomm,
  2670. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(coupled SLAC,%d)",
  2671. CheckConnectorPlugIn());
  2672. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2673. break;
  2674. }
  2675. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  2676. {
  2677. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n",counter + 1 , MnbcSoundNum);
  2678. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2679. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2680. DEBUG_PRINTF_EVCOMM_DETAIL("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2681. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2682. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
  2683. MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
  2684. MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
  2685. MmePacket->MMENTRY[18]);
  2686. DEBUG_PRINTF_EVCOMM_DETAIL("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  2687. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2688. MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
  2689. MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
  2690. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2691. MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
  2692. MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
  2693. DEBUG_PRINTF_EVCOMM_DETAIL("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2694. MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
  2695. MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
  2696. MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
  2697. MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
  2698. }
  2699. #endif
  2700. //New SLAC architecture designed by Joseph
  2701. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2702. {
  2703. EvMac_in = &MmePacket->OSA[0];
  2704. RunID_in = &MmePacket->MMENTRY[20];
  2705. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2706. if (idx >= 0)
  2707. {
  2708. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2709. //Check for RunID
  2710. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2711. {
  2712. SLAC_INFO.array[idx].MnbcSoundCnt++;
  2713. /*
  2714. sprintf((char*)buf_log_evcomm,
  2715. "[SLAC][Rx]CM_MNBC_SOUND_IND[%d]:%d-th",
  2716. (idx + 1),
  2717. SLAC_INFO.array[idx].MnbcSoundCnt);
  2718. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2719. */
  2720. }
  2721. else
  2722. {
  2723. //RunID is not matched or does not exist.
  2724. sprintf((char*)buf_log_evcomm,
  2725. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac-RunID: unmatched");
  2726. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2727. }
  2728. }
  2729. else
  2730. {
  2731. //ignore
  2732. sprintf((char*)buf_log_evcomm,
  2733. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac does not exist");
  2734. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2735. }
  2736. break;
  2737. }
  2738. #else //Old SLAC architecture designed by Vern
  2739. {
  2740. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2741. counter++;
  2742. break;
  2743. }
  2744. #endif
  2745. }
  2746. case MMTYPE_CM_ATTEN_PROFILE_IND:
  2747. {
  2748. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2749. {
  2750. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_ATTEN_PROFILE_IND: ignore(timeup)");
  2751. break;
  2752. }
  2753. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  2754. {
  2755. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n", counter, MnbcSoundNum);
  2756. DEBUG_PRINTF_EVCOMM_DETAIL("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2757. MmePacket->MMENTRY[0], MmePacket->MMENTRY[1], MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2758. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5]);
  2759. DEBUG_PRINTF_EVCOMM_DETAIL("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]); //NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2760. //NumGroups: Number of OFDM carrier groups used for the SLAC signal characterization.
  2761. //AAG[i]: Average Attenuation of Group i (i = 1 ~ 58)
  2762. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  2763. DEBUG_PRINTF_EVCOMM_DETAIL("AAG: \n");
  2764. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2765. {
  2766. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[8 + Rtn]);
  2767. }
  2768. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2769. }
  2770. #endif
  2771. //New SLAC architecture designed by Joseph
  2772. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2773. {
  2774. EvMac_in = &MmePacket->MMENTRY[0]; //[CAUTION] The EvMac address is not &MmePacket->OSA[0]
  2775. //[CAUTION] There is no RunID information of CM_ATTEN_PROFILE_IND
  2776. // packet, which means SECC cannot use the RunID to
  2777. // distinguish those SLAC request with identical EvMac
  2778. // but with different RunID.
  2779. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2780. /*
  2781. printf("%d, %d, %d, %d\n",
  2782. idx,
  2783. SLAC_INFO.array[idx].AagGroupsNum,
  2784. MmePacket->MMENTRY[6],
  2785. SLAC_INFO.array[idx].AttenProfileCnt);
  2786. */
  2787. if (idx >= 0)
  2788. {
  2789. SLAC_INFO.array[idx].AttenProfileCnt++;
  2790. /*
  2791. sprintf((char*)buf_log_evcomm,
  2792. "[SLAC][Rx]CM_ATTEN_PROFILE_IND[%d]:%d-th",
  2793. (idx + 1),
  2794. SLAC_INFO.array[idx].AttenProfileCnt);
  2795. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2796. */
  2797. //printf("%d, %d\n", SLAC_INFO.array[idx].AagGroupsNum, MmePacket->MMENTRY[6]);
  2798. SLAC_INFO.array[idx].AagGroupsNum = MmePacket->MMENTRY[6];
  2799. ////NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2800. for(Rtn = 0; Rtn < SLAC_INFO.array[idx].AagGroupsNum; Rtn++) //ex:58
  2801. {
  2802. SLAC_INFO.array[idx].AAG[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2803. }
  2804. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2805. break;
  2806. }
  2807. else
  2808. {
  2809. //The EvMac is not in the database
  2810. //ignore
  2811. sprintf((char*)buf_log_evcomm,
  2812. "[SLAC][Rx][CM_ATTEN_PROFILE_IND]EvMac(%02X%02X%02X%02X%02X%02X): not exist => ignore",
  2813. EvMac_in[0], EvMac_in[1], EvMac_in[2], EvMac_in[3], EvMac_in[4], EvMac_in[5]);
  2814. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2815. break;
  2816. }
  2817. }
  2818. #else //Old SLAC architecture designed by Vern
  2819. {
  2820. AagGroupsNum = MmePacket->MMENTRY[6];
  2821. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2822. {
  2823. Aag[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2824. }
  2825. AttenProfileCnt++;
  2826. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2827. break;
  2828. }
  2829. #endif
  2830. }
  2831. case MMTYPE_CM_ATTEN_CHAR_RSP:
  2832. {
  2833. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2834. {
  2835. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_CHAR_RSP ---\n");
  2836. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2837. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2838. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2839. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2840. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  2841. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2842. MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
  2843. MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
  2844. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  2845. for(Rtn = 0; Rtn < 17; Rtn++)
  2846. {
  2847. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[16 + Rtn]);
  2848. }
  2849. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2850. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  2851. for(Rtn = 0; Rtn < 17; Rtn++)
  2852. {
  2853. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[33 + Rtn]);
  2854. }
  2855. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  2856. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[50]); //Fixed value of 0x00 indicates a successful SLAC process
  2857. }
  2858. #endif
  2859. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2860. {
  2861. //Check ODA (Destination Address)
  2862. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  2863. {
  2864. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx][CM_ATTEN_CHAR_RSP]wrong ODA: ignore");
  2865. break;
  2866. }
  2867. EvMac_in = &MmePacket->OSA[0];
  2868. RunID_in = &MmePacket->MMENTRY[8];
  2869. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2870. //Check Parameters
  2871. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2872. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2873. (SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in) < 0) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2874. (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2875. (Array_Check_All_Zero(&MmePacket->MMENTRY[16], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] SourceID(17 bytes) must be all zero.
  2876. (Array_Check_All_Zero(&MmePacket->MMENTRY[33], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] RESP_ID (17 bytes) must be all zero.
  2877. (MmePacket->MMENTRY[50] != 0) //Result: must be 0x00(Success)
  2878. )
  2879. {
  2880. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2881. sprintf((char*)buf_log_evcomm,
  2882. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para(%d,%d,%d,%d,%d) => %d-th retry",
  2883. MmePacket->MMENTRY[0], //applicationType must be 0x00
  2884. MmePacket->MMENTRY[1], //securityType must be 0x00
  2885. SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in),
  2886. SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in),
  2887. MmePacket->MMENTRY[50],
  2888. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry
  2889. );
  2890. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2891. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2892. {
  2893. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2894. ftime(&SeqStartTime);
  2895. break;
  2896. }
  2897. else
  2898. {
  2899. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para => 2-retry fail => End_Process");
  2900. Update_V2G_Flow_Status(Other_Fault);
  2901. break;
  2902. }
  2903. }
  2904. else
  2905. {
  2906. //The CM_ATTEN_CHAR_IND is legal
  2907. SLAC_INFO.array[idx].AttenCharRspCnt++;
  2908. sprintf((char*)buf_log_evcomm,
  2909. "[SLAC][Rx]CM_ATTEN_CHAR_RSP[%d]:%d-th",
  2910. (idx + 1),
  2911. SLAC_INFO.array[idx].AttenCharRspCnt);
  2912. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2913. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2914. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2915. ftime(&SeqStartTime);
  2916. break;
  2917. }
  2918. }
  2919. #else
  2920. {
  2921. //Check Parameters
  2922. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2923. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2924. (Array_Compare_Identity(SLAC_INFO.array[0].EvMac, &MmePacket->MMENTRY[2], 6) == TRUE) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2925. (Array_Compare_Identity(SLAC_INFO.array[0].RunID, &MmePacket->MMENTRY[8], 8) == TRUE) //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2926. )
  2927. {
  2928. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2929. sprintf((char*)buf_log_evcomm,
  2930. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP: invalid parameters(%d-th)",
  2931. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  2932. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2933. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2934. {
  2935. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2936. ftime(&SeqStartTime);
  2937. break;
  2938. }
  2939. else
  2940. {
  2941. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]CM_ATTEN_CHAR_RSP: invalid parameters => End_Process");
  2942. Update_V2G_Flow_Status(Other_Fault);
  2943. ftime(&SeqStartTime);
  2944. break;
  2945. }
  2946. }
  2947. else
  2948. {
  2949. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2950. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2951. ftime(&SeqStartTime);
  2952. break;
  2953. }
  2954. }
  2955. #endif
  2956. }
  2957. case MMTYPE_CM_VALIDATE_REQ: //BCB Toggle
  2958. {
  2959. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2960. {
  2961. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_VALIDATE_REQ ---\n");
  2962. DEBUG_PRINTF_EVCOMM_DETAIL("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]); //Fixed value (0x00) to indicate ��PEV S2 toggles on control pilot line��
  2963. 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.
  2964. 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��.
  2965. }
  2966. #endif
  2967. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2968. {
  2969. counter = 0;
  2970. EvMac_in = &MmePacket->OSA[0];
  2971. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2972. if (idx >= 0)
  2973. {
  2974. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  2975. SLAC_INFO.array[idx].ValidateReqCnt++;
  2976. sprintf((char*)buf_log_evcomm,
  2977. "[SLAC][Rx]CM_VALIDATE_REQ[%d]:%d-th",
  2978. (idx + 1),
  2979. SLAC_INFO.array[idx].ValidateReqCnt);
  2980. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2981. //[To-Do] Protection
  2982. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2983. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  2984. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2985. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2986. SendMmePacket.MMV = 0x01;
  2987. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  2988. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2989. SendMmePacketSize = 0;
  2990. if(counter == 0)
  2991. {
  2992. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  2993. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SignalType(0x00): Fixed value to indicate "EV S2 toggles on control pilot line"
  2994. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //ToggleNum(0x00): Fixed value. In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  2995. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  2996. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  2997. #else
  2998. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  2999. #endif
  3000. }
  3001. else
  3002. {
  3003. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  3004. unsigned char PreStatus = 3;
  3005. unsigned char ToggleNum = 0;
  3006. ftime(&SeqStartTime);
  3007. while(1)
  3008. {
  3009. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  3010. {
  3011. ToggleNum++;
  3012. PreStatus = 4;
  3013. }
  3014. else
  3015. {
  3016. PreStatus = 3;
  3017. }
  3018. ftime(&SeqEndTime);
  3019. if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
  3020. {
  3021. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate "PEV S2 toggles on control pilot line"
  3022. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  3023. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3024. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  3025. #else
  3026. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3027. #endif
  3028. break;
  3029. }
  3030. }
  3031. }
  3032. SendMmePacketSize += 19; //the size before MMENTRY
  3033. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3034. ftime(&SeqStartTime);
  3035. }
  3036. else
  3037. {
  3038. //EvMac does not exist.
  3039. //ignore
  3040. }
  3041. break;
  3042. }
  3043. #else
  3044. {
  3045. counter = 0;
  3046. for(Rtn = 0; Rtn < 6; Rtn++)
  3047. {
  3048. if(MmePacket->ODA[Rtn] != CsuMac[Rtn])
  3049. {
  3050. counter = 1;
  3051. break;
  3052. }
  3053. }
  3054. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3055. memcpy(SendMmePacket.ODA, EvMac,6);
  3056. memcpy(SendMmePacket.OSA, CsuMac,6);
  3057. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3058. SendMmePacket.MMV = 0x01;
  3059. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  3060. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3061. SendMmePacketSize = 0;
  3062. if(counter == 0)
  3063. {
  3064. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  3065. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  3066. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  3067. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3068. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  3069. #else
  3070. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3071. #endif
  3072. }
  3073. else
  3074. {
  3075. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  3076. unsigned char PreStatus = 3, ToggleNum = 0;
  3077. ftime(&SeqStartTime);
  3078. while(1)
  3079. {
  3080. ftime(&SeqEndTime);
  3081. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  3082. {
  3083. ToggleNum++;
  3084. PreStatus = 4;
  3085. }
  3086. else
  3087. {
  3088. PreStatus = 3;
  3089. }
  3090. if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
  3091. {
  3092. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  3093. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  3094. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3095. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  3096. #else
  3097. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3098. #endif
  3099. break;
  3100. }
  3101. }
  3102. }
  3103. SendMmePacketSize += 19; //the size before MMENTRY
  3104. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3105. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  3106. ftime(&SeqStartTime);
  3107. break;
  3108. }
  3109. #endif
  3110. }
  3111. case MMTYPE_CM_SLAC_MATCH_REQ:
  3112. {
  3113. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3114. {
  3115. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  3116. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  3117. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  3118. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
  3119. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3120. for(Rtn=0; Rtn<17; Rtn++)
  3121. {
  3122. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  3123. }
  3124. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3125. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3126. for(Rtn=0; Rtn<6; Rtn++)
  3127. {
  3128. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  3129. }
  3130. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3131. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3132. for(Rtn=0; Rtn<17; Rtn++)
  3133. {
  3134. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  3135. }
  3136. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3137. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3138. for(Rtn=0; Rtn<6; Rtn++)
  3139. {
  3140. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  3141. }
  3142. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3143. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3144. for(Rtn=0; Rtn<8; Rtn++)
  3145. {
  3146. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  3147. }
  3148. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3149. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3150. for(Rtn=0; Rtn<8; Rtn++)
  3151. {
  3152. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  3153. }
  3154. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3155. }
  3156. #endif
  3157. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  3158. {
  3159. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3160. //Check ODA (Destination Address)
  3161. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  3162. {
  3163. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx][CM_SLAC_MATCH_REQ]wrong ODA: ignore");
  3164. //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
  3165. }
  3166. EvMac_in = &MmePacket->OSA[0];
  3167. RunID_in = &MmePacket->MMENTRY[50];
  3168. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  3169. if (idx >= 0)
  3170. {
  3171. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3172. SLAC_INFO.array[idx].MatchReqNum++;
  3173. sprintf((char*)buf_log_evcomm,
  3174. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:%d-th",
  3175. (idx + 1),
  3176. SLAC_INFO.array[idx].MatchReqNum);
  3177. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3178. //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  3179. //[TC_SECC_VTB_CmSlacMatch_008]
  3180. if (MmePacket->MMENTRY[0] != 0)
  3181. {
  3182. sprintf((char*)buf_log_evcomm,
  3183. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong APPLICATION_TYPE(%d)",
  3184. (idx + 1),
  3185. MmePacket->MMENTRY[0]);
  3186. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3187. break;
  3188. }
  3189. //[TC_SECC_VTB_CmSlacMatch_009] SECURITY_TYPE must be 0x00(No Security)
  3190. //[TC_SECC_VTB_CmSlacMatch_010]
  3191. if (MmePacket->MMENTRY[1] != 0)
  3192. {
  3193. sprintf((char*)buf_log_evcomm,
  3194. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong SECURITY_TYPE(%d)",
  3195. (idx + 1),
  3196. MmePacket->MMENTRY[1]);
  3197. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3198. break;
  3199. }
  3200. //[TC_SECC_VTB_CmSlacMatch_011] MVFLength must be 0x3E(MatchVarField Length)
  3201. //[TC_SECC_VTB_CmSlacMatch_012]
  3202. if (MmePacket->MMENTRY[2] != 0x3E || MmePacket->MMENTRY[3] != 0x00)
  3203. {
  3204. sprintf((char*)buf_log_evcomm,
  3205. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong MVFLength(%d,%d)",
  3206. (idx + 1),
  3207. MmePacket->MMENTRY[2],
  3208. MmePacket->MMENTRY[3]);
  3209. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3210. break;
  3211. }
  3212. //[TC_SECC_VTB_CmSlacMatch_013] EV ID (muxt be all zero)
  3213. //[TC_SECC_VTB_CmSlacMatch_014]
  3214. if (Array_Check_All_Zero(&MmePacket->MMENTRY[4], 17) == FALSE)
  3215. {
  3216. sprintf((char*)buf_log_evcomm,
  3217. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV ID",
  3218. (idx + 1));
  3219. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3220. break;
  3221. }
  3222. //[TC_SECC_VTB_CmSlacMatch_015] EV MAC
  3223. //[TC_SECC_VTB_CmSlacMatch_016]
  3224. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[21], SLAC_EVMAC_LENGTH) == FALSE)
  3225. {
  3226. sprintf((char*)buf_log_evcomm,
  3227. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3228. (idx + 1),
  3229. MmePacket->MMENTRY[21], MmePacket->MMENTRY[22], MmePacket->MMENTRY[23],
  3230. MmePacket->MMENTRY[24], MmePacket->MMENTRY[25], MmePacket->MMENTRY[26]);
  3231. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3232. break;
  3233. }
  3234. //[TC_SECC_VTB_CmSlacMatch_017] EVSE ID should be all zero
  3235. //[TC_SECC_VTB_CmSlacMatch_018]
  3236. if (Array_Check_All_Zero(&MmePacket->MMENTRY[27], 17) == FALSE)
  3237. {
  3238. sprintf((char*)buf_log_evcomm,
  3239. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE ID",
  3240. (idx + 1));
  3241. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3242. break;
  3243. }
  3244. //[TC_SECC_VTB_CmSlacMatch_019] EVSE MAC
  3245. //[TC_SECC_VTB_CmSlacMatch_020]
  3246. if (Array_Compare_Identity(CsuMac, &MmePacket->MMENTRY[44], SLAC_EVSE_MAC_LENGTH) == FALSE)
  3247. {
  3248. sprintf((char*)buf_log_evcomm,
  3249. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3250. (idx + 1),
  3251. MmePacket->MMENTRY[44], MmePacket->MMENTRY[45], MmePacket->MMENTRY[46],
  3252. MmePacket->MMENTRY[47], MmePacket->MMENTRY[48], MmePacket->MMENTRY[49]);
  3253. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3254. break;
  3255. }
  3256. //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
  3257. //[TC_SECC_VTB_CmSlacMatch_022]
  3258. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
  3259. (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
  3260. {
  3261. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3262. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  3263. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3264. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3265. SendMmePacket.MMV = MmePacket->MMV;
  3266. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_MATCH_CNF;
  3267. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3268. SendMmePacketSize = 0;
  3269. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //APPLICATION_TYPE: Fixed value (0x00: EV-EVSE matching)
  3270. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //SECURITY_TYPE: Fixed value (0x00: No Security)
  3271. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x56; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3272. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3273. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EV ID
  3274. SendMmePacketSize += 17;
  3275. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //EV MAC
  3276. SendMmePacketSize += 6;
  3277. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EVSE ID
  3278. SendMmePacketSize += 17;
  3279. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, CsuMac, 6); //EVSE MAC
  3280. SendMmePacketSize += 6;
  3281. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  3282. SendMmePacketSize += SLAC_RUNID_LENGTH;
  3283. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 8); //RSVD
  3284. SendMmePacketSize += 8;
  3285. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, Nid, sizeof(Nid)); //NID: Network ID given by the CCo(EVSE)
  3286. SendMmePacketSize += sizeof(Nid); //NID caculated from the random NMK that will be set.
  3287. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //RSVD
  3288. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, NewNmkKey, sizeof(NewNmkKey)); //NMK: Random value
  3289. SendMmePacketSize += sizeof(NewNmkKey); //NMK: Private NMK of the EVSE (random value)
  3290. SendMmePacketSize += 19; //the size before MMENTRY
  3291. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3292. {
  3293. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3294. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3295. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3296. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3297. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3298. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3299. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3300. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3301. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3302. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3303. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3304. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3305. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3306. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3307. for(Rtn=0; Rtn<17; Rtn++)
  3308. {
  3309. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3310. }
  3311. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3312. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3313. for(Rtn=0; Rtn<6; Rtn++)
  3314. {
  3315. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3316. }
  3317. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3318. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3319. for(Rtn=0; Rtn<17; Rtn++)
  3320. {
  3321. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3322. }
  3323. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3324. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3325. for(Rtn=0; Rtn<6; Rtn++)
  3326. {
  3327. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3328. }
  3329. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3330. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3331. for(Rtn=0; Rtn<8; Rtn++)
  3332. {
  3333. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3334. }
  3335. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3336. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3337. for(Rtn=0; Rtn<8; Rtn++)
  3338. {
  3339. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3340. }
  3341. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3342. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3343. for(Rtn=0; Rtn<7; Rtn++)
  3344. {
  3345. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3346. }
  3347. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3348. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3349. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3350. for(Rtn=0; Rtn<16; Rtn++)
  3351. {
  3352. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3353. }
  3354. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3355. }
  3356. #endif
  3357. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3358. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3359. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3360. sprintf((char*)buf_log_evcomm,
  3361. "[SLAC][Tx]CM_SLAC_MATCH_CNF[%d]",
  3362. (idx + 1));
  3363. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3364. ftime(&SeqStartTime);
  3365. }
  3366. else
  3367. {
  3368. //RunID does not match and it's not the first SLAC request
  3369. //Reset the SLAC database to embrace SLAC retry
  3370. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
  3371. SLAC_DB_Reset();
  3372. }
  3373. }
  3374. else
  3375. {
  3376. //OSA(EvMac) does not exist
  3377. }
  3378. break;
  3379. }
  3380. #else
  3381. {
  3382. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3383. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3384. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  3385. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  3386. memcpy(SendMmePacket.OSA,CsuMac,6);
  3387. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  3388. SendMmePacket.MMV=MmePacket->MMV;
  3389. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_MATCH_CNF;
  3390. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  3391. SendMmePacketSize=0;
  3392. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating ��PEV-EVSE matching��
  3393. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating ��No Security��
  3394. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56; //Fixed value (0x0056) for matching
  3395. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x0056) for matching
  3396. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //PEV ID
  3397. SendMmePacketSize+=17;
  3398. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  3399. SendMmePacketSize+=6;
  3400. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //EVSE ID
  3401. SendMmePacketSize+=17;
  3402. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
  3403. SendMmePacketSize+=6;
  3404. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  3405. SendMmePacketSize+=sizeof(SlacRunId);
  3406. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8); //RSVD
  3407. SendMmePacketSize+=8;
  3408. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
  3409. SendMmePacketSize+=sizeof(Nid);
  3410. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //RSVD
  3411. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
  3412. SendMmePacketSize+=sizeof(NewNmkKey);
  3413. SendMmePacketSize+=19; //the size before MMENTRY
  3414. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3415. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3416. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3417. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3418. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3419. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3420. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3421. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3422. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3423. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3424. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3425. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3426. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3427. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3428. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3429. for(Rtn=0; Rtn<17; Rtn++)
  3430. {
  3431. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3432. }
  3433. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3434. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3435. for(Rtn=0; Rtn<6; Rtn++)
  3436. {
  3437. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3438. }
  3439. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3440. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3441. for(Rtn=0; Rtn<17; Rtn++)
  3442. {
  3443. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3444. }
  3445. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3446. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3447. for(Rtn=0; Rtn<6; Rtn++)
  3448. {
  3449. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3450. }
  3451. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3452. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3453. for(Rtn=0; Rtn<8; Rtn++)
  3454. {
  3455. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3456. }
  3457. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3458. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3459. for(Rtn=0; Rtn<8; Rtn++)
  3460. {
  3461. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3462. }
  3463. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3464. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3465. for(Rtn=0; Rtn<7; Rtn++)
  3466. {
  3467. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3468. }
  3469. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3470. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3471. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3472. for(Rtn=0; Rtn<16; Rtn++)
  3473. {
  3474. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3475. }
  3476. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3477. #endif
  3478. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3479. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3480. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3481. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Tx]CM_SLAC_MATCH_CNF");
  3482. ftime(&SeqStartTime);
  3483. break;
  3484. }
  3485. #endif
  3486. }
  3487. case MMTYPE_VENDOR_VS_HOST_ACTION:
  3488. {
  3489. struct QcaVendorMmeHeader *RecvPacket;
  3490. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3491. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_HOST_ACTION ---\n");
  3492. switch (RecvPacket->MBODY[0])
  3493. {
  3494. case 0x00:
  3495. //Loader (Device Softloader or Bootloader) ready
  3496. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader Ready\n");
  3497. break;
  3498. case 0x01:
  3499. //Firmware Upgrade Ready
  3500. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade Ready\n");
  3501. break;
  3502. case 0x02:
  3503. //PIB Update Ready
  3504. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: PIB Update Ready\n");
  3505. break;
  3506. case 0x03:
  3507. //Firmware Upgrade and PIB Update ready
  3508. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade and PIB Update ready\n");
  3509. break;
  3510. case 0x04:
  3511. //Loader (Bootloader) ready to receive SDRAM configuration.
  3512. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader ready to receive SDRAM configuration\n");
  3513. break;
  3514. case 0x05:
  3515. //Reset to Factory Defaults.
  3516. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reset to Factory Defaults\n");
  3517. break;
  3518. default:
  3519. //Reserved
  3520. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reserved\n");
  3521. break;
  3522. }
  3523. break;
  3524. }
  3525. case MMTYPE_VENDOR_ATTEN_CHAR:
  3526. {
  3527. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_ATTEN_CHAR ---\n");
  3528. break;
  3529. }
  3530. case MMTYPE_VENDOR_VS_NW_INFO_CNF:
  3531. {
  3532. memcpy(QcaMac, MmePacket->OSA, 6);
  3533. sprintf((char*)buf_log_evcomm,
  3534. "[QCA7K][Rx][VENDOR_VS_NW_INFO_CNF]Got QCA7K MacAddr:%02X:%02X:%02X:%02X:%02X:%02X (comm:OK)",
  3535. QcaMac[0], QcaMac[1], QcaMac[2], QcaMac[3], QcaMac[4], QcaMac[5]);
  3536. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3537. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
  3538. DEBUG_PRINTF_EVCOMM_DETAIL("QcaMac: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3539. QcaMac[0],
  3540. QcaMac[1],
  3541. QcaMac[2],
  3542. QcaMac[3],
  3543. QcaMac[4],
  3544. QcaMac[5]);
  3545. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  3546. ftime(&SeqStartTime);
  3547. break;
  3548. }
  3549. default:
  3550. {
  3551. break;
  3552. }
  3553. }
  3554. return 0;
  3555. }
  3556. /*===========================================================================
  3557. FUNCTION: SlacComm
  3558. DESCRIPTION:
  3559. PRE-CONDITION:
  3560. INPUT:
  3561. OUTPUT:
  3562. GLOBAL VARIABLES:
  3563. =============================================================================*/
  3564. int SlacComm()
  3565. {
  3566. static unsigned char qca7k_comm_retry = 0;
  3567. unsigned char *EvMac_in;
  3568. unsigned char *RunID_in;
  3569. double t_diff = 0;
  3570. int packet_size = 0;
  3571. int count = 0;
  3572. //int idx = 0;
  3573. int i = 0;
  3574. if(RawSock >= 0)
  3575. {
  3576. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  3577. packet_size = recvfrom(RawSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0, NULL, NULL);
  3578. if(packet_size > 0)
  3579. {
  3580. /*#ifdef Debug
  3581. DEBUG_PRINTF_EVCOMM_DETAIL("Raw Data: ");
  3582. for(count=0;count<packet_size;count++)
  3583. DEBUG_PRINTF_EVCOMM_DETAIL("0x%x, ",V2gtpMsgRxBuf[count]);
  3584. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3585. #endif*/
  3586. MmeProcess(V2gtpMsgRxBuf, packet_size);
  3587. }
  3588. }
  3589. switch(Check_V2G_Flow_Status())
  3590. {
  3591. case IDLE:
  3592. {
  3593. if(RawSock < 0)
  3594. {
  3595. RawSock = socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  3596. sprintf((char*)buf_log_evcomm, "[RawSock]opened(%d)", RawSock);
  3597. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3598. if(RawSock == -1)
  3599. {
  3600. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Failed to create socket");
  3601. Update_V2G_Flow_Status(Other_Fault);
  3602. return -1;
  3603. }
  3604. if (setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE, QcaInterface, 4) < 0)
  3605. {
  3606. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_BINDTODEVICE NG");
  3607. Update_V2G_Flow_Status(Other_Fault);
  3608. return -1;
  3609. }
  3610. struct timeval tv;
  3611. tv.tv_sec = 0;
  3612. tv.tv_usec = 100000; //100ms (Rx timeout)
  3613. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3614. {
  3615. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_RCVTIMEO NG");
  3616. Update_V2G_Flow_Status(Other_Fault);
  3617. return -1;
  3618. }
  3619. tv.tv_usec = 100000; //100ms (Tx timeout)
  3620. if (setsockopt(RawSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3621. {
  3622. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_SNDTIMEO NG");
  3623. Update_V2G_Flow_Status(Other_Fault);
  3624. return -1;
  3625. }
  3626. memset(&Req, 0, sizeof(struct ifreq));
  3627. strcpy( (char*)Req.ifr_name, QcaInterface);
  3628. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  3629. {
  3630. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm: ioctl NG");
  3631. Update_V2G_Flow_Status(Other_Fault);
  3632. return -1;
  3633. }
  3634. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll));
  3635. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  3636. DestSocketAddress.sll_halen = ETH_ALEN;
  3637. PwmStartTime = 0;
  3638. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = FALSE;
  3639. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K]connecting...");
  3640. //Get QCA7K MAC address
  3641. GetQca7kMac();
  3642. ftime(&SeqStartTime);
  3643. break;
  3644. }
  3645. else //RawSock: opened
  3646. {
  3647. if(EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  3648. {
  3649. ftime(&SeqEndTime);
  3650. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3651. if (t_diff > V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD) //3 secs
  3652. {
  3653. qca7k_comm_retry++;
  3654. sprintf((char*)buf_log_evcomm,
  3655. "Re-try connecting...(%.02lf/%dms)",
  3656. t_diff,
  3657. V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD);
  3658. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3659. GetQca7kMac(); //re-send req
  3660. ftime(&SeqStartTime);
  3661. break;
  3662. }
  3663. else
  3664. {
  3665. //null
  3666. }
  3667. //Retry by 3 times
  3668. if (qca7k_comm_retry >= 3)
  3669. {
  3670. sprintf((char*)buf_log_evcomm,
  3671. "[Error]Comm: fail (retry by %d times)",
  3672. qca7k_comm_retry);
  3673. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3674. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3675. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3676. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3677. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3678. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3679. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3680. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3681. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3682. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3683. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3684. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  3685. Update_V2G_Flow_Status(Sequence_Timeout);
  3686. qca7k_comm_retry = 0;
  3687. break;
  3688. }
  3689. }
  3690. else //RawSock: opened; Set Key: DONE
  3691. {
  3692. if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
  3693. {
  3694. if(PwmStartTime <= 0)
  3695. {
  3696. //Sniffer_Tcpdump(ENABLE);
  3697. //#if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  3698. //sleep(1); //wait for tcpdump to be ready.
  3699. //#endif
  3700. SwitchCpStateE(DISABLE);
  3701. OutputCpPwmDuty(5);
  3702. PwmStartTime = time(NULL);
  3703. }
  3704. else
  3705. {
  3706. if((time(NULL) - PwmStartTime) > TT_EVSE_SLAC_init)
  3707. {
  3708. sprintf((char*)buf_log_evcomm,
  3709. "SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init, NowTime(%ld)-PwmStartTime(%d)>%d (sec)",
  3710. time(NULL),
  3711. PwmStartTime,
  3712. TT_EVSE_SLAC_init);
  3713. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3714. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3715. //CCS_SECC_TIMEOUT_SLAC_TT_EVSE_SLAC_init (023809)
  3716. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3717. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3718. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3719. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3720. ShmStatusCodeData->PresentStatusCode[0][4] = 0;
  3721. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  3722. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3723. Update_V2G_Flow_Status(Sequence_Timeout);
  3724. PwmStartTime = 0;
  3725. return -1;
  3726. }
  3727. else
  3728. {
  3729. //waiting for CM_SLAC_PARM_REQ
  3730. }
  3731. }
  3732. }
  3733. else
  3734. {
  3735. PwmStartTime = 0;
  3736. }
  3737. }
  3738. }
  3739. break;
  3740. }
  3741. case CM_SET_KEY_REQ: //13
  3742. {
  3743. //CM_SET_KEY_REQ
  3744. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Rx]CM_SET_KEY_REQ");
  3745. ftime(&SeqEndTime);
  3746. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3747. if (t_diff > V2G_SECC_QCA7000_COMM_TIMEOUT) //10 seconds
  3748. {
  3749. sprintf((char*)buf_log_evcomm,
  3750. "[QCA7K]Failed on SetKey => End_Process (%.02lf/%dms)",
  3751. t_diff,
  3752. V2G_SECC_QCA7000_COMM_TIMEOUT);
  3753. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3754. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3755. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3756. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3757. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3758. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3759. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3760. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3761. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3762. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3763. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3764. Update_V2G_Flow_Status(Sequence_Timeout);
  3765. }
  3766. else if (t_diff > V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD) //2 seconds
  3767. {
  3768. sprintf((char*)buf_log_evcomm,
  3769. "[QCA7K]SetKey: proceed (%.02lf/%dms)",
  3770. t_diff,
  3771. V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD);
  3772. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3773. SendSetKey();
  3774. ftime(&SeqStartTime);
  3775. }
  3776. else
  3777. {
  3778. //null
  3779. }
  3780. break;
  3781. }
  3782. case CM_SET_KEY_CNF: //14
  3783. {
  3784. sprintf((char*)buf_log_evcomm,
  3785. "[SECCReady]Wait: plugin(%d), matached(%d), permission(%d)...",
  3786. CheckConnectorPlugIn(),
  3787. CSUCOMMDC_TASK_FLAG.matched,
  3788. ShmInternalComm->ChargingPermission
  3789. );
  3790. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3791. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = TRUE;
  3792. PwmStartTime = 0;
  3793. Update_V2G_Flow_Status(IDLE);
  3794. break;
  3795. }
  3796. case CM_SLAC_PARM_CONF:
  3797. {
  3798. ftime(&SeqEndTime);
  3799. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  3800. {
  3801. sprintf((char*)buf_log_evcomm,
  3802. "SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence (%.02lf of %dms)",
  3803. DiffTimeb(SeqStartTime, SeqEndTime),
  3804. TT_match_sequence);
  3805. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3806. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3807. //CCS_SECC_TIMEOUT_CM_START_ATTEN_CHAR_IND (023811):
  3808. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3809. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3810. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3811. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3812. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3813. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3814. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3815. ShmStatusCodeData->PresentStatusCode[0][5] = 1;
  3816. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3817. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3818. Update_V2G_Flow_Status(Sequence_Timeout);
  3819. return -1;
  3820. }
  3821. break;
  3822. }
  3823. case CM_START_ATTEN_CHAR_IND:
  3824. {
  3825. ftime(&SeqEndTime);
  3826. if(DiffTimeb(SeqStartTime, SeqEndTime) > (TP_EV_batch_msg_interval)) //one more time interval for tolerance
  3827. {
  3828. sprintf((char*)buf_log_evcomm,
  3829. "SlacComm: Wait CM_MNBC_SOUND_IND Timeout - TP_EV_batch_msg_interval (%.02lf of %dms)",
  3830. DiffTimeb(SeqStartTime, SeqEndTime),
  3831. TP_EV_batch_msg_interval);
  3832. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3833. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3834. //CCS_SECC_TIMEOUT_SLAC_CM_MNBC_SOUND_IND (023818):
  3835. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3836. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3837. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3838. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3839. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3840. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3841. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3842. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  3843. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3844. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3845. Update_V2G_Flow_Status(Sequence_Timeout);
  3846. return -1;
  3847. }
  3848. break;
  3849. }
  3850. case CM_MNBC_SOUND_IND:
  3851. {
  3852. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  3853. {
  3854. ftime(&SeqEndTime);
  3855. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3856. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  3857. if(t_diff > TT_EVSE_match_MNBC ||
  3858. (SLAC_INFO.array[0].AttenProfileCnt >= SLAC_INFO.array[0].MnbcSoundNum) ||
  3859. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)) //TC_SECC_VTB_AttenuationCharacterization_003
  3860. {
  3861. //Wait for other SLAC Req sets
  3862. if ((SLAC_INFO.arrayLen >= 2) &&
  3863. (t_diff < TT_EVSE_match_MNBC) &&
  3864. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)) //not a retry
  3865. {
  3866. break;
  3867. }
  3868. //Check if it is a timeup response
  3869. if (t_diff > TT_EVSE_match_MNBC)
  3870. {
  3871. sprintf((char*)buf_log_evcomm,
  3872. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: timeup(%.2f/%dms) => send",
  3873. (i + 1),
  3874. t_diff,
  3875. TT_EVSE_match_MNBC);
  3876. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3877. }
  3878. //Sending all CM_ATTEN_CHAR_IND according to all corresponding SLAC Req sets
  3879. for (i = 0; i < SLAC_INFO.arrayLen; i++)
  3880. {
  3881. if ((SLAC_INFO.array[i].AttenProfileCnt == 0) ||
  3882. (SLAC_INFO.array[i].AagGroupsNum == 0) ||
  3883. (SLAC_INFO.array[i].StartAttenCharCnt == 0) ||
  3884. (SLAC_INFO.array[i].MnbcSoundNum != 10) || //received in CM_START_ATTEN_CHAR_IND
  3885. (SLAC_INFO.array[i].StartAttenCharErr == TRUE)
  3886. )
  3887. {
  3888. //Ignoring those SLAC request sets without sending CM_MNBC_SOUND_IND(CM_ATTEN_PROFILE_IND)
  3889. sprintf((char*)buf_log_evcomm,
  3890. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: para err(%d,%d,%d,%d,%d) => canceled",
  3891. (i + 1),
  3892. SLAC_INFO.array[i].AttenProfileCnt,
  3893. SLAC_INFO.array[i].AagGroupsNum,
  3894. SLAC_INFO.array[i].StartAttenCharCnt,
  3895. SLAC_INFO.array[i].MnbcSoundNum,
  3896. SLAC_INFO.array[i].StartAttenCharErr);
  3897. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3898. continue;
  3899. }
  3900. //In CM_ATTEN_CHAR_IND retry process, here only re-send this message according to the 1st coming SLAC request
  3901. if ((EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0) && (i != 0))
  3902. {
  3903. sprintf((char*)buf_log_evcomm,
  3904. "[NOTE][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: canceled",
  3905. (i + 1));
  3906. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3907. break;
  3908. }
  3909. EvMac_in = SLAC_INFO.array[i].EvMac;
  3910. RunID_in = SLAC_INFO.array[i].RunID;
  3911. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3912. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  3913. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3914. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3915. SendMmePacket.MMV = 0x01;
  3916. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  3917. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3918. SendMmePacketSize = 0;
  3919. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  3920. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  3921. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //SOURCE_ADDRESS, MAC address of the EV Host
  3922. SendMmePacketSize += SLAC_EVMAC_LENGTH;
  3923. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  3924. SendMmePacketSize += SLAC_RUNID_LENGTH;
  3925. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //SOURCE_ID(0x00)
  3926. SendMmePacketSize += 17;
  3927. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //RESP_ID(0x00)
  3928. SendMmePacketSize += 17;
  3929. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AttenProfileCnt; //NumSounds: Number of M-Sounds used for generation of the ATTEN_PROFILE
  3930. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AagGroupsNum; //NumGroups
  3931. for(count = 0; count < SLAC_INFO.array[i].AagGroupsNum; count++)
  3932. {
  3933. unsigned char TmpAag;
  3934. TmpAag = ((SLAC_INFO.array[i].AAG[count] / SLAC_INFO.array[i].AttenProfileCnt) & 0xFF);
  3935. SLAC_INFO.array[i].AAG_quality_ori += (float) TmpAag; //original signal quality
  3936. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  3937. #if 1
  3938. //TC_SECC_VTB_AttenuationCharacterization_019
  3939. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  3940. #else
  3941. if(TmpAag >= 39) //original method proposed by Vern
  3942. {
  3943. TmpAag = 37;
  3944. }
  3945. #endif
  3946. #endif
  3947. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  3948. SLAC_INFO.array[i].AAG_quality_refined += (float) TmpAag; //refined signal quality
  3949. }
  3950. SendMmePacketSize += 19; //the size before MMENTRY
  3951. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  3952. {
  3953. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  3954. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3955. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3956. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3957. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3958. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3959. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3960. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3961. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3962. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  3963. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3964. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3965. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3966. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  3967. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  3968. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  3969. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  3970. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  3971. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  3972. for(count=0; count<17; count++)
  3973. {
  3974. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
  3975. }
  3976. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3977. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  3978. for(count=0; count<17; count++)
  3979. {
  3980. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
  3981. }
  3982. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3983. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  3984. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
  3985. for(count=0; count<AagGroupsNum; count++)
  3986. {
  3987. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
  3988. }
  3989. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3990. }
  3991. #endif
  3992. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3993. SLAC_INFO.array[i].AAG_quality_ori /= SLAC_INFO.array[i].AagGroupsNum;
  3994. SLAC_INFO.array[i].AAG_quality_refined /= SLAC_INFO.array[i].AagGroupsNum;
  3995. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  3996. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  3997. {
  3998. sprintf((char*)buf_log_evcomm,
  3999. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: %d-th resend (Q=%.2f/%.2f)(%d/%d)",
  4000. (i + 1),
  4001. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry,
  4002. SLAC_INFO.array[i].AAG_quality_refined,
  4003. SLAC_INFO.array[i].AAG_quality_ori,
  4004. SLAC_INFO.array[i].AttenProfileCnt,
  4005. SLAC_INFO.array[i].MnbcSoundNum);
  4006. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4007. }
  4008. else if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)
  4009. {
  4010. sprintf((char*)buf_log_evcomm,
  4011. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: Q=%.2f/%.2f(%d/%d)",
  4012. (i + 1),
  4013. SLAC_INFO.array[i].AAG_quality_refined,
  4014. SLAC_INFO.array[i].AAG_quality_ori,
  4015. SLAC_INFO.array[i].AttenProfileCnt,
  4016. SLAC_INFO.array[i].MnbcSoundNum);
  4017. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4018. }
  4019. else
  4020. {
  4021. sprintf((char*)buf_log_evcomm,
  4022. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: unexpected CM_ATTEN_CHAR_IND_retry(%d))",
  4023. i,
  4024. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  4025. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4026. }
  4027. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  4028. } //end of for loop
  4029. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  4030. ftime(&SeqStartTime);
  4031. }
  4032. break;
  4033. }
  4034. #else
  4035. {
  4036. ftime(&SeqEndTime);
  4037. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  4038. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_MNBC || (AttenProfileCnt >= MnbcSoundNum) || (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0))
  4039. {
  4040. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  4041. memcpy(SendMmePacket.ODA, EvMac, 6);
  4042. memcpy(SendMmePacket.OSA, CsuMac, 6);
  4043. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  4044. SendMmePacket.MMV = 0x01;
  4045. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  4046. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  4047. SendMmePacketSize = 0;
  4048. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  4049. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  4050. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //SOURCE_ADDRESS, MAC address of the EV Host
  4051. SendMmePacketSize += 6;
  4052. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize, SlacRunId, sizeof(SlacRunId));
  4053. SendMmePacketSize += sizeof(SlacRunId);
  4054. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //SOURCE_ID
  4055. SendMmePacketSize += 17;
  4056. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //RESP_ID
  4057. SendMmePacketSize += 17;
  4058. SendMmePacket.MMENTRY[SendMmePacketSize++] = AttenProfileCnt; //NumSounds
  4059. SendMmePacket.MMENTRY[SendMmePacketSize++] = AagGroupsNum; //NumGroups
  4060. for(count=0; count < AagGroupsNum; count++)
  4061. {
  4062. unsigned char TmpAag;
  4063. TmpAag = ((Aag[count] / AttenProfileCnt) & 0xFF);
  4064. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  4065. #if 1
  4066. //TC_SECC_VTB_AttenuationCharacterization_019
  4067. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  4068. #else
  4069. if(TmpAag >= 39) //original method proposed by Vern
  4070. {
  4071. /*
  4072. // [To-do] If this statement is enabled, SLAC will fail due to timeout.
  4073. {
  4074. unsigned char TmpBuf[64];
  4075. memset(TmpBuf,0,sizeof(TmpBuf));
  4076. sprintf((char*)TmpBuf,"SlacComm: bad Aag[%d]=%d",count,TmpAag);
  4077. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", TmpBuf);
  4078. }
  4079. */
  4080. printf("%d,", TmpAag);
  4081. TmpAag = 37;
  4082. }
  4083. #endif
  4084. #endif
  4085. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  4086. }
  4087. SendMmePacketSize += 19; //the size before MMENTRY
  4088. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
  4089. {
  4090. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  4091. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4092. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  4093. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4094. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  4095. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  4096. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  4097. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  4098. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  4099. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  4100. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  4101. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  4102. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  4103. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  4104. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  4105. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  4106. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  4107. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  4108. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
  4109. for(count=0; count<17; count++)
  4110. {
  4111. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
  4112. }
  4113. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4114. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
  4115. for(count=0; count<17; count++)
  4116. {
  4117. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
  4118. }
  4119. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4120. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  4121. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
  4122. for(count=0; count<AagGroupsNum; count++)
  4123. {
  4124. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
  4125. }
  4126. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  4127. }
  4128. #endif
  4129. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  4130. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  4131. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  4132. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  4133. {
  4134. sprintf((char*)buf_log_evcomm,
  4135. "[SLAC][Tx]CM_ATTEN_CHAR_IND: resend(%d-th)",
  4136. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  4137. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4138. }
  4139. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  4140. ftime(&SeqStartTime);
  4141. }
  4142. break;
  4143. }
  4144. #endif
  4145. }
  4146. case CM_ATTEN_CHAR_IND:
  4147. {
  4148. ftime(&SeqEndTime);
  4149. //if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  4150. 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.
  4151. {
  4152. sprintf((char*)buf_log_evcomm,
  4153. "SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response (%.02lf of %dms)",
  4154. DiffTimeb(SeqStartTime, SeqEndTime),
  4155. TT_match_response);
  4156. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4157. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4158. //CCS_SECC_TIMEOUT_SLAC_CM_ATTEN_CHAR_RSP (023814):
  4159. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4160. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4161. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4162. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4163. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4164. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4165. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  4166. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  4167. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4168. Update_V2G_Flow_Status(Sequence_Timeout);
  4169. return -1;
  4170. }
  4171. break;
  4172. }
  4173. case CM_ATTEN_CHAR_RSP:
  4174. {
  4175. ftime(&SeqEndTime);
  4176. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_session)
  4177. {
  4178. sprintf((char*)buf_log_evcomm,
  4179. "SlacComm: Wait CM_VALIDATE_REQ_1ST or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session (%.02lf of %dms)",
  4180. DiffTimeb(SeqStartTime, SeqEndTime),
  4181. TT_EVSE_match_session);
  4182. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4183. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4184. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_1ST__CM_SLAC_MATCH_REQ (023815):
  4185. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4186. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4187. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4188. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4189. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4190. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4191. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  4192. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  4193. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4194. Update_V2G_Flow_Status(Sequence_Timeout);
  4195. return -1;
  4196. }
  4197. break;
  4198. }
  4199. case CM_VALIDATE_CNF:
  4200. {
  4201. ftime(&SeqEndTime);
  4202. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  4203. {
  4204. sprintf((char*)buf_log_evcomm,
  4205. "SlacComm: Wait CM_VALIDATE_REQ_2ND or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence (%.02lf of %dms)",
  4206. DiffTimeb(SeqStartTime, SeqEndTime),
  4207. TT_match_sequence);
  4208. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4209. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4210. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_2ND__CM_SLAC_MATCH_REQ (023819):
  4211. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4212. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4213. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4214. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4215. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4216. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4217. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  4218. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  4219. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4220. Update_V2G_Flow_Status(Sequence_Timeout);
  4221. return -1;
  4222. }
  4223. break;
  4224. }
  4225. case CM_SLAC_MATCH_CNF:
  4226. {
  4227. if(UdpSock > 0)
  4228. {
  4229. close(UdpSock);
  4230. UdpSock = -1;
  4231. }
  4232. if(TcpSock > 0)
  4233. {
  4234. close(TcpSock);
  4235. TcpSock = -1;
  4236. }
  4237. ftime(&SeqStartTime);
  4238. V2gTcpConnected();
  4239. Update_V2G_Flow_Status(SLACC_SDP_UDP_Connection);
  4240. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SLAAC,SDP,UDP: connecting...");
  4241. break;
  4242. }
  4243. default:
  4244. {
  4245. break;
  4246. }
  4247. }
  4248. return 0;
  4249. }
  4250. /*===========================================================================
  4251. FUNCTION: V2gMsgDecoder
  4252. DESCRIPTION:
  4253. 1. Decode the V2GTP messages inside "msg" and save the decoded
  4254. messages in ccs_exi_doc_DIN, ccs_exi_doc_ISO1, and ccs_exi_doc_ISO2,
  4255. respectively.
  4256. 2. After decoding, V2gMsg_Process() could then use
  4257. ccs_exi_doc_DIN, ccs_exi_doc_ISO1, or ccs_exi_doc_ISO2
  4258. to deal with the corresponding Response messages, respectively.
  4259. PRE-CONDITION:
  4260. 1. msg_length > 0
  4261. INPUT:
  4262. 1. msg
  4263. 2. msg_length
  4264. OUTPUT:
  4265. 1. ccs_exi_doc_DIN //global variable
  4266. ccs_exi_doc_ISO1
  4267. ccs_exi_doc_ISO2
  4268. 2. v2g_state //Status Flag
  4269. //indicating the V2gMsg_Process_din to proceed
  4270. the next process.
  4271. 3. return value // < 0: ERROR
  4272. // > 0: Message Type
  4273. GLOBAL VARIABLES:
  4274. =============================================================================*/
  4275. int V2gMsgDecoder(unsigned char *msg, unsigned int msg_length, unsigned int v2g_state)
  4276. {
  4277. int errn = 0;
  4278. //Checking the minimum Header size requirement
  4279. if(msg_length < V2GTP_MSG_HEADER_LENGTH) //The minimum requirement should be 8-byte header.
  4280. {
  4281. errn = -1;
  4282. return errn;
  4283. }
  4284. //Decode the 1st V2GMSG: AppProtocol
  4285. if(v2g_state == SupportedAppProtocolRequest) //17
  4286. {
  4287. if ((errn = API_V2GMSG_EXI_Decoder_AppProtocol(msg, msg_length, &ccs_handshake)) < 0)
  4288. {
  4289. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: SupportedAppProtocolRequest()\n", errn);
  4290. }
  4291. else //decoded successfully.
  4292. {
  4293. //PRINT_XML_DOC_supportedAppProtocolReq(&ccs_handshake);
  4294. }
  4295. }
  4296. //Decode the subsequent V2GMSG (DIN 70121, ISO 15118-2, ISO 15118-20)
  4297. else if(v2g_state > SupportedAppProtocolRequest && v2g_state <= SessionStopResponse)
  4298. {
  4299. //Decoding according to its own protocol
  4300. switch (ShmCcsData->CommProtocol)
  4301. {
  4302. case V2GT_MSG_PROTOCOL_DIN70121: //0
  4303. {
  4304. //DIN
  4305. if((errn = API_V2GMSG_EXI_Decoder_DIN(msg, msg_length, &ccs_exi_doc_DIN)) < 0)
  4306. {
  4307. sprintf((char*)buf_log_evcomm,
  4308. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_DIN()",
  4309. errn);
  4310. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4311. }
  4312. break;
  4313. }
  4314. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  4315. {
  4316. //ISO1
  4317. if((errn = API_V2GMSG_EXI_Decoder_ISO1(msg, msg_length, &ccs_exi_doc_ISO1)) < 0)
  4318. {
  4319. sprintf((char*)buf_log_evcomm,
  4320. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO1()",
  4321. errn);
  4322. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4323. }
  4324. break;
  4325. }
  4326. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  4327. {
  4328. //ISO2
  4329. if((errn = API_V2GMSG_EXI_Decoder_ISO2(msg, msg_length, &ccs_exi_doc_ISO2)) < 0)
  4330. {
  4331. sprintf((char*)buf_log_evcomm,
  4332. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO2()",
  4333. errn);
  4334. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4335. }
  4336. break;
  4337. }
  4338. default:
  4339. break;
  4340. }
  4341. }
  4342. else
  4343. {
  4344. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: Unexpected v2g_state\n", errn);
  4345. errn = -1;
  4346. }
  4347. return errn;
  4348. }
  4349. /*===========================================================================
  4350. FUNCTION: encode_din_V2GTP_stream
  4351. DESCRIPTION:
  4352. PRE-CONDITION:
  4353. INPUT:
  4354. OUTPUT:
  4355. GLOBAL VARIABLES:
  4356. =============================================================================*/
  4357. int encode_din_V2GTP_stream(bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4358. {
  4359. int errn = 0;
  4360. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4361. errn = encode_dinExiDocument(v2g_tx_stream, ccs_exi_doc_DIN);
  4362. if (errn == 0)
  4363. {
  4364. //successfully encoded
  4365. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4366. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4367. if (errn != 0)
  4368. {
  4369. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4370. }
  4371. }
  4372. else
  4373. {
  4374. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]encode_dinExiDocument(): %d (DEC)\n", errn);
  4375. }
  4376. return errn;
  4377. }
  4378. /*===========================================================================
  4379. FUNCTION: encode_iso1_V2GTP_stream
  4380. DESCRIPTION:
  4381. PRE-CONDITION:
  4382. INPUT:
  4383. OUTPUT:
  4384. GLOBAL VARIABLES:
  4385. =============================================================================*/
  4386. int encode_iso1_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4387. {
  4388. int errn = 0;
  4389. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4390. errn = encode_iso1ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO1);
  4391. if (errn == 0)
  4392. {
  4393. //successfully encoded
  4394. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4395. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4396. if (errn != 0)
  4397. {
  4398. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4399. }
  4400. }
  4401. else
  4402. {
  4403. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]encode_iso1ExiDocument(): %d (DEC)\n", errn);
  4404. }
  4405. return errn;
  4406. }
  4407. /*===========================================================================
  4408. FUNCTION: encode_iso2_V2GTP_stream
  4409. DESCRIPTION:
  4410. PRE-CONDITION:
  4411. INPUT:
  4412. OUTPUT:
  4413. GLOBAL VARIABLES:
  4414. =============================================================================*/
  4415. int encode_iso2_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4416. {
  4417. int errn = 0;
  4418. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4419. errn = encode_iso2ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO2);
  4420. if (errn == 0)
  4421. {
  4422. //successfully encoded
  4423. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4424. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4425. if (errn != 0)
  4426. {
  4427. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4428. }
  4429. }
  4430. else
  4431. {
  4432. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]encode_iso2ExiDocument(): %d (DEC)\n", errn);
  4433. }
  4434. return errn;
  4435. }
  4436. /*===========================================================================
  4437. FUNCTION: send_encoded_din_V2GTP_Stream
  4438. DESCRIPTION:
  4439. PRE-CONDITION:
  4440. INPUT:
  4441. OUTPUT:
  4442. GLOBAL VARIABLES:
  4443. =============================================================================*/
  4444. int send_encoded_din_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4445. {
  4446. int errn = 0;
  4447. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4448. errn = encode_din_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_DIN);
  4449. // STEP 2: =========== Send Response Packet ===========
  4450. int rtn = 0;
  4451. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4452. if (rtn == v2g_tx_stream->size)
  4453. {
  4454. /*
  4455. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_din_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4456. rtn, v2g_tx_stream->size);
  4457. */
  4458. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4459. }
  4460. else if (rtn >= 0)
  4461. {
  4462. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_din_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n", rtn, v2g_tx_stream->size);
  4463. }
  4464. else
  4465. {
  4466. errn = rtn;
  4467. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_din_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4468. }
  4469. //STEP 3: ========= Reset V2G MSG Flags ==========
  4470. init_dinBodyType(&ccs_exi_doc_DIN->V2G_Message.Body);
  4471. return errn;
  4472. }
  4473. /*===========================================================================
  4474. FUNCTION: send_encoded_iso1_V2GTP_Stream
  4475. DESCRIPTION:
  4476. PRE-CONDITION:
  4477. INPUT:
  4478. OUTPUT:
  4479. GLOBAL VARIABLES:
  4480. =============================================================================*/
  4481. int send_encoded_iso1_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4482. {
  4483. int errn = 0;
  4484. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4485. errn = encode_iso1_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO1);
  4486. // STEP 2: =========== Send Response Packet ===========
  4487. int rtn = 0;
  4488. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4489. if (rtn == v2g_tx_stream->size)
  4490. {
  4491. /*
  4492. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso1_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4493. rtn, v2g_tx_stream->size);
  4494. */
  4495. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4496. }
  4497. else if (rtn >= 0)
  4498. {
  4499. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso1_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n", rtn, v2g_tx_stream->size);
  4500. }
  4501. else
  4502. {
  4503. errn = rtn;
  4504. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso1_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4505. }
  4506. //STEP 3: ========= Reset V2G MSG Flags ==========
  4507. init_iso1BodyType(&ccs_exi_doc_ISO1->V2G_Message.Body);
  4508. return errn;
  4509. }
  4510. /*===========================================================================
  4511. FUNCTION: send_encoded_iso2_V2GTP_Stream
  4512. DESCRIPTION:
  4513. PRE-CONDITION:
  4514. INPUT:
  4515. OUTPUT:
  4516. GLOBAL VARIABLES:
  4517. =============================================================================*/
  4518. int send_encoded_iso2_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4519. {
  4520. int errn = 0;
  4521. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4522. errn = encode_iso2_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO2);
  4523. // STEP 2: =========== Send Response Packet ===========
  4524. int rtn = 0;
  4525. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4526. if (rtn == v2g_tx_stream->size)
  4527. {
  4528. /*
  4529. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso2_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4530. rtn, v2g_tx_stream->size);
  4531. */
  4532. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4533. }
  4534. else if (rtn >= 0)
  4535. {
  4536. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso2_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4537. rtn, v2g_tx_stream->size);
  4538. }
  4539. else
  4540. {
  4541. errn = rtn;
  4542. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso2_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4543. }
  4544. //STEP 3: ========= Reset V2G MSG Flags ==========
  4545. init_iso2BodyType(&ccs_exi_doc_ISO2->V2G_Message.Body);
  4546. return errn;
  4547. }
  4548. /*===========================================================================
  4549. FUNCTION: Check_din_V2G_Rx_MSG_SessionID
  4550. DESCRIPTION:
  4551. PRE-CONDITION:
  4552. INPUT:
  4553. OUTPUT:
  4554. GLOBAL VARIABLES:
  4555. =============================================================================*/
  4556. int Check_din_V2G_Rx_MSG_SessionID(struct dinEXIDocument *exi_doc_DIN)
  4557. {
  4558. int i = 0;
  4559. int leng = 0;
  4560. int errn = 0;
  4561. leng = exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen;
  4562. //Step 1: Check SessionID Length
  4563. if (leng != 8) //8-byte
  4564. {
  4565. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4566. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4567. errn = -1;
  4568. }
  4569. else
  4570. {
  4571. //Step 2-1: Check SessionID content
  4572. for (i = 0; i < leng; i++)
  4573. {
  4574. if (exi_doc_DIN->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4575. {
  4576. errn = -2;
  4577. break;
  4578. }
  4579. }
  4580. }
  4581. //Step 2-2: Print Incorrect ID
  4582. if (errn == -2) //incorrect ID
  4583. {
  4584. sprintf((char*)buf_log_evcomm,
  4585. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4586. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[0],
  4587. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[1],
  4588. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[2],
  4589. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[3],
  4590. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[4],
  4591. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[5],
  4592. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[6],
  4593. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[7],
  4594. EVCOMM_SYS_INFO.SessionID[0],
  4595. EVCOMM_SYS_INFO.SessionID[1],
  4596. EVCOMM_SYS_INFO.SessionID[2],
  4597. EVCOMM_SYS_INFO.SessionID[3],
  4598. EVCOMM_SYS_INFO.SessionID[4],
  4599. EVCOMM_SYS_INFO.SessionID[5],
  4600. EVCOMM_SYS_INFO.SessionID[6],
  4601. EVCOMM_SYS_INFO.SessionID[7]
  4602. );
  4603. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4604. }
  4605. //Step 3: Correct SessionID for Res Message
  4606. if (errn != 0)
  4607. {
  4608. exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen = 8;
  4609. memset(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, 0, 8);
  4610. memcpy(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4611. }
  4612. return errn;
  4613. }
  4614. /*===========================================================================
  4615. FUNCTION: Check_iso1_V2G_Rx_MSG_SessionID
  4616. DESCRIPTION:
  4617. PRE-CONDITION:
  4618. INPUT:
  4619. OUTPUT:
  4620. GLOBAL VARIABLES:
  4621. =============================================================================*/
  4622. int Check_iso1_V2G_Rx_MSG_SessionID(struct iso1EXIDocument *exi_doc_ISO1)
  4623. {
  4624. int i = 0;
  4625. int leng = 0;
  4626. int errn = 0;
  4627. leng = exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen;
  4628. //Step 1: Check SessionID Length
  4629. if (leng != 8) //8-byte
  4630. {
  4631. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4632. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4633. errn = -1;
  4634. }
  4635. else
  4636. {
  4637. //Step 2-1: Check SessionID content
  4638. for (i = 0; i < leng; i++)
  4639. {
  4640. if (exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4641. {
  4642. errn = -2;
  4643. break;
  4644. }
  4645. }
  4646. }
  4647. //Step 2-2: Print Incorrect ID
  4648. if (errn == -2) //incorrect ID
  4649. {
  4650. sprintf((char*)buf_log_evcomm,
  4651. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4652. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[0],
  4653. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[1],
  4654. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[2],
  4655. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[3],
  4656. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[4],
  4657. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[5],
  4658. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[6],
  4659. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[7],
  4660. EVCOMM_SYS_INFO.SessionID[0],
  4661. EVCOMM_SYS_INFO.SessionID[1],
  4662. EVCOMM_SYS_INFO.SessionID[2],
  4663. EVCOMM_SYS_INFO.SessionID[3],
  4664. EVCOMM_SYS_INFO.SessionID[4],
  4665. EVCOMM_SYS_INFO.SessionID[5],
  4666. EVCOMM_SYS_INFO.SessionID[6],
  4667. EVCOMM_SYS_INFO.SessionID[7]
  4668. );
  4669. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4670. }
  4671. //Step 3: Correct SessionID for Res Message
  4672. if (errn != 0)
  4673. {
  4674. exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen = 8;
  4675. memset(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, 0, 8);
  4676. memcpy(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4677. }
  4678. return errn;
  4679. }
  4680. /*===========================================================================
  4681. FUNCTION: Check_iso2_V2G_Rx_MSG_SessionID
  4682. DESCRIPTION:
  4683. PRE-CONDITION:
  4684. INPUT:
  4685. OUTPUT:
  4686. GLOBAL VARIABLES:
  4687. =============================================================================*/
  4688. int Check_iso2_V2G_Rx_MSG_SessionID(struct iso2EXIDocument *exi_doc_ISO2)
  4689. {
  4690. int i = 0;
  4691. int leng = 0;
  4692. int errn = 0;
  4693. leng = exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen;
  4694. //Step 1: Check SessionID Length
  4695. if (leng != 8) //8-byte
  4696. {
  4697. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4698. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4699. errn = -1;
  4700. }
  4701. else
  4702. {
  4703. //Step 2-1: Check SessionID content
  4704. for (i = 0; i < leng; i++)
  4705. {
  4706. if (exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4707. {
  4708. errn = -2;
  4709. break;
  4710. }
  4711. }
  4712. }
  4713. //Step 2-2: Print Incorrect ID
  4714. if (errn == -2) //incorrect ID
  4715. {
  4716. sprintf((char*)buf_log_evcomm,
  4717. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4718. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[0],
  4719. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[1],
  4720. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[2],
  4721. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[3],
  4722. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[4],
  4723. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[5],
  4724. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[6],
  4725. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[7],
  4726. EVCOMM_SYS_INFO.SessionID[0],
  4727. EVCOMM_SYS_INFO.SessionID[1],
  4728. EVCOMM_SYS_INFO.SessionID[2],
  4729. EVCOMM_SYS_INFO.SessionID[3],
  4730. EVCOMM_SYS_INFO.SessionID[4],
  4731. EVCOMM_SYS_INFO.SessionID[5],
  4732. EVCOMM_SYS_INFO.SessionID[6],
  4733. EVCOMM_SYS_INFO.SessionID[7]
  4734. );
  4735. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4736. }
  4737. //Step 3: Correct SessionID for Res Message
  4738. if (errn != 0)
  4739. {
  4740. exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen = 8;
  4741. memset(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, 0, 8);
  4742. memcpy(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4743. }
  4744. return errn;
  4745. }
  4746. /*===========================================================================
  4747. FUNCTION: GetSchemaID_of_Protocol
  4748. DESCRIPTION:
  4749. 1. Get the SchemaID accroding to the input target
  4750. *V2GT_MSG_PROTOCOL_DIN70121: choose DIN 70121
  4751. *V2GT_MSG_PROTOCOL_ISO15118_2014: choose ISO 15118-2 (ed1)
  4752. *V2GT_MSG_PROTOCOL_ISO15118_2018: choose ISO 15118-20 (ed2)
  4753. *V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY: choose the one with the highest priority
  4754. 2. [To-do] Checking Major and Minor version
  4755. 3. The parsing method will not support those private protocols,
  4756. such as "usr:tesla...," since "tesla" is 5 bytes but "din" and "iso" are 3 bytes.
  4757. 4. [To-do] If the target is selected as DIN," but there is no DIN.
  4758. However, if EV and EVSE all support ISO, how to use ISO instead?
  4759. PRE-CONDITION:
  4760. INPUT:
  4761. 1. target: target protocol
  4762. OUTPUT:
  4763. 1. id: SchemaID of selected protocol by EVSE
  4764. 2. ShmCcsData->CommProtocol (selected protocol)
  4765. 3. SupportedAppProtocol_result
  4766. (1) appHandresponseCodeType_OK_SuccessfulNegotiation = 0,
  4767. (2) appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation = 1,
  4768. (3) appHandresponseCodeType_Failed_NoNegotiation = 2
  4769. GLOBAL VARIABLES:
  4770. 1. ccs_handshake
  4771. 2. ShmCcsData
  4772. =============================================================================*/
  4773. int GetSchemaID_of_Protocol(unsigned char target)
  4774. {
  4775. int i = 0;
  4776. int ii = 0;
  4777. int id = 0;
  4778. //unsigned char tmp = 0;
  4779. unsigned char pri = 20; //priority = 1(highest)~20(lowerest)
  4780. char num[10];
  4781. //struct CCS_ProtocolNamespacestructCharacters pro;
  4782. //Choose the 1st protocol as default.
  4783. //id = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  4784. id = -1;
  4785. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4786. for(i = 0; i < CCS_HANDSHAKE_PROTOCOLS.arrayLen; i++)
  4787. {
  4788. //Checking for <ProtocolNamespace>urn:din:70121:2012:MsgDef</ProtocolNamespace>
  4789. //[To-Do] Ignoring the priority from EV and force DIN 70121 as our only option. (for temp)
  4790. //[CAUTION] The parsing method will not support those private protocols, such as "usr:tesla..."
  4791. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[8];
  4792. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[9];
  4793. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[10];
  4794. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[11];
  4795. num[4] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[12];
  4796. num[5] = '\0';
  4797. if (atoi(num) == 70121)
  4798. {
  4799. sprintf((char*)buf_log_evcomm,
  4800. "[GetSchemaID_of_Protocol]supported(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  4801. (i+1),
  4802. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4803. atoi(num),
  4804. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4805. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4806. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4807. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4808. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4809. if (target == V2GT_MSG_PROTOCOL_DIN70121)
  4810. {
  4811. sprintf((char*)buf_log_evcomm,
  4812. "[GetSchemaID_of_Protocol]selected(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  4813. (i+1),
  4814. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4815. atoi(num),
  4816. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4817. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4818. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4819. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4820. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4821. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == DIN_SPEC_70121_2012_VersionNumberMajor)
  4822. {
  4823. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == DIN_SPEC_70121_2012_VersionNumberMinor)
  4824. {
  4825. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4826. }
  4827. else
  4828. { //[TC_SECC_VTB_SupportedAppProtocol_005]
  4829. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4830. }
  4831. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4832. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4833. return id;
  4834. }
  4835. else
  4836. {
  4837. //keep looking for the suitable protocol
  4838. }
  4839. }
  4840. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4841. {
  4842. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4843. {
  4844. ii = i;
  4845. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4846. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4847. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4848. }
  4849. else
  4850. {
  4851. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4852. }
  4853. }
  4854. else
  4855. {
  4856. //null
  4857. }
  4858. }
  4859. else if (atoi(num) == 15118)
  4860. {
  4861. //urn:din:70121:2012:MsgDef
  4862. //urn:iso:15118:2:2013:MsgDef
  4863. memset(num, 0, sizeof(num));
  4864. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[16];
  4865. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[17];
  4866. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[18];
  4867. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[19];
  4868. num[4] = '\0';
  4869. if (atoi(num) < 2018 && atoi(num) >= 2010)
  4870. {
  4871. sprintf((char*)buf_log_evcomm,
  4872. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-2(ed1,%d:v%d.%d;id=%d,pri=%d)",
  4873. (i+1),
  4874. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4875. atoi(num),
  4876. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4877. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4878. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4879. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4880. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4881. if (target == V2GT_MSG_PROTOCOL_ISO15118_2014)
  4882. {
  4883. sprintf((char*)buf_log_evcomm,
  4884. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-2,ed1(%d:v%d.%d;id=%d,pri=%d)",
  4885. (i+1),
  4886. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4887. atoi(num),
  4888. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4889. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4890. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4891. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4892. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4893. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO1_15118_2013_VersionNumberMajor)
  4894. {
  4895. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO1_15118_2013_VersionNumberMinor)
  4896. {
  4897. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4898. }
  4899. else
  4900. {
  4901. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4902. }
  4903. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4904. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  4905. return id;
  4906. }
  4907. else
  4908. {
  4909. //keep looking for the suitable protocol
  4910. }
  4911. }
  4912. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4913. {
  4914. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4915. {
  4916. ii = i;
  4917. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4918. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4919. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  4920. }
  4921. else
  4922. {
  4923. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4924. }
  4925. }
  4926. else
  4927. {
  4928. //null
  4929. }
  4930. }
  4931. else if (atoi(num) >= 2018 && atoi(num) <= 2100) // >= 2018
  4932. {
  4933. sprintf((char*)buf_log_evcomm,
  4934. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-20(ed2,%d:v%d.%d;id=%d,pri=%d)",
  4935. (i+1),
  4936. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4937. atoi(num),
  4938. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4939. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4940. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4941. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4942. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4943. if (target == V2GT_MSG_PROTOCOL_ISO15118_2018)
  4944. {
  4945. sprintf((char*)buf_log_evcomm,
  4946. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-20,ed2(%d:v%d.%d;id=%d,pri=%d)",
  4947. (i+1),
  4948. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4949. atoi(num),
  4950. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4951. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4952. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4953. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4954. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4955. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO2_15118_2018_VersionNumberMajor)
  4956. {
  4957. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO2_15118_2018_VersionNumberMinor)
  4958. {
  4959. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4960. }
  4961. else
  4962. {
  4963. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4964. }
  4965. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4966. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  4967. return id;
  4968. }
  4969. else
  4970. {
  4971. //keep looking for the suitable protocol
  4972. }
  4973. }
  4974. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4975. {
  4976. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4977. {
  4978. ii = i;
  4979. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4980. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4981. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  4982. }
  4983. else
  4984. {
  4985. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4986. }
  4987. }
  4988. else
  4989. {
  4990. //null
  4991. }
  4992. }
  4993. else
  4994. {
  4995. //Unexpected Year
  4996. sprintf((char*)buf_log_evcomm,
  4997. "[GetSchemaID_of_Protocol]unsupported(%d-th/%d): ISO 15118-X(unexpected year:%d,v%d.%d),id=%d,pri=%d",
  4998. (i+1),
  4999. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5000. atoi(num),
  5001. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5002. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5003. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5004. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5005. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5006. //return -1;
  5007. }
  5008. }
  5009. else
  5010. {
  5011. sprintf((char*)buf_log_evcomm,
  5012. "[GetSchemaID_of_Protocol]unsupported protocol(%d-th/%d)(%d:v%d.%d;id=%d,pri=%d)",
  5013. (i+1),
  5014. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5015. atoi(num),
  5016. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5017. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5018. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5019. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5020. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5021. //return -1;
  5022. }
  5023. }
  5024. //The final result of highest priority protocol
  5025. sprintf((char*)buf_log_evcomm,
  5026. "[GetSchemaID_of_Protocol]selected(%d-th/%d): pro=%d(0:DIN,1:ISO1,2:ISO2);id=%d,pri=%d",
  5027. (ii+1),
  5028. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5029. ShmCcsData->CommProtocol,
  5030. id,
  5031. pri);
  5032. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5033. if (id < 0)
  5034. {
  5035. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_Failed_NoNegotiation;
  5036. }
  5037. return id;
  5038. }
  5039. /*===========================================================================
  5040. FUNCTION: Proc_supportedAppProtocolRes
  5041. DESCRIPTION:
  5042. PRE-CONDITION:
  5043. INPUT:
  5044. OUTPUT:
  5045. GLOBAL VARIABLES:
  5046. =============================================================================*/
  5047. int Proc_supportedAppProtocolRes(int AcceptFd)
  5048. {
  5049. int errn = 0;
  5050. bitstream_t v2g_tx_stream;
  5051. static struct ChargingInfoData *sys;
  5052. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5053. //STEP 1: =========== Setting the Response Message ===========
  5054. init_appHandEXIDocument(&ccs_handshake);
  5055. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5056. ccs_handshake.supportedAppProtocolRes_isUsed = 1u;
  5057. //select the 1st one as the default
  5058. ccs_handshake.supportedAppProtocolRes.SchemaID = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  5059. ccs_handshake.supportedAppProtocolRes.SchemaID_isUsed = 1u;
  5060. int id = 0;
  5061. id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_PREFERENCE); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5062. ccs_handshake.supportedAppProtocolRes.ResponseCode = EVCOMM_SYS_INFO.SupportedAppProtocol_result; //updating the response code
  5063. if (id < 0)
  5064. {
  5065. sprintf((char*)buf_log_evcomm,
  5066. "[Error]No avalible CCS protocol (id = %d, preference = %d)",
  5067. id,
  5068. V2GT_MSG_PROTOCOL_PREFERENCE);
  5069. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5070. }
  5071. else
  5072. {
  5073. //selected SchemaID
  5074. ccs_handshake.supportedAppProtocolRes.SchemaID = (unsigned char) id;
  5075. }
  5076. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  5077. {
  5078. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_supportedAppProtocolRes]EVSE_Shutdown => End_Process");
  5079. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5080. errn = -1;
  5081. }
  5082. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5083. {
  5084. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_supportedAppProtocolRes]EVSE_EmergencyShutdown => End_Process");
  5085. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5086. errn = -1;
  5087. }
  5088. else
  5089. {
  5090. //null
  5091. }
  5092. //Check for Permission Changing from TRUE to FALSE
  5093. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5094. ShmInternalComm->ChargingPermission == FALSE)
  5095. {
  5096. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][supportedAppProtocolRes]Permission OFF");
  5097. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5098. //errn = -1;
  5099. }
  5100. #if (CP_PROTECTION_MECHANISM == ENABLE)
  5101. {
  5102. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  5103. {
  5104. //Detect for CP State should be 9V with 5% PWM or 100%PWM (State B1, B2)
  5105. if (sys->CpState != 2 && sys->CpState != 3) //State B1, B2
  5106. {
  5107. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5108. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5109. Update_V2G_Flow_Status(Other_Fault);
  5110. sprintf((char*)buf_log_evcomm,
  5111. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5112. sys->CpState,
  5113. sys->CpVoltage);
  5114. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5115. }
  5116. }
  5117. #else
  5118. {
  5119. //Detect for CP State should be 9V (State B)
  5120. if (sys->CpState != 3) //B2
  5121. {
  5122. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5123. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5124. Update_V2G_Flow_Status(Other_Fault);
  5125. sprintf((char*)buf_log_evcomm,
  5126. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5127. sys->CpState,
  5128. sys->CpVoltage);
  5129. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5130. }
  5131. }
  5132. #endif
  5133. }
  5134. #endif
  5135. //STEP 2: =========== Encode into EXI ===========
  5136. if ((errn = API_V2GMSG_EXI_Encoder_AppProtocol(&ccs_handshake, &v2g_tx_stream)) !=0)
  5137. {
  5138. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Error]API_V2GMSG_EXI_Encoder_AppProtocol\n");
  5139. return errn;
  5140. }
  5141. //STEP 3: =========== Send Response Packet ===========
  5142. int Rtn = 0;
  5143. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5144. //Rtn = send(6, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5145. DEBUG_PRINTF_EVCOMM_DETAIL("Send V2GTP Packet Size = %d, Rtn = %d (Bytes, DEC)\n", v2g_tx_stream.size, Rtn);
  5146. if (Rtn < 0)
  5147. {
  5148. return Rtn;
  5149. }
  5150. //STEP 4: =========== Save into Share Memory =========
  5151. //[Joseph, To-Do] Adding a mechanism to choose DIN 70121 as our 1st priority. (for multiple protocols)
  5152. //STEP 5: =========== Updating the Flow State Flag =========
  5153. if (id < 0)
  5154. {
  5155. errn = -1;
  5156. }
  5157. //STEP 6: =========== Reset Flags ============
  5158. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  5159. init_appHandEXIDocument(&ccs_handshake);
  5160. return errn;
  5161. }
  5162. /*===========================================================================
  5163. FUNCTION: Proc_supportedAppProtocolReq
  5164. DESCRIPTION:
  5165. PRE-CONDITION:
  5166. INPUT:
  5167. OUTPUT:
  5168. GLOBAL VARIABLES:
  5169. =============================================================================*/
  5170. int Proc_supportedAppProtocolReq(int AcceptFd)
  5171. {
  5172. //[Joseph, To-Do] analysis on Req message and choose the prefered protocol
  5173. //Default: DIN 70121 (find SchemaID)
  5174. int errn = 0;
  5175. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]supportedAppProtocolReq");
  5176. SHM_Save_din_supportedAppProtocolReq(ShmCcsData, &ccs_handshake, ShmSysConfigAndInfo);
  5177. errn = Proc_supportedAppProtocolRes(AcceptFd);
  5178. if (errn == 0)
  5179. {
  5180. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]supportedAppProtocolRes");
  5181. }
  5182. else
  5183. {
  5184. DEBUG_PRINTF_EVCOMM_DETAIL("[Error]Proc_supportedAppProtocolRes(): %d (DEC)\n", errn);
  5185. }
  5186. return errn;
  5187. }
  5188. /*===========================================================================
  5189. FUNCTION: Proc_din_SessionSetupRes
  5190. DESCRIPTION:
  5191. PRE-CONDITION:
  5192. INPUT:
  5193. OUTPUT:
  5194. GLOBAL VARIABLES:
  5195. =============================================================================*/
  5196. int Proc_din_SessionSetupRes(int AcceptFd)
  5197. {
  5198. //int i = 0;
  5199. int errn = 0;
  5200. bitstream_t v2g_tx_stream;
  5201. static struct ChargingInfoData *sys;
  5202. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5203. size_t pos = 0;
  5204. v2g_tx_stream.pos = &pos;
  5205. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5206. v2g_tx_stream.data = V2GTP_Tx_buf;
  5207. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5208. init_dinSessionSetupResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes);
  5209. // ====== [BODY (1/2) ResponseCode ======
  5210. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5211. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_OK_NewSessionEstablished;
  5212. //[HEADER] Assign Res SessionID
  5213. ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytesLen = 8;
  5214. memset(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, 0, 8);
  5215. memcpy(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5216. //Check for SequenceError
  5217. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5218. {
  5219. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError;
  5220. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5221. errn = -1;
  5222. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5223. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5224. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5225. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5226. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5227. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5228. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5229. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5230. }
  5231. //#if PARAMETER_NORMAL_MODE == ENABLE
  5232. //SHM_Read_din_V2GMSG_Header(&ccs_exi_doc_DIN, ShmCcsData);
  5233. //#endif
  5234. //Detect for CP State should be 9V (State B)
  5235. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5236. {
  5237. #if CP_PROTECTION_MECHANISM == ENABLE
  5238. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5239. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5240. Update_V2G_Flow_Status(Other_Fault);
  5241. errn = -1;
  5242. sprintf((char*)buf_log_evcomm,
  5243. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5244. sys->CpState);
  5245. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5246. #else
  5247. sprintf((char*)buf_log_evcomm,
  5248. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5249. sys->CpState);
  5250. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5251. #endif
  5252. }
  5253. //Check for shutdown commands from EVSE(DC Main Board)
  5254. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5255. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5256. {
  5257. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5258. sprintf((char*)buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5259. EVSE_Shutdown,
  5260. EVSE_EmergencyShutdown,
  5261. sys->DC_EVSEStatus);
  5262. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5263. errn = -1;
  5264. }
  5265. //Check for Permission Changing from TRUE to FALSE
  5266. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5267. ShmInternalComm->ChargingPermission == FALSE)
  5268. {
  5269. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][SessionSetupRes]Permission OFF");
  5270. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5271. errn = -1;
  5272. }
  5273. // ====== [BODY (2/3) EVSEID ======
  5274. //EVSEID = all zero
  5275. memset(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes, 0, sizeof(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes));
  5276. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytesLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5277. // ====== [BODY (3/3) DateTimeNow ======
  5278. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow_isUsed = 1u;
  5279. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5280. #if PARAMETER_NORMAL_MODE == ENABLE
  5281. ///////////SHM_Read_din_SessionSetupRes(&ccs_exi_doc_DIN, ShmCcsData);
  5282. #endif
  5283. // ============ Encode and Send Response Message ===========
  5284. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5285. {
  5286. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_SessionSetupRes][Error]Tx encoded msg error");
  5287. errn = -1;
  5288. }
  5289. return errn;
  5290. }
  5291. /*===========================================================================
  5292. FUNCTION: Proc_iso1_SessionSetupRes
  5293. DESCRIPTION:
  5294. PRE-CONDITION:
  5295. INPUT:
  5296. OUTPUT:
  5297. GLOBAL VARIABLES:
  5298. =============================================================================*/
  5299. int Proc_iso1_SessionSetupRes(int AcceptFd)
  5300. {
  5301. //int i = 0;
  5302. int errn = 0;
  5303. bitstream_t v2g_tx_stream;
  5304. static struct ChargingInfoData *sys;
  5305. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5306. size_t pos = 0;
  5307. v2g_tx_stream.pos = &pos;
  5308. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5309. v2g_tx_stream.data = V2GTP_Tx_buf;
  5310. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5311. init_iso1SessionSetupResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes);
  5312. // ====== [BODY (1/2) ResponseCode ======
  5313. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5314. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_OK_NewSessionEstablished;
  5315. //[HEADER] Assign Res SessionID
  5316. ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytesLen = 8;
  5317. memset(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, 0, 8);
  5318. memcpy(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5319. //Check for SequenceError
  5320. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5321. {
  5322. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5323. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5324. errn = -1;
  5325. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5326. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5327. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5328. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5329. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5330. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5331. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5332. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5333. }
  5334. //#if PARAMETER_NORMAL_MODE == ENABLE
  5335. //SHM_Read_iso1_V2GMSG_Header(&ccs_exi_doc_ISO1, ShmCcsData);
  5336. //#endif
  5337. //Detect for CP State should be 9V (State B)
  5338. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5339. {
  5340. #if CP_PROTECTION_MECHANISM == ENABLE
  5341. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5342. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5343. Update_V2G_Flow_Status(Other_Fault);
  5344. errn = -1;
  5345. sprintf((char*)buf_log_evcomm,
  5346. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5347. sys->CpState);
  5348. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5349. #else
  5350. sprintf((char*)buf_log_evcomm,
  5351. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5352. sys->CpState);
  5353. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5354. #endif
  5355. }
  5356. //Check for shutdown commands from EVSE(DC Main Board)
  5357. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5358. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5359. {
  5360. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5361. sprintf((char*)buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5362. EVSE_Shutdown,
  5363. EVSE_EmergencyShutdown,
  5364. sys->DC_EVSEStatus);
  5365. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5366. errn = -1;
  5367. }
  5368. //Check for Permission Changing from TRUE to FALSE
  5369. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5370. ShmInternalComm->ChargingPermission == FALSE)
  5371. {
  5372. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][SessionSetupRes]Permission OFF");
  5373. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5374. errn = -1;
  5375. }
  5376. // ====== [BODY (2/3) EVSEID ======
  5377. //EVSEID = all zero
  5378. memset(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5379. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5380. // ====== [BODY (3/3) DateTimeNow ======
  5381. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5382. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5383. #if PARAMETER_NORMAL_MODE == ENABLE
  5384. ///////////SHM_Read_iso1_SessionSetupRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5385. #endif
  5386. // ============ Encode and Send Response Message ===========
  5387. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5388. {
  5389. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_SessionSetupRes][Error]Tx encoded msg error");
  5390. errn = -1;
  5391. }
  5392. return errn;
  5393. }
  5394. /*===========================================================================
  5395. FUNCTION: Proc_iso2_SessionSetupRes
  5396. DESCRIPTION:
  5397. PRE-CONDITION:
  5398. INPUT:
  5399. OUTPUT:
  5400. GLOBAL VARIABLES:
  5401. =============================================================================*/
  5402. int Proc_iso2_SessionSetupRes(int AcceptFd)
  5403. {
  5404. //int i = 0;
  5405. int errn = 0;
  5406. bitstream_t v2g_tx_stream;
  5407. static struct ChargingInfoData *sys;
  5408. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5409. size_t pos = 0;
  5410. v2g_tx_stream.pos = &pos;
  5411. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5412. v2g_tx_stream.data = V2GTP_Tx_buf;
  5413. init_iso2BodyType(&ccs_exi_doc_ISO2.V2G_Message.Body);
  5414. init_iso2SessionSetupResType(&ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes);
  5415. // ====== [BODY (1/2) ResponseCode ======
  5416. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5417. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_OK_NewSessionEstablished;
  5418. //[HEADER] Assign Res SessionID
  5419. ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytesLen = 8;
  5420. memset(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, 0, 8);
  5421. memcpy(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5422. //Check for SequenceError
  5423. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5424. {
  5425. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5426. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5427. errn = -1;
  5428. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5429. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5430. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5431. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5432. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5433. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5434. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5435. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5436. }
  5437. //#if PARAMETER_NORMAL_MODE == ENABLE
  5438. //SHM_Read_iso2_V2GMSG_Header(&ccs_exi_doc_ISO2, ShmCcsData);
  5439. //#endif
  5440. //Detect for CP State should be 9V (State B)
  5441. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5442. {
  5443. #if CP_PROTECTION_MECHANISM == ENABLE
  5444. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5445. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5446. Update_V2G_Flow_Status(Other_Fault);
  5447. errn = -1;
  5448. sprintf((char*)buf_log_evcomm,
  5449. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d)",
  5450. sys->CpState);
  5451. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5452. #else
  5453. sprintf((char*)buf_log_evcomm,
  5454. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d): ignored",
  5455. sys->CpState);
  5456. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5457. #endif
  5458. }
  5459. //Check for shutdown commands from EVSE(DC Main Board)
  5460. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5461. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5462. {
  5463. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5464. sprintf((char*)buf_log_evcomm, "[Proc_iso2_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5465. EVSE_Shutdown,
  5466. EVSE_EmergencyShutdown,
  5467. sys->DC_EVSEStatus);
  5468. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5469. errn = -1;
  5470. }
  5471. //Check for Permission Changing from TRUE to FALSE
  5472. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5473. ShmInternalComm->ChargingPermission == FALSE)
  5474. {
  5475. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO2][SessionSetupRes]Permission OFF");
  5476. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5477. errn = -1;
  5478. }
  5479. // ====== [BODY (2/3) EVSEID ======
  5480. //EVSEID = all zero
  5481. memset(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5482. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5483. // ====== [BODY (3/3) DateTimeNow ======
  5484. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5485. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5486. #if PARAMETER_NORMAL_MODE == ENABLE
  5487. ///////////SHM_Read_iso2_SessionSetupRes(&ccs_exi_doc_ISO2, ShmCcsData);
  5488. #endif
  5489. // ============ Encode and Send Response Message ===========
  5490. if (send_encoded_iso2_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO2) != 0)
  5491. {
  5492. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso2_SessionSetupRes][Error]Tx encoded msg error");
  5493. errn = -1;
  5494. }
  5495. return errn;
  5496. }
  5497. /*===========================================================================
  5498. FUNCTION: Proc_din_SessionSetupReq
  5499. DESCRIPTION:
  5500. PRE-CONDITION:
  5501. INPUT:
  5502. OUTPUT:
  5503. GLOBAL VARIABLES:
  5504. 2. ccs_exi_doc_DIN
  5505. =============================================================================*/
  5506. int Proc_din_SessionSetupReq(int AcceptFd)
  5507. {
  5508. int errn = 0;
  5509. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_din_SessionSetupReq]Got SessionSetupReq\n");
  5510. //Print the decoded XML Document
  5511. PRINT_XML_DOC_DIN_SessionSetupReq(&ccs_exi_doc_DIN);
  5512. //Save into Share Memory
  5513. SHM_Save_din_SessionSetupReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5514. errn = Proc_din_SessionSetupRes(AcceptFd);
  5515. if (errn == 0)
  5516. {
  5517. //successfully send response.
  5518. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]SessionSetupRes");
  5519. }
  5520. else
  5521. {
  5522. sprintf((char*)buf_log_evcomm,
  5523. "[Error]Proc_din_SessionSetupRes(): %d (DEC)",
  5524. errn);
  5525. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5526. }
  5527. return errn;
  5528. }
  5529. /*===========================================================================
  5530. FUNCTION: Proc_iso1_SessionSetupReq
  5531. DESCRIPTION:
  5532. PRE-CONDITION:
  5533. INPUT:
  5534. OUTPUT:
  5535. GLOBAL VARIABLES:
  5536. 2. ccs_exi_doc_ISO1
  5537. =============================================================================*/
  5538. int Proc_iso1_SessionSetupReq(int AcceptFd)
  5539. {
  5540. int errn = 0;
  5541. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso1_SessionSetupReq]Got SessionSetupReq\n");
  5542. //Print the decoded XML Document
  5543. PRINT_XML_DOC_ISO1_SessionSetupReq(&ccs_exi_doc_ISO1);
  5544. //Save into Share Memory
  5545. SHM_Save_iso1_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5546. errn = Proc_iso1_SessionSetupRes(AcceptFd);
  5547. if (errn == 0)
  5548. {
  5549. //successfully send response.
  5550. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]SessionSetupRes");
  5551. }
  5552. else
  5553. {
  5554. sprintf((char*)buf_log_evcomm,
  5555. "[Error]Proc_iso1_SessionSetupRes(): %d (DEC)",
  5556. errn);
  5557. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5558. }
  5559. return errn;
  5560. }
  5561. /*===========================================================================
  5562. FUNCTION: Proc_iso2_SessionSetupReq
  5563. DESCRIPTION:
  5564. PRE-CONDITION:
  5565. INPUT:
  5566. OUTPUT:
  5567. GLOBAL VARIABLES:
  5568. 2. ccs_exi_doc_ISO2
  5569. =============================================================================*/
  5570. int Proc_iso2_SessionSetupReq(int AcceptFd)
  5571. {
  5572. int errn = 0;
  5573. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso2_SessionSetupReq]Got SessionSetupReq\n");
  5574. //Print the decoded XML Document
  5575. PRINT_XML_DOC_ISO2_SessionSetupReq(&ccs_exi_doc_ISO2);
  5576. //Save into Share Memory
  5577. SHM_Save_iso2_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO2, ShmSysConfigAndInfo);
  5578. errn = Proc_iso2_SessionSetupRes(AcceptFd);
  5579. if (errn == 0)
  5580. {
  5581. //successfully send response.
  5582. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO2][V2G][Tx]SessionSetupRes");
  5583. }
  5584. else
  5585. {
  5586. sprintf((char*)buf_log_evcomm,
  5587. "[Error]Proc_iso2_SessionSetupRes(): %d (DEC)",
  5588. errn);
  5589. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5590. }
  5591. return errn;
  5592. }
  5593. /*===========================================================================
  5594. FUNCTION: Proc_din_ServiceDiscoveryRes
  5595. DESCRIPTION:
  5596. PRE-CONDITION:
  5597. INPUT:
  5598. OUTPUT:
  5599. GLOBAL VARIABLES:
  5600. =============================================================================*/
  5601. int Proc_din_ServiceDiscoveryRes(int AcceptFd)
  5602. {
  5603. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5604. //if it is not the same, the packet should be ignored.
  5605. //int i = 0;
  5606. int errn = 0;
  5607. bitstream_t v2g_tx_stream;
  5608. struct ChargingInfoData *sys;
  5609. //struct ServiceDiscoveryRequest_DIN70121 *req;
  5610. struct ServiceDiscoveryResponse_DIN70121 *res;
  5611. size_t pos = 0;
  5612. v2g_tx_stream.pos = &pos;
  5613. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5614. v2g_tx_stream.data = V2GTP_Tx_buf;
  5615. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5616. //req = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryRequest;
  5617. res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5618. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5619. init_dinServiceDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes);
  5620. //[1/4] Response Code
  5621. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5622. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_OK;
  5623. //[HEADER] Check Req SessionID
  5624. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5625. {
  5626. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5627. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5628. errn = -1;
  5629. }
  5630. //Check for SequenceError
  5631. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5632. {
  5633. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5634. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5635. errn = -1;
  5636. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5637. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5638. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5639. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5640. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5641. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5642. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5643. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5644. }
  5645. //Detect for CP State should be 9V (State B)
  5646. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5647. {
  5648. #if CP_PROTECTION_MECHANISM == ENABLE
  5649. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5650. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5651. Update_V2G_Flow_Status(Other_Fault);
  5652. errn = -1;
  5653. sprintf((char*)buf_log_evcomm, "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)", sys->CpState);
  5654. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5655. #else
  5656. sprintf((char*)buf_log_evcomm,
  5657. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5658. sys->CpState);
  5659. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5660. #endif
  5661. }
  5662. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5663. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5664. {
  5665. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5666. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5667. errn = -1;
  5668. }
  5669. //Check for Permission Changing from TRUE to FALSE
  5670. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5671. ShmInternalComm->ChargingPermission == FALSE)
  5672. {
  5673. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ServiceDiscoveryRes]Permission OFF");
  5674. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5675. errn = -1;
  5676. }
  5677. //[2/4] PaymentOptions
  5678. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.arrayLen = 1u;
  5679. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.array[0] = dinpaymentOptionType_ExternalPayment; //1
  5680. //[3/4] Charge Service
  5681. res->ChargeService_DIN70121.Services.ServiceTag.ServiceID = 1;
  5682. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceID = (unsigned short) res->ChargeService_DIN70121.Services.ServiceTag.ServiceID;
  5683. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceCategory = dinserviceCategoryType_EVCharging;
  5684. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5685. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.EnergyTransferType = dinEVSESupportedEnergyTransferType_DC_extended;
  5686. //[4/4] Service List (null, not be uesed for now.)
  5687. //#if PARAMETER_NORMAL_MODE == ENABLE
  5688. ///////////////SHM_Read_din_ServiceDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  5689. //#endif
  5690. // ============ Encode and Send Response Message ===========
  5691. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5692. {
  5693. errn = -1;
  5694. }
  5695. return errn;
  5696. }
  5697. /*===========================================================================
  5698. FUNCTION: Proc_iso1_ServiceDiscoveryRes
  5699. DESCRIPTION:
  5700. PRE-CONDITION:
  5701. INPUT:
  5702. OUTPUT:
  5703. GLOBAL VARIABLES:
  5704. =============================================================================*/
  5705. int Proc_iso1_ServiceDiscoveryRes(int AcceptFd)
  5706. {
  5707. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5708. //if it is not the same, the packet should be ignored.
  5709. //int i = 0;
  5710. int errn = 0;
  5711. bitstream_t v2g_tx_stream;
  5712. struct ChargingInfoData *sys;
  5713. //struct ServiceDiscoveryRequest_ISO15118_2014 *req;
  5714. struct ServiceDiscoveryResponse_ISO15118_2014 *res;
  5715. size_t pos = 0;
  5716. v2g_tx_stream.pos = &pos;
  5717. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5718. v2g_tx_stream.data = V2GTP_Tx_buf;
  5719. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5720. //req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryRequest;
  5721. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  5722. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5723. init_iso1ServiceDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes);
  5724. //[1/4] Response Code
  5725. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5726. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_OK;
  5727. //[HEADER] Check Req SessionID
  5728. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  5729. {
  5730. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  5731. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5732. errn = -1;
  5733. }
  5734. //Check for SequenceError
  5735. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5736. {
  5737. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5738. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5739. errn = -1;
  5740. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5741. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5742. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5743. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5744. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5745. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5746. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5747. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5748. }
  5749. //Detect for CP State should be 9V (State B)
  5750. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5751. {
  5752. #if CP_PROTECTION_MECHANISM == ENABLE
  5753. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5754. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5755. Update_V2G_Flow_Status(Other_Fault);
  5756. errn = -1;
  5757. sprintf((char*)buf_log_evcomm,
  5758. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  5759. sys->CpState);
  5760. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5761. #else
  5762. sprintf((char*)buf_log_evcomm,
  5763. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5764. sys->CpState);
  5765. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5766. #endif
  5767. }
  5768. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5769. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5770. {
  5771. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5772. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  5773. errn = -1;
  5774. }
  5775. //Check for Permission Changing from TRUE to FALSE
  5776. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5777. ShmInternalComm->ChargingPermission == FALSE)
  5778. {
  5779. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][ServiceDiscoveryRes]Permission OFF");
  5780. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5781. errn = -1;
  5782. }
  5783. //[2/4] PaymentOptionList
  5784. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 1u;
  5785. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = iso1paymentOptionType_ExternalPayment; //1
  5786. //[3/4] Charge Service
  5787. res->ChargeService.Services.ServiceID = 1;
  5788. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = (unsigned short) res->ChargeService.Services.ServiceID;
  5789. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1; //new in ISO1, not be used, yet.
  5790. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = xxx;
  5791. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[i] = xxx;
  5792. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = iso1serviceCategoryType_EVCharging;
  5793. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5794. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 1u; //[ISO1] max = 6
  5795. switch (ShmCcsData->EnergyTransferMode)
  5796. {
  5797. case DC_extended:
  5798. {
  5799. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  5800. break;
  5801. }
  5802. case AC_single_phase_core:
  5803. {
  5804. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_single_phase_core;
  5805. break;
  5806. }
  5807. case AC_three_phase_core:
  5808. {
  5809. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_three_phase_core;
  5810. break;
  5811. }
  5812. default:
  5813. {
  5814. sprintf((char*)buf_log_evcomm,
  5815. "[ISO1][ServiceDiscoveryRes][Warning]unexpected EnergyTransferMode(%d)",
  5816. ShmCcsData->EnergyTransferMode);
  5817. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5818. break;
  5819. }
  5820. }
  5821. //[4/4] Service List (null, not be uesed for now.)
  5822. //#if PARAMETER_NORMAL_MODE == ENABLE
  5823. ///////////////SHM_Read_iso1_ServiceDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5824. //#endif
  5825. // ============ Encode and Send Response Message ===========
  5826. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5827. {
  5828. errn = -1;
  5829. }
  5830. return errn;
  5831. }
  5832. /*===========================================================================
  5833. FUNCTION: Proc_din_ServiceDiscoveryReq
  5834. DESCRIPTION:
  5835. PRE-CONDITION:
  5836. INPUT:
  5837. OUTPUT:
  5838. GLOBAL VARIABLES:
  5839. =============================================================================*/
  5840. int Proc_din_ServiceDiscoveryReq(int AcceptFd)
  5841. {
  5842. int errn = 0;
  5843. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  5844. //Print the decoded XML Document
  5845. PRINT_XML_DOC_DIN_ServiceDiscoveryReq(&ccs_exi_doc_DIN);
  5846. //Save into Share Memory
  5847. SHM_Save_din_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5848. errn = Proc_din_ServiceDiscoveryRes(AcceptFd);
  5849. if (errn == 0)
  5850. {
  5851. //send response successfully.
  5852. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ServiceDiscoveryRes");
  5853. }
  5854. else
  5855. {
  5856. sprintf((char*)buf_log_evcomm,
  5857. "[Error][SeccComm][Proc_din_ServiceDiscoveryReq]Proc_din_ServiceDiscoveryRes(): %d (DEC)",
  5858. errn
  5859. );
  5860. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5861. }
  5862. return errn;
  5863. }
  5864. /*===========================================================================
  5865. FUNCTION: Proc_iso1_ServiceDiscoveryReq
  5866. DESCRIPTION:
  5867. PRE-CONDITION:
  5868. INPUT:
  5869. OUTPUT:
  5870. GLOBAL VARIABLES:
  5871. =============================================================================*/
  5872. int Proc_iso1_ServiceDiscoveryReq(int AcceptFd)
  5873. {
  5874. int errn = 0;
  5875. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  5876. //Print the decoded XML Document
  5877. PRINT_XML_DOC_ISO1_ServiceDiscoveryReq(&ccs_exi_doc_ISO1);
  5878. //Save into Share Memory
  5879. SHM_Save_iso1_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5880. errn = Proc_iso1_ServiceDiscoveryRes(AcceptFd);
  5881. if (errn == 0)
  5882. {
  5883. //send response successfully.
  5884. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ServiceDiscoveryRes");
  5885. }
  5886. else
  5887. {
  5888. sprintf((char*)buf_log_evcomm,
  5889. "[Error][SeccComm][Proc_iso1_ServiceDiscoveryReq]Proc_iso1_ServiceDiscoveryRes(): %d (DEC)",
  5890. errn
  5891. );
  5892. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5893. }
  5894. return errn;
  5895. }
  5896. /*===========================================================================
  5897. FUNCTION: Proc_din_ServiceAndPaymentSelectionRes
  5898. DESCRIPTION:
  5899. PRE-CONDITION:
  5900. INPUT:
  5901. OUTPUT:
  5902. GLOBAL VARIABLES:
  5903. =============================================================================*/
  5904. int Proc_din_ServiceAndPaymentSelectionRes(int AcceptFd)
  5905. {
  5906. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5907. //if it is not the same, the packet should be ignored.
  5908. //int i = 0;
  5909. int errn = 0;
  5910. bitstream_t v2g_tx_stream;
  5911. struct ServiceAndPaymentSelectionRequest_DIN70121 *req;
  5912. //struct ServiceAndPaymentSelectionResponse_DIN70121 *res;
  5913. struct ServiceDiscoveryResponse_DIN70121 *sd_res;
  5914. struct ChargingInfoData *sys;
  5915. size_t pos = 0;
  5916. v2g_tx_stream.pos = &pos;
  5917. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5918. v2g_tx_stream.data = V2GTP_Tx_buf;
  5919. req = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionRequest;
  5920. //res = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionResponse;
  5921. sd_res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5922. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5923. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5924. init_dinServicePaymentSelectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes);
  5925. //[1/1] Response Code
  5926. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes_isUsed = 1u;
  5927. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_OK;
  5928. //[HEADER] Check Req SessionID
  5929. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5930. {
  5931. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5932. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5933. errn = -1;
  5934. }
  5935. //Check for SequenceError
  5936. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5937. {
  5938. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5939. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5940. errn = -1;
  5941. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5942. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5943. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5944. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5945. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5946. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5947. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5948. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5949. }
  5950. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  5951. if (req->SelectedPaymentOption != ExternalPayment) //1
  5952. {
  5953. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_PaymentSelectionInvalid;
  5954. sprintf((char*)buf_log_evcomm,
  5955. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  5956. req->SelectedPaymentOption);
  5957. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5958. errn = -1;
  5959. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5960. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  5961. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5962. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5963. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5964. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5965. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  5966. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  5967. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5968. }
  5969. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  5970. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService_DIN70121.Services.ServiceTag.ServiceID)
  5971. {
  5972. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_ServiceSelectionInvalid; //8
  5973. sprintf((char*)buf_log_evcomm,
  5974. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  5975. req->SelectedServiceList.SelectedService[0].ServiceID);
  5976. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5977. errn = -1;
  5978. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5979. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  5980. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5981. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5982. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5983. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5984. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  5985. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  5986. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5987. }
  5988. //Detect for CP State should be 9V (State B)
  5989. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5990. {
  5991. #if CP_PROTECTION_MECHANISM == ENABLE
  5992. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  5993. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5994. Update_V2G_Flow_Status(Other_Fault);
  5995. errn = -1;
  5996. sprintf((char*)buf_log_evcomm,
  5997. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  5998. sys->CpState);
  5999. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6000. #else
  6001. sprintf((char*)buf_log_evcomm,
  6002. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6003. sys->CpState);
  6004. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6005. #endif
  6006. }
  6007. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  6008. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6009. {
  6010. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6011. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6012. errn = -1;
  6013. }
  6014. //Check for Permission Changing from TRUE to FALSE
  6015. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  6016. ShmInternalComm->ChargingPermission == FALSE)
  6017. {
  6018. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ServicePaymentSelectionRes]Permission OFF");
  6019. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6020. errn = -1;
  6021. }
  6022. // ============ Encode and Send Response Message ===========
  6023. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6024. {
  6025. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6026. errn = -1;
  6027. }
  6028. return errn;
  6029. }
  6030. /*===========================================================================
  6031. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionRes
  6032. DESCRIPTION:
  6033. PRE-CONDITION:
  6034. INPUT:
  6035. OUTPUT:
  6036. GLOBAL VARIABLES:
  6037. =============================================================================*/
  6038. int Proc_iso1_ServiceAndPaymentSelectionRes(int AcceptFd)
  6039. {
  6040. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6041. //if it is not the same, the packet should be ignored.
  6042. //int i = 0;
  6043. int errn = 0;
  6044. bitstream_t v2g_tx_stream;
  6045. struct ServiceAndPaymentSelectionRequest_ISO15118_2014 *req;
  6046. //struct ServiceAndPaymentSelectionResponse_ISO15118_2014 *res;
  6047. struct ServiceDiscoveryResponse_ISO15118_2014 *sd_res;
  6048. static struct ChargingInfoData *sys;
  6049. size_t pos = 0;
  6050. v2g_tx_stream.pos = &pos;
  6051. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6052. v2g_tx_stream.data = V2GTP_Tx_buf;
  6053. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionRequest;
  6054. //res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionResponse;
  6055. sd_res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  6056. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6057. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6058. init_iso1PaymentServiceSelectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes);
  6059. //[1/1] Response Code
  6060. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes_isUsed = 1u;
  6061. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_OK;
  6062. //[HEADER] Check Req SessionID
  6063. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6064. {
  6065. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6066. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6067. errn = -1;
  6068. }
  6069. //Check for SequenceError
  6070. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6071. {
  6072. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6073. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6074. errn = -1;
  6075. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6076. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6077. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6078. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6079. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6080. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6081. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6082. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6083. }
  6084. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  6085. if (req->SelectedPaymentOption != ExternalPayment) //1
  6086. {
  6087. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  6088. sprintf((char*)buf_log_evcomm,
  6089. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6090. req->SelectedPaymentOption);
  6091. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6092. errn = -1;
  6093. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6094. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  6095. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6096. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6097. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6098. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6099. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6100. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  6101. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6102. }
  6103. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  6104. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService.Services.ServiceID)
  6105. {
  6106. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6107. sprintf((char*)buf_log_evcomm,
  6108. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6109. req->SelectedServiceList.SelectedService[0].ServiceID);
  6110. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6111. errn = -1;
  6112. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6113. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6114. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6115. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6116. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6117. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6118. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6119. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6120. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6121. }
  6122. //Detect for CP State should be 9V (State B)
  6123. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6124. {
  6125. #if CP_PROTECTION_MECHANISM == ENABLE
  6126. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6127. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6128. Update_V2G_Flow_Status(Other_Fault);
  6129. errn = -1;
  6130. sprintf((char*)buf_log_evcomm,
  6131. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6132. sys->CpState);
  6133. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6134. #else
  6135. sprintf((char*)buf_log_evcomm,
  6136. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6137. sys->CpState);
  6138. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6139. #endif
  6140. }
  6141. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  6142. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6143. {
  6144. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6145. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6146. errn = -1;
  6147. }
  6148. //Check for Permission Changing from TRUE to FALSE
  6149. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  6150. ShmInternalComm->ChargingPermission == FALSE)
  6151. {
  6152. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][PaymentServiceSelectionRes]Permission OFF");
  6153. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6154. errn = -1;
  6155. }
  6156. // ============ Encode and Send Response Message ===========
  6157. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6158. {
  6159. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6160. errn = -1;
  6161. }
  6162. return errn;
  6163. }
  6164. /*===========================================================================
  6165. FUNCTION: Proc_din_ServiceAndPaymentSelectionReq
  6166. DESCRIPTION:
  6167. PRE-CONDITION:
  6168. INPUT:
  6169. OUTPUT:
  6170. GLOBAL VARIABLES:
  6171. =============================================================================*/
  6172. int Proc_din_ServiceAndPaymentSelectionReq(int AcceptFd)
  6173. {
  6174. int errn = 0;
  6175. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_din_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6176. //Print the decoded XML Document
  6177. PRINT_XML_DOC_DIN_ServiceAndPaymentSelectionReq(&ccs_exi_doc_DIN);
  6178. //Save into Share Memory
  6179. SHM_Save_din_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6180. errn = Proc_din_ServiceAndPaymentSelectionRes(AcceptFd);
  6181. if (errn == 0)
  6182. {
  6183. //send response successfully.
  6184. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ServiceAndPaymentSelectionRes");
  6185. }
  6186. else
  6187. {
  6188. sprintf((char*)buf_log_evcomm,
  6189. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6190. errn);
  6191. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6192. }
  6193. return errn;
  6194. }
  6195. /*===========================================================================
  6196. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionReq
  6197. DESCRIPTION:
  6198. PRE-CONDITION:
  6199. INPUT:
  6200. OUTPUT:
  6201. GLOBAL VARIABLES:
  6202. =============================================================================*/
  6203. int Proc_iso1_ServiceAndPaymentSelectionReq(int AcceptFd)
  6204. {
  6205. int errn = 0;
  6206. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6207. //Print the decoded XML Document
  6208. PRINT_XML_DOC_ISO1_ServiceAndPaymentSelectionReq(&ccs_exi_doc_ISO1);
  6209. //Save into Share Memory
  6210. SHM_Save_iso1_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6211. errn = Proc_iso1_ServiceAndPaymentSelectionRes(AcceptFd);
  6212. if (errn == 0)
  6213. {
  6214. //send response successfully.
  6215. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ServiceAndPaymentSelectionRes");
  6216. }
  6217. else
  6218. {
  6219. sprintf((char*)buf_log_evcomm,
  6220. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6221. errn);
  6222. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6223. }
  6224. return errn;
  6225. }
  6226. /*===========================================================================
  6227. FUNCTION: Proc_din_ContractAuthenticationRes
  6228. DESCRIPTION:
  6229. PRE-CONDITION:
  6230. INPUT:
  6231. OUTPUT:
  6232. GLOBAL VARIABLES:
  6233. =============================================================================*/
  6234. int Proc_din_ContractAuthenticationRes(int AcceptFd)
  6235. {
  6236. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6237. //if it is not the same, the packet should be ignored.
  6238. //int i = 0;
  6239. int errn = 0;
  6240. bitstream_t v2g_tx_stream;
  6241. static struct ChargingInfoData *sys;
  6242. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6243. size_t pos = 0;
  6244. v2g_tx_stream.pos = &pos;
  6245. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6246. v2g_tx_stream.data = V2GTP_Tx_buf;
  6247. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6248. init_dinContractAuthenticationResType(&ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes);
  6249. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes_isUsed = 1u;
  6250. //[BODY (1/2)] ResponseCode
  6251. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_OK;
  6252. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6253. //[HEADER] Check Req SessionID
  6254. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6255. {
  6256. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6257. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6258. errn = -1;
  6259. }
  6260. //Check for SequenceError
  6261. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6262. {
  6263. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6264. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6265. errn = -1;
  6266. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6267. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6268. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6269. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6270. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6271. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6272. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6273. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6274. }
  6275. //Detect for CP State should be 9V (State B)
  6276. #if CP_PROTECTION_MECHANISM == ENABLE
  6277. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6278. {
  6279. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6280. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6281. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6282. Update_V2G_Flow_Status(Other_Fault);
  6283. errn = -1;
  6284. sprintf((char*)buf_log_evcomm,
  6285. "[Proc_din_ContractAuthenticationRes]Emergency Stop by CP Error (%d)",
  6286. sys->CpState);
  6287. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6288. }
  6289. #endif
  6290. //Check for CSU command of "Stop by EVSE"
  6291. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6292. {
  6293. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6294. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6295. errn = -1;
  6296. }
  6297. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6298. {
  6299. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6300. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6301. errn = -1;
  6302. }
  6303. //[BODY (2/2)] EVSEProcessing
  6304. if(ShmInternalComm->ChargingPermission == TRUE)
  6305. {
  6306. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6307. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CSU Permission: OK");
  6308. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6309. {
  6310. //Set PWM as 5% (for SLAC first case)
  6311. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Set PWM as 5%%");
  6312. SwitchCpStateE(DISABLE);
  6313. OutputCpPwmDuty(5);
  6314. }
  6315. #endif
  6316. }
  6317. //Check for Permission Changing from TRUE to FALSE
  6318. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  6319. ShmInternalComm->ChargingPermission == FALSE)
  6320. {
  6321. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ContractAuthenticationRes]Permission OFF");
  6322. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6323. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6324. errn = -1;
  6325. }
  6326. #if PARAMETER_NORMAL_MODE == ENABLE
  6327. ////////////SHM_Read_din_ContractAuthenticationRes(&ccs_exi_doc_DIN, ShmCcsData);
  6328. #endif
  6329. // ============ Encode and Send Response Message ===========
  6330. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6331. {
  6332. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6333. errn = -1;
  6334. }
  6335. return errn;
  6336. }
  6337. /*===========================================================================
  6338. FUNCTION: Proc_iso1_AuthorizationRes
  6339. DESCRIPTION:
  6340. PRE-CONDITION:
  6341. INPUT:
  6342. OUTPUT:
  6343. GLOBAL VARIABLES:
  6344. =============================================================================*/
  6345. int Proc_iso1_AuthorizationRes(int AcceptFd)
  6346. {
  6347. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6348. //if it is not the same, the packet should be ignored.
  6349. //int i = 0;
  6350. int errn = 0;
  6351. bitstream_t v2g_tx_stream;
  6352. static struct ChargingInfoData *sys;
  6353. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6354. size_t pos = 0;
  6355. v2g_tx_stream.pos = &pos;
  6356. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6357. v2g_tx_stream.data = V2GTP_Tx_buf;
  6358. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6359. init_iso1AuthorizationResType(&ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes);
  6360. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes_isUsed = 1u;
  6361. //[BODY (1/2)] ResponseCode
  6362. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_OK;
  6363. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Ongoing; //0
  6364. //[HEADER] Check Req SessionID
  6365. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6366. {
  6367. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6368. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6369. errn = -1;
  6370. }
  6371. //Check for SequenceError
  6372. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6373. {
  6374. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6375. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6376. errn = -1;
  6377. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6378. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6379. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6380. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6381. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6382. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6383. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6384. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6385. }
  6386. //Detect for CP State should be 9V (State B)
  6387. #if CP_PROTECTION_MECHANISM == ENABLE
  6388. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6389. {
  6390. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED;
  6391. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6392. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6393. Update_V2G_Flow_Status(Other_Fault);
  6394. errn = -1;
  6395. sprintf((char*)buf_log_evcomm,
  6396. "[Proc_iso1_AuthorizationRes]Emergency Stop by CP Error (%d)",
  6397. sys->CpState);
  6398. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6399. }
  6400. #endif
  6401. //Check for CSU command of "Stop by EVSE"
  6402. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6403. {
  6404. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6405. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6406. errn = -1;
  6407. }
  6408. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6409. {
  6410. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6411. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6412. errn = -1;
  6413. }
  6414. //[BODY (2/2)] EVSEProcessing
  6415. //Check for Permission from CSU
  6416. if(ShmInternalComm->ChargingPermission == TRUE)
  6417. {
  6418. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  6419. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CSU Permission: OK");
  6420. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6421. {
  6422. //Set PWM as 5% (for SLAC first case)
  6423. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Set PWM as 5%%");
  6424. SwitchCpStateE(DISABLE);
  6425. OutputCpPwmDuty(5);
  6426. }
  6427. #endif
  6428. }
  6429. //Check for Permission Changing from TRUE to FALSE
  6430. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  6431. ShmInternalComm->ChargingPermission == FALSE)
  6432. {
  6433. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][AuthorizationRes]Permission OFF");
  6434. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6435. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6436. errn = -1;
  6437. }
  6438. #if PARAMETER_NORMAL_MODE == ENABLE
  6439. ////////////SHM_Read_iso1_AuthorizationRes(&ccs_exi_doc_ISO1, ShmCcsData);
  6440. #endif
  6441. // ============ Encode and Send Response Message ===========
  6442. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6443. {
  6444. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6445. errn = -1;
  6446. }
  6447. return errn;
  6448. }
  6449. /*===========================================================================
  6450. FUNCTION: Proc_din_ContractAuthenticationReq
  6451. DESCRIPTION:
  6452. PRE-CONDITION:
  6453. INPUT:
  6454. OUTPUT:
  6455. GLOBAL VARIABLES:
  6456. =============================================================================*/
  6457. int Proc_din_ContractAuthenticationReq(int AcceptFd)
  6458. {
  6459. int errn = 0;
  6460. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ContractAuthenticationReq]Got Proc_din_ContractAuthenticationReq\n");
  6461. //Print the decoded XML Document
  6462. PRINT_XML_DOC_DIN_ContractAuthenticationReq(&ccs_exi_doc_DIN);
  6463. //Save into Share Memory
  6464. SHM_Save_din_ContractAuthenticationReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6465. errn = Proc_din_ContractAuthenticationRes(AcceptFd);
  6466. if (errn == 0)
  6467. {
  6468. //send response successfully.
  6469. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ContractAuthenticationRes");
  6470. }
  6471. else
  6472. {
  6473. sprintf((char*)buf_log_evcomm,
  6474. "[Error][SeccComm][Proc_din_ContractAuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  6475. errn);
  6476. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6477. }
  6478. return errn;
  6479. }
  6480. /*===========================================================================
  6481. FUNCTION: Proc_iso1_AuthenticationReq
  6482. DESCRIPTION:
  6483. PRE-CONDITION:
  6484. INPUT:
  6485. OUTPUT:
  6486. GLOBAL VARIABLES:
  6487. =============================================================================*/
  6488. int Proc_iso1_AuthenticationReq(int AcceptFd)
  6489. {
  6490. int errn = 0;
  6491. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_AuthenticationReq]Got AuthorizationReq\n");
  6492. //Print the decoded XML Document
  6493. PRINT_XML_DOC_ISO1_AuthorizationReq(&ccs_exi_doc_ISO1);
  6494. //Save into Share Memory
  6495. SHM_Save_iso1_AuthorizationReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6496. errn = Proc_iso1_AuthorizationRes(AcceptFd);
  6497. if (errn == 0)
  6498. {
  6499. //send response successfully.
  6500. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]AuthorizationRes");
  6501. }
  6502. else
  6503. {
  6504. sprintf((char*)buf_log_evcomm,
  6505. "[Error][SeccComm][Proc_iso1_AuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  6506. errn);
  6507. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6508. }
  6509. return errn;
  6510. }
  6511. /*===========================================================================
  6512. FUNCTION: SHM_Init_dinDC_EVSEStatusType
  6513. DESCRIPTION:
  6514. PRE-CONDITION:
  6515. INPUT:
  6516. 1. in
  6517. OUTPUT:
  6518. 2. out
  6519. GLOBAL VARIABLES:
  6520. =============================================================================*/
  6521. void SHM_Init_dinDC_EVSEStatusType(struct DC_EVSEStatusType_DIN70121 *in)
  6522. {
  6523. in->EVSEIsolationStatus = dinisolationLevelType_Valid;
  6524. // dinisolationLevelType_Invalid = 0,
  6525. // dinisolationLevelType_Valid = 1, (default)
  6526. // dinisolationLevelType_Warning = 2,
  6527. // dinisolationLevelType_Fault = 3
  6528. in->EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  6529. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6530. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1, (default)
  6531. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6532. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6533. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6534. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6535. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6536. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  6537. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  6538. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  6539. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  6540. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  6541. in->EVSENotification = dinEVSENotificationType_None;
  6542. // dinEVSENotificationType_None = 0, (default)
  6543. // dinEVSENotificationType_StopCharging = 1,
  6544. // dinEVSENotificationType_ReNegotiation = 2
  6545. }
  6546. /*===========================================================================
  6547. FUNCTION: SHM_Save_dinPhysicalValueType
  6548. DESCRIPTION:
  6549. PRE-CONDITION:
  6550. INPUT:
  6551. OUTPUT:
  6552. GLOBAL VARIABLES:
  6553. =============================================================================*/
  6554. void SHM_Save_dinPhysicalValueType(struct PhysicalValueType_DIN70121 *obj, short value, int multiplier, unsigned char unit)
  6555. {
  6556. obj->Value = value;
  6557. obj->Multiplier = multiplier;
  6558. obj->Unit =unit;
  6559. }
  6560. /*===========================================================================
  6561. FUNCTION: SHM_Init_din_ChargeParameterDiscoveryRes
  6562. DESCRIPTION:
  6563. PRE-CONDITION:
  6564. INPUT:
  6565. 1. shm_ccs
  6566. OUTPUT:
  6567. 2. shm_ccs
  6568. GLOBAL VARIABLES:
  6569. =============================================================================*/
  6570. void SHM_Init_din_ChargeParameterDiscoveryRes(struct CcsData *shm_ccs)
  6571. {
  6572. struct ChargeParameterDiscoveryResponse_DIN70121 *in;
  6573. in = &shm_ccs->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  6574. //----- [BODY (1/5)] ResponseCode -----
  6575. in->ResponseCode = dinresponseCodeType_OK;
  6576. //----- [BODY (2/5)] EVSEProcessing -----
  6577. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6578. // dinEVSEProcessingType_Finished = 0,
  6579. // dinEVSEProcessingType_Ongoing = 1
  6580. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6581. //be fixed in another function.
  6582. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6583. //ignore, since DIN doesn't support AC
  6584. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6585. struct DC_EVSEChargeParameterType_DIN70121 *in_para;
  6586. in_para = &in->DC_EVSEChargeParameter;
  6587. //DC_EVSEStatus
  6588. SHM_Init_dinDC_EVSEStatusType(&in_para->DC_EVSEStatus);
  6589. in_para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  6590. short value = 0; int multiplier = 0; unsigned char unit = 0;
  6591. //EVSEMaximumCurrentLimit
  6592. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  6593. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumCurrentLimit, value, multiplier, unit);
  6594. //EVSEMaximumPowerLimit
  6595. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  6596. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumPowerLimit, value, multiplier, unit);
  6597. //EVSEMaximumVoltageLimit
  6598. value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  6599. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumVoltageLimit, value, multiplier, unit);
  6600. //EVSEMinimumVoltageLimit
  6601. value = 1500; multiplier = -1; unit = V_DIN70121; //150V
  6602. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumVoltageLimit, value, multiplier, unit);
  6603. //EVSEMinimumCurrentLimit
  6604. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  6605. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumCurrentLimit, value, multiplier, unit);
  6606. //EVSECurrentRegulationTolerance
  6607. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  6608. SHM_Save_dinPhysicalValueType(&in_para->EVSECurrentRegulationTolerance, value, multiplier, unit);
  6609. //EVSEPeakCurrentRipple
  6610. value = 2; multiplier = -1; unit = A_DIN70121; //0.2A
  6611. SHM_Save_dinPhysicalValueType(&in_para->EVSEPeakCurrentRipple, value, multiplier, unit);
  6612. //EVSEEnergyToBeDelivered (optional)
  6613. //SHM_Save_dinPhysicalValueType(&out_para->EVSEEnergyToBeDelivered, &in_para->EVSEEnergyToBeDelivered);
  6614. }
  6615. /*===========================================================================
  6616. FUNCTION: Sudo_Parameter_din_ChargeParameterDiscoveryRes
  6617. DESCRIPTION:
  6618. PRE-CONDITION:
  6619. INPUT:
  6620. OUTPUT:
  6621. GLOBAL VARIABLES:
  6622. =============================================================================*/
  6623. void Sudo_Parameter_din_ChargeParameterDiscoveryRes()
  6624. {
  6625. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6626. init_dinChargeParameterDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes);
  6627. ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  6628. //----- [BODY (1/5)] ResponseCode -----
  6629. struct dinChargeParameterDiscoveryResType *res;
  6630. res = &ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes;
  6631. res->ResponseCode = dinresponseCodeType_OK;
  6632. //----- [BODY (2/5)] EVSEProcessing -----
  6633. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6634. // dinEVSEProcessingType_Finished = 0,
  6635. // dinEVSEProcessingType_Ongoing = 1
  6636. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6637. res->SAScheduleList_isUsed = 1u;
  6638. struct dinSAScheduleListType *list;
  6639. list = &res->SAScheduleList;
  6640. //
  6641. list->SAScheduleTuple.arrayLen = 1;
  6642. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  6643. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleID = 0;
  6644. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  6645. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  6646. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  6647. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  6648. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  6649. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  6650. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  6651. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  6652. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  6653. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6654. //ignore, since DIN doesn't support AC
  6655. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6656. res->DC_EVSEChargeParameter_isUsed = 1u;
  6657. struct dinDC_EVSEChargeParameterType *para;
  6658. para = &res->DC_EVSEChargeParameter;
  6659. //DC_EVSEStatus
  6660. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  6661. para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  6662. // dinisolationLevelType_Invalid = 0,
  6663. // dinisolationLevelType_Valid = 1,
  6664. // dinisolationLevelType_Warning = 2,
  6665. // dinisolationLevelType_Fault = 3
  6666. para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  6667. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6668. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  6669. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6670. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6671. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6672. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6673. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6674. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  6675. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  6676. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  6677. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  6678. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  6679. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  6680. para->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  6681. // dinEVSENotificationType_None = 0,
  6682. // dinEVSENotificationType_StopCharging = 1,
  6683. // dinEVSENotificationType_ReNegotiation = 2
  6684. //EVSEMaximumCurrentLimit
  6685. para->EVSEMaximumCurrentLimit.Value = 2400;
  6686. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  6687. para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  6688. para->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  6689. // dinunitSymbolType_h = 0,
  6690. // dinunitSymbolType_m = 1,
  6691. // dinunitSymbolType_s = 2,
  6692. // dinunitSymbolType_A = 3,
  6693. // dinunitSymbolType_Ah = 4,
  6694. // dinunitSymbolType_V = 5,
  6695. // dinunitSymbolType_VA = 6,
  6696. // dinunitSymbolType_W = 7,
  6697. // dinunitSymbolType_W_s = 8,
  6698. // dinunitSymbolType_Wh = 9
  6699. //EVSEMaximumPowerLimit
  6700. para->EVSEMaximumPowerLimit.Value = 6000;
  6701. para->EVSEMaximumPowerLimit.Multiplier = 1;
  6702. para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  6703. para->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  6704. //EVSEMaximumVoltageLimit
  6705. para->EVSEMaximumVoltageLimit.Value = 7500;
  6706. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  6707. para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  6708. para->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  6709. //EVSEMinimumVoltageLimit
  6710. para->EVSEMinimumVoltageLimit.Value = 1500;
  6711. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  6712. para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  6713. para->EVSEMinimumVoltageLimit.Unit = dinunitSymbolType_V;
  6714. //EVSEMinimumCurrentLimit
  6715. para->EVSEMinimumCurrentLimit.Value = 20;
  6716. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  6717. para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  6718. para->EVSEMinimumCurrentLimit.Unit = dinunitSymbolType_A;
  6719. //EVSECurrentRegulationTolerance_isUsed
  6720. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  6721. //EVSECurrentRegulationTolerance
  6722. para->EVSECurrentRegulationTolerance.Value = 10;
  6723. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  6724. para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  6725. para->EVSECurrentRegulationTolerance.Unit = dinunitSymbolType_A;
  6726. //EVSEEnergyToBeDelivered_isUsed
  6727. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  6728. //EVSEPeakCurrentRipple
  6729. para->EVSEPeakCurrentRipple.Value = 2;
  6730. para->EVSEPeakCurrentRipple.Multiplier = -1;
  6731. para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  6732. para->EVSEPeakCurrentRipple.Unit = dinunitSymbolType_A;
  6733. //EVSEEnergyToBeDelivered (optional)
  6734. /*
  6735. para->EVSEEnergyToBeDelivered.Value = 360;
  6736. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  6737. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  6738. para->EVSEEnergyToBeDelivered.Unit = dinunitSymbolType_Wh;
  6739. */
  6740. }
  6741. /*===========================================================================
  6742. FUNCTION: Sudo_Parameter_iso1_ChargeParameterDiscoveryRes
  6743. DESCRIPTION:
  6744. PRE-CONDITION:
  6745. INPUT:
  6746. OUTPUT:
  6747. GLOBAL VARIABLES:
  6748. =============================================================================*/
  6749. void Sudo_Parameter_iso1_ChargeParameterDiscoveryRes()
  6750. {
  6751. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6752. init_iso1ChargeParameterDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes);
  6753. ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  6754. //----- [BODY (1/5)] ResponseCode -----
  6755. struct iso1ChargeParameterDiscoveryResType *res;
  6756. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes;
  6757. res->ResponseCode = iso1responseCodeType_OK;
  6758. //----- [BODY (2/5)] EVSEProcessing -----
  6759. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  6760. // iso1EVSEProcessingType_Finished = 0,
  6761. // iso1EVSEProcessingType_Ongoing = 1
  6762. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6763. res->SAScheduleList_isUsed = 1u;
  6764. struct iso1SAScheduleListType *list;
  6765. list = &res->SAScheduleList;
  6766. //
  6767. list->SAScheduleTuple.arrayLen = 1;
  6768. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  6769. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  6770. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  6771. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  6772. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  6773. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  6774. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  6775. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  6776. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  6777. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  6778. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6779. //ignore, since our ISO1 doesn't support AC, yet
  6780. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6781. res->DC_EVSEChargeParameter_isUsed = 1u;
  6782. struct iso1DC_EVSEChargeParameterType *para;
  6783. para = &res->DC_EVSEChargeParameter;
  6784. //DC_EVSEStatus
  6785. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  6786. para->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  6787. // iso1isolationLevelType_Invalid = 0,
  6788. // iso1isolationLevelType_Valid = 1,
  6789. // iso1isolationLevelType_Warning = 2,
  6790. // iso1isolationLevelType_Fault = 3
  6791. para->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  6792. // iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6793. // iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  6794. // iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6795. // iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6796. // iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6797. // iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6798. // iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6799. // iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  6800. // iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  6801. // iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  6802. // iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  6803. // iso1DC_EVSEStatusCodeType_Reserved_C = 11
  6804. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  6805. para->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  6806. // iso1EVSENotificationType_None = 0,
  6807. // iso1EVSENotificationType_StopCharging = 1,
  6808. // iso1EVSENotificationType_ReNegotiation = 2
  6809. //EVSEMaximumCurrentLimit
  6810. para->EVSEMaximumCurrentLimit.Value = 2400;
  6811. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  6812. //para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  6813. para->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  6814. //iso1unitSymbolType_h = 0,
  6815. //iso1unitSymbolType_m = 1,
  6816. //iso1unitSymbolType_s = 2,
  6817. //iso1unitSymbolType_A = 3,
  6818. //iso1unitSymbolType_V = 4,
  6819. //iso1unitSymbolType_W = 5,
  6820. //iso1unitSymbolType_Wh = 6
  6821. //EVSEMaximumPowerLimit
  6822. para->EVSEMaximumPowerLimit.Value = 6000;
  6823. para->EVSEMaximumPowerLimit.Multiplier = 1;
  6824. //para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  6825. para->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  6826. //EVSEMaximumVoltageLimit
  6827. para->EVSEMaximumVoltageLimit.Value = 7500;
  6828. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  6829. //para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  6830. para->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  6831. //EVSEMinimumVoltageLimit
  6832. para->EVSEMinimumVoltageLimit.Value = 1500;
  6833. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  6834. //para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  6835. para->EVSEMinimumVoltageLimit.Unit = iso1unitSymbolType_V;
  6836. //EVSEMinimumCurrentLimit
  6837. para->EVSEMinimumCurrentLimit.Value = 20;
  6838. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  6839. //para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  6840. para->EVSEMinimumCurrentLimit.Unit = iso1unitSymbolType_A;
  6841. //EVSECurrentRegulationTolerance_isUsed
  6842. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  6843. //EVSECurrentRegulationTolerance
  6844. para->EVSECurrentRegulationTolerance.Value = 10;
  6845. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  6846. //para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  6847. para->EVSECurrentRegulationTolerance.Unit = iso1unitSymbolType_A;
  6848. //EVSEEnergyToBeDelivered_isUsed
  6849. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  6850. //EVSEPeakCurrentRipple
  6851. para->EVSEPeakCurrentRipple.Value = 2;
  6852. para->EVSEPeakCurrentRipple.Multiplier = -1;
  6853. //para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  6854. para->EVSEPeakCurrentRipple.Unit = iso1unitSymbolType_A;
  6855. //EVSEEnergyToBeDelivered (optional)
  6856. /*
  6857. para->EVSEEnergyToBeDelivered.Value = 360;
  6858. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  6859. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  6860. para->EVSEEnergyToBeDelivered.Unit = iso1unitSymbolType_Wh;
  6861. */
  6862. }
  6863. /*===========================================================================
  6864. FUNCTION: Proc_din_ChargeParameterDiscoveryRes
  6865. DESCRIPTION:
  6866. PRE-CONDITION:
  6867. INPUT:
  6868. OUTPUT:
  6869. GLOBAL VARIABLES:
  6870. =============================================================================*/
  6871. int Proc_din_ChargeParameterDiscoveryRes(int AcceptFd)
  6872. {
  6873. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6874. //if it is not the same, the packet should be ignored.
  6875. //STEP 1: ============ Initialize ============
  6876. int errn = 0;
  6877. bitstream_t v2g_tx_stream;
  6878. struct ChargeParameterDiscoveryResponse_DIN70121 *res;
  6879. struct ChargeParameterDiscoveryRequest_DIN70121 *req;
  6880. struct DC_EVSEChargeParameterType_DIN70121 *dc_para;
  6881. struct ChargingInfoData *sys;
  6882. size_t pos = 0;
  6883. v2g_tx_stream.pos = &pos;
  6884. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6885. v2g_tx_stream.data = V2GTP_Tx_buf;
  6886. res = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  6887. req = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest;
  6888. dc_para = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  6889. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6890. res->ResponseCode = OK_DIN70121;
  6891. res->EVSEProcessing = Ongoing_DIN70121;
  6892. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready; //1
  6893. //[HEADER] Check Req SessionID
  6894. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6895. {
  6896. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6897. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6898. errn = -1;
  6899. }
  6900. //Check for SequenceError
  6901. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6902. {
  6903. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6904. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6905. errn = -1;
  6906. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6907. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6908. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6909. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6910. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6911. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6912. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6913. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6914. }
  6915. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  6916. if (sys->EvBatteryMaxCurrent < 0)
  6917. {
  6918. sprintf((char*)buf_log_evcomm,
  6919. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  6920. sys->EvBatteryMaxCurrent);
  6921. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6922. res->ResponseCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  6923. res->EVSEProcessing = Finished_DIN70121;
  6924. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6925. errn = -1;
  6926. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6927. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  6928. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6929. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6930. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6931. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6932. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  6933. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  6934. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6935. }
  6936. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  6937. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  6938. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  6939. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  6940. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumVoltageLimit, 1500, V_DIN70121); //150V
  6941. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumCurrentLimit, 10, A_DIN70121); //1A
  6942. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSECurrentRegulationTolerance, 10, A_DIN70121); //1A
  6943. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEPeakCurrentRipple, 2, A_DIN70121); //0.2A
  6944. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEEnergyToBeDelivered, 0, WH_DIN70121); //optional
  6945. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  6946. if (sys->EvBatteryMaxVoltage <= 500)
  6947. {
  6948. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  6949. }
  6950. #endif
  6951. //for test with Tesla Model 3, 10A
  6952. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_DIN70121); //10A, for testing with Tesla Model 3
  6953. //Check for EnergyTransferMode [TC_SECC_VTB_ChargeParameterDiscovery_004]
  6954. if (req->EVRequestedEnergyTransferType != DC_extended)
  6955. {
  6956. sprintf((char*)buf_log_evcomm,
  6957. "[ERROR]Wrong EVRequestedEnergyTransferType(%d,%d)",
  6958. req->EVRequestedEnergyTransferType,
  6959. dinEVSESupportedEnergyTransferType_DC_extended);
  6960. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6961. res->ResponseCode = FAILED_WrongEnergyTransferType_DIN70121;
  6962. res->EVSEProcessing = Finished_DIN70121;
  6963. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6964. errn = -1;
  6965. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6966. Update_V2G_Flow_Status(Other_Fault);
  6967. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6968. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  6969. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6970. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6971. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6972. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6973. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  6974. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6975. }
  6976. //Check for CSU command of "Stop by EVSE"
  6977. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6978. {
  6979. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  6980. res->ResponseCode = FAILED_DIN70121;
  6981. res->EVSEProcessing = Finished_DIN70121;
  6982. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6983. errn = -1;
  6984. }
  6985. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6986. {
  6987. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  6988. res->ResponseCode = FAILED_DIN70121;
  6989. res->EVSEProcessing = Finished_DIN70121;
  6990. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  6991. errn = -1;
  6992. }
  6993. //Detect for CP State should be 9V (State B)
  6994. #if CP_PROTECTION_MECHANISM == ENABLE
  6995. if (sys->CpState != 3) //State B1, B2
  6996. {
  6997. res->ResponseCode = FAILED_DIN70121;
  6998. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  6999. res->EVSEProcessing = Finished_DIN70121;
  7000. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7001. Update_V2G_Flow_Status(Other_Fault);
  7002. errn = -1;
  7003. sprintf((char*)buf_log_evcomm,
  7004. "[Proc_din_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7005. sys->CpState,
  7006. sys->CpVoltage);
  7007. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7008. }
  7009. #endif
  7010. //Check for Permission from CSU
  7011. if (ShmInternalComm->ChargingPermission == TRUE)
  7012. {
  7013. res->EVSEProcessing = Finished_DIN70121;
  7014. }
  7015. //Check for Permission Off
  7016. if (ShmInternalComm->ChargingPermission == FALSE)
  7017. {
  7018. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ChargeParameterDiscoveryRes]Permission OFF");
  7019. res->ResponseCode = FAILED_DIN70121;
  7020. res->EVSEProcessing = Finished_DIN70121;
  7021. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7022. errn = -1;
  7023. }
  7024. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7025. #if PARAMETER_NORMAL_MODE == ENABLE
  7026. SHM_Read_din_ChargeParameterDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  7027. #else
  7028. Sudo_Parameter_din_ChargeParameterDiscoveryRes();
  7029. #endif
  7030. //STEP 4: ============ Encode and Send Response Message ===========
  7031. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  7032. {
  7033. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7034. errn = -1;
  7035. }
  7036. //STPE 5: ============ Update Flags ============
  7037. return errn;
  7038. }
  7039. /*===========================================================================
  7040. FUNCTION: Proc_iso1_ChargeParameterDiscoveryRes
  7041. DESCRIPTION:
  7042. PRE-CONDITION:
  7043. INPUT:
  7044. OUTPUT:
  7045. GLOBAL VARIABLES:
  7046. =============================================================================*/
  7047. int Proc_iso1_ChargeParameterDiscoveryRes(int AcceptFd)
  7048. {
  7049. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7050. //if it is not the same, the packet should be ignored.
  7051. //STEP 1: ============ Initialize ============
  7052. int errn = 0;
  7053. bitstream_t v2g_tx_stream;
  7054. struct ChargeParameterDiscoveryResponse_ISO15118_2014 *res;
  7055. struct ChargeParameterDiscoveryRequest_ISO15118_2014 *req;
  7056. struct DC_EVSEChargeParameterType_ISO15118_2014 *dc_para;
  7057. struct AC_EVSEChargeParameterType_ISO15118_2014 *ac_para;
  7058. struct ChargingInfoData *sys;
  7059. size_t pos = 0;
  7060. v2g_tx_stream.pos = &pos;
  7061. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7062. v2g_tx_stream.data = V2GTP_Tx_buf;
  7063. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse;
  7064. req = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest;
  7065. dc_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  7066. ac_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.AC_EVSEChargeParameter;
  7067. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7068. res->ResponseCode = OK_ISO15118_2014;
  7069. res->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7070. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; //1
  7071. ac_para->AC_EVSEStatus.RCD = ShmInternalComm->AC_RcdStatus; //0:no error, 1:error
  7072. ac_para->AC_EVSEStatus.NotificationMaxDelay = 0; //unit: 1s
  7073. ac_para->AC_EVSEStatus.EVSENotification = ShmInternalComm->AC_EVSENotification; //0:none, 1:StopCharging, 2:RenNgotiation
  7074. //[HEADER] Check Req SessionID
  7075. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7076. {
  7077. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7078. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7079. errn = -1;
  7080. }
  7081. //Check for SequenceError
  7082. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7083. {
  7084. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7085. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7086. errn = -1;
  7087. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7088. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7089. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7090. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7091. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7092. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7093. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7094. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7095. }
  7096. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  7097. if (sys->EvBatteryMaxCurrent < 0)
  7098. {
  7099. sprintf((char*)buf_log_evcomm,
  7100. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  7101. sys->EvBatteryMaxCurrent);
  7102. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7103. res->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  7104. res->EVSEProcessing = Finished_ISO15118_2014;
  7105. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7106. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7107. errn = -1;
  7108. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7109. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  7110. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7111. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7112. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7113. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7114. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7115. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  7116. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7117. }
  7118. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  7119. //DC
  7120. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  7121. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7122. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  7123. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumVoltageLimit, 1500, V_ISO15118_2014); //150V
  7124. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumCurrentLimit, 10, A_ISO15118_2014); //1A
  7125. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSECurrentRegulationTolerance, 10, A_ISO15118_2014); //1A
  7126. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEPeakCurrentRipple, 2, A_ISO15118_2014); //0.2A
  7127. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEEnergyToBeDelivered, 0, Wh_ISO15118_2014); //optional
  7128. //AC
  7129. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSENominalVoltage, (int) (sys->AC_EVSENominalVoltage * 10), V_ISO15118_2014);
  7130. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7131. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  7132. if (sys->EvBatteryMaxVoltage <= 500)
  7133. {
  7134. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  7135. }
  7136. #endif
  7137. //for test with Tesla Model 3, 10A
  7138. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_ISO15118_2014); //10A, for testing with Tesla Model 3
  7139. //Check for EnergyTransferMode
  7140. if (req->RequestedEnergyTransferMode != ShmCcsData->EnergyTransferMode) //[CAUTION] Their table should be kept as the same.
  7141. {
  7142. sprintf((char*)buf_log_evcomm,
  7143. "[ERROR]Unmatched RequestedEnergyTransferMode(%d,%d)",
  7144. req->RequestedEnergyTransferMode,
  7145. ShmCcsData->EnergyTransferMode);
  7146. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7147. res->ResponseCode = FAILED_WrongEnergyTransferMode_ISO15118_2014;
  7148. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7149. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7150. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7151. errn = -1;
  7152. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7153. Update_V2G_Flow_Status(Other_Fault);
  7154. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7155. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  7156. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7157. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7158. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7159. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7160. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7161. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  7162. }
  7163. //Check for CSU command of "Stop by EVSE"
  7164. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7165. {
  7166. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7167. res->ResponseCode = FAILED_ISO15118_2014;
  7168. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7169. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7170. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7171. errn = -1;
  7172. }
  7173. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7174. {
  7175. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7176. res->ResponseCode = FAILED_ISO15118_2014;
  7177. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7178. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7179. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7180. errn = -1;
  7181. }
  7182. //Detect for CP State should be 9V (State B)
  7183. #if CP_PROTECTION_MECHANISM == ENABLE
  7184. if (sys->CpState != 3) //State B1, B2
  7185. {
  7186. res->ResponseCode = FAILED_ISO15118_2014;
  7187. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7188. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7189. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7190. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7191. Update_V2G_Flow_Status(Other_Fault);
  7192. errn = -1;
  7193. sprintf((char*)buf_log_evcomm,
  7194. "[Proc_iso1_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7195. sys->CpState,
  7196. sys->CpVoltage);
  7197. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7198. }
  7199. #endif
  7200. //Check for Permission from CSU
  7201. if(ShmInternalComm->ChargingPermission == TRUE)
  7202. {
  7203. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7204. }
  7205. //Check for Permission Off
  7206. if (ShmInternalComm->ChargingPermission == FALSE)
  7207. {
  7208. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][ChargeParameterDiscoveryRes]Permission OFF");
  7209. res->ResponseCode = FAILED_ISO15118_2014;
  7210. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7211. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7212. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7213. errn = -1;
  7214. }
  7215. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7216. #if PARAMETER_NORMAL_MODE == ENABLE
  7217. SHM_Read_iso1_ChargeParameterDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7218. #else
  7219. Sudo_Parameter_iso1_ChargeParameterDiscoveryRes();
  7220. #endif
  7221. //STEP 4: ============ Encode and Send Response Message ===========
  7222. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7223. {
  7224. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7225. errn = -1;
  7226. }
  7227. //STPE 5: ============ Update Flags ============
  7228. return errn;
  7229. }
  7230. /*===========================================================================
  7231. FUNCTION: Proc_din_ChargeParameterDiscoveryReq
  7232. DESCRIPTION:
  7233. PRE-CONDITION:
  7234. INPUT:
  7235. OUTPUT:
  7236. GLOBAL VARIABLES:
  7237. =============================================================================*/
  7238. int Proc_din_ChargeParameterDiscoveryReq(int AcceptFd)
  7239. {
  7240. int errn = 0;
  7241. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7242. //ftime(&SeqStartTime);
  7243. //Print the decoded XML Document
  7244. PRINT_XML_DOC_DIN_ChargeParameterDiscoveryReq(&ccs_exi_doc_DIN);
  7245. //Save into Share Memory
  7246. SHM_Save_din_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7247. //Check for EV Error Code
  7248. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7249. errn = Proc_din_ChargeParameterDiscoveryRes(AcceptFd);
  7250. //ftime(&SeqEndTime);
  7251. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7252. if ( errn == 0)
  7253. {
  7254. //send response successfully.
  7255. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ChargeParameterDiscoveryRes");
  7256. }
  7257. else
  7258. {
  7259. sprintf((char*)buf_log_evcomm,
  7260. "[Error][DIN][ChargeParameterDiscoveryRes]%d (DEC)",
  7261. errn);
  7262. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7263. }
  7264. return errn;
  7265. }
  7266. /*===========================================================================
  7267. FUNCTION: Proc_iso1_ChargeParameterDiscoveryReq
  7268. DESCRIPTION:
  7269. PRE-CONDITION:
  7270. INPUT:
  7271. OUTPUT:
  7272. GLOBAL VARIABLES:
  7273. =============================================================================*/
  7274. int Proc_iso1_ChargeParameterDiscoveryReq(int AcceptFd)
  7275. {
  7276. int errn = 0;
  7277. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7278. //ftime(&SeqStartTime);
  7279. //Print the decoded XML Document
  7280. PRINT_XML_DOC_ISO1_ChargeParameterDiscoveryReq(&ccs_exi_doc_ISO1);
  7281. //Save into Share Memory
  7282. SHM_Save_iso1_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7283. //Check for EV Error Code
  7284. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7285. errn = Proc_iso1_ChargeParameterDiscoveryRes(AcceptFd);
  7286. //ftime(&SeqEndTime);
  7287. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7288. if (errn == 0)
  7289. {
  7290. //send response successfully.
  7291. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ChargeParameterDiscoveryRes");
  7292. }
  7293. else
  7294. {
  7295. sprintf((char*)buf_log_evcomm,
  7296. "[Error][ISO1][ChargeParameterDiscoveryRes]%d (DEC)",
  7297. errn);
  7298. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7299. }
  7300. return errn;
  7301. }
  7302. /*===========================================================================
  7303. FUNCTION: SHM_Init_din_CableCheckRes
  7304. DESCRIPTION:
  7305. PRE-CONDITION:
  7306. INPUT:
  7307. 1. shm_ccs
  7308. OUTPUT:
  7309. 1. shm_ccs
  7310. GLOBAL VARIABLES:
  7311. =============================================================================*/
  7312. void SHM_Init_din_CableCheckRes(struct CcsData *shm_ccs)
  7313. {
  7314. struct CableCheckResponse_DIN70121 *in;
  7315. in = &shm_ccs->V2GMessage_DIN70121.CableCheckResponse;
  7316. //----- [BODY (1/3)] ResponseCode -----
  7317. in->ResponseCode = dinresponseCodeType_OK;
  7318. //----- [BODY (2/3)] EVSEProcessing -----
  7319. //in->EVSEProcessing = dinEVSEProcessingType_Finished; //for test
  7320. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //default
  7321. // dinEVSEProcessingType_Finished = 0,
  7322. // dinEVSEProcessingType_Ongoing = 1
  7323. //----- [BODY (3/3)] DC_EVSEStatus -----
  7324. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7325. in->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0 (default)
  7326. // dinisolationLevelType_Invalid = 0,
  7327. // dinisolationLevelType_Valid = 1, (default)
  7328. // dinisolationLevelType_Warning = 2,
  7329. // dinisolationLevelType_Fault = 3
  7330. }
  7331. /*===========================================================================
  7332. FUNCTION: Sudo_Parameter_din_CableCheckRes
  7333. DESCRIPTION:
  7334. PRE-CONDITION:
  7335. INPUT:
  7336. OUTPUT:
  7337. GLOBAL VARIABLES:
  7338. =============================================================================*/
  7339. void Sudo_Parameter_din_CableCheckRes()
  7340. {
  7341. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7342. init_dinCableCheckResType(&ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes);
  7343. ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  7344. //----- [BODY (1/3)] ResponseCode -----
  7345. struct dinCableCheckResType *res;
  7346. res = &ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes;
  7347. res->ResponseCode = dinresponseCodeType_OK;
  7348. //----- [BODY (2/3)] EVSEProcessing -----
  7349. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  7350. // dinEVSEProcessingType_Finished = 0,
  7351. // dinEVSEProcessingType_Ongoing = 1
  7352. //----- [BODY (3/3)] DC_EVSEStatus -----
  7353. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7354. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7355. // dinisolationLevelType_Invalid = 0,
  7356. // dinisolationLevelType_Valid = 1,
  7357. // dinisolationLevelType_Warning = 2,
  7358. // dinisolationLevelType_Fault = 3
  7359. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7360. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7361. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7362. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7363. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7364. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7365. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7366. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7367. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7368. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7369. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7370. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7371. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7372. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7373. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  7374. // dinEVSENotificationType_None = 0,
  7375. // dinEVSENotificationType_StopCharging = 1,
  7376. // dinEVSENotificationType_ReNegotiation = 2
  7377. }
  7378. /*===========================================================================
  7379. FUNCTION: Sudo_Parameter_iso1_CableCheckRes
  7380. DESCRIPTION:
  7381. PRE-CONDITION:
  7382. INPUT:
  7383. OUTPUT:
  7384. GLOBAL VARIABLES:
  7385. =============================================================================*/
  7386. void Sudo_Parameter_iso1_CableCheckRes()
  7387. {
  7388. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  7389. init_iso1CableCheckResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes);
  7390. ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  7391. //----- [BODY (1/3)] ResponseCode -----
  7392. struct iso1CableCheckResType *res;
  7393. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes;
  7394. res->ResponseCode = iso1responseCodeType_OK;
  7395. //----- [BODY (2/3)] EVSEProcessing -----
  7396. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7397. //iso1EVSEProcessingType_Finished = 0,
  7398. //iso1EVSEProcessingType_Ongoing = 1,
  7399. //iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction = 2
  7400. //----- [BODY (3/3)] DC_EVSEStatus -----
  7401. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7402. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  7403. //iso1isolationLevelType_Invalid = 0,
  7404. //iso1isolationLevelType_Valid = 1,
  7405. //iso1isolationLevelType_Warning = 2,
  7406. //iso1isolationLevelType_Fault = 3,
  7407. //iso1isolationLevelType_No_IMD = 4
  7408. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7409. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7410. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  7411. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7412. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7413. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7414. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7415. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7416. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  7417. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  7418. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  7419. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  7420. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  7421. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7422. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  7423. //iso1EVSENotificationType_None = 0,
  7424. //iso1EVSENotificationType_StopCharging = 1,
  7425. //iso1EVSENotificationType_ReNegotiation = 2
  7426. }
  7427. /*===========================================================================
  7428. FUNCTION: Proc_din_CableCheckRes
  7429. DESCRIPTION:
  7430. PRE-CONDITION:
  7431. INPUT:
  7432. OUTPUT:
  7433. GLOBAL VARIABLES:
  7434. =============================================================================*/
  7435. int Proc_din_CableCheckRes(int AcceptFd)
  7436. {
  7437. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7438. //if it is not the same, the packet should be ignored.
  7439. //STEP 1: ============ Initialize ============
  7440. //int i = 0;
  7441. int errn = 0;
  7442. bitstream_t v2g_tx_stream;
  7443. static struct CableCheckResponse_DIN70121 *cab;
  7444. static struct ChargingInfoData *sys;
  7445. size_t pos = 0;
  7446. v2g_tx_stream.pos = &pos;
  7447. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7448. v2g_tx_stream.data = V2GTP_Tx_buf;
  7449. cab = &ShmCcsData->V2GMessage_DIN70121.CableCheckResponse;
  7450. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7451. cab->ResponseCode = OK_DIN70121;
  7452. cab->cnt++;
  7453. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  7454. sys->CpState,
  7455. sys->CpVoltage,
  7456. sys->PresentChargingVoltage,
  7457. sys->IsolationStatus,
  7458. cab->EVSEProcessing);
  7459. //[HEADER] Check Req SessionID
  7460. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  7461. {
  7462. cab->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  7463. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7464. errn = -1;
  7465. }
  7466. //Check for SequenceError
  7467. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7468. {
  7469. cab->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  7470. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7471. errn = -1;
  7472. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7473. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7474. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7475. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7476. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7477. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7478. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7479. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7480. }
  7481. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  7482. if (sys->IsolationStatus == GFD_Invalid) //0: on going
  7483. {
  7484. //For PSU
  7485. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  7486. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  7487. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7488. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive; //4
  7489. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  7490. }
  7491. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2: warning
  7492. {
  7493. //For PSU
  7494. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7495. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7496. if (sys->PresentChargingVoltage < 60) // < 60V
  7497. {
  7498. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  7499. sprintf((char*)buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  7500. sys->PresentChargingVoltage,
  7501. sys->IsolationStatus);
  7502. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7503. //IsolationStatus
  7504. if (sys->IsolationStatus == GFD_Valid)
  7505. {
  7506. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7507. }
  7508. else if (sys->IsolationStatus == GFD_Warning)
  7509. {
  7510. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning;
  7511. }
  7512. else
  7513. {
  7514. sprintf((char*)buf_log_evcomm,
  7515. "[WARNING]unexpected IsolationStatus(%d)",
  7516. sys->IsolationStatus);
  7517. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7518. }
  7519. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7520. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7521. }
  7522. else
  7523. {
  7524. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7525. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7526. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  7527. }
  7528. }
  7529. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  7530. {
  7531. //For PSU
  7532. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7533. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7534. cab->ResponseCode = FAILED_DIN70121;
  7535. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7536. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  7537. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7538. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]IsolationStatus = 3 (fault)");
  7539. errn = -1;
  7540. }
  7541. else
  7542. {
  7543. //For PSU
  7544. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7545. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7546. cab->ResponseCode = FAILED_DIN70121;
  7547. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7548. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  7549. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7550. sprintf((char*)buf_log_evcomm,
  7551. "[Proc_din_CableCheckRes]Undefined Isolation Status(%d)",
  7552. sys->IsolationStatus);
  7553. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7554. }
  7555. //Check for CSU command of "Stop by EVSE"
  7556. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7557. {
  7558. cab->ResponseCode = FAILED_DIN70121;
  7559. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7560. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7561. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7562. errn = -1;
  7563. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]EVSE_Shutdown");
  7564. }
  7565. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7566. {
  7567. cab->ResponseCode = FAILED_DIN70121;
  7568. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7569. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7570. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7571. errn = -1;
  7572. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]EVSE_EmergencyShutdown");
  7573. }
  7574. else if (ShmInternalComm->ChargingPermission == FALSE)
  7575. {
  7576. cab->ResponseCode = FAILED_DIN70121;
  7577. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7578. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7579. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7580. errn = -1;
  7581. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_CableCheckRes]ChargingPermission = FALSE");
  7582. }
  7583. else
  7584. {
  7585. //null
  7586. }
  7587. //Response to CP Error
  7588. #if CP_PROTECTION_MECHANISM == ENABLE
  7589. //#if 1
  7590. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  7591. {
  7592. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  7593. {
  7594. cab->ResponseCode = FAILED_DIN70121;
  7595. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7596. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7597. Update_V2G_Flow_Status(Other_Fault);
  7598. errn = -1;
  7599. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7600. //CCS_SECC_CP_State_Error (023889)
  7601. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7602. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7603. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7604. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  7605. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  7606. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  7607. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  7608. sprintf((char*)buf_log_evcomm,
  7609. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  7610. sys->CpState,
  7611. sys->CpVoltage,
  7612. cab->cnt
  7613. );
  7614. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7615. //cab->cnt = 0;
  7616. }
  7617. }
  7618. #endif
  7619. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7620. #if PARAMETER_NORMAL_MODE == ENABLE
  7621. SHM_Read_din_CableCheckRes(&ccs_exi_doc_DIN, ShmCcsData);
  7622. #else
  7623. Sudo_Parameter_din_CableCheckRes();
  7624. #endif
  7625. //STEP 4: ============ Encode and Send Response Message ===========
  7626. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  7627. {
  7628. errn = -1;
  7629. }
  7630. //STEP 5: ============ Update Flags ===========
  7631. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  7632. return errn;
  7633. }
  7634. /*===========================================================================
  7635. FUNCTION: Proc_iso1_CableCheckRes
  7636. DESCRIPTION:
  7637. PRE-CONDITION:
  7638. INPUT:
  7639. OUTPUT:
  7640. GLOBAL VARIABLES:
  7641. =============================================================================*/
  7642. int Proc_iso1_CableCheckRes(int AcceptFd)
  7643. {
  7644. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7645. //if it is not the same, the packet should be ignored.
  7646. //STEP 1: ============ Initialize ============
  7647. //int i = 0;
  7648. int errn = 0;
  7649. bitstream_t v2g_tx_stream;
  7650. static struct CableCheckResponse_ISO15118_2014 *cab;
  7651. static struct ChargingInfoData *sys;
  7652. size_t pos = 0;
  7653. v2g_tx_stream.pos = &pos;
  7654. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7655. v2g_tx_stream.data = V2GTP_Tx_buf;
  7656. cab = &ShmCcsData->V2GMessage_ISO15118_2014.CableCheckResponse;
  7657. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7658. cab->ResponseCode = OK_ISO15118_2014;
  7659. cab->cnt++;
  7660. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  7661. sys->CpState,
  7662. sys->CpVoltage,
  7663. sys->PresentChargingVoltage,
  7664. sys->IsolationStatus,
  7665. cab->EVSEProcessing);
  7666. //[HEADER] Check Req SessionID
  7667. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7668. {
  7669. cab->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7670. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7671. errn = -1;
  7672. }
  7673. //Check for SequenceError
  7674. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7675. {
  7676. cab->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7677. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7678. errn = -1;
  7679. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7680. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7681. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7682. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7683. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7684. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7685. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7686. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7687. }
  7688. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  7689. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  7690. {
  7691. //For PSU
  7692. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  7693. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  7694. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7695. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7696. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7697. }
  7698. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2:waring
  7699. {
  7700. //For PSU
  7701. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7702. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7703. if (sys->PresentChargingVoltage < 60) // < 60V
  7704. {
  7705. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  7706. sprintf((char*)buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  7707. sys->PresentChargingVoltage,
  7708. sys->IsolationStatus);
  7709. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7710. //IsolationStatus
  7711. if (sys->IsolationStatus == GFD_Valid)
  7712. {
  7713. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  7714. }
  7715. else if (sys->IsolationStatus == GFD_Warning)
  7716. {
  7717. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning;
  7718. }
  7719. else
  7720. {
  7721. sprintf((char*)buf_log_evcomm,
  7722. "[WARNING]unexpected IsolationStatus(%d)",
  7723. sys->IsolationStatus);
  7724. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7725. }
  7726. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7727. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7728. }
  7729. else
  7730. {
  7731. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7732. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7733. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7734. }
  7735. }
  7736. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  7737. {
  7738. //For PSU
  7739. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7740. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7741. cab->ResponseCode = FAILED_ISO15118_2014;
  7742. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7743. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  7744. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7745. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]IsolationStatus = 3 (fault)");
  7746. errn = -1;
  7747. }
  7748. //else if (sys->IsolationStatus == GFD_No_IMD){} //only for ISO15118
  7749. else
  7750. {
  7751. //For PSU
  7752. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7753. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7754. cab->ResponseCode = FAILED_ISO15118_2014;
  7755. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7756. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  7757. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7758. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]Undefined Isolation Status.");
  7759. }
  7760. //Check for CSU command of "Stop by EVSE"
  7761. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7762. {
  7763. cab->ResponseCode = FAILED_ISO15118_2014;
  7764. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7765. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7766. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7767. errn = -1;
  7768. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]EVSE_Shutdown");
  7769. }
  7770. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7771. {
  7772. cab->ResponseCode = FAILED_ISO15118_2014;
  7773. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7774. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7775. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7776. errn = -1;
  7777. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]EVSE_EmergencyShutdown");
  7778. }
  7779. else if (ShmInternalComm->ChargingPermission == FALSE)
  7780. {
  7781. cab->ResponseCode = FAILED_ISO15118_2014;
  7782. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7783. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7784. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7785. errn = -1;
  7786. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_CableCheckRes]ChargingPermission = FALSE");
  7787. }
  7788. else
  7789. {
  7790. //null
  7791. }
  7792. //Response to CP Error
  7793. #if CP_PROTECTION_MECHANISM == ENABLE
  7794. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  7795. {
  7796. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  7797. {
  7798. cab->ResponseCode = FAILED_ISO15118_2014;
  7799. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7800. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7801. Update_V2G_Flow_Status(Other_Fault);
  7802. errn = -1;
  7803. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7804. //CCS_SECC_CP_State_Error (023889)
  7805. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7806. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7807. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7808. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  7809. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  7810. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  7811. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  7812. sprintf((char*)buf_log_evcomm,
  7813. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  7814. sys->CpState,
  7815. sys->CpVoltage,
  7816. cab->cnt
  7817. );
  7818. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7819. //cab->cnt = 0;
  7820. }
  7821. }
  7822. #endif
  7823. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7824. #if PARAMETER_NORMAL_MODE == ENABLE
  7825. SHM_Read_iso1_CableCheckRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7826. #else
  7827. Sudo_Parameter_iso1_CableCheckRes();
  7828. #endif
  7829. //STEP 4: ============ Encode and Send Response Message ===========
  7830. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7831. {
  7832. errn = -1;
  7833. }
  7834. //STEP 5: ============ Update Flags ===========
  7835. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  7836. return errn;
  7837. }
  7838. /*===========================================================================
  7839. FUNCTION: Proc_din_CableCheckReq
  7840. DESCRIPTION:
  7841. PRE-CONDITION:
  7842. INPUT:
  7843. OUTPUT:
  7844. GLOBAL VARIABLES:
  7845. =============================================================================*/
  7846. int Proc_din_CableCheckReq(int AcceptFd)
  7847. {
  7848. int errn = 0;
  7849. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckReq] Got CableCheckReq\n");
  7850. //Print the decoded XML Document
  7851. PRINT_XML_DOC_DIN_CableCheckReq(&ccs_exi_doc_DIN);
  7852. //Save into Share Memory
  7853. SHM_Save_din_CableCheckReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7854. //Check for EV Error Code
  7855. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CableCheckRequest.DC_EVStatus.EVErrorCode);
  7856. errn = Proc_din_CableCheckRes(AcceptFd);
  7857. if (errn == 0)
  7858. {
  7859. //send response successfully.
  7860. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]CableCheckRes");
  7861. }
  7862. else
  7863. {
  7864. sprintf((char*)buf_log_evcomm,
  7865. "[Error][SeccComm][Proc_din_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  7866. errn);
  7867. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7868. }
  7869. return errn;
  7870. }
  7871. /*===========================================================================
  7872. FUNCTION: Proc_iso1_CableCheckReq
  7873. DESCRIPTION:
  7874. PRE-CONDITION:
  7875. INPUT:
  7876. OUTPUT:
  7877. GLOBAL VARIABLES:
  7878. =============================================================================*/
  7879. int Proc_iso1_CableCheckReq(int AcceptFd)
  7880. {
  7881. int errn = 0;
  7882. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckReq] Got CableCheckReq");
  7883. //Print the decoded XML Document
  7884. PRINT_XML_DOC_ISO1_CableCheckReq(&ccs_exi_doc_ISO1);
  7885. //Save into Share Memory
  7886. SHM_Save_iso1_CableCheckReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7887. //Check for EV Error Code
  7888. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CableCheckRequest.DC_EVStatus.EVErrorCode);
  7889. errn = Proc_iso1_CableCheckRes(AcceptFd);
  7890. if (errn == 0)
  7891. {
  7892. //send response successfully.
  7893. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]CableCheckRes");
  7894. }
  7895. else
  7896. {
  7897. sprintf((char*)buf_log_evcomm,
  7898. "[Error][SeccComm][Proc_iso1_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  7899. errn);
  7900. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7901. }
  7902. return errn;
  7903. }
  7904. /*===========================================================================
  7905. FUNCTION: SHM_Init_din_PreChargeRes
  7906. DESCRIPTION:
  7907. PRE-CONDITION:
  7908. INPUT:
  7909. 1. shm_ccs
  7910. OUTPUT:
  7911. 1. shm_ccs
  7912. GLOBAL VARIABLES:
  7913. =============================================================================*/
  7914. void SHM_Init_din_PreChargeRes(struct CcsData *shm_ccs)
  7915. {
  7916. struct PreChargeResponse_DIN70121 *in;
  7917. in = &shm_ccs->V2GMessage_DIN70121.PreChargeResponse;
  7918. //----- [BODY (1/3)] ResponseCode -----
  7919. in->ResponseCode = dinresponseCodeType_OK;
  7920. //----- [BODY (2/3)] EVSEPresentVoltage -----
  7921. short value = 0; int multiplier = 0; unsigned char unit = 0;
  7922. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for Test
  7923. value = 0; multiplier = 0; unit = V_DIN70121; //waiting for CsuComm to update V to fit EV Target
  7924. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  7925. //----- [BODY (3/3)] DC_EVSEStatus -----
  7926. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7927. }
  7928. /*===========================================================================
  7929. FUNCTION: Sudo_Parameter_din_PreChargeRes
  7930. DESCRIPTION:
  7931. PRE-CONDITION:
  7932. INPUT:
  7933. OUTPUT:
  7934. GLOBAL VARIABLES:
  7935. =============================================================================*/
  7936. void Sudo_Parameter_din_PreChargeRes()
  7937. {
  7938. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7939. init_dinPreChargeResType(&ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes);
  7940. ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  7941. //----- [BODY (1/3)] ResponseCode -----
  7942. struct dinPreChargeResType *res;
  7943. res = &ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes;
  7944. res->ResponseCode = dinresponseCodeType_OK;
  7945. //----- [BODY (2/3)] EVSEPresentVoltage -----
  7946. res->EVSEPresentVoltage.Value = 3820;
  7947. res->EVSEPresentVoltage.Multiplier = -1;
  7948. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  7949. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  7950. // dinunitSymbolType_h = 0,
  7951. // dinunitSymbolType_m = 1,
  7952. // dinunitSymbolType_s = 2,
  7953. // dinunitSymbolType_A = 3,
  7954. // dinunitSymbolType_Ah = 4,
  7955. // dinunitSymbolType_V = 5,
  7956. // dinunitSymbolType_VA = 6,
  7957. // dinunitSymbolType_W = 7,
  7958. // dinunitSymbolType_W_s = 8,
  7959. // dinunitSymbolType_Wh = 9
  7960. //----- [BODY (3/3)] DC_EVSEStatus -----
  7961. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7962. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7963. // dinisolationLevelType_Invalid = 0,
  7964. // dinisolationLevelType_Valid = 1,
  7965. // dinisolationLevelType_Warning = 2,
  7966. // dinisolationLevelType_Fault = 3
  7967. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7968. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7969. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7970. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7971. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7972. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7973. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7974. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7975. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7976. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7977. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7978. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7979. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7980. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7981. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  7982. // dinEVSENotificationType_None = 0,
  7983. // dinEVSENotificationType_StopCharging = 1,
  7984. // dinEVSENotificationType_ReNegotiation = 2
  7985. }
  7986. /*===========================================================================
  7987. FUNCTION: Sudo_Parameter_iso1_PreChargeRes
  7988. DESCRIPTION:
  7989. PRE-CONDITION:
  7990. INPUT:
  7991. OUTPUT:
  7992. GLOBAL VARIABLES:
  7993. =============================================================================*/
  7994. void Sudo_Parameter_iso1_PreChargeRes()
  7995. {
  7996. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  7997. init_iso1PreChargeResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes);
  7998. ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  7999. //----- [BODY (1/3)] ResponseCode -----
  8000. struct iso1PreChargeResType *res;
  8001. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes;
  8002. res->ResponseCode = iso1responseCodeType_OK;
  8003. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8004. res->EVSEPresentVoltage.Value = 3820;
  8005. res->EVSEPresentVoltage.Multiplier = -1;
  8006. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8007. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  8008. //iso1unitSymbolType_h = 0,
  8009. //iso1unitSymbolType_m = 1,
  8010. //iso1unitSymbolType_s = 2,
  8011. //iso1unitSymbolType_A = 3,
  8012. //iso1unitSymbolType_V = 4,
  8013. //iso1unitSymbolType_W = 5,
  8014. //iso1unitSymbolType_Wh = 6
  8015. //----- [BODY (3/3)] DC_EVSEStatus -----
  8016. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8017. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8018. //iso1isolationLevelType_Invalid = 0,
  8019. //iso1isolationLevelType_Valid = 1,
  8020. //iso1isolationLevelType_Warning = 2,
  8021. //iso1isolationLevelType_Fault = 3,
  8022. //iso1isolationLevelType_No_IMD = 4
  8023. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8024. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8025. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8026. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8027. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8028. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8029. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8030. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8031. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8032. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8033. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8034. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8035. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8036. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8037. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8038. //iso1EVSENotificationType_None = 0,
  8039. //iso1EVSENotificationType_StopCharging = 1,
  8040. //iso1EVSENotificationType_ReNegotiation = 2
  8041. }
  8042. /*===========================================================================
  8043. FUNCTION: Proc_din_PreChargeRes
  8044. DESCRIPTION:
  8045. PRE-CONDITION:
  8046. INPUT:
  8047. OUTPUT:
  8048. GLOBAL VARIABLES:
  8049. =============================================================================*/
  8050. int Proc_din_PreChargeRes(int AcceptFd)
  8051. {
  8052. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8053. //if it is not the same, the packet should be ignored.
  8054. //STEP 1: ============ Initialize ============
  8055. //int i = 0;
  8056. int errn = 0;
  8057. bitstream_t v2g_tx_stream;
  8058. static struct PreChargeResponse_DIN70121 *pre;
  8059. static struct ChargingInfoData *sys;
  8060. size_t pos = 0;
  8061. v2g_tx_stream.pos = &pos;
  8062. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8063. v2g_tx_stream.data = V2GTP_Tx_buf;
  8064. pre = &ShmCcsData->V2GMessage_DIN70121.PreChargeResponse;
  8065. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8066. pre->ResponseCode = OK_DIN70121;
  8067. //EVSE Status Code
  8068. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8069. //[HEADER] Check Req SessionID
  8070. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8071. {
  8072. pre->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8073. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8074. errn = -1;
  8075. }
  8076. //Check for SequenceError
  8077. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8078. {
  8079. pre->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8080. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8081. errn = -1;
  8082. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8083. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8084. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8085. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8086. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8087. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8088. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8089. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8090. }
  8091. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8092. SAVE_PhysicalValueType_DIN70121(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  8093. //Isolation Status
  8094. if (sys->IsolationStatus == GFD_Invalid) //0: invalid
  8095. {
  8096. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  8097. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8098. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8099. Update_V2G_Flow_Status(Other_Fault);
  8100. errn = -1;
  8101. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8102. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8103. }
  8104. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8105. {
  8106. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8107. }
  8108. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  8109. {
  8110. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  8111. }
  8112. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8113. {
  8114. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8115. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8116. pre->ResponseCode = FAILED_DIN70121;
  8117. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8118. errn = -1;
  8119. }
  8120. else //GFD_No_IMD or other unexpected status
  8121. {
  8122. pre->ResponseCode = FAILED_DIN70121;
  8123. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8124. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8125. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8126. Update_V2G_Flow_Status(Other_Fault);
  8127. errn = -1;
  8128. sprintf((char*)buf_log_evcomm,
  8129. "[Error][Proc_din_PreChargeRes]IsolationStatus = %d (undefined)",
  8130. sys->IsolationStatus);
  8131. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8132. }
  8133. //Check for CSU command of "Stop by EVSE"
  8134. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8135. {
  8136. //Check for Alarm Code: CCS GFD trip (012235)
  8137. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8138. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8139. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8140. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8141. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8142. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8143. {
  8144. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  8145. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8146. }
  8147. else
  8148. {
  8149. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]EVSE_Shutdown");
  8150. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8151. }
  8152. pre->ResponseCode = FAILED_DIN70121;
  8153. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8154. errn = -1;
  8155. }
  8156. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8157. {
  8158. //Check for Alarm Code: CCS GFD trip (012235)
  8159. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8160. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8161. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8162. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8163. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8164. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8165. {
  8166. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  8167. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8168. }
  8169. else
  8170. {
  8171. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]EVSE_EmergencyShutdown");
  8172. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8173. }
  8174. pre->ResponseCode = FAILED_DIN70121;
  8175. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8176. errn = -1;
  8177. }
  8178. else if (ShmInternalComm->ChargingPermission == FALSE)
  8179. {
  8180. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]ChargingPermission = FALSE");
  8181. pre->ResponseCode = FAILED_DIN70121;
  8182. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8183. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8184. errn = -1;
  8185. }
  8186. else
  8187. {
  8188. //null
  8189. }
  8190. //Response to CP Error
  8191. #if CP_PROTECTION_MECHANISM == ENABLE
  8192. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8193. {
  8194. pre->ResponseCode = FAILED_DIN70121;
  8195. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8196. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8197. Update_V2G_Flow_Status(Other_Fault);
  8198. errn = -1;
  8199. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8200. //CCS_SECC_CP_State_Error (023889)
  8201. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8202. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8203. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8204. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8205. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8206. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8207. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8208. sprintf((char*)buf_log_evcomm,
  8209. "[Error][Proc_din_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8210. sys->CpState,
  8211. sys->CpVoltage
  8212. );
  8213. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8214. }
  8215. #endif
  8216. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8217. #if PARAMETER_NORMAL_MODE == ENABLE
  8218. SHM_Read_din_PreChargeRes(&ccs_exi_doc_DIN, ShmCcsData);
  8219. #else
  8220. Sudo_Parameter_din_PreChargeRes();
  8221. #endif
  8222. //STEP 4: ============ Encode and Send Response Message ===========
  8223. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8224. {
  8225. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][send_encoded_din_V2GTP_Stream]:Tx encoded msg error");
  8226. errn = -1;
  8227. }
  8228. //STEP 5: ============ Update Flags ===========
  8229. return errn;
  8230. }
  8231. /*===========================================================================
  8232. FUNCTION: Proc_iso1_PreChargeRes
  8233. DESCRIPTION:
  8234. PRE-CONDITION:
  8235. INPUT:
  8236. OUTPUT:
  8237. GLOBAL VARIABLES:
  8238. =============================================================================*/
  8239. int Proc_iso1_PreChargeRes(int AcceptFd)
  8240. {
  8241. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8242. //if it is not the same, the packet should be ignored.
  8243. //STEP 1: ============ Initialize ============
  8244. //int i = 0;
  8245. int errn = 0;
  8246. bitstream_t v2g_tx_stream;
  8247. static struct PreChargeResponse_ISO15118_2014 *pre;
  8248. static struct ChargingInfoData *sys;
  8249. size_t pos = 0;
  8250. v2g_tx_stream.pos = &pos;
  8251. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8252. v2g_tx_stream.data = V2GTP_Tx_buf;
  8253. pre = &ShmCcsData->V2GMessage_ISO15118_2014.PreChargeResponse;
  8254. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8255. pre->ResponseCode = OK_ISO15118_2014;
  8256. //EVSE Status Code
  8257. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8258. //[HEADER] Check Req SessionID
  8259. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8260. {
  8261. pre->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8262. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8263. errn = -1;
  8264. }
  8265. //Check for SequenceError
  8266. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8267. {
  8268. pre->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8269. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8270. errn = -1;
  8271. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8272. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8273. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8274. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8275. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8276. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8277. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8278. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8279. }
  8280. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8281. SAVE_PhysicalValueType_ISO15118_2014(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  8282. //Isolation Status
  8283. if (sys->IsolationStatus == GFD_Invalid) //0: invalid(on going)
  8284. {
  8285. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  8286. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8287. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8288. Update_V2G_Flow_Status(Other_Fault);
  8289. errn = -1;
  8290. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8291. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8292. }
  8293. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8294. {
  8295. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8296. }
  8297. else if (sys->IsolationStatus == GFD_Warning) //2: waring
  8298. {
  8299. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //1
  8300. }
  8301. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8302. {
  8303. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8304. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8305. pre->ResponseCode = FAILED_ISO15118_2014;
  8306. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8307. errn = -1;
  8308. }
  8309. else
  8310. {
  8311. pre->ResponseCode = FAILED_ISO15118_2014;
  8312. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8313. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8314. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8315. Update_V2G_Flow_Status(Other_Fault);
  8316. errn = -1;
  8317. sprintf((char*)buf_log_evcomm,
  8318. "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d (undefined)",
  8319. sys->IsolationStatus);
  8320. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8321. }
  8322. //Check for CSU command of "Stop by EVSE"
  8323. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8324. {
  8325. //Check for Alarm Code: CCS GFD trip (012235)
  8326. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8327. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8328. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8329. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8330. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8331. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8332. {
  8333. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  8334. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8335. }
  8336. else
  8337. {
  8338. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]EVSE_Shutdown");
  8339. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8340. }
  8341. pre->ResponseCode = FAILED_ISO15118_2014;
  8342. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8343. errn = -1;
  8344. }
  8345. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8346. {
  8347. //Check for Alarm Code: CCS GFD trip (012235)
  8348. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8349. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8350. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8351. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8352. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8353. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8354. {
  8355. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  8356. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8357. }
  8358. else
  8359. {
  8360. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]EVSE_EmergencyShutdown");
  8361. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8362. }
  8363. pre->ResponseCode = FAILED_ISO15118_2014;
  8364. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8365. errn = -1;
  8366. }
  8367. else if (ShmInternalComm->ChargingPermission == FALSE)
  8368. {
  8369. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]ChargingPermission = FALSE");
  8370. pre->ResponseCode = FAILED_ISO15118_2014;
  8371. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8372. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8373. errn = -1;
  8374. }
  8375. else
  8376. {
  8377. //null
  8378. }
  8379. //Response to CP Error
  8380. #if CP_PROTECTION_MECHANISM == ENABLE
  8381. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8382. {
  8383. pre->ResponseCode = FAILED_ISO15118_2014;
  8384. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8385. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8386. Update_V2G_Flow_Status(Other_Fault);
  8387. errn = -1;
  8388. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8389. //CCS_SECC_CP_State_Error (023889)
  8390. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8391. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8392. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8393. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8394. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8395. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8396. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8397. sprintf((char*)buf_log_evcomm,
  8398. "[Error][Proc_iso1_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8399. sys->CpState,
  8400. sys->CpVoltage
  8401. );
  8402. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8403. }
  8404. #endif
  8405. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8406. #if PARAMETER_NORMAL_MODE == ENABLE
  8407. SHM_Read_iso1_PreChargeRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8408. #else
  8409. Sudo_Parameter_iso1_PreChargeRes();
  8410. #endif
  8411. //STEP 4: ============ Encode and Send Response Message ===========
  8412. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8413. {
  8414. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][send_encoded_iso1_V2GTP_Stream]:Tx encoded msg error");
  8415. errn = -1;
  8416. }
  8417. //STEP 5: ============ Update Flags ===========
  8418. return errn;
  8419. }
  8420. /*===========================================================================
  8421. FUNCTION: Proc_din_PreChargeReq
  8422. DESCRIPTION:
  8423. PRE-CONDITION:
  8424. INPUT:
  8425. OUTPUT:
  8426. GLOBAL VARIABLES:
  8427. =============================================================================*/
  8428. int Proc_din_PreChargeReq(int AcceptFd)
  8429. {
  8430. int errn = 0;
  8431. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PreChargeReq] Got PreChargeReq");
  8432. //Print the decoded XML Document
  8433. PRINT_XML_DOC_DIN_PreChargeReq(&ccs_exi_doc_DIN);
  8434. //Save into Share Memory
  8435. SHM_Save_din_PreChargeReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8436. //Check for EV Error Code
  8437. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PreChargeRequest.DC_EVStatus.EVErrorCode);
  8438. errn = Proc_din_PreChargeRes(AcceptFd);
  8439. if (errn == 0)
  8440. {
  8441. //send response successfully.
  8442. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PreChargeRes");
  8443. }
  8444. else
  8445. {
  8446. sprintf((char*)buf_log_evcomm,
  8447. "[Error][SeccComm][Proc_din_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  8448. errn);
  8449. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8450. }
  8451. return errn;
  8452. }
  8453. /*===========================================================================
  8454. FUNCTION: Proc_iso1_PreChargeReq
  8455. DESCRIPTION:
  8456. PRE-CONDITION:
  8457. INPUT:
  8458. OUTPUT:
  8459. GLOBAL VARIABLES:
  8460. =============================================================================*/
  8461. int Proc_iso1_PreChargeReq(int AcceptFd)
  8462. {
  8463. int errn = 0;
  8464. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PreChargeReq] Got PreChargeReq");
  8465. //Print the decoded XML Document
  8466. PRINT_XML_DOC_ISO1_PreChargeReq(&ccs_exi_doc_ISO1);
  8467. //Save into Share Memory
  8468. SHM_Save_iso1_PreChargeReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8469. //Check for EV Error Code
  8470. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PreChargeRequest.DC_EVStatus.EVErrorCode);
  8471. errn = Proc_iso1_PreChargeRes(AcceptFd);
  8472. if (errn == 0)
  8473. {
  8474. //send response successfully.
  8475. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PreChargeRes");
  8476. }
  8477. else
  8478. {
  8479. sprintf((char*)buf_log_evcomm,
  8480. "[Error][SeccComm][Proc_iso1_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  8481. errn);
  8482. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8483. }
  8484. return errn;
  8485. }
  8486. /*===========================================================================
  8487. FUNCTION: SHM_Init_din_PowerDeliveryRes
  8488. DESCRIPTION:
  8489. PRE-CONDITION:
  8490. INPUT:
  8491. 1. shm_ccs
  8492. OUTPUT:
  8493. 1. shm_ccs
  8494. GLOBAL VARIABLES:
  8495. =============================================================================*/
  8496. void SHM_Init_din_PowerDeliveryRes(struct CcsData *shm_ccs)
  8497. {
  8498. struct PowerDeliveryResponse_DIN70121 *in;
  8499. in = &shm_ccs->V2GMessage_DIN70121.PowerDeliveryResponse;
  8500. //----- [BODY (1/3)] ResponseCode -----
  8501. in->ResponseCode = dinresponseCodeType_OK;
  8502. //----- [BODY (2/3)] AC_EVSEStatus -----
  8503. //ignore, since DIN 70121 doesn't support AC, yet.
  8504. //----- [BODY (2/3)] DC_EVSEStatus -----
  8505. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8506. }
  8507. /*===========================================================================
  8508. FUNCTION: Sudo_Parameter_din_PowerDeliveryRes
  8509. DESCRIPTION:
  8510. PRE-CONDITION:
  8511. INPUT:
  8512. OUTPUT:
  8513. GLOBAL VARIABLES:
  8514. =============================================================================*/
  8515. void Sudo_Parameter_din_PowerDeliveryRes()
  8516. {
  8517. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8518. init_dinPowerDeliveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes);
  8519. ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  8520. //----- [BODY (1/3)] ResponseCode -----
  8521. struct dinPowerDeliveryResType *res;
  8522. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  8523. res->ResponseCode = dinresponseCodeType_OK;
  8524. //----- [BODY (2/3)] AC_EVSEStatus -----
  8525. //ignore, since DIN 70121 doesn't support AC, yet.
  8526. //----- [BODY (2/3)] DC_EVSEStatus -----
  8527. res->DC_EVSEStatus_isUsed = 1u;
  8528. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8529. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8530. // dinisolationLevelType_Invalid = 0,
  8531. // dinisolationLevelType_Valid = 1,
  8532. // dinisolationLevelType_Warning = 2,
  8533. // dinisolationLevelType_Fault = 3
  8534. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8535. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8536. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8537. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8538. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8539. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8540. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8541. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8542. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8543. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8544. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8545. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8546. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8547. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8548. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8549. // dinEVSENotificationType_None = 0,
  8550. // dinEVSENotificationType_StopCharging = 1,
  8551. // dinEVSENotificationType_ReNegotiation = 2
  8552. }
  8553. /*===========================================================================
  8554. FUNCTION: Sudo_Parameter_iso1_PowerDeliveryRes
  8555. DESCRIPTION:
  8556. PRE-CONDITION:
  8557. INPUT:
  8558. OUTPUT:
  8559. GLOBAL VARIABLES:
  8560. =============================================================================*/
  8561. void Sudo_Parameter_iso1_PowerDeliveryRes()
  8562. {
  8563. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8564. init_iso1PowerDeliveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes);
  8565. ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  8566. //----- [BODY (1/3)] ResponseCode -----
  8567. struct iso1PowerDeliveryResType *res;
  8568. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  8569. res->ResponseCode = iso1responseCodeType_OK;
  8570. //----- [BODY (2/3)] AC_EVSEStatus -----
  8571. //ignore, since our ISO1 70121 doesn't support AC, yet.
  8572. //----- [BODY (2/3)] DC_EVSEStatus -----
  8573. res->DC_EVSEStatus_isUsed = 1u;
  8574. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8575. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8576. //iso1isolationLevelType_Invalid = 0,
  8577. //iso1isolationLevelType_Valid = 1,
  8578. //iso1isolationLevelType_Warning = 2,
  8579. //iso1isolationLevelType_Fault = 3,
  8580. //iso1isolationLevelType_No_IMD = 4
  8581. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8582. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8583. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8584. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8585. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8586. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8587. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8588. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8589. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8590. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8591. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8592. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8593. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8594. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8595. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8596. //iso1EVSENotificationType_None = 0,
  8597. //iso1EVSENotificationType_StopCharging = 1,
  8598. //iso1EVSENotificationType_ReNegotiation = 2
  8599. }
  8600. /*===========================================================================
  8601. FUNCTION: Proc_din_PowerDeliveryStartRes
  8602. DESCRIPTION:
  8603. PRE-CONDITION:
  8604. INPUT:
  8605. OUTPUT:
  8606. GLOBAL VARIABLES:
  8607. =============================================================================*/
  8608. int Proc_din_PowerDeliveryStartRes(int AcceptFd)
  8609. {
  8610. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8611. //if it is not the same, the packet should be ignored.
  8612. //STEP 1: ============ Initialize ============
  8613. //int i = 0;
  8614. int errn = 0;
  8615. bitstream_t v2g_tx_stream;
  8616. struct dinPowerDeliveryResType *res;
  8617. struct ChargingInfoData *sys;
  8618. size_t pos = 0;
  8619. v2g_tx_stream.pos = &pos;
  8620. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8621. v2g_tx_stream.data = V2GTP_Tx_buf;
  8622. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  8623. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8624. res->ResponseCode = OK_DIN70121;
  8625. //[HEADER] Check Req SessionID
  8626. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8627. {
  8628. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8629. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8630. errn = -1;
  8631. }
  8632. //Check for SequenceError
  8633. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8634. {
  8635. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8636. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8637. errn = -1;
  8638. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8639. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8640. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8641. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8642. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8643. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8644. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8645. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8646. }
  8647. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8648. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8649. #if PARAMETER_NORMAL_MODE == ENABLE
  8650. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  8651. #else
  8652. Sudo_Parameter_din_PowerDeliveryRes();
  8653. #endif
  8654. //EVSE Status Code
  8655. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8656. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8657. //Check for CSU command of "Stop by EVSE"
  8658. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8659. {
  8660. //res->ResponseCode = FAILED_DIN70121;
  8661. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8662. }
  8663. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8664. {
  8665. //res->ResponseCode = FAILED_DIN70121;
  8666. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8667. }
  8668. else if (ShmInternalComm->ChargingPermission == FALSE)
  8669. {
  8670. //res->ResponseCode = FAILED_DIN70121;
  8671. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8672. }
  8673. //STEP 4: ============ Encode and Send Response Message ===========
  8674. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8675. {
  8676. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PowerDeliveryStartRes][Error]Tx encoded msg error");
  8677. errn = -1;
  8678. }
  8679. //STEP 5: ============ Update Flags ===========
  8680. return errn;
  8681. }
  8682. /*===========================================================================
  8683. FUNCTION: Proc_iso1_PowerDeliveryStartRes
  8684. DESCRIPTION:
  8685. PRE-CONDITION:
  8686. INPUT:
  8687. OUTPUT:
  8688. GLOBAL VARIABLES:
  8689. =============================================================================*/
  8690. int Proc_iso1_PowerDeliveryStartRes(int AcceptFd)
  8691. {
  8692. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8693. //if it is not the same, the packet should be ignored.
  8694. //STEP 1: ============ Initialize ============
  8695. //int i = 0;
  8696. int errn = 0;
  8697. bitstream_t v2g_tx_stream;
  8698. struct iso1PowerDeliveryResType *res;
  8699. struct ChargingInfoData *sys;
  8700. size_t pos = 0;
  8701. v2g_tx_stream.pos = &pos;
  8702. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8703. v2g_tx_stream.data = V2GTP_Tx_buf;
  8704. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  8705. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8706. res->ResponseCode = OK_ISO15118_2014;
  8707. //[HEADER] Check Req SessionID
  8708. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8709. {
  8710. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8711. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8712. errn = -1;
  8713. }
  8714. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8715. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8716. #if PARAMETER_NORMAL_MODE == ENABLE
  8717. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8718. #else
  8719. Sudo_Parameter_iso1_PowerDeliveryRes();
  8720. #endif
  8721. //EVSE Status Code
  8722. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8723. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8724. //Check for CSU command of "Stop by EVSE"
  8725. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8726. {
  8727. //res->ResponseCode = FAILED_ISO15118_2014;
  8728. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8729. }
  8730. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8731. {
  8732. //res->ResponseCode = FAILED_ISO15118_2014;
  8733. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8734. }
  8735. else if (ShmInternalComm->ChargingPermission == FALSE)
  8736. {
  8737. //res->ResponseCode = FAILED_ISO15118_2014;
  8738. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8739. }
  8740. //STEP 4: ============ Encode and Send Response Message ===========
  8741. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8742. {
  8743. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PowerDeliveryStartRes][Error]Tx encoded msg error");
  8744. errn = -1;
  8745. }
  8746. //STEP 5: ============ Update Flags ===========
  8747. return errn;
  8748. }
  8749. /*===========================================================================
  8750. FUNCTION: Proc_din_PowerDeliveryStartReq
  8751. DESCRIPTION:
  8752. PRE-CONDITION:
  8753. INPUT:
  8754. OUTPUT:
  8755. GLOBAL VARIABLES:
  8756. =============================================================================*/
  8757. int Proc_din_PowerDeliveryStartReq(int AcceptFd)
  8758. {
  8759. int errn = 0;
  8760. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryStartReq");
  8761. //Print the decoded XML Document
  8762. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  8763. //Save into Share Memory
  8764. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8765. //Check for EV Error Code
  8766. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  8767. errn = Proc_din_PowerDeliveryStartRes(AcceptFd);
  8768. if (errn == 0)
  8769. {
  8770. //send response successfully.
  8771. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PowerDeliveryStartRes");
  8772. }
  8773. else
  8774. {
  8775. sprintf((char*)buf_log_evcomm,
  8776. "[Error][Proc_din_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  8777. errn);
  8778. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8779. }
  8780. return errn;
  8781. }
  8782. /*===========================================================================
  8783. FUNCTION: Proc_iso1_PowerDeliveryStartReq
  8784. DESCRIPTION:
  8785. PRE-CONDITION:
  8786. INPUT:
  8787. OUTPUT:
  8788. GLOBAL VARIABLES:
  8789. =============================================================================*/
  8790. int Proc_iso1_PowerDeliveryStartReq(int AcceptFd)
  8791. {
  8792. int errn = 0;
  8793. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryStartReq");
  8794. //Print the decoded XML Document
  8795. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  8796. //Save into Share Memory
  8797. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8798. //Check for EV Error Code
  8799. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  8800. errn = Proc_iso1_PowerDeliveryStartRes(AcceptFd);
  8801. if (errn == 0)
  8802. {
  8803. //send response successfully.
  8804. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PowerDeliveryStartRes");
  8805. }
  8806. else
  8807. {
  8808. sprintf((char*)buf_log_evcomm,
  8809. "[Error][Proc_iso1_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  8810. errn);
  8811. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8812. }
  8813. return errn;
  8814. }
  8815. /*===========================================================================
  8816. FUNCTION: SHM_Init_din_CurrentDemandRes
  8817. DESCRIPTION:
  8818. PRE-CONDITION:
  8819. INPUT:
  8820. 1. shm_ccs
  8821. OUTPUT:
  8822. 1. shm_ccs
  8823. GLOBAL VARIABLES:
  8824. =============================================================================*/
  8825. void SHM_Init_din_CurrentDemandRes(struct CcsData *shm_ccs)
  8826. {
  8827. struct CurrentDemandResponse_DIN70121 *in;
  8828. in = &shm_ccs->V2GMessage_DIN70121.CurrentDemandResponse;
  8829. //----- [BODY (1/10)] ResponseCode -----
  8830. in->ResponseCode = dinresponseCodeType_OK;
  8831. //----- [BODY (2/10)] DC_EVSEStatus -----
  8832. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8833. //----- [BODY (3/10)] EVSEPresentVoltage -----
  8834. short value = 0; int multiplier = 0; unsigned char unit = 0;
  8835. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  8836. value = 0; multiplier = 0; unit = V_DIN70121;
  8837. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  8838. //----- [BODY (4/10)] EVSEPresentCurrent -----
  8839. //value = 600; multiplier = -1; unit = A_DIN70121; //60A, for test only.
  8840. value = 0; multiplier = 0; unit = A_DIN70121;
  8841. SHM_Save_dinPhysicalValueType(&in->EVSEPresentCurrent, value, multiplier, unit);
  8842. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  8843. in->EVSECurrentLimitAchieved = FALSE;
  8844. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  8845. in->EVSEVoltageLimitAchieved = FALSE;
  8846. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  8847. in->EVSEPowerLimitAchieved = FALSE;
  8848. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  8849. //value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  8850. value = 5000; multiplier = -1; unit = V_DIN70121; //500V
  8851. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumVoltageLimit, value, multiplier, unit);
  8852. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  8853. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  8854. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumCurrentLimit, value, multiplier, unit);
  8855. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  8856. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  8857. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumPowerLimit, value, multiplier, unit);
  8858. }
  8859. /*===========================================================================
  8860. FUNCTION: Sudo_Parameter_din_CurrentDemandRes
  8861. DESCRIPTION:
  8862. PRE-CONDITION:
  8863. INPUT:
  8864. OUTPUT:
  8865. GLOBAL VARIABLES:
  8866. =============================================================================*/
  8867. void Sudo_Parameter_din_CurrentDemandRes()
  8868. {
  8869. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8870. init_dinCurrentDemandResType(&ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes);
  8871. ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  8872. //----- [BODY (1/10)] ResponseCode -----
  8873. struct dinCurrentDemandResType *res;
  8874. res = &ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes;
  8875. res->ResponseCode = dinresponseCodeType_OK;
  8876. //----- [BODY (2/10)] DC_EVSEStatus -----
  8877. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8878. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8879. // dinisolationLevelType_Invalid = 0,
  8880. // dinisolationLevelType_Valid = 1,
  8881. // dinisolationLevelType_Warning = 2,
  8882. // dinisolationLevelType_Fault = 3
  8883. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8884. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8885. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8886. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8887. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8888. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8889. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8890. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8891. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8892. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8893. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8894. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8895. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8896. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8897. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8898. // dinEVSENotificationType_None = 0,
  8899. // dinEVSENotificationType_StopCharging = 1,
  8900. // dinEVSENotificationType_ReNegotiation = 2
  8901. //----- [BODY (3/10)] EVSEPresentVoltage -----
  8902. res->EVSEPresentVoltage.Value = 3820;
  8903. res->EVSEPresentVoltage.Multiplier = -1;
  8904. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8905. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  8906. //----- [BODY (4/10)] EVSEPresentCurrent -----
  8907. res->EVSEPresentCurrent.Value = 1200;
  8908. res->EVSEPresentCurrent.Multiplier = -1;
  8909. res->EVSEPresentCurrent.Unit_isUsed = 1u;
  8910. res->EVSEPresentCurrent.Unit = dinunitSymbolType_A;
  8911. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  8912. res->EVSECurrentLimitAchieved = 0;
  8913. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  8914. res->EVSEVoltageLimitAchieved = 0;
  8915. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  8916. res->EVSEPowerLimitAchieved = 0;
  8917. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  8918. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  8919. res->EVSEMaximumVoltageLimit.Value = 7500;
  8920. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  8921. res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  8922. res->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  8923. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  8924. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  8925. res->EVSEMaximumCurrentLimit.Value = 1200;
  8926. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  8927. res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  8928. res->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  8929. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  8930. res->EVSEMaximumPowerLimit_isUsed = 1u;
  8931. res->EVSEMaximumPowerLimit.Value = 6000;
  8932. res->EVSEMaximumPowerLimit.Multiplier = 1;
  8933. res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  8934. res->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  8935. }
  8936. /*===========================================================================
  8937. FUNCTION: Sudo_Parameter_iso1_CurrentDemandRes
  8938. DESCRIPTION:
  8939. PRE-CONDITION:
  8940. INPUT:
  8941. OUTPUT:
  8942. GLOBAL VARIABLES:
  8943. =============================================================================*/
  8944. void Sudo_Parameter_iso1_CurrentDemandRes()
  8945. {
  8946. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8947. init_iso1CurrentDemandResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes);
  8948. ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  8949. //----- [BODY (1/10)] ResponseCode -----
  8950. struct iso1CurrentDemandResType *res;
  8951. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes;
  8952. res->ResponseCode = iso1responseCodeType_OK;
  8953. //----- [BODY (2/10)] DC_EVSEStatus -----
  8954. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8955. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8956. //iso1isolationLevelType_Invalid = 0,
  8957. //iso1isolationLevelType_Valid = 1,
  8958. //iso1isolationLevelType_Warning = 2,
  8959. //iso1isolationLevelType_Fault = 3,
  8960. //iso1isolationLevelType_No_IMD = 4
  8961. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8962. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8963. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8964. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8965. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8966. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8967. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8968. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8969. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8970. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8971. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8972. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8973. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8974. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8975. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8976. //iso1EVSENotificationType_None = 0,
  8977. //iso1EVSENotificationType_StopCharging = 1,
  8978. //iso1EVSENotificationType_ReNegotiation = 2
  8979. //----- [BODY (3/10)] EVSEPresentVoltage -----
  8980. res->EVSEPresentVoltage.Value = 3820;
  8981. res->EVSEPresentVoltage.Multiplier = -1;
  8982. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8983. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  8984. //----- [BODY (4/10)] EVSEPresentCurrent -----
  8985. res->EVSEPresentCurrent.Value = 1200;
  8986. res->EVSEPresentCurrent.Multiplier = -1;
  8987. //res->EVSEPresentCurrent.Unit_isUsed = 1u;
  8988. res->EVSEPresentCurrent.Unit = iso1unitSymbolType_A;
  8989. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  8990. res->EVSECurrentLimitAchieved = 0;
  8991. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  8992. res->EVSEVoltageLimitAchieved = 0;
  8993. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  8994. res->EVSEPowerLimitAchieved = 0;
  8995. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  8996. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  8997. res->EVSEMaximumVoltageLimit.Value = 7500;
  8998. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  8999. //res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  9000. res->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  9001. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9002. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  9003. res->EVSEMaximumCurrentLimit.Value = 1200;
  9004. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  9005. //res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  9006. res->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  9007. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9008. res->EVSEMaximumPowerLimit_isUsed = 1u;
  9009. res->EVSEMaximumPowerLimit.Value = 6000;
  9010. res->EVSEMaximumPowerLimit.Multiplier = 1;
  9011. //res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  9012. res->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  9013. }
  9014. /*===========================================================================
  9015. FUNCTION: Sudo_Parameter_iso1_ChargingStatusRes
  9016. DESCRIPTION:
  9017. PRE-CONDITION:
  9018. INPUT:
  9019. OUTPUT:
  9020. GLOBAL VARIABLES:
  9021. =============================================================================*/
  9022. void Sudo_Parameter_iso1_ChargingStatusRes()
  9023. {
  9024. //int i = 0;
  9025. struct iso1ChargingStatusResType *res;
  9026. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9027. init_iso1ChargingStatusResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes);
  9028. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes;
  9029. ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes_isUsed = 1u;
  9030. //----- [BODY (1/10)] ResponseCode -----
  9031. res->ResponseCode = OK_ISO15118_2014;
  9032. //----- [BODY (2/10)] AC_EVSEStatus -----
  9033. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9034. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  9035. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9036. // iso1EVSENotificationType_None = 0,
  9037. // iso1EVSENotificationType_StopCharging = 1,
  9038. // iso1EVSENotificationType_ReNegotiation = 2
  9039. //----- [BODY (3/10)] EVSEMaxCurrent -----
  9040. res->EVSEMaxCurrent_isUsed = 1u;
  9041. res->EVSEMaxCurrent.Value = 32;
  9042. res->EVSEMaxCurrent.Multiplier = 0;
  9043. res->EVSEMaxCurrent.Unit = iso1unitSymbolType_A;
  9044. //----- [BODY (4/10)] SAScheduleTupleID -----
  9045. res->SAScheduleTupleID = 0;
  9046. //----- [BODY (5/10)] EVSEID -----
  9047. res->EVSEID.charactersLen = 37;
  9048. memset(res->EVSEID.characters, 0, sizeof(res->EVSEID.characters));
  9049. //sprintf((char*)res->EVSEID.characters, CCS_AC_EVSEID);
  9050. //----- [BODY (6/10)] MeterInfo -----
  9051. res->MeterInfo_isUsed = 1u;
  9052. memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  9053. memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  9054. //[MeterInfo][1/5] MeterID
  9055. //sprintf((char*)res->MeterInfo.MeterID , CCS_AC_METER_ID);
  9056. //[MeterInfo][2/5] SigMeterReading (optional)
  9057. //sprintf((char*)res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  9058. //[MeterInfo][3/5] MeterStatus (optional)
  9059. res->MeterInfo.MeterStatus = 0;
  9060. //[MeterInfo][4/5] MeterReading (optional)
  9061. res->MeterInfo.MeterReading = 12345;
  9062. //[MeterInfo][5/5] TMeter (optional)
  9063. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  9064. //----- [BODY (7/10)] ReceiptRequired -----
  9065. res->ReceiptRequired_isUsed = 1u;
  9066. res->ReceiptRequired = FALSE; //optional
  9067. }
  9068. /*===========================================================================
  9069. FUNCTION: Check_EVErrorCode
  9070. DESCRIPTION:
  9071. PRE-CONDITION:
  9072. INPUT:
  9073. OUTPUT:
  9074. GLOBAL VARIABLES:
  9075. =============================================================================*/
  9076. void Check_EVErrorCode(int code)
  9077. {
  9078. if (code != NO_ERROR) //NO_ERROR = 0
  9079. {
  9080. //Asking CSU to Stop
  9081. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9082. //Update_V2G_Flow_Status(Other_Fault);
  9083. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  9084. sprintf((char*)buf_log_evcomm,
  9085. "Stop by EV (EVErrorCode = %d (DEC))",
  9086. code);
  9087. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9088. }
  9089. }
  9090. /*===========================================================================
  9091. FUNCTION: Proc_din_CurrentDemandRes
  9092. DESCRIPTION:
  9093. PRE-CONDITION:
  9094. INPUT:
  9095. OUTPUT:
  9096. GLOBAL VARIABLES:
  9097. =============================================================================*/
  9098. int Proc_din_CurrentDemandRes(int AcceptFd)
  9099. {
  9100. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9101. //if it is not the same, the packet should be ignored.
  9102. //STEP 1: ============ Initialize ============
  9103. int errn = 0;
  9104. bitstream_t v2g_tx_stream;
  9105. static struct CurrentDemandResponse_DIN70121 *cur;
  9106. static struct ChargingInfoData *sys;
  9107. // int i = 0;
  9108. // static int EVSE_max_current;
  9109. // int tmp = 0;
  9110. size_t pos = 0;
  9111. v2g_tx_stream.pos = &pos;
  9112. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9113. v2g_tx_stream.data = V2GTP_Tx_buf;
  9114. cur = &ShmCcsData->V2GMessage_DIN70121.CurrentDemandResponse;
  9115. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9116. cur->ResponseCode = OK_DIN70121;
  9117. //EVSE Status Code
  9118. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9119. //[HEADER] Check Req SessionID
  9120. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9121. {
  9122. cur->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  9123. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9124. errn = -1;
  9125. }
  9126. //Check for SequenceError
  9127. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9128. {
  9129. cur->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  9130. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9131. errn = -1;
  9132. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9133. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9134. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9135. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9136. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9137. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9138. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9139. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9140. }
  9141. //Check for negative EvBatteryMaxCurrent
  9142. if (sys->EvBatteryMaxCurrent < 0)
  9143. {
  9144. sprintf((char*)buf_log_evcomm,
  9145. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  9146. sys->EvBatteryMaxCurrent);
  9147. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9148. cur->DC_EVSEStatus.EVSEStatusCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  9149. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9150. errn = -1;
  9151. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9152. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  9153. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9154. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9155. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9156. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9157. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9158. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  9159. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9160. }
  9161. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9162. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_DIN70121);
  9163. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  9164. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  9165. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  9166. #endif
  9167. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  9168. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  9169. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  9170. if (sys->EvBatteryMaxVoltage <= 500)
  9171. {
  9172. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  9173. }
  9174. #endif
  9175. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  9176. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  9177. {
  9178. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  9179. //[To-Do] Limit is achieved flag
  9180. }
  9181. //Isolation Status
  9182. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  9183. {
  9184. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  9185. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9186. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9187. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  9188. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9189. Update_V2G_Flow_Status(Other_Fault);
  9190. errn = -1;
  9191. }
  9192. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  9193. {
  9194. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  9195. }
  9196. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  9197. {
  9198. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  9199. }
  9200. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  9201. {
  9202. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  9203. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9204. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9205. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_CurrentDemandRes]GFD_Fault => Emergency Shutdown");
  9206. Update_V2G_Flow_Status(Other_Fault);
  9207. errn = -1;
  9208. }
  9209. else //GFD_No_IMD or other unexpected status
  9210. {
  9211. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  9212. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9213. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9214. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9215. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9216. Update_V2G_Flow_Status(Other_Fault);
  9217. errn = -1;
  9218. }
  9219. //For testing with Tesla Model 3
  9220. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  9221. //[CAUTION][To-Do] Decresement of Current is not implemented.
  9222. //SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, 10, A_DIN70121);
  9223. if (sys->EvBatterytargetCurrent <= 0)
  9224. {
  9225. EVSE_max_current = 50; //10A
  9226. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  9227. /*
  9228. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9229. sys->PresentChargingCurrent,
  9230. sys->EvBatterytargetCurrent,
  9231. EVSE_max_current,
  9232. cur->EVSEMaximumCurrentLimit.Value
  9233. );
  9234. */
  9235. }
  9236. else //1A
  9237. {
  9238. /*
  9239. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9240. sys->PresentChargingCurrent,
  9241. sys->EvBatterytargetCurrent,
  9242. EVSE_max_current,
  9243. cur->EVSEMaximumCurrentLimit.Value
  9244. );
  9245. */
  9246. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  9247. {
  9248. tmp = EVSE_max_current + 50; //10A
  9249. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  9250. {
  9251. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  9252. EVSE_max_current = tmp;
  9253. }
  9254. else
  9255. {
  9256. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  9257. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  9258. }
  9259. }
  9260. }
  9261. #endif
  9262. //Check for CSU command of "Stop by EVSE"
  9263. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9264. {
  9265. //Check for Alarm Code: CCS GFD trip (012235)
  9266. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9267. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9268. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9269. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9270. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9271. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9272. {
  9273. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  9274. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  9275. }
  9276. else
  9277. {
  9278. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]EVSE_Shutdown");
  9279. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9280. }
  9281. //cur->ResponseCode = FAILED_DIN70121;
  9282. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9283. //errn = -1;
  9284. }
  9285. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9286. {
  9287. //Check for Alarm Code: CCS GFD trip (012235)
  9288. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9289. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9290. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9291. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9292. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9293. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9294. {
  9295. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9296. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  9297. }
  9298. else
  9299. {
  9300. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  9301. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9302. }
  9303. //cur->ResponseCode = FAILED_DIN70121;
  9304. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9305. //errn = -1;
  9306. }
  9307. else if (ShmInternalComm->ChargingPermission == FALSE)
  9308. {
  9309. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]Permission OFF");
  9310. //cur->ResponseCode = FAILED_DIN70121;
  9311. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9312. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9313. //errn = -1;
  9314. }
  9315. else
  9316. {
  9317. //null
  9318. }
  9319. //Response to CP Error
  9320. #if CP_PROTECTION_MECHANISM == ENABLE
  9321. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9322. {
  9323. cur->ResponseCode = FAILED_DIN70121;
  9324. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9325. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9326. Update_V2G_Flow_Status(Other_Fault);
  9327. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9328. //CCS_SECC_CP_State_Error (023889)
  9329. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9330. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9331. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9332. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9333. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9334. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9335. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9336. sprintf((char*)buf_log_evcomm,
  9337. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  9338. sys->CpState,
  9339. sys->CpVoltage);
  9340. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9341. }
  9342. #endif
  9343. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9344. #if PARAMETER_NORMAL_MODE == ENABLE
  9345. SHM_Read_din_CurrentDemandRes(&ccs_exi_doc_DIN, ShmCcsData);
  9346. #else
  9347. Sudo_Parameter_din_CurrentDemandRes();
  9348. #endif
  9349. //STEP 4: ============ Encode and Send Response Message ===========
  9350. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9351. {
  9352. errn = -1;
  9353. }
  9354. //STEP 5: ============ Update Flags ===========
  9355. return errn;
  9356. }
  9357. /*===========================================================================
  9358. FUNCTION: Proc_iso1_CurrentDemandRes
  9359. DESCRIPTION:
  9360. PRE-CONDITION:
  9361. INPUT:
  9362. OUTPUT:
  9363. GLOBAL VARIABLES:
  9364. =============================================================================*/
  9365. int Proc_iso1_CurrentDemandRes(int AcceptFd)
  9366. {
  9367. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9368. //if it is not the same, the packet should be ignored.
  9369. //STEP 1: ============ Initialize ============
  9370. int errn = 0;
  9371. bitstream_t v2g_tx_stream;
  9372. static struct CurrentDemandResponse_ISO15118_2014 *cur;
  9373. static struct ChargingInfoData *sys;
  9374. // int i = 0;
  9375. // static int EVSE_max_current;
  9376. // int tmp = 0;
  9377. size_t pos = 0;
  9378. v2g_tx_stream.pos = &pos;
  9379. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9380. v2g_tx_stream.data = V2GTP_Tx_buf;
  9381. cur = &ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandResponse;
  9382. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9383. cur->ResponseCode = OK_ISO15118_2014;
  9384. //EVSE Status Code
  9385. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9386. //[HEADER] Check Req SessionID
  9387. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9388. {
  9389. cur->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9390. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9391. errn = -1;
  9392. }
  9393. //Check for SequenceError
  9394. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9395. {
  9396. cur->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  9397. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9398. errn = -1;
  9399. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9400. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9401. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9402. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9403. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9404. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9405. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9406. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9407. }
  9408. //Check for negative EvBatteryMaxCurrent
  9409. if (sys->EvBatteryMaxCurrent < 0)
  9410. {
  9411. sprintf((char*)buf_log_evcomm,
  9412. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  9413. sys->EvBatteryMaxCurrent);
  9414. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9415. cur->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  9416. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9417. errn = -1;
  9418. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9419. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  9420. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9421. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9422. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9423. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9424. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9425. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  9426. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9427. }
  9428. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9429. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_ISO15118_2014);
  9430. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  9431. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  9432. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  9433. #endif
  9434. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  9435. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  9436. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  9437. if (sys->EvBatteryMaxVoltage <= 500)
  9438. {
  9439. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  9440. }
  9441. #endif
  9442. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  9443. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  9444. {
  9445. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  9446. //[To-Do] Limit is achieved flag
  9447. }
  9448. //Isolation Status
  9449. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  9450. {
  9451. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  9452. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9453. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9454. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  9455. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9456. Update_V2G_Flow_Status(Other_Fault);
  9457. errn = -1;
  9458. }
  9459. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  9460. {
  9461. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  9462. }
  9463. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  9464. {
  9465. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  9466. }
  9467. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  9468. {
  9469. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  9470. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9471. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9472. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_CurrentDemandRes]GFD_Fault => EmergencyShutdown");
  9473. Update_V2G_Flow_Status(Other_Fault);
  9474. errn = -1;
  9475. }
  9476. else
  9477. {
  9478. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  9479. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9480. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9481. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9482. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9483. Update_V2G_Flow_Status(Other_Fault);
  9484. errn = -1;
  9485. }
  9486. //For testing with Tesla Model 3
  9487. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  9488. //[CAUTION][To-Do] Decresement of Current is not implemented.
  9489. //SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, 10, A_ISO15118_2014);
  9490. if (sys->EvBatterytargetCurrent <= 0)
  9491. {
  9492. EVSE_max_current = 50; //10A
  9493. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  9494. /*
  9495. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9496. sys->PresentChargingCurrent,
  9497. sys->EvBatterytargetCurrent,
  9498. EVSE_max_current,
  9499. cur->EVSEMaximumCurrentLimit.Value
  9500. );
  9501. */
  9502. }
  9503. else //1A
  9504. {
  9505. /*
  9506. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9507. sys->PresentChargingCurrent,
  9508. sys->EvBatterytargetCurrent,
  9509. EVSE_max_current,
  9510. cur->EVSEMaximumCurrentLimit.Value
  9511. );
  9512. */
  9513. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  9514. {
  9515. tmp = EVSE_max_current + 50; //10A
  9516. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  9517. {
  9518. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  9519. EVSE_max_current = tmp;
  9520. }
  9521. else
  9522. {
  9523. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  9524. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  9525. }
  9526. }
  9527. }
  9528. #endif
  9529. //Check for CSU command of "Stop by EVSE"
  9530. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9531. {
  9532. //Check for Alarm Code: CCS GFD trip (012235)
  9533. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9534. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9535. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9536. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9537. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9538. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9539. {
  9540. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  9541. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9542. }
  9543. else
  9544. {
  9545. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]EVSE_Shutdown");
  9546. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9547. }
  9548. //cur->ResponseCode = FAILED_ISO15118_2014;
  9549. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9550. //errn = -1;
  9551. }
  9552. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9553. {
  9554. //Check for Alarm Code: CCS GFD trip (012235)
  9555. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9556. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9557. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9558. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9559. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9560. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9561. {
  9562. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9563. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9564. }
  9565. else
  9566. {
  9567. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  9568. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9569. }
  9570. //cur->ResponseCode = FAILED_ISO15118_2014;
  9571. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9572. //errn = -1;
  9573. }
  9574. else if (ShmInternalComm->ChargingPermission == FALSE)
  9575. {
  9576. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]Permission OFF");
  9577. //cur->ResponseCode = FAILED_ISO15118_2014;
  9578. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9579. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9580. //errn = -1;
  9581. }
  9582. else
  9583. {
  9584. //null
  9585. }
  9586. //Response to CP Error
  9587. #if CP_PROTECTION_MECHANISM == ENABLE
  9588. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9589. {
  9590. cur->ResponseCode = FAILED_ISO15118_2014;
  9591. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9592. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9593. Update_V2G_Flow_Status(Other_Fault);
  9594. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9595. //CCS_SECC_CP_State_Error (023889)
  9596. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9597. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9598. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9599. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9600. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9601. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9602. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9603. sprintf((char*)buf_log_evcomm,
  9604. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  9605. sys->CpState,
  9606. sys->CpVoltage);
  9607. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9608. }
  9609. #endif
  9610. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9611. #if PARAMETER_NORMAL_MODE == ENABLE
  9612. SHM_Read_iso1_CurrentDemandRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9613. #else
  9614. Sudo_Parameter_iso1_CurrentDemandRes();
  9615. #endif
  9616. //STEP 4: ============ Encode and Send Response Message ===========
  9617. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9618. {
  9619. errn = -1;
  9620. }
  9621. //STEP 5: ============ Update Flags ===========
  9622. return errn;
  9623. }
  9624. /*===========================================================================
  9625. FUNCTION: Proc_iso1_ChargingStatusRes
  9626. DESCRIPTION:
  9627. PRE-CONDITION:
  9628. INPUT:
  9629. OUTPUT:
  9630. GLOBAL VARIABLES:
  9631. =============================================================================*/
  9632. int Proc_iso1_ChargingStatusRes(int AcceptFd)
  9633. {
  9634. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9635. //if it is not the same, the packet should be ignored.
  9636. //STEP 1: ============ Initialize ============
  9637. //int i = 0;
  9638. int errn = 0;
  9639. bitstream_t v2g_tx_stream;
  9640. static struct ChargingStatusResponse_ISO15118_2014 *res;
  9641. static struct ChargingInfoData *sys;
  9642. size_t pos = 0;
  9643. v2g_tx_stream.pos = &pos;
  9644. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9645. v2g_tx_stream.data = V2GTP_Tx_buf;
  9646. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargingStatusResponse;
  9647. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9648. //Init
  9649. res->ResponseCode = OK_ISO15118_2014;
  9650. res->ReceiptRequired = FALSE; //optional
  9651. res->SAScheduleTupleID = 0;
  9652. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9653. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  9654. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9655. // iso1EVSENotificationType_None = 0,
  9656. // iso1EVSENotificationType_StopCharging = 1,
  9657. // iso1EVSENotificationType_ReNegotiation = 2
  9658. //[HEADER] Check Req SessionID
  9659. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9660. {
  9661. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9662. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9663. errn = -1;
  9664. }
  9665. //Check for SequenceError
  9666. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9667. {
  9668. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  9669. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9670. errn = -1;
  9671. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9672. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9673. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9674. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9675. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9676. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9677. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9678. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9679. }
  9680. //EVSE ID
  9681. memset(res->EVSEID, 0, sizeof(res->EVSEID));
  9682. //sprintf((char*)res->EVSEID, CCS_AC_EVSEID);
  9683. //[MeterInfo][0/5] init
  9684. //memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  9685. //memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  9686. //[MeterInfo][1/5] MeterID
  9687. //sprintf((char*)res->MeterInfo.MeterID , CCS_AC_METER_ID);
  9688. //[MeterInfo][2/5] SigMeterReading (optional)
  9689. //sprintf((char*)res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  9690. //[MeterInfo][3/5] MeterStatus (optional)
  9691. res->MeterInfo.MeterStatus = 0;
  9692. //[MeterInfo][4/5] MeterReading (optional)
  9693. res->MeterInfo.MeterReading = 12345;
  9694. //[MeterInfo][5/5] TMeter (optional)
  9695. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  9696. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9697. SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  9698. //Isolation Status (RCD)
  9699. if (sys->IsolationStatus == 0) //Isolation is invalid
  9700. {
  9701. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  9702. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9703. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9704. sprintf((char*)buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d", sys->IsolationStatus);
  9705. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9706. Update_V2G_Flow_Status(Other_Fault);
  9707. errn = -1;
  9708. }
  9709. else if (sys->IsolationStatus == 1) //Isolation is valid
  9710. {
  9711. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9712. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9713. }
  9714. else
  9715. {
  9716. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  9717. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9718. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9719. sprintf((char*)buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9720. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9721. Update_V2G_Flow_Status(Other_Fault);
  9722. errn = -1;
  9723. }
  9724. //Check for CSU command of "Stop by EVSE"
  9725. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9726. {
  9727. //res->ResponseCode = FAILED_ISO15118_2014;
  9728. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9729. //errn = -1;
  9730. }
  9731. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9732. {
  9733. //res->ResponseCode = FAILED_ISO15118_2014;
  9734. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9735. //errn = -1;
  9736. }
  9737. else if (ShmInternalComm->ChargingPermission == FALSE)
  9738. {
  9739. //res->ResponseCode = FAILED_ISO15118_2014;
  9740. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9741. //errn = -1;
  9742. }
  9743. //Response to CP Error
  9744. #if CP_PROTECTION_MECHANISM == ENABLE
  9745. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9746. {
  9747. res->ResponseCode = FAILED_ISO15118_2014;
  9748. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9749. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9750. Update_V2G_Flow_Status(Other_Fault);
  9751. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9752. //CCS_SECC_CP_State_Error (023889)
  9753. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9754. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9755. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9756. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9757. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9758. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9759. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9760. sprintf((char*)buf_log_evcomm,
  9761. "[ChargingStatus]Emergency Stop by CP Error (%d, %.02f V)",
  9762. sys->CpState,
  9763. sys->CpVoltage);
  9764. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9765. }
  9766. #endif
  9767. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9768. #if PARAMETER_NORMAL_MODE == ENABLE
  9769. SHM_Read_iso1_ChargingStatusRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9770. #else
  9771. Sudo_Parameter_iso1_ChargingStatusRes();
  9772. #endif
  9773. //STEP 4: ============ Encode and Send Response Message ===========
  9774. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9775. {
  9776. errn = -1;
  9777. }
  9778. //STEP 5: ============ Update Flags ===========
  9779. return errn;
  9780. }
  9781. /*===========================================================================
  9782. FUNCTION: Proc_din_CurrentDemandReq
  9783. DESCRIPTION:
  9784. PRE-CONDITION:
  9785. INPUT:
  9786. OUTPUT:
  9787. GLOBAL VARIABLES:
  9788. =============================================================================*/
  9789. int Proc_din_CurrentDemandReq(int AcceptFd)
  9790. {
  9791. int errn = 0;
  9792. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CurrentDemandReq] Got CurrentDemandReq\n");
  9793. //Print the decoded XML Document
  9794. PRINT_XML_DOC_DIN_CurrentDemandReq(&ccs_exi_doc_DIN);
  9795. //Save into Share Memory
  9796. SHM_Save_din_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9797. //Check for EV Error Code
  9798. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  9799. errn = Proc_din_CurrentDemandRes(AcceptFd);
  9800. if (errn == 0)
  9801. {
  9802. //Response is sent successfully.
  9803. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]CurrentDemandRes");
  9804. }
  9805. else
  9806. {
  9807. sprintf((char*)buf_log_evcomm,
  9808. "[DIN][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  9809. errn);
  9810. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9811. }
  9812. return errn;
  9813. }
  9814. /*===========================================================================
  9815. FUNCTION: Proc_iso1_CurrentDemandReq
  9816. DESCRIPTION:
  9817. PRE-CONDITION:
  9818. INPUT:
  9819. OUTPUT:
  9820. GLOBAL VARIABLES:
  9821. =============================================================================*/
  9822. int Proc_iso1_CurrentDemandReq(int AcceptFd)
  9823. {
  9824. int errn = 0;
  9825. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CurrentDemandReq] Got CurrentDemandReq\n");
  9826. //Print the decoded XML Document
  9827. PRINT_XML_DOC_ISO1_CurrentDemandReq(&ccs_exi_doc_ISO1);
  9828. //Save into Share Memory
  9829. SHM_Save_iso1_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9830. //Check for EV Error Code
  9831. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  9832. errn = Proc_iso1_CurrentDemandRes(AcceptFd);
  9833. if (errn == 0)
  9834. {
  9835. //Response is sent successfully.
  9836. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]CurrentDemandRes");
  9837. }
  9838. else
  9839. {
  9840. sprintf((char*)buf_log_evcomm,
  9841. "[ISO1][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  9842. errn);
  9843. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9844. }
  9845. return errn;
  9846. }
  9847. /*===========================================================================
  9848. FUNCTION: Proc_iso1_ChargingStatusReq
  9849. DESCRIPTION:
  9850. PRE-CONDITION:
  9851. INPUT:
  9852. OUTPUT:
  9853. GLOBAL VARIABLES:
  9854. =============================================================================*/
  9855. int Proc_iso1_ChargingStatusReq(int AcceptFd)
  9856. {
  9857. int errn = 0;
  9858. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargingStatusReq] Got ChargingStatusReq\n");
  9859. //Print the decoded XML Document
  9860. PRINT_XML_DOC_ISO1_ChargingStatusReq(&ccs_exi_doc_ISO1);
  9861. //Save into Share Memory
  9862. SHM_Save_iso1_ChargingStatusReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9863. //Check for EV Error Code
  9864. //no content in ISO1
  9865. errn = Proc_iso1_ChargingStatusRes(AcceptFd);
  9866. if (errn == 0)
  9867. {
  9868. //Response is sent successfully.
  9869. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ChargingStatusRes");
  9870. }
  9871. else
  9872. {
  9873. sprintf((char*)buf_log_evcomm,
  9874. "[ISO1][Error][ChargingStatusReq]ChargingStatusRes: fail(%d,DEC)",
  9875. errn);
  9876. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9877. }
  9878. return errn;
  9879. }
  9880. /*===========================================================================
  9881. FUNCTION: Proc_din_PowerDeliveryStopRes
  9882. DESCRIPTION:
  9883. PRE-CONDITION:
  9884. INPUT:
  9885. OUTPUT:
  9886. GLOBAL VARIABLES:
  9887. =============================================================================*/
  9888. int Proc_din_PowerDeliveryStopRes(int AcceptFd)
  9889. {
  9890. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9891. //if it is not the same, the packet should be ignored.
  9892. //STEP 1: ============ Initialize ============
  9893. //int i = 0;
  9894. int errn = 0;
  9895. bitstream_t v2g_tx_stream;
  9896. struct dinPowerDeliveryResType *res;
  9897. struct ChargingInfoData *sys;
  9898. size_t pos = 0;
  9899. v2g_tx_stream.pos = &pos;
  9900. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9901. v2g_tx_stream.data = V2GTP_Tx_buf;
  9902. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9903. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9904. res->ResponseCode = OK_DIN70121;
  9905. //[HEADER] Check Req SessionID
  9906. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9907. {
  9908. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  9909. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9910. errn = -1;
  9911. }
  9912. //Check for SequenceError
  9913. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9914. {
  9915. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  9916. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9917. errn = -1;
  9918. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9919. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9920. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9921. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9922. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9923. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9924. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9925. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9926. }
  9927. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9928. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9929. #if PARAMETER_NORMAL_MODE == ENABLE
  9930. ShmCcsData->V2GMessage_DIN70121.PowerDeliveryResponse.DC_EVSEStatus.EVSEStatusCode = EVSE_NotReady;
  9931. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  9932. #else
  9933. Sudo_Parameter_din_PreChargeRes();
  9934. #endif
  9935. //EVSE Status Code
  9936. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9937. //Check for CSU command of "Stop by EVSE"
  9938. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9939. {
  9940. //res->ResponseCode = FAILED_DIN70121;
  9941. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9942. }
  9943. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9944. {
  9945. //res->ResponseCode = FAILED_DIN70121;
  9946. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9947. }
  9948. else if (ShmInternalComm->ChargingPermission == FALSE)
  9949. {
  9950. //res->ResponseCode = FAILED_DIN70121;
  9951. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9952. }
  9953. //STEP 4: ============ Encode and Send Response Message ===========
  9954. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9955. {
  9956. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PowerDeliveryStopRes][Error]Tx encoded msg error");
  9957. errn = -1;
  9958. }
  9959. //STEP 5: ============ Update Flags ===========
  9960. return errn;
  9961. }
  9962. /*===========================================================================
  9963. FUNCTION: Proc_iso1_PowerDeliveryStopRes
  9964. DESCRIPTION:
  9965. PRE-CONDITION:
  9966. INPUT:
  9967. OUTPUT:
  9968. GLOBAL VARIABLES:
  9969. =============================================================================*/
  9970. int Proc_iso1_PowerDeliveryStopRes(int AcceptFd)
  9971. {
  9972. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9973. //if it is not the same, the packet should be ignored.
  9974. //STEP 1: ============ Initialize ============
  9975. //int i = 0;
  9976. int errn = 0;
  9977. bitstream_t v2g_tx_stream;
  9978. struct iso1PowerDeliveryResType *res;
  9979. struct ChargingInfoData *sys;
  9980. size_t pos = 0;
  9981. v2g_tx_stream.pos = &pos;
  9982. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9983. v2g_tx_stream.data = V2GTP_Tx_buf;
  9984. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  9985. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9986. res->ResponseCode = OK_ISO15118_2014;
  9987. //[HEADER] Check Req SessionID
  9988. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9989. {
  9990. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9991. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9992. errn = -1;
  9993. }
  9994. //Check for SequenceError
  9995. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9996. {
  9997. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  9998. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9999. errn = -1;
  10000. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10001. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10002. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10003. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10004. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10005. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10006. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10007. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10008. }
  10009. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10010. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10011. #if PARAMETER_NORMAL_MODE == ENABLE
  10012. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryResponse.DC_EVSEStatus.DC_EVSEStatusCode = EVSE_NotReady;
  10013. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10014. #else
  10015. Sudo_Parameter_iso1_PreChargeRes();
  10016. #endif
  10017. //EVSE Status Code
  10018. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10019. //Check for CSU command of "Stop by EVSE"
  10020. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10021. {
  10022. //res->ResponseCode = FAILED_ISO15118_2014;
  10023. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10024. }
  10025. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10026. {
  10027. //res->ResponseCode = FAILED_ISO15118_2014;
  10028. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10029. }
  10030. else if (ShmInternalComm->ChargingPermission == FALSE)
  10031. {
  10032. //res->ResponseCode = FAILED_ISO15118_2014;
  10033. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10034. }
  10035. //STEP 4: ============ Encode and Send Response Message ===========
  10036. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10037. {
  10038. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PowerDeliveryStopRes][Error]Tx encoded msg error");
  10039. errn = -1;
  10040. }
  10041. //STEP 5: ============ Update Flags ===========
  10042. return errn;
  10043. }
  10044. /*===========================================================================
  10045. FUNCTION: Proc_din_PowerDeliveryStopReq
  10046. DESCRIPTION:
  10047. PRE-CONDITION:
  10048. INPUT:
  10049. OUTPUT:
  10050. GLOBAL VARIABLES:
  10051. =============================================================================*/
  10052. int Proc_din_PowerDeliveryStopReq(int AcceptFd)
  10053. {
  10054. int errn = 0;
  10055. //Request CSU to STOP
  10056. //This should be reponsed as soon as possible once this message is received.
  10057. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10058. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  10059. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  10060. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryReq (2nd)\n");
  10061. //Print the decoded XML Document
  10062. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  10063. //Save into Share Memory
  10064. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10065. //Check for EV Error Code
  10066. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  10067. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  10068. usleep(1500000); //1.5 seconds
  10069. //sleep(1); //1 second
  10070. errn = Proc_din_PowerDeliveryStopRes(AcceptFd);
  10071. if (errn == 0)
  10072. {
  10073. //send response successfully.
  10074. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PowerDeliveryRes (2nd)\n");
  10075. }
  10076. else
  10077. {
  10078. sprintf((char*)buf_log_evcomm,
  10079. "[Error][SeccComm][Proc_din_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  10080. errn);
  10081. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10082. }
  10083. return errn;
  10084. }
  10085. /*===========================================================================
  10086. FUNCTION: Proc_iso1_PowerDeliveryStopReq
  10087. DESCRIPTION:
  10088. PRE-CONDITION:
  10089. INPUT:
  10090. OUTPUT:
  10091. GLOBAL VARIABLES:
  10092. =============================================================================*/
  10093. int Proc_iso1_PowerDeliveryStopReq(int AcceptFd)
  10094. {
  10095. int errn = 0;
  10096. //Request CSU to STOP
  10097. //This should be reponsed as soon as possible once this message is received.
  10098. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10099. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  10100. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  10101. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryReq (2nd)\n");
  10102. //Print the decoded XML Document
  10103. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  10104. //Save into Share Memory
  10105. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10106. //Check for EV Error Code
  10107. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  10108. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  10109. usleep(1500000); //1.5 seconds
  10110. //sleep(1); //1 second
  10111. errn = Proc_iso1_PowerDeliveryStopRes(AcceptFd);
  10112. if (errn == 0)
  10113. {
  10114. //send response successfully.
  10115. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PowerDeliveryRes (2nd)");
  10116. }
  10117. else
  10118. {
  10119. sprintf((char*)buf_log_evcomm,
  10120. "[Error][SeccComm][Proc_iso1_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  10121. errn);
  10122. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10123. }
  10124. return errn;
  10125. }
  10126. /*===========================================================================
  10127. FUNCTION: SHM_Init_din_WeldingDetectionRes
  10128. DESCRIPTION:
  10129. PRE-CONDITION:
  10130. INPUT:
  10131. 1. shm_ccs
  10132. OUTPUT:
  10133. 1. shm_ccs
  10134. GLOBAL VARIABLES:
  10135. =============================================================================*/
  10136. void SHM_Init_din_WeldingDetectionRes(struct CcsData *shm_ccs)
  10137. {
  10138. struct WeldingDetectionResponse_DIN70121 *in;
  10139. in = &shm_ccs->V2GMessage_DIN70121.WeldingDetectionResponse;
  10140. //----- [BODY (1/3)] ResponseCode -----
  10141. in->ResponseCode = dinresponseCodeType_OK;
  10142. //----- [BODY (2/3)] EVSEPresentVoltage -----
  10143. short value = 0; int multiplier = 0; unsigned char unit = 0;
  10144. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  10145. value = 0; multiplier = 0; unit = V_DIN70121;
  10146. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  10147. //----- [BODY (3/3)] DC_EVSEStatus -----
  10148. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  10149. }
  10150. /*===========================================================================
  10151. FUNCTION: Sudo_Parameter_din_WeldingDetectionRes
  10152. DESCRIPTION:
  10153. PRE-CONDITION:
  10154. INPUT:
  10155. OUTPUT:
  10156. GLOBAL VARIABLES:
  10157. =============================================================================*/
  10158. void Sudo_Parameter_din_WeldingDetectionRes()
  10159. {
  10160. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  10161. init_dinWeldingDetectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes);
  10162. ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  10163. //----- [BODY (1/3)] ResponseCode -----
  10164. struct dinWeldingDetectionResType *res;
  10165. res = &ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes;
  10166. res->ResponseCode = dinresponseCodeType_OK;
  10167. //----- [BODY (2/3)] EVSEPresentVoltage -----
  10168. res->EVSEPresentVoltage.Value = 3820;
  10169. res->EVSEPresentVoltage.Multiplier = -1;
  10170. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  10171. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  10172. // dinunitSymbolType_h = 0,
  10173. // dinunitSymbolType_m = 1,
  10174. // dinunitSymbolType_s = 2,
  10175. // dinunitSymbolType_A = 3,
  10176. // dinunitSymbolType_Ah = 4,
  10177. // dinunitSymbolType_V = 5,
  10178. // dinunitSymbolType_VA = 6,
  10179. // dinunitSymbolType_W = 7,
  10180. // dinunitSymbolType_W_s = 8,
  10181. // dinunitSymbolType_Wh = 9
  10182. //----- [BODY (3/3)] DC_EVSEStatus -----
  10183. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  10184. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  10185. // dinisolationLevelType_Invalid = 0,
  10186. // dinisolationLevelType_Valid = 1,
  10187. // dinisolationLevelType_Warning = 2,
  10188. // dinisolationLevelType_Fault = 3
  10189. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10190. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  10191. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  10192. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  10193. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  10194. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  10195. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  10196. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  10197. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  10198. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  10199. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  10200. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  10201. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  10202. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  10203. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  10204. // dinEVSENotificationType_None = 0,
  10205. // dinEVSENotificationType_StopCharging = 1,
  10206. // dinEVSENotificationType_ReNegotiation = 2
  10207. }
  10208. /*===========================================================================
  10209. FUNCTION: Sudo_Parameter_iso1_WeldingDetectionRes
  10210. DESCRIPTION:
  10211. PRE-CONDITION:
  10212. INPUT:
  10213. OUTPUT:
  10214. GLOBAL VARIABLES:
  10215. =============================================================================*/
  10216. void Sudo_Parameter_iso1_WeldingDetectionRes()
  10217. {
  10218. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  10219. init_iso1WeldingDetectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes);
  10220. ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  10221. //----- [BODY (1/3)] ResponseCode -----
  10222. struct iso1WeldingDetectionResType *res;
  10223. res = &ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes;
  10224. res->ResponseCode = iso1responseCodeType_OK;
  10225. //----- [BODY (2/3)] EVSEPresentVoltage -----
  10226. res->EVSEPresentVoltage.Value = 3820;
  10227. res->EVSEPresentVoltage.Multiplier = -1;
  10228. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  10229. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  10230. //iso1unitSymbolType_h = 0,
  10231. //iso1unitSymbolType_m = 1,
  10232. //iso1unitSymbolType_s = 2,
  10233. //iso1unitSymbolType_A = 3,
  10234. //iso1unitSymbolType_V = 4,
  10235. //iso1unitSymbolType_W = 5,
  10236. //iso1unitSymbolType_Wh = 6
  10237. //----- [BODY (3/3)] DC_EVSEStatus -----
  10238. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  10239. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  10240. //iso1isolationLevelType_Invalid = 0,
  10241. //iso1isolationLevelType_Valid = 1,
  10242. //iso1isolationLevelType_Warning = 2,
  10243. //iso1isolationLevelType_Fault = 3,
  10244. //iso1isolationLevelType_No_IMD = 4
  10245. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10246. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  10247. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  10248. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  10249. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  10250. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  10251. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  10252. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  10253. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  10254. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  10255. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  10256. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  10257. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  10258. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  10259. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  10260. //iso1EVSENotificationType_None = 0,
  10261. //iso1EVSENotificationType_StopCharging = 1,
  10262. //iso1EVSENotificationType_ReNegotiation = 2
  10263. }
  10264. /*===========================================================================
  10265. FUNCTION: Proc_din_WeldingDetectionRes
  10266. DESCRIPTION:
  10267. PRE-CONDITION:
  10268. INPUT:
  10269. OUTPUT:
  10270. GLOBAL VARIABLES:
  10271. =============================================================================*/
  10272. int Proc_din_WeldingDetectionRes(int AcceptFd)
  10273. {
  10274. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10275. //if it is not the same, the packet should be ignored.
  10276. //STEP 1: ============ Initialize ============
  10277. //int i = 0;
  10278. int errn = 0;
  10279. bitstream_t v2g_tx_stream;
  10280. static struct WeldingDetectionResponse_DIN70121 *wel;
  10281. static struct ChargingInfoData *sys;
  10282. size_t pos = 0;
  10283. v2g_tx_stream.pos = &pos;
  10284. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10285. v2g_tx_stream.data = V2GTP_Tx_buf;
  10286. wel = &ShmCcsData->V2GMessage_DIN70121.WeldingDetectionResponse;
  10287. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10288. wel->ResponseCode = OK_DIN70121;
  10289. //[HEADER] Check Req SessionID
  10290. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10291. {
  10292. wel->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10293. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10294. errn = -1;
  10295. }
  10296. //Check for SequenceError
  10297. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10298. {
  10299. wel->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10300. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10301. errn = -1;
  10302. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10303. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10304. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10305. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10306. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10307. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10308. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10309. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10310. }
  10311. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10312. SAVE_PhysicalValueType_DIN70121(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  10313. //EVSE Status Code
  10314. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10315. //Check for CSU command of "Stop by EVSE"
  10316. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10317. {
  10318. //wel->ResponseCode = FAILED_DIN70121;
  10319. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10320. }
  10321. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10322. {
  10323. //wel->ResponseCode = FAILED_DIN70121;
  10324. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10325. }
  10326. else if (ShmInternalComm->ChargingPermission == FALSE)
  10327. {
  10328. //wel->ResponseCode = FAILED_DIN70121;
  10329. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10330. }
  10331. //Isolation Status
  10332. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  10333. {
  10334. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  10335. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10336. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10337. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  10338. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10339. Update_V2G_Flow_Status(Other_Fault);
  10340. errn = -1;
  10341. }
  10342. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10343. {
  10344. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10345. }
  10346. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10347. {
  10348. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10349. }
  10350. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10351. {
  10352. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10353. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10354. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10355. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_WeldingDetectionRes]GFD_Fault => Emergency Shutdown");
  10356. Update_V2G_Flow_Status(Other_Fault);
  10357. errn = -1;
  10358. }
  10359. else //GFD_No_IMD or other unexpected status
  10360. {
  10361. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10362. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10363. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10364. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10365. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10366. Update_V2G_Flow_Status(Other_Fault);
  10367. errn = -1;
  10368. }
  10369. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10370. #if PARAMETER_NORMAL_MODE == ENABLE
  10371. SHM_Read_din_WeldingDetectionRes(&ccs_exi_doc_DIN, ShmCcsData);
  10372. #else
  10373. Sudo_Parameter_din_WeldingDetectionRes();
  10374. #endif
  10375. //STEP 4: ============ Encode and Send Response Message ===========
  10376. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10377. {
  10378. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_WeldingDetectionRes][Error]Tx encoded msg error");
  10379. errn = -1;
  10380. }
  10381. //STEP 5: ============ Update Flags ===========
  10382. return errn;
  10383. }
  10384. /*===========================================================================
  10385. FUNCTION: Proc_iso1_WeldingDetectionRes
  10386. DESCRIPTION:
  10387. PRE-CONDITION:
  10388. INPUT:
  10389. OUTPUT:
  10390. GLOBAL VARIABLES:
  10391. =============================================================================*/
  10392. int Proc_iso1_WeldingDetectionRes(int AcceptFd)
  10393. {
  10394. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10395. //if it is not the same, the packet should be ignored.
  10396. //STEP 1: ============ Initialize ============
  10397. //int i = 0;
  10398. int errn = 0;
  10399. bitstream_t v2g_tx_stream;
  10400. static struct WeldingDetectionResponse_ISO15118_2014 *wel;
  10401. static struct ChargingInfoData *sys;
  10402. size_t pos = 0;
  10403. v2g_tx_stream.pos = &pos;
  10404. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10405. v2g_tx_stream.data = V2GTP_Tx_buf;
  10406. wel = &ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionResponse;
  10407. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10408. wel->ResponseCode = OK_ISO15118_2014;
  10409. //[HEADER] Check Req SessionID
  10410. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10411. {
  10412. wel->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10413. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10414. errn = -1;
  10415. }
  10416. //Check for SequenceError
  10417. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10418. {
  10419. wel->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10420. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10421. errn = -1;
  10422. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10423. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10424. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10425. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10426. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10427. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10428. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10429. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10430. }
  10431. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10432. SAVE_PhysicalValueType_ISO15118_2014(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  10433. //EVSE Status Code
  10434. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10435. //Check for CSU command of "Stop by EVSE"
  10436. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10437. {
  10438. //wel->ResponseCode = FAILED_ISO15118_2014;
  10439. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10440. }
  10441. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10442. {
  10443. //wel->ResponseCode = FAILED_ISO15118_2014;
  10444. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10445. }
  10446. else if (ShmInternalComm->ChargingPermission == FALSE)
  10447. {
  10448. //wel->ResponseCode = FAILED_ISO15118_2014;
  10449. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10450. }
  10451. //Isolation Status
  10452. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  10453. {
  10454. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  10455. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10456. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10457. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
  10458. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10459. Update_V2G_Flow_Status(Other_Fault);
  10460. errn = -1;
  10461. }
  10462. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10463. {
  10464. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10465. }
  10466. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10467. {
  10468. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10469. }
  10470. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10471. {
  10472. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10473. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10474. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10475. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_WeldingDetectionRes]GFD_Fault => EmergencyShutdown");
  10476. Update_V2G_Flow_Status(Other_Fault);
  10477. errn = -1;
  10478. }
  10479. else
  10480. {
  10481. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10482. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10483. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10484. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10485. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10486. Update_V2G_Flow_Status(Other_Fault);
  10487. errn = -1;
  10488. }
  10489. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10490. #if PARAMETER_NORMAL_MODE == ENABLE
  10491. SHM_Read_iso1_WeldingDetectionRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10492. #else
  10493. Sudo_Parameter_iso1_WeldingDetectionRes();
  10494. #endif
  10495. //STEP 4: ============ Encode and Send Response Message ===========
  10496. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10497. {
  10498. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_WeldingDetectionRes][Error]Tx encoded msg error");
  10499. errn = -1;
  10500. }
  10501. //STEP 5: ============ Update Flags ===========
  10502. return errn;
  10503. }
  10504. /*===========================================================================
  10505. FUNCTION: Proc_din_WeldingDetectionReq
  10506. DESCRIPTION:
  10507. PRE-CONDITION:
  10508. INPUT:
  10509. OUTPUT:
  10510. GLOBAL VARIABLES:
  10511. =============================================================================*/
  10512. int Proc_din_WeldingDetectionReq(int AcceptFd)
  10513. {
  10514. int errn = 0;
  10515. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_WeldingDetectionReq] Got WeldingDetectionReq\n");
  10516. //Print the decoded XML Document
  10517. PRINT_XML_DOC_DIN_WeldingDetectionReq(&ccs_exi_doc_DIN);
  10518. //Save into Share Memory
  10519. SHM_Save_din_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10520. //Check for EV Error Code
  10521. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  10522. errn = Proc_din_WeldingDetectionRes(AcceptFd);
  10523. if (errn == 0)
  10524. {
  10525. //send response successfully.
  10526. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]WeldingDetectionRes");
  10527. }
  10528. else
  10529. {
  10530. sprintf((char*)buf_log_evcomm,
  10531. "[Error][SeccComm][Proc_din_WeldingDetectionReq]Proc_din_WeldingDetectionRes(): %d (DEC)",
  10532. errn);
  10533. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10534. }
  10535. return errn;
  10536. }
  10537. /*===========================================================================
  10538. FUNCTION: Proc_iso1_WeldingDetectionReq
  10539. DESCRIPTION:
  10540. PRE-CONDITION:
  10541. INPUT:
  10542. OUTPUT:
  10543. GLOBAL VARIABLES:
  10544. =============================================================================*/
  10545. int Proc_iso1_WeldingDetectionReq(int AcceptFd)
  10546. {
  10547. int errn = 0;
  10548. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_WeldingDetectionReq] Got WeldingDetectionReq\n");
  10549. //Print the decoded XML Document
  10550. PRINT_XML_DOC_ISO1_WeldingDetectionReq(&ccs_exi_doc_ISO1);
  10551. //Save into Share Memory
  10552. SHM_Save_iso1_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10553. //Check for EV Error Code
  10554. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  10555. errn = Proc_iso1_WeldingDetectionRes(AcceptFd);
  10556. if (errn == 0)
  10557. {
  10558. //send response successfully.
  10559. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]WeldingDetectionRes");
  10560. }
  10561. else
  10562. {
  10563. sprintf((char*)buf_log_evcomm,
  10564. "[Error][SeccComm][Proc_iso1_WeldingDetectionReq]Proc_iso1_WeldingDetectionRes(): %d (DEC)",
  10565. errn);
  10566. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10567. }
  10568. return errn;
  10569. }
  10570. /*===========================================================================
  10571. FUNCTION: SHM_Init_din_SessionStopRes
  10572. DESCRIPTION:
  10573. PRE-CONDITION:
  10574. INPUT:
  10575. 1. shm_ccs
  10576. OUTPUT:
  10577. 1. shm_ccs
  10578. GLOBAL VARIABLES:
  10579. =============================================================================*/
  10580. void SHM_Init_din_SessionStopRes(struct CcsData *shm_ccs)
  10581. {
  10582. struct SessionStopResponse_DIN70121 *in;
  10583. in = &shm_ccs->V2GMessage_DIN70121.SessionStopResponse;
  10584. //----- [BODY (1/3)] ResponseCode -----
  10585. in->ResponseCode = dinresponseCodeType_OK;
  10586. }
  10587. /*===========================================================================
  10588. FUNCTION: Sudo_Parameter_din_SessionStopRes
  10589. DESCRIPTION:
  10590. PRE-CONDITION:
  10591. INPUT:
  10592. OUTPUT:
  10593. GLOBAL VARIABLES:
  10594. =============================================================================*/
  10595. void Sudo_Parameter_din_SessionStopRes()
  10596. {
  10597. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  10598. init_dinSessionStopResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes);
  10599. ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  10600. //----- [BODY (1/3)] ResponseCode -----
  10601. struct dinSessionStopResType *res;
  10602. res = &ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes;
  10603. res->ResponseCode = dinresponseCodeType_OK;
  10604. }
  10605. /*===========================================================================
  10606. FUNCTION: Sudo_Parameter_iso1_SessionStopRes
  10607. DESCRIPTION:
  10608. PRE-CONDITION:
  10609. INPUT:
  10610. OUTPUT:
  10611. GLOBAL VARIABLES:
  10612. =============================================================================*/
  10613. void Sudo_Parameter_iso1_SessionStopRes()
  10614. {
  10615. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  10616. init_iso1SessionStopResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes);
  10617. ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  10618. //----- [BODY (1/3)] ResponseCode -----
  10619. struct iso1SessionStopResType *res;
  10620. res = &ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes;
  10621. res->ResponseCode = iso1responseCodeType_OK;
  10622. }
  10623. /*===========================================================================
  10624. FUNCTION: Proc_din_SessionStopRes
  10625. DESCRIPTION:
  10626. PRE-CONDITION:
  10627. INPUT:
  10628. OUTPUT:
  10629. GLOBAL VARIABLES:
  10630. =============================================================================*/
  10631. int Proc_din_SessionStopRes(int AcceptFd)
  10632. {
  10633. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10634. //if it is not the same, the packet should be ignored.
  10635. //STEP 1: ============ Initialize ============
  10636. //int i = 0;
  10637. int errn = 0;
  10638. bitstream_t v2g_tx_stream;
  10639. struct SessionStopResponse_DIN70121 *stp;
  10640. size_t pos = 0;
  10641. v2g_tx_stream.pos = &pos;
  10642. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10643. v2g_tx_stream.data = V2GTP_Tx_buf;
  10644. stp = &ShmCcsData->V2GMessage_DIN70121.SessionStopResponse;
  10645. stp->ResponseCode = OK_DIN70121;
  10646. //[HEADER] Check Req SessionID
  10647. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10648. {
  10649. stp->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10650. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10651. errn = -1;
  10652. }
  10653. //Check for SequenceError
  10654. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10655. {
  10656. stp->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10657. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10658. errn = -1;
  10659. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10660. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10661. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10662. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10663. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10664. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10665. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10666. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10667. }
  10668. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10669. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10670. #if PARAMETER_NORMAL_MODE == ENABLE
  10671. SHM_Read_din_SessionStopRes(&ccs_exi_doc_DIN, ShmCcsData);
  10672. #else
  10673. Sudo_Parameter_din_SessionStopRes();
  10674. #endif
  10675. //STEP 4: ============ Encode and Send Response Message ===========
  10676. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10677. {
  10678. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes: fail");
  10679. errn = -1;
  10680. }
  10681. else
  10682. {
  10683. //send response successfully.
  10684. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes");
  10685. }
  10686. //STEP 5: ============ Update Flags ===========
  10687. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  10688. //Once this is set, the CSU should
  10689. // =========== Annouce to CSU [To-Be Implemented]=============
  10690. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  10691. // =========== Re-initialized [To-Be Implemented]=============
  10692. //Keep 5% PWM for 2 seconds
  10693. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 2");
  10694. sleep(1);
  10695. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 1");
  10696. sleep(1);
  10697. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 0");
  10698. OutputCpPwmDuty(100);
  10699. //[To-Do] Reset All Share memory
  10700. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  10701. //system("reboot -f");
  10702. //sleep(5);
  10703. //system("reboot -f");
  10704. return errn;
  10705. }
  10706. /*===========================================================================
  10707. FUNCTION: Proc_iso1_SessionStopRes
  10708. DESCRIPTION:
  10709. PRE-CONDITION:
  10710. INPUT:
  10711. OUTPUT:
  10712. GLOBAL VARIABLES:
  10713. =============================================================================*/
  10714. int Proc_iso1_SessionStopRes(int AcceptFd)
  10715. {
  10716. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10717. //if it is not the same, the packet should be ignored.
  10718. //STEP 1: ============ Initialize ============
  10719. //int i = 0;
  10720. int errn = 0;
  10721. bitstream_t v2g_tx_stream;
  10722. struct SessionStopResponse_ISO15118_2014 *stp;
  10723. //struct ChargingInfoData *sys;
  10724. size_t pos = 0;
  10725. v2g_tx_stream.pos = &pos;
  10726. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10727. v2g_tx_stream.data = V2GTP_Tx_buf;
  10728. stp = &ShmCcsData->V2GMessage_ISO15118_2014.SessionStopResponse;
  10729. //sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10730. stp->ResponseCode = OK_ISO15118_2014;
  10731. //[HEADER] Check Req SessionID
  10732. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10733. {
  10734. stp->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10735. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10736. errn = -1;
  10737. }
  10738. //Check for SequenceError
  10739. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10740. {
  10741. stp->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10742. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10743. errn = -1;
  10744. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10745. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10746. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10747. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10748. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10749. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10750. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10751. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10752. }
  10753. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10754. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10755. #if PARAMETER_NORMAL_MODE == ENABLE
  10756. SHM_Read_iso1_SessionStopRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10757. #else
  10758. Sudo_Parameter_iso1_SessionStopRes();
  10759. #endif
  10760. //STEP 4: ============ Encode and Send Response Message ===========
  10761. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10762. {
  10763. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes: fail");
  10764. errn = -1;
  10765. }
  10766. else
  10767. {
  10768. //send response successfully.
  10769. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes");
  10770. }
  10771. //STEP 5: ============ Update Flags ===========
  10772. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  10773. //Once this is set, the CSU should
  10774. // =========== Annouce to CSU [To-Be Implemented]=============
  10775. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  10776. // =========== Re-initialized [To-Be Implemented]=============
  10777. //Keep 5% PWM for 2 seconds
  10778. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 2");
  10779. sleep(1);
  10780. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 1");
  10781. sleep(1);
  10782. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 0");
  10783. OutputCpPwmDuty(100);
  10784. //[To-Do] Reset All Share memory
  10785. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  10786. //system("reboot -f");
  10787. //sleep(5);
  10788. //system("reboot -f");
  10789. return errn;
  10790. }
  10791. /*===========================================================================
  10792. FUNCTION: Proc_din_SessionStopReq
  10793. DESCRIPTION:
  10794. PRE-CONDITION:
  10795. INPUT:
  10796. OUTPUT:
  10797. GLOBAL VARIABLES:
  10798. =============================================================================*/
  10799. int Proc_din_SessionStopReq(int AcceptFd)
  10800. {
  10801. int errn = 0;
  10802. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]SessionStopReq");
  10803. //Print the decoded XML Document
  10804. PRINT_XML_DOC_DIN_SessionStopReq(&ccs_exi_doc_DIN);
  10805. //Save into Share Memory
  10806. SHM_Save_din_SessionStopReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10807. errn = Proc_din_SessionStopRes(AcceptFd);
  10808. if (errn == 0)
  10809. {
  10810. //send response successfully.
  10811. }
  10812. else
  10813. {
  10814. sprintf((char*)buf_log_evcomm,
  10815. "[Error][SeccComm][Proc_din_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  10816. errn);
  10817. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10818. }
  10819. return errn;
  10820. }
  10821. /*===========================================================================
  10822. FUNCTION: Proc_iso1_SessionStopReq
  10823. DESCRIPTION:
  10824. PRE-CONDITION:
  10825. INPUT:
  10826. OUTPUT:
  10827. GLOBAL VARIABLES:
  10828. =============================================================================*/
  10829. int Proc_iso1_SessionStopReq(int AcceptFd)
  10830. {
  10831. int errn = 0;
  10832. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]SessionStopReq");
  10833. //Print the decoded XML Document
  10834. PRINT_XML_DOC_ISO1_SessionStopReq(&ccs_exi_doc_ISO1);
  10835. //Save into Share Memory
  10836. SHM_Save_iso1_SessionStopReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10837. errn = Proc_iso1_SessionStopRes(AcceptFd);
  10838. if (errn == 0)
  10839. {
  10840. //send response successfully.
  10841. }
  10842. else
  10843. {
  10844. sprintf((char*)buf_log_evcomm,
  10845. "[Error][SeccComm][Proc_iso1_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  10846. errn);
  10847. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10848. }
  10849. return errn;
  10850. }
  10851. /*===========================================================================
  10852. FUNCTION: V2gMsg_Process_din
  10853. DESCRIPTION:
  10854. PRE-CONDITION:
  10855. INPUT:
  10856. 1. V2gFlowStatus
  10857. OUTPUT:
  10858. GLOBAL VARIABLES:
  10859. 1. V2gFlowStatus
  10860. =============================================================================*/
  10861. int V2gMsg_Process_din(int AcceptFd)
  10862. {
  10863. unsigned char req_is_responsed = FALSE;
  10864. while (req_is_responsed == FALSE)
  10865. {
  10866. //Check if it is in End_Process
  10867. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  10868. {
  10869. break;
  10870. }
  10871. switch(V2gFlowStatus)
  10872. {
  10873. //-------------------------------------------
  10874. case SupportedAppProtocolRequest:
  10875. {
  10876. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  10877. {
  10878. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  10879. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  10880. {
  10881. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10882. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  10883. }
  10884. else
  10885. {
  10886. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  10887. Update_V2G_Flow_Status(Other_Fault);
  10888. }
  10889. }
  10890. req_is_responsed = TRUE;
  10891. break;
  10892. }
  10893. case SupportedAppProtocolResponse:
  10894. {
  10895. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  10896. {
  10897. Update_V2G_Flow_Status(SessionSetupRequest);
  10898. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10899. }
  10900. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10901. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10902. {
  10903. sprintf((char*)buf_log_evcomm,
  10904. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10905. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10906. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10907. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10908. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10909. }
  10910. else
  10911. {
  10912. }
  10913. break;
  10914. }
  10915. //-------------------------------------------
  10916. case SessionSetupRequest: //19
  10917. {
  10918. if (Proc_din_SessionSetupReq(AcceptFd) == 0)
  10919. {
  10920. Update_V2G_Flow_Status(SessionSetupResponse);
  10921. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10922. }
  10923. else
  10924. {
  10925. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  10926. Update_V2G_Flow_Status(Other_Fault);
  10927. }
  10928. req_is_responsed = TRUE;
  10929. break;
  10930. }
  10931. case SessionSetupResponse: //20
  10932. {
  10933. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  10934. {
  10935. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  10936. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10937. }
  10938. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10939. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10940. {
  10941. sprintf((char*)buf_log_evcomm,
  10942. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10943. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10944. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10945. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10946. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10947. }
  10948. else
  10949. {
  10950. }
  10951. break;
  10952. }
  10953. //-------------------------------------------
  10954. case ServiceDiscoveryRequest: //21
  10955. {
  10956. if (Proc_din_ServiceDiscoveryReq(AcceptFd) == 0)
  10957. {
  10958. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  10959. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10960. }
  10961. else
  10962. {
  10963. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  10964. Update_V2G_Flow_Status(Other_Fault);
  10965. }
  10966. req_is_responsed = TRUE;
  10967. break;
  10968. }
  10969. case ServiceDiscoveryResponse: //22
  10970. {
  10971. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  10972. {
  10973. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  10974. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10975. }
  10976. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10977. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10978. {
  10979. sprintf((char*)buf_log_evcomm, "[ERROR]SequenceError(%d) => Tx Res MSG", EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10980. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10981. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10982. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10983. }
  10984. else
  10985. {
  10986. }
  10987. break;
  10988. }
  10989. //-------------------------------------------
  10990. case ServiceAndPaymentSelectionRequest: //25
  10991. {
  10992. if (Proc_din_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  10993. {
  10994. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  10995. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10996. }
  10997. else
  10998. {
  10999. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  11000. Update_V2G_Flow_Status(Other_Fault);
  11001. }
  11002. req_is_responsed = TRUE;
  11003. break;
  11004. }
  11005. case ServiceAndPaymentSelectionResponse: //26
  11006. {
  11007. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11008. {
  11009. Update_V2G_Flow_Status(AuthorizationRequest);
  11010. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11011. }
  11012. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11013. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11014. {
  11015. sprintf((char*)buf_log_evcomm,
  11016. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11017. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11018. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11019. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11020. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11021. }
  11022. else
  11023. {
  11024. }
  11025. break;
  11026. }
  11027. //-------------------------------------------
  11028. //case ContractAuthenticationReq:
  11029. case AuthorizationRequest: //29
  11030. {
  11031. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  11032. {
  11033. Update_V2G_Flow_Status(AuthorizationResponse);
  11034. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11035. }
  11036. else
  11037. {
  11038. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11039. Update_V2G_Flow_Status(Other_Fault);
  11040. }
  11041. req_is_responsed = TRUE;
  11042. break;
  11043. }
  11044. case AuthorizationResponse: //30
  11045. {
  11046. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11047. {
  11048. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11049. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  11050. {
  11051. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11052. }
  11053. else
  11054. {
  11055. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11056. Update_V2G_Flow_Status(Other_Fault);
  11057. }
  11058. req_is_responsed = TRUE;
  11059. }
  11060. //Check for ChargeParameterDiscoveryReq
  11061. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11062. {
  11063. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11064. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  11065. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  11066. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11067. ftime(&SeqStartTime);
  11068. #endif
  11069. }
  11070. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11071. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11072. {
  11073. sprintf((char*)buf_log_evcomm,
  11074. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11075. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11076. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11077. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11078. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11079. }
  11080. else
  11081. {
  11082. }
  11083. break;
  11084. }
  11085. //-------------------------------------------
  11086. case ChargeParameterDiscoveryRequest: //35
  11087. {
  11088. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11089. {
  11090. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  11091. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11092. }
  11093. else
  11094. {
  11095. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11096. Update_V2G_Flow_Status(Other_Fault);
  11097. }
  11098. req_is_responsed = TRUE;
  11099. break;
  11100. }
  11101. case ChargeParameterDiscoveryResponse:
  11102. {
  11103. //STEP 1: Check for Process Timeout
  11104. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11105. ftime(&SeqEndTime);
  11106. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  11107. {
  11108. sprintf((char*)buf_log_evcomm,
  11109. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  11110. DiffTimeb(SeqStartTime, SeqEndTime),
  11111. V2G_SECC_ChargingParameter_Performance_Time);
  11112. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11113. Update_V2G_Flow_Status(Sequence_Timeout);
  11114. break;
  11115. }
  11116. #endif
  11117. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11118. {
  11119. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11120. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11121. {
  11122. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11123. }
  11124. else
  11125. {
  11126. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11127. Update_V2G_Flow_Status(Other_Fault);
  11128. }
  11129. req_is_responsed = TRUE;
  11130. break;
  11131. }
  11132. //STEP 2: Check for CableCheckReq message
  11133. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11134. {
  11135. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11136. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  11137. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  11138. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11139. Update_V2G_Flow_Status(CableCheckRequest);
  11140. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11141. ftime(&SeqStartTime);
  11142. #endif
  11143. }
  11144. //STEP 3: Wait for PowerDeliveryReq Message
  11145. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11146. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11147. {
  11148. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11149. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11150. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11151. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11152. ftime(&SeqStartTime);
  11153. #endif
  11154. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  11155. {
  11156. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11157. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11158. }
  11159. else
  11160. {
  11161. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11162. Update_V2G_Flow_Status(Other_Fault);
  11163. }
  11164. }
  11165. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11166. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11167. {
  11168. sprintf((char*)buf_log_evcomm,
  11169. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11170. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11171. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11172. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11173. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11174. }
  11175. else
  11176. {
  11177. }
  11178. break;
  11179. }
  11180. //-------------------------------------------
  11181. case CableCheckRequest: //37
  11182. {
  11183. //STEP 3: Execute Cable Check Process
  11184. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  11185. {
  11186. Update_V2G_Flow_Status(CableCheckResponse);
  11187. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11188. }
  11189. else
  11190. {
  11191. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  11192. Update_V2G_Flow_Status(Other_Fault);
  11193. }
  11194. req_is_responsed = TRUE;
  11195. break;
  11196. }
  11197. case CableCheckResponse: //38
  11198. {
  11199. //STEP 1: Check for Process Timeout
  11200. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11201. ftime(&SeqEndTime);
  11202. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  11203. {
  11204. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  11205. sprintf((char*)buf_log_evcomm,
  11206. "CableCheck Timeout - (%.02lf of %d ms)\n",
  11207. DiffTimeb(SeqStartTime, SeqEndTime),
  11208. V2G_SECC_CableCheck_Performance_Time);
  11209. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11210. Update_V2G_Flow_Status(Sequence_Timeout);
  11211. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11212. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  11213. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11214. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11215. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11216. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  11217. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  11218. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  11219. break;
  11220. }
  11221. #endif
  11222. //STEP 2: Check for CableCheckReq message
  11223. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11224. {
  11225. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11226. //STEP 3: Execute Cable Check Process
  11227. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  11228. {
  11229. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11230. }
  11231. else
  11232. {
  11233. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  11234. Update_V2G_Flow_Status(Other_Fault);
  11235. }
  11236. req_is_responsed = TRUE;
  11237. }
  11238. //STEP 3: Check for PreChargeReq message
  11239. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  11240. {
  11241. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11242. Update_V2G_Flow_Status(PreChargeRequest);
  11243. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  11244. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11245. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  11246. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11247. ftime(&SeqStartTime);
  11248. #endif
  11249. }
  11250. //STEP 3: Wait for PowerDeliveryReq Message
  11251. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11252. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11253. {
  11254. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11255. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11256. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11257. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11258. ftime(&SeqStartTime);
  11259. #endif
  11260. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  11261. {
  11262. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11263. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11264. }
  11265. else
  11266. {
  11267. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11268. Update_V2G_Flow_Status(Other_Fault);
  11269. }
  11270. }
  11271. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11272. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11273. {
  11274. sprintf((char*)buf_log_evcomm,
  11275. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11276. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11277. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11278. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11279. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11280. }
  11281. else
  11282. {
  11283. }
  11284. break;
  11285. }
  11286. //-------------------------------------------
  11287. case PreChargeRequest: //39
  11288. {
  11289. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  11290. {
  11291. Update_V2G_Flow_Status(PreChargeResponse);
  11292. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11293. }
  11294. else
  11295. {
  11296. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  11297. Update_V2G_Flow_Status(Other_Fault);
  11298. }
  11299. req_is_responsed = TRUE;
  11300. break;
  11301. }
  11302. case PreChargeResponse: //40
  11303. {
  11304. //STEP 1: Check for Process Timeout
  11305. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11306. ftime(&SeqEndTime);
  11307. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  11308. {
  11309. sprintf((char*)buf_log_evcomm,
  11310. "Precharge Timeout - (%.02lf of %d ms)\n",
  11311. DiffTimeb(SeqStartTime, SeqEndTime),
  11312. V2G_SECC_PreCharge_Performance_Time);
  11313. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11314. Update_V2G_Flow_Status(Sequence_Timeout);
  11315. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11316. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  11317. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11318. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11319. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11320. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  11321. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11322. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  11323. break;
  11324. }
  11325. #endif
  11326. //STEP 2: Check for PreChargeReq message
  11327. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  11328. {
  11329. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11330. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  11331. {
  11332. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11333. }
  11334. else
  11335. {
  11336. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  11337. Update_V2G_Flow_Status(Other_Fault);
  11338. }
  11339. req_is_responsed = TRUE;
  11340. }
  11341. //STEP 3: Check for PowerDeliveryReq message
  11342. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11343. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11344. {
  11345. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11346. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  11347. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  11348. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11349. ftime(&SeqStartTime);
  11350. #endif
  11351. }
  11352. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11353. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11354. {
  11355. sprintf((char*)buf_log_evcomm,
  11356. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11357. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11358. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11359. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11360. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11361. }
  11362. else
  11363. {
  11364. }
  11365. break;
  11366. }
  11367. //-------------------------------------------
  11368. case PowerDeliveryRequestStart: //41
  11369. {
  11370. if (Proc_din_PowerDeliveryStartReq(AcceptFd) == 0)
  11371. {
  11372. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  11373. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11374. }
  11375. else
  11376. {
  11377. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  11378. Update_V2G_Flow_Status(Other_Fault);
  11379. }
  11380. req_is_responsed = TRUE;
  11381. break;
  11382. }
  11383. case PowerDeliveryResponsetStart: //42
  11384. {
  11385. //STEP 1: Check for Process Timeout
  11386. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11387. if (ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  11388. {
  11389. ftime(&SeqEndTime);
  11390. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  11391. {
  11392. sprintf((char*)buf_log_evcomm,
  11393. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  11394. DiffTimeb(SeqStartTime, SeqEndTime),
  11395. 2000);
  11396. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11397. Update_V2G_Flow_Status(Sequence_Timeout);
  11398. }
  11399. break;
  11400. }
  11401. #endif
  11402. //STEP 2: Wait for CurrentDemandReq Message
  11403. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  11404. {
  11405. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11406. Update_V2G_Flow_Status(CurrentDemandRequest);
  11407. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  11408. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  11409. }
  11410. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11411. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11412. {
  11413. sprintf((char*)buf_log_evcomm,
  11414. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11415. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11416. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11417. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11418. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11419. }
  11420. else
  11421. {
  11422. }
  11423. break;
  11424. }
  11425. //-------------------------------------------
  11426. case CurrentDemandRequest: //45,
  11427. {
  11428. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  11429. {
  11430. Update_V2G_Flow_Status(CurrentDemandResponse);
  11431. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11432. }
  11433. else
  11434. {
  11435. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  11436. Update_V2G_Flow_Status(Other_Fault);
  11437. }
  11438. req_is_responsed = TRUE;
  11439. break;
  11440. }
  11441. case CurrentDemandResponse: //46,
  11442. {
  11443. //STEP 1: Wait for CurrentDemandReq Message
  11444. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  11445. {
  11446. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11447. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  11448. {
  11449. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11450. }
  11451. else
  11452. {
  11453. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  11454. Update_V2G_Flow_Status(Other_Fault);
  11455. }
  11456. req_is_responsed = TRUE;
  11457. break;
  11458. }
  11459. //STEP 2: Wait for PowerDeliveryReq Message
  11460. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11461. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11462. {
  11463. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11464. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11465. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  11466. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11467. ftime(&SeqStartTime);
  11468. #endif
  11469. }
  11470. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11471. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11472. {
  11473. sprintf((char*)buf_log_evcomm,
  11474. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11475. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11476. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11477. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11478. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11479. }
  11480. else
  11481. {
  11482. }
  11483. break;
  11484. }
  11485. //-------------------------------------------
  11486. case PowerDeliveryRequestStop: //49,
  11487. {
  11488. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  11489. {
  11490. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11491. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11492. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11493. ftime(&SeqStartTime);
  11494. #endif
  11495. }
  11496. else
  11497. {
  11498. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11499. Update_V2G_Flow_Status(Other_Fault);
  11500. }
  11501. req_is_responsed = TRUE;
  11502. break;
  11503. }
  11504. case PowerDeliveryResponseStop: //50,
  11505. {
  11506. //STEP 1: Check for Process Timeout
  11507. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11508. ftime(&SeqEndTime);
  11509. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  11510. {
  11511. sprintf((char*)buf_log_evcomm,
  11512. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  11513. DiffTimeb(SeqStartTime, SeqEndTime),
  11514. 2000);
  11515. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11516. Update_V2G_Flow_Status(Sequence_Timeout);
  11517. break;
  11518. }
  11519. #endif
  11520. //STEP 2: Check for WeldingDetectionReq Message
  11521. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  11522. {
  11523. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11524. Update_V2G_Flow_Status(WeldingDetectionRequest);
  11525. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  11526. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  11527. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11528. ftime(&SeqStartTime);
  11529. #endif
  11530. }
  11531. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  11532. {
  11533. Update_V2G_Flow_Status(SessionStopRequest);
  11534. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11535. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  11536. {
  11537. Update_V2G_Flow_Status(SessionStopResponse);
  11538. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11539. }
  11540. else
  11541. {
  11542. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  11543. Update_V2G_Flow_Status(Other_Fault);
  11544. }
  11545. break;
  11546. }
  11547. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11548. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11549. {
  11550. sprintf((char*)buf_log_evcomm,
  11551. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11552. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11553. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11554. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11555. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11556. }
  11557. else
  11558. {
  11559. }
  11560. break;
  11561. }
  11562. //-------------------------------------------
  11563. case WeldingDetectionRequest: //51,
  11564. {
  11565. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  11566. {
  11567. Update_V2G_Flow_Status(WeldingDetectionResponse);
  11568. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11569. }
  11570. else
  11571. {
  11572. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  11573. Update_V2G_Flow_Status(Other_Fault);
  11574. }
  11575. req_is_responsed = TRUE;
  11576. break;
  11577. }
  11578. case WeldingDetectionResponse: //52,
  11579. {
  11580. //STEP 1: Check for Process Timeout
  11581. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11582. ftime(&SeqEndTime);
  11583. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  11584. {
  11585. sprintf((char*)buf_log_evcomm,
  11586. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  11587. DiffTimeb(SeqStartTime, SeqEndTime),
  11588. V2G_SECC_WeldingDetection_Performance_Time);
  11589. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11590. Update_V2G_Flow_Status(Sequence_Timeout);
  11591. break;
  11592. }
  11593. #endif
  11594. //STEP 2: Check for WeldingDetectionReq Message
  11595. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  11596. {
  11597. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11598. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  11599. {
  11600. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11601. }
  11602. else
  11603. {
  11604. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  11605. Update_V2G_Flow_Status(Other_Fault);
  11606. }
  11607. req_is_responsed = TRUE;
  11608. }
  11609. //STEP 3: Check for SessionStopReq Message
  11610. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  11611. {
  11612. Update_V2G_Flow_Status(SessionStopRequest);
  11613. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11614. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  11615. }
  11616. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11617. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11618. {
  11619. sprintf((char*)buf_log_evcomm,
  11620. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11621. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11622. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11623. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11624. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11625. }
  11626. else
  11627. {
  11628. }
  11629. break;
  11630. }
  11631. //-------------------------------------------
  11632. case SessionStopRequest: //53,
  11633. {
  11634. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  11635. {
  11636. Update_V2G_Flow_Status(SessionStopResponse);
  11637. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11638. }
  11639. else
  11640. {
  11641. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  11642. Update_V2G_Flow_Status(Other_Fault);
  11643. }
  11644. req_is_responsed = TRUE;
  11645. break;
  11646. }
  11647. case SessionStopResponse: //54,
  11648. {
  11649. break;
  11650. }
  11651. //-------------------------------------------
  11652. default:
  11653. {
  11654. break;
  11655. }
  11656. }
  11657. }
  11658. return 0;
  11659. }
  11660. /*===========================================================================
  11661. FUNCTION: V2gMsg_Process_iso1_DC
  11662. DESCRIPTION:
  11663. PRE-CONDITION:
  11664. INPUT:
  11665. 1. V2gFlowStatus
  11666. OUTPUT:
  11667. GLOBAL VARIABLES:
  11668. 1. V2gFlowStatus
  11669. =============================================================================*/
  11670. int V2gMsg_Process_iso1_DC(int AcceptFd)
  11671. {
  11672. unsigned char req_is_responsed = FALSE;
  11673. while (req_is_responsed == FALSE)
  11674. {
  11675. //Check if it is in End_Process
  11676. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  11677. {
  11678. break;
  11679. }
  11680. switch(V2gFlowStatus)
  11681. {
  11682. //-------------------------------------------
  11683. case SupportedAppProtocolRequest:
  11684. {
  11685. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  11686. {
  11687. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  11688. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  11689. {
  11690. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11691. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  11692. }
  11693. else
  11694. {
  11695. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  11696. Update_V2G_Flow_Status(Other_Fault);
  11697. }
  11698. }
  11699. req_is_responsed = TRUE;
  11700. break;
  11701. }
  11702. case SupportedAppProtocolResponse:
  11703. {
  11704. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  11705. {
  11706. Update_V2G_Flow_Status(SessionSetupRequest);
  11707. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11708. }
  11709. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11710. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11711. {
  11712. sprintf((char*)buf_log_evcomm,
  11713. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11714. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11715. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11716. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11717. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11718. }
  11719. else
  11720. {
  11721. }
  11722. break;
  11723. }
  11724. //-------------------------------------------
  11725. case SessionSetupRequest: //19
  11726. {
  11727. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  11728. {
  11729. Update_V2G_Flow_Status(SessionSetupResponse);
  11730. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11731. }
  11732. else
  11733. {
  11734. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  11735. Update_V2G_Flow_Status(Other_Fault);
  11736. }
  11737. req_is_responsed = TRUE;
  11738. break;
  11739. }
  11740. case SessionSetupResponse: //20
  11741. {
  11742. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  11743. {
  11744. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  11745. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11746. }
  11747. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11748. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11749. {
  11750. sprintf((char*)buf_log_evcomm,
  11751. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11752. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11753. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11754. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11755. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11756. }
  11757. else
  11758. {
  11759. }
  11760. break;
  11761. }
  11762. //-------------------------------------------
  11763. case ServiceDiscoveryRequest: //21
  11764. {
  11765. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  11766. {
  11767. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  11768. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11769. }
  11770. else
  11771. {
  11772. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  11773. Update_V2G_Flow_Status(Other_Fault);
  11774. }
  11775. req_is_responsed = TRUE;
  11776. break;
  11777. }
  11778. case ServiceDiscoveryResponse: //22
  11779. {
  11780. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  11781. {
  11782. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  11783. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11784. }
  11785. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11786. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11787. {
  11788. sprintf((char*)buf_log_evcomm,
  11789. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11790. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11791. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11792. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11793. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11794. }
  11795. else
  11796. {
  11797. }
  11798. break;
  11799. }
  11800. //-------------------------------------------
  11801. case ServiceAndPaymentSelectionRequest: //25
  11802. {
  11803. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  11804. {
  11805. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  11806. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11807. }
  11808. else
  11809. {
  11810. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  11811. Update_V2G_Flow_Status(Other_Fault);
  11812. }
  11813. req_is_responsed = TRUE;
  11814. break;
  11815. }
  11816. case ServiceAndPaymentSelectionResponse: //26
  11817. {
  11818. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11819. {
  11820. Update_V2G_Flow_Status(AuthorizationRequest);
  11821. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11822. }
  11823. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11824. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11825. {
  11826. sprintf((char*)buf_log_evcomm,
  11827. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11828. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11829. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11830. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11831. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11832. }
  11833. else
  11834. {
  11835. }
  11836. break;
  11837. }
  11838. //-------------------------------------------
  11839. //case ContractAuthenticationReq:
  11840. case AuthorizationRequest: //29
  11841. {
  11842. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  11843. {
  11844. Update_V2G_Flow_Status(AuthorizationResponse);
  11845. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11846. }
  11847. else
  11848. {
  11849. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11850. Update_V2G_Flow_Status(Other_Fault);
  11851. }
  11852. req_is_responsed = TRUE;
  11853. break;
  11854. }
  11855. case AuthorizationResponse: //30
  11856. {
  11857. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11858. {
  11859. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11860. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  11861. {
  11862. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11863. }
  11864. else
  11865. {
  11866. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11867. Update_V2G_Flow_Status(Other_Fault);
  11868. }
  11869. req_is_responsed = TRUE;
  11870. }
  11871. //Check for ChargeParameterDiscoveryReq
  11872. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11873. {
  11874. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11875. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  11876. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  11877. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11878. ftime(&SeqStartTime);
  11879. #endif
  11880. }
  11881. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11882. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11883. {
  11884. sprintf((char*)buf_log_evcomm,
  11885. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11886. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11887. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11888. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11889. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11890. }
  11891. else
  11892. {
  11893. }
  11894. break;
  11895. }
  11896. //-------------------------------------------
  11897. case ChargeParameterDiscoveryRequest: //35
  11898. {
  11899. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11900. {
  11901. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  11902. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11903. }
  11904. else
  11905. {
  11906. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11907. Update_V2G_Flow_Status(Other_Fault);
  11908. }
  11909. req_is_responsed = TRUE;
  11910. break;
  11911. }
  11912. case ChargeParameterDiscoveryResponse:
  11913. {
  11914. //STEP 1: Check for Process Timeout
  11915. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11916. ftime(&SeqEndTime);
  11917. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  11918. {
  11919. sprintf((char*)buf_log_evcomm,
  11920. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  11921. DiffTimeb(SeqStartTime, SeqEndTime),
  11922. V2G_SECC_ChargingParameter_Performance_Time);
  11923. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11924. Update_V2G_Flow_Status(Sequence_Timeout);
  11925. break;
  11926. }
  11927. #endif
  11928. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11929. {
  11930. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11931. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11932. {
  11933. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11934. }
  11935. else
  11936. {
  11937. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11938. Update_V2G_Flow_Status(Other_Fault);
  11939. }
  11940. req_is_responsed = TRUE;
  11941. }
  11942. //STEP 2: Check for CableCheckReq message
  11943. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11944. {
  11945. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11946. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  11947. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  11948. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11949. Update_V2G_Flow_Status(CableCheckRequest);
  11950. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11951. ftime(&SeqStartTime);
  11952. #endif
  11953. }
  11954. //STEP 3: Wait for PowerDeliveryReq Message
  11955. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11956. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11957. {
  11958. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11959. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11960. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11961. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11962. ftime(&SeqStartTime);
  11963. #endif
  11964. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  11965. {
  11966. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11967. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11968. }
  11969. else
  11970. {
  11971. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11972. Update_V2G_Flow_Status(Other_Fault);
  11973. }
  11974. break;
  11975. }
  11976. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11977. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11978. {
  11979. sprintf((char*)buf_log_evcomm,
  11980. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11981. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11982. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11983. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11984. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11985. }
  11986. else
  11987. {
  11988. }
  11989. break;
  11990. }
  11991. //-------------------------------------------
  11992. case CableCheckRequest: //37
  11993. {
  11994. //STEP 3: Execute Cable Check Process
  11995. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  11996. {
  11997. Update_V2G_Flow_Status(CableCheckResponse);
  11998. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11999. }
  12000. else
  12001. {
  12002. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  12003. Update_V2G_Flow_Status(Other_Fault);
  12004. }
  12005. req_is_responsed = TRUE;
  12006. break;
  12007. }
  12008. case CableCheckResponse: //38
  12009. {
  12010. //STEP 1: Check for Process Timeout
  12011. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12012. ftime(&SeqEndTime);
  12013. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  12014. {
  12015. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  12016. sprintf((char*)buf_log_evcomm,
  12017. "CableCheck Timeout - (%.02lf of %d ms)\n",
  12018. DiffTimeb(SeqStartTime, SeqEndTime),
  12019. V2G_SECC_CableCheck_Performance_Time);
  12020. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12021. Update_V2G_Flow_Status(Sequence_Timeout);
  12022. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12023. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  12024. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12025. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12026. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12027. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12028. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  12029. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  12030. break;
  12031. }
  12032. #endif
  12033. //STEP 2: Check for CableCheckReq message
  12034. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  12035. {
  12036. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12037. //STEP 3: Execute Cable Check Process
  12038. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  12039. {
  12040. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12041. }
  12042. else
  12043. {
  12044. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  12045. Update_V2G_Flow_Status(Other_Fault);
  12046. }
  12047. req_is_responsed = TRUE;
  12048. }
  12049. //STEP 3: Check for PreChargeReq message
  12050. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12051. {
  12052. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12053. Update_V2G_Flow_Status(PreChargeRequest);
  12054. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  12055. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  12056. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  12057. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12058. ftime(&SeqStartTime);
  12059. #endif
  12060. }
  12061. //STEP 3: Wait for PowerDeliveryReq Message
  12062. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12063. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12064. {
  12065. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12066. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12067. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12068. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12069. ftime(&SeqStartTime);
  12070. #endif
  12071. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12072. {
  12073. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12074. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12075. }
  12076. else
  12077. {
  12078. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12079. Update_V2G_Flow_Status(Other_Fault);
  12080. }
  12081. }
  12082. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12083. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12084. {
  12085. sprintf((char*)buf_log_evcomm,
  12086. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12087. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12088. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12089. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12090. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12091. }
  12092. else
  12093. {
  12094. }
  12095. break;
  12096. }
  12097. //-------------------------------------------
  12098. case PreChargeRequest: //39
  12099. {
  12100. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  12101. {
  12102. Update_V2G_Flow_Status(PreChargeResponse);
  12103. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12104. }
  12105. else
  12106. {
  12107. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  12108. Update_V2G_Flow_Status(Other_Fault);
  12109. }
  12110. req_is_responsed = TRUE;
  12111. break;
  12112. }
  12113. case PreChargeResponse: //40
  12114. {
  12115. //STEP 1: Check for Process Timeout
  12116. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12117. ftime(&SeqEndTime);
  12118. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  12119. {
  12120. sprintf((char*)buf_log_evcomm,
  12121. "Precharge Timeout - (%.02lf of %d ms)\n",
  12122. DiffTimeb(SeqStartTime, SeqEndTime),
  12123. V2G_SECC_PreCharge_Performance_Time);
  12124. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12125. Update_V2G_Flow_Status(Sequence_Timeout);
  12126. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12127. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  12128. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12129. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12130. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12131. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12132. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  12133. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  12134. break;
  12135. }
  12136. #endif
  12137. //STEP 2: Check for PreChargeReq message
  12138. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12139. {
  12140. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12141. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  12142. {
  12143. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12144. }
  12145. else
  12146. {
  12147. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  12148. Update_V2G_Flow_Status(Other_Fault);
  12149. }
  12150. req_is_responsed = TRUE;
  12151. }
  12152. //STEP 3: Check for PowerDeliveryReq message
  12153. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12154. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12155. {
  12156. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12157. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  12158. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  12159. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12160. ftime(&SeqStartTime);
  12161. #endif
  12162. }
  12163. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12164. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12165. {
  12166. sprintf((char*)buf_log_evcomm,
  12167. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12168. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12169. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12170. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12171. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12172. }
  12173. else
  12174. {
  12175. }
  12176. break;
  12177. }
  12178. //-------------------------------------------
  12179. case PowerDeliveryRequestStart: //41
  12180. {
  12181. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  12182. {
  12183. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  12184. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12185. }
  12186. else
  12187. {
  12188. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  12189. Update_V2G_Flow_Status(Other_Fault);
  12190. }
  12191. req_is_responsed = TRUE;
  12192. break;
  12193. }
  12194. case PowerDeliveryResponsetStart: //42
  12195. {
  12196. //STEP 1: Check for Process Timeout
  12197. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12198. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12199. {
  12200. ftime(&SeqEndTime);
  12201. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12202. {
  12203. sprintf((char*)buf_log_evcomm,
  12204. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  12205. DiffTimeb(SeqStartTime, SeqEndTime),
  12206. 2000);
  12207. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12208. Update_V2G_Flow_Status(Sequence_Timeout);
  12209. }
  12210. break;
  12211. }
  12212. #endif
  12213. //STEP 2: Wait for CurrentDemandReq Message
  12214. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12215. {
  12216. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12217. Update_V2G_Flow_Status(CurrentDemandRequest);
  12218. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  12219. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  12220. }
  12221. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12222. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12223. {
  12224. sprintf((char*)buf_log_evcomm,
  12225. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12226. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12227. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12228. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12229. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12230. }
  12231. else
  12232. {
  12233. }
  12234. break;
  12235. }
  12236. //-------------------------------------------
  12237. case CurrentDemandRequest: //45,
  12238. {
  12239. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  12240. {
  12241. Update_V2G_Flow_Status(CurrentDemandResponse);
  12242. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12243. }
  12244. else
  12245. {
  12246. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  12247. Update_V2G_Flow_Status(Other_Fault);
  12248. }
  12249. req_is_responsed = TRUE;
  12250. break;
  12251. }
  12252. case CurrentDemandResponse: //46,
  12253. {
  12254. //STEP 1: Wait for CurrentDemandReq Message
  12255. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12256. {
  12257. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12258. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  12259. {
  12260. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12261. }
  12262. else
  12263. {
  12264. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  12265. Update_V2G_Flow_Status(Other_Fault);
  12266. }
  12267. req_is_responsed = TRUE;
  12268. }
  12269. //STEP 2: Wait for PowerDeliveryReq Message
  12270. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12271. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12272. {
  12273. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12274. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12275. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  12276. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12277. ftime(&SeqStartTime);
  12278. #endif
  12279. }
  12280. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12281. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12282. {
  12283. sprintf((char*)buf_log_evcomm,
  12284. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12285. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12286. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12287. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12288. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12289. }
  12290. else
  12291. {
  12292. }
  12293. break;
  12294. }
  12295. //-------------------------------------------
  12296. case PowerDeliveryRequestStop: //49,
  12297. {
  12298. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12299. {
  12300. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12301. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12302. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12303. ftime(&SeqStartTime);
  12304. #endif
  12305. }
  12306. else
  12307. {
  12308. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12309. Update_V2G_Flow_Status(Other_Fault);
  12310. }
  12311. req_is_responsed = TRUE;
  12312. break;
  12313. }
  12314. case PowerDeliveryResponseStop: //50,
  12315. {
  12316. //STEP 1: Check for Process Timeout
  12317. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12318. ftime(&SeqEndTime);
  12319. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12320. {
  12321. sprintf((char*)buf_log_evcomm,
  12322. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12323. DiffTimeb(SeqStartTime, SeqEndTime),
  12324. 2000);
  12325. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12326. Update_V2G_Flow_Status(Sequence_Timeout);
  12327. break;
  12328. }
  12329. #endif
  12330. //STEP 2: Check for WeldingDetectionReq Message
  12331. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12332. {
  12333. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12334. Update_V2G_Flow_Status(WeldingDetectionRequest);
  12335. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  12336. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  12337. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12338. ftime(&SeqStartTime);
  12339. #endif
  12340. }
  12341. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12342. {
  12343. Update_V2G_Flow_Status(SessionStopRequest);
  12344. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12345. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12346. {
  12347. Update_V2G_Flow_Status(SessionStopResponse);
  12348. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12349. }
  12350. else
  12351. {
  12352. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12353. Update_V2G_Flow_Status(Other_Fault);
  12354. }
  12355. }
  12356. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12357. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12358. {
  12359. sprintf((char*)buf_log_evcomm,
  12360. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12361. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12362. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12363. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12364. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12365. }
  12366. else
  12367. {
  12368. }
  12369. break;
  12370. }
  12371. //-------------------------------------------
  12372. case WeldingDetectionRequest: //51,
  12373. {
  12374. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  12375. {
  12376. Update_V2G_Flow_Status(WeldingDetectionResponse);
  12377. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12378. }
  12379. else
  12380. {
  12381. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  12382. Update_V2G_Flow_Status(Other_Fault);
  12383. }
  12384. req_is_responsed = TRUE;
  12385. break;
  12386. }
  12387. case WeldingDetectionResponse: //52,
  12388. {
  12389. //STEP 1: Check for Process Timeout
  12390. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12391. ftime(&SeqEndTime);
  12392. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  12393. {
  12394. sprintf((char*)buf_log_evcomm,
  12395. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12396. DiffTimeb(SeqStartTime, SeqEndTime),
  12397. V2G_SECC_WeldingDetection_Performance_Time);
  12398. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12399. Update_V2G_Flow_Status(Sequence_Timeout);
  12400. break;
  12401. }
  12402. #endif
  12403. //STEP 2: Check for WeldingDetectionReq Message
  12404. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12405. {
  12406. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12407. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  12408. {
  12409. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12410. }
  12411. else
  12412. {
  12413. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  12414. Update_V2G_Flow_Status(Other_Fault);
  12415. }
  12416. req_is_responsed = TRUE;
  12417. }
  12418. //STEP 3: Check for SessionStopReq Message
  12419. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12420. {
  12421. Update_V2G_Flow_Status(SessionStopRequest);
  12422. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12423. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  12424. }
  12425. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12426. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12427. {
  12428. sprintf((char*)buf_log_evcomm,
  12429. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12430. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12431. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12432. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12433. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12434. }
  12435. else
  12436. {
  12437. }
  12438. break;
  12439. }
  12440. //-------------------------------------------
  12441. case SessionStopRequest: //53,
  12442. {
  12443. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12444. {
  12445. Update_V2G_Flow_Status(SessionStopResponse);
  12446. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12447. }
  12448. else
  12449. {
  12450. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12451. Update_V2G_Flow_Status(Other_Fault);
  12452. }
  12453. req_is_responsed = TRUE;
  12454. break;
  12455. }
  12456. case SessionStopResponse: //54,
  12457. {
  12458. break;
  12459. }
  12460. //-------------------------------------------
  12461. default:
  12462. {
  12463. break;
  12464. }
  12465. }
  12466. }
  12467. return 0;
  12468. }
  12469. /*===========================================================================
  12470. FUNCTION: V2gMsg_Process_iso1_AC
  12471. DESCRIPTION:
  12472. PRE-CONDITION:
  12473. INPUT:
  12474. 1. V2gFlowStatus
  12475. OUTPUT:
  12476. GLOBAL VARIABLES:
  12477. 1. V2gFlowStatus
  12478. =============================================================================*/
  12479. int V2gMsg_Process_iso1_AC(int AcceptFd)
  12480. {
  12481. unsigned char req_is_responsed = FALSE;
  12482. while (req_is_responsed == FALSE)
  12483. {
  12484. //Check if it is in End_Process
  12485. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  12486. {
  12487. break;
  12488. }
  12489. switch(V2gFlowStatus)
  12490. {
  12491. //-------------------------------------------
  12492. case SupportedAppProtocolRequest: //17
  12493. {
  12494. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  12495. {
  12496. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  12497. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  12498. {
  12499. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12500. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  12501. }
  12502. else
  12503. {
  12504. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  12505. Update_V2G_Flow_Status(Other_Fault);
  12506. }
  12507. }
  12508. req_is_responsed = TRUE;
  12509. break;
  12510. }
  12511. case SupportedAppProtocolResponse: //18
  12512. {
  12513. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  12514. {
  12515. Update_V2G_Flow_Status(SessionSetupRequest);
  12516. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12517. }
  12518. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12519. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12520. {
  12521. sprintf((char*)buf_log_evcomm,
  12522. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12523. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12524. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12525. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12526. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12527. }
  12528. else
  12529. {
  12530. }
  12531. break;
  12532. }
  12533. //-------------------------------------------
  12534. case SessionSetupRequest: //19
  12535. {
  12536. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  12537. {
  12538. Update_V2G_Flow_Status(SessionSetupResponse);
  12539. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12540. }
  12541. else
  12542. {
  12543. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  12544. Update_V2G_Flow_Status(Other_Fault);
  12545. }
  12546. req_is_responsed = TRUE;
  12547. break;
  12548. }
  12549. case SessionSetupResponse: //20
  12550. {
  12551. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  12552. {
  12553. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  12554. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12555. }
  12556. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12557. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12558. {
  12559. sprintf((char*)buf_log_evcomm,
  12560. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12561. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12562. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12563. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12564. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12565. }
  12566. else
  12567. {
  12568. }
  12569. break;
  12570. }
  12571. //-------------------------------------------
  12572. case ServiceDiscoveryRequest: //21
  12573. {
  12574. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  12575. {
  12576. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  12577. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12578. }
  12579. else
  12580. {
  12581. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  12582. Update_V2G_Flow_Status(Other_Fault);
  12583. }
  12584. req_is_responsed = TRUE;
  12585. break;
  12586. }
  12587. case ServiceDiscoveryResponse: //22
  12588. {
  12589. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  12590. {
  12591. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  12592. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12593. }
  12594. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12595. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12596. {
  12597. sprintf((char*)buf_log_evcomm,
  12598. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12599. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12600. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12601. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12602. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12603. }
  12604. else
  12605. {
  12606. }
  12607. break;
  12608. }
  12609. //-------------------------------------------
  12610. case ServiceAndPaymentSelectionRequest: //25
  12611. {
  12612. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  12613. {
  12614. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  12615. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12616. }
  12617. else
  12618. {
  12619. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  12620. Update_V2G_Flow_Status(Other_Fault);
  12621. }
  12622. req_is_responsed = TRUE;
  12623. break;
  12624. }
  12625. case ServiceAndPaymentSelectionResponse://26
  12626. {
  12627. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12628. {
  12629. Update_V2G_Flow_Status(AuthorizationRequest);
  12630. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12631. }
  12632. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12633. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12634. {
  12635. sprintf((char*)buf_log_evcomm,
  12636. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12637. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12638. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12639. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12640. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12641. }
  12642. else
  12643. {
  12644. }
  12645. break;
  12646. }
  12647. //-------------------------------------------
  12648. //case ContractAuthenticationReq:
  12649. case AuthorizationRequest: //29
  12650. {
  12651. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  12652. {
  12653. Update_V2G_Flow_Status(AuthorizationResponse);
  12654. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12655. }
  12656. else
  12657. {
  12658. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  12659. Update_V2G_Flow_Status(Other_Fault);
  12660. }
  12661. break;
  12662. }
  12663. case AuthorizationResponse: //30
  12664. {
  12665. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12666. {
  12667. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12668. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  12669. {
  12670. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12671. }
  12672. else
  12673. {
  12674. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  12675. Update_V2G_Flow_Status(Other_Fault);
  12676. }
  12677. req_is_responsed = TRUE;
  12678. }
  12679. //Check for ChargeParameterDiscoveryReq
  12680. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12681. {
  12682. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12683. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  12684. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  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 ChargeParameterDiscoveryRequest: //35
  12706. {
  12707. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12708. {
  12709. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  12710. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12711. }
  12712. else
  12713. {
  12714. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  12715. Update_V2G_Flow_Status(Other_Fault);
  12716. }
  12717. req_is_responsed = TRUE;
  12718. break;
  12719. }
  12720. case ChargeParameterDiscoveryResponse: //36
  12721. {
  12722. //STEP 1: Check for Process Timeout
  12723. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12724. ftime(&SeqEndTime);
  12725. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  12726. {
  12727. sprintf((char*)buf_log_evcomm,
  12728. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  12729. DiffTimeb(SeqStartTime, SeqEndTime),
  12730. V2G_SECC_ChargingParameter_Performance_Time);
  12731. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12732. Update_V2G_Flow_Status(Sequence_Timeout);
  12733. break;
  12734. }
  12735. #endif
  12736. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12737. {
  12738. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12739. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12740. {
  12741. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12742. }
  12743. else
  12744. {
  12745. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  12746. Update_V2G_Flow_Status(Other_Fault);
  12747. }
  12748. req_is_responsed = TRUE;
  12749. }
  12750. //STEP 3: Wait for PowerDeliveryReq Message
  12751. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12752. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12753. {
  12754. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  12755. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12756. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12757. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12758. ftime(&SeqStartTime);
  12759. #endif
  12760. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12761. {
  12762. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12763. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12764. }
  12765. else
  12766. {
  12767. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12768. Update_V2G_Flow_Status(Other_Fault);
  12769. }
  12770. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12771. ftime(&SeqStartTime);
  12772. #endif
  12773. }
  12774. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12775. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12776. {
  12777. sprintf((char*)buf_log_evcomm,
  12778. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12779. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12780. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12781. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12782. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12783. }
  12784. else
  12785. {
  12786. }
  12787. break;
  12788. }
  12789. //-------------------------------------------
  12790. case PowerDeliveryRequestStart: //41
  12791. {
  12792. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  12793. {
  12794. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  12795. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12796. }
  12797. else
  12798. {
  12799. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  12800. Update_V2G_Flow_Status(Other_Fault);
  12801. }
  12802. req_is_responsed = TRUE;
  12803. break;
  12804. }
  12805. case PowerDeliveryResponsetStart: //42
  12806. {
  12807. //STEP 1: Check for Process Timeout
  12808. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12809. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12810. {
  12811. ftime(&SeqEndTime);
  12812. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12813. {
  12814. sprintf((char*)buf_log_evcomm,
  12815. "Wait for ChargingStatusReq Timeout - (%.02lf of %d ms)\n",
  12816. DiffTimeb(SeqStartTime, SeqEndTime),
  12817. 2000);
  12818. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12819. Update_V2G_Flow_Status(Sequence_Timeout);
  12820. }
  12821. break;
  12822. }
  12823. #endif
  12824. //STEP 2: Wait for ChargingStatusReq Message
  12825. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  12826. {
  12827. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12828. Update_V2G_Flow_Status(ChargingStatusRequest);
  12829. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargingStatusReq: energy transfering...");
  12830. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_Start);
  12831. }
  12832. else
  12833. {
  12834. }
  12835. break;
  12836. }
  12837. //-------------------------------------------
  12838. case ChargingStatusRequest: //43
  12839. {
  12840. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  12841. {
  12842. Update_V2G_Flow_Status(ChargingStatusResponse);
  12843. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12844. }
  12845. else
  12846. {
  12847. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargingStatusRes: fail");
  12848. Update_V2G_Flow_Status(Other_Fault);
  12849. }
  12850. req_is_responsed = TRUE;
  12851. break;
  12852. }
  12853. case ChargingStatusResponse: //44
  12854. {
  12855. //STEP 1: Wait for ChargingStatusReq Message
  12856. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  12857. {
  12858. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12859. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  12860. {
  12861. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12862. }
  12863. else
  12864. {
  12865. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargingStatusRes: fail");
  12866. Update_V2G_Flow_Status(Other_Fault);
  12867. }
  12868. req_is_responsed = TRUE;
  12869. }
  12870. //STEP 2: Wait for PowerDeliveryReq Message
  12871. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12872. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12873. {
  12874. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12875. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12876. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_End);
  12877. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12878. ftime(&SeqStartTime);
  12879. #endif
  12880. }
  12881. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12882. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12883. {
  12884. sprintf((char*)buf_log_evcomm,
  12885. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12886. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12887. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12888. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12889. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12890. }
  12891. else
  12892. {
  12893. }
  12894. break;
  12895. }
  12896. //-------------------------------------------
  12897. case PowerDeliveryRequestStop: //49
  12898. {
  12899. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12900. {
  12901. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12902. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12903. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12904. ftime(&SeqStartTime);
  12905. #endif
  12906. }
  12907. else
  12908. {
  12909. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12910. Update_V2G_Flow_Status(Other_Fault);
  12911. }
  12912. req_is_responsed = TRUE;
  12913. break;
  12914. }
  12915. case PowerDeliveryResponseStop: //50
  12916. {
  12917. //STEP 1: Check for Process Timeout
  12918. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12919. ftime(&SeqEndTime);
  12920. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12921. {
  12922. sprintf((char*)buf_log_evcomm,
  12923. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12924. DiffTimeb(SeqStartTime, SeqEndTime),
  12925. 2000);
  12926. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12927. Update_V2G_Flow_Status(Sequence_Timeout);
  12928. break;
  12929. }
  12930. #endif
  12931. //STEP 3: Check for SessionStopReq Message
  12932. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12933. {
  12934. Update_V2G_Flow_Status(SessionStopRequest);
  12935. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12936. }
  12937. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12938. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12939. {
  12940. sprintf((char*)buf_log_evcomm,
  12941. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12942. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12943. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12944. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12945. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12946. }
  12947. else
  12948. {
  12949. }
  12950. break;
  12951. }
  12952. //-------------------------------------------
  12953. case SessionStopRequest: //53
  12954. {
  12955. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12956. {
  12957. Update_V2G_Flow_Status(SessionStopResponse);
  12958. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12959. }
  12960. else
  12961. {
  12962. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12963. Update_V2G_Flow_Status(Other_Fault);
  12964. }
  12965. req_is_responsed = TRUE;
  12966. break;
  12967. }
  12968. case SessionStopResponse: //54
  12969. {
  12970. break;
  12971. }
  12972. //-------------------------------------------
  12973. default:
  12974. {
  12975. break;
  12976. }
  12977. }
  12978. }
  12979. return 0;
  12980. }
  12981. /*===========================================================================
  12982. FUNCTION: V2gMsg_Process_iso1
  12983. DESCRIPTION:
  12984. 1. EnergyTransferMode:
  12985. AC_single_phase_core = 0,
  12986. AC_three_phase_core = 1,
  12987. DC_core = 2,
  12988. DC_extended = 3,
  12989. DC_combo_core = 4,
  12990. DC_unique = 5
  12991. iso1EnergyTransferModeType_AC_single_phase_core = 0,
  12992. iso1EnergyTransferModeType_AC_three_phase_core = 1,
  12993. iso1EnergyTransferModeType_DC_core = 2,
  12994. iso1EnergyTransferModeType_DC_extended = 3,
  12995. iso1EnergyTransferModeType_DC_combo_core = 4,
  12996. iso1EnergyTransferModeType_DC_unique = 5
  12997. PRE-CONDITION:
  12998. INPUT:
  12999. 1. V2gFlowStatus
  13000. OUTPUT:
  13001. GLOBAL VARIABLES:
  13002. 1. V2gFlowStatus
  13003. =============================================================================*/
  13004. int V2gMsg_Process_iso1(int AcceptFd, unsigned char EnergyTransferMode)
  13005. {
  13006. switch (EnergyTransferMode)
  13007. {
  13008. case DC_extended:
  13009. {
  13010. V2gMsg_Process_iso1_DC(AcceptFd);
  13011. break;
  13012. }
  13013. case AC_single_phase_core:
  13014. case AC_three_phase_core:
  13015. {
  13016. V2gMsg_Process_iso1_AC(AcceptFd);
  13017. break;
  13018. }
  13019. default:
  13020. {
  13021. sprintf((char*)buf_log_evcomm,
  13022. "[ISO1][Warning]Unexpected EnergyTransferMode(%d)",
  13023. EnergyTransferMode);
  13024. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13025. break;
  13026. }
  13027. }
  13028. return 0;
  13029. }
  13030. /*===========================================================================
  13031. FUNCTION: V2gMsg_Process_iso2_DC
  13032. DESCRIPTION:
  13033. PRE-CONDITION:
  13034. INPUT:
  13035. 1. V2gFlowStatus
  13036. OUTPUT:
  13037. GLOBAL VARIABLES:
  13038. 1. V2gFlowStatus
  13039. =============================================================================*/
  13040. int V2gMsg_Process_iso2_DC(int AcceptFd)
  13041. {
  13042. unsigned char req_is_responsed = FALSE;
  13043. while (req_is_responsed == FALSE)
  13044. {
  13045. //Check if it is in End_Process
  13046. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  13047. {
  13048. break;
  13049. }
  13050. switch(V2gFlowStatus)
  13051. {
  13052. //-------------------------------------------
  13053. case SupportedAppProtocolRequest:
  13054. {
  13055. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  13056. {
  13057. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  13058. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  13059. {
  13060. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13061. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  13062. }
  13063. else
  13064. {
  13065. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  13066. Update_V2G_Flow_Status(Other_Fault);
  13067. }
  13068. }
  13069. req_is_responsed = TRUE;
  13070. break;
  13071. }
  13072. case SupportedAppProtocolResponse:
  13073. {
  13074. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  13075. {
  13076. Update_V2G_Flow_Status(SessionSetupRequest);
  13077. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13078. }
  13079. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13080. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13081. {
  13082. sprintf((char*)buf_log_evcomm,
  13083. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13084. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13085. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13086. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13087. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13088. }
  13089. else
  13090. {
  13091. }
  13092. break;
  13093. }
  13094. //-------------------------------------------
  13095. case SessionSetupRequest: //19
  13096. {
  13097. if (Proc_iso2_SessionSetupReq(AcceptFd) == 0)
  13098. {
  13099. Update_V2G_Flow_Status(SessionSetupResponse);
  13100. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13101. }
  13102. else
  13103. {
  13104. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  13105. Update_V2G_Flow_Status(Other_Fault);
  13106. }
  13107. req_is_responsed = TRUE;
  13108. break;
  13109. }
  13110. case SessionSetupResponse: //20
  13111. {
  13112. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  13113. {
  13114. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  13115. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13116. }
  13117. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13118. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13119. {
  13120. sprintf((char*)buf_log_evcomm,
  13121. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13122. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13123. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13124. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13125. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13126. }
  13127. else
  13128. {
  13129. }
  13130. break;
  13131. }
  13132. #if 0
  13133. //-------------------------------------------
  13134. case ServiceDiscoveryRequest: //21
  13135. {
  13136. if (Proc_iso2_ServiceDiscoveryReq(AcceptFd) == 0)
  13137. {
  13138. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  13139. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13140. }
  13141. else
  13142. {
  13143. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  13144. Update_V2G_Flow_Status(Other_Fault);
  13145. }
  13146. req_is_responsed = TRUE;
  13147. break;
  13148. }
  13149. case ServiceDiscoveryResponse: //22
  13150. {
  13151. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  13152. {
  13153. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  13154. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13155. }
  13156. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13157. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13158. {
  13159. sprintf((char*)buf_log_evcomm,
  13160. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13161. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13162. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13163. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13164. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13165. }
  13166. else
  13167. {
  13168. break;
  13169. }
  13170. }
  13171. //-------------------------------------------
  13172. case ServiceAndPaymentSelectionRequest: //25
  13173. {
  13174. if (Proc_iso2_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  13175. {
  13176. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  13177. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13178. }
  13179. else
  13180. {
  13181. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  13182. Update_V2G_Flow_Status(Other_Fault);
  13183. }
  13184. req_is_responsed = TRUE;
  13185. break;
  13186. }
  13187. case ServiceAndPaymentSelectionResponse: //26
  13188. {
  13189. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13190. {
  13191. Update_V2G_Flow_Status(AuthorizationRequest);
  13192. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13193. }
  13194. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13195. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13196. {
  13197. sprintf((char*)buf_log_evcomm,
  13198. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13199. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13200. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13201. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13202. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13203. }
  13204. else
  13205. {
  13206. break;
  13207. }
  13208. }
  13209. //-------------------------------------------
  13210. //case ContractAuthenticationReq:
  13211. case AuthorizationRequest: //29
  13212. {
  13213. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  13214. {
  13215. Update_V2G_Flow_Status(AuthorizationResponse);
  13216. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13217. }
  13218. else
  13219. {
  13220. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  13221. Update_V2G_Flow_Status(Other_Fault);
  13222. }
  13223. req_is_responsed = TRUE;
  13224. break;
  13225. }
  13226. case AuthorizationResponse: //30
  13227. {
  13228. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13229. {
  13230. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13231. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  13232. {
  13233. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13234. }
  13235. else
  13236. {
  13237. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  13238. Update_V2G_Flow_Status(Other_Fault);
  13239. }
  13240. req_is_responsed = TRUE;
  13241. break;
  13242. }
  13243. //Check for ChargeParameterDiscoveryReq
  13244. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13245. {
  13246. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13247. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  13248. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  13249. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13250. ftime(&SeqStartTime);
  13251. #endif
  13252. }
  13253. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13254. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13255. {
  13256. sprintf((char*)buf_log_evcomm,
  13257. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13258. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13259. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13260. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13261. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13262. }
  13263. else
  13264. {
  13265. break;
  13266. }
  13267. }
  13268. //-------------------------------------------
  13269. case ChargeParameterDiscoveryRequest: //35
  13270. {
  13271. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13272. {
  13273. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  13274. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13275. }
  13276. else
  13277. {
  13278. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  13279. Update_V2G_Flow_Status(Other_Fault);
  13280. }
  13281. req_is_responsed = TRUE;
  13282. break;
  13283. }
  13284. case ChargeParameterDiscoveryResponse:
  13285. {
  13286. //STEP 1: Check for Process Timeout
  13287. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13288. ftime(&SeqEndTime);
  13289. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  13290. {
  13291. sprintf((char*)buf_log_evcomm,
  13292. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  13293. DiffTimeb(SeqStartTime, SeqEndTime),
  13294. V2G_SECC_ChargingParameter_Performance_Time);
  13295. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13296. Update_V2G_Flow_Status(Sequence_Timeout);
  13297. break;
  13298. }
  13299. #endif
  13300. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13301. {
  13302. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13303. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13304. {
  13305. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13306. }
  13307. else
  13308. {
  13309. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  13310. Update_V2G_Flow_Status(Other_Fault);
  13311. }
  13312. req_is_responsed = TRUE;
  13313. break;
  13314. }
  13315. //STEP 2: Check for CableCheckReq message
  13316. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13317. {
  13318. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13319. Update_V2G_Flow_Status(CableCheckRequest);
  13320. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  13321. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  13322. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13323. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13324. ftime(&SeqStartTime);
  13325. #endif
  13326. }
  13327. //STEP 3: Wait for PowerDeliveryReq Message
  13328. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13329. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13330. {
  13331. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13332. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13333. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13334. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13335. ftime(&SeqStartTime);
  13336. #endif
  13337. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13338. {
  13339. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13340. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13341. }
  13342. else
  13343. {
  13344. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13345. Update_V2G_Flow_Status(Other_Fault);
  13346. }
  13347. break;
  13348. }
  13349. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13350. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13351. {
  13352. sprintf((char*)buf_log_evcomm,
  13353. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13354. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13355. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13356. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13357. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13358. }
  13359. else
  13360. {
  13361. break;
  13362. }
  13363. }
  13364. //-------------------------------------------
  13365. case CableCheckRequest: //37
  13366. {
  13367. //STEP 3: Execute Cable Check Process
  13368. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  13369. {
  13370. Update_V2G_Flow_Status(CableCheckResponse);
  13371. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13372. }
  13373. else
  13374. {
  13375. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  13376. Update_V2G_Flow_Status(Other_Fault);
  13377. }
  13378. req_is_responsed = TRUE;
  13379. break;
  13380. }
  13381. case CableCheckResponse: //38
  13382. {
  13383. //STEP 1: Check for Process Timeout
  13384. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13385. ftime(&SeqEndTime);
  13386. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  13387. {
  13388. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  13389. sprintf((char*)buf_log_evcomm,
  13390. "CableCheck Timeout - (%.02lf of %d ms)\n",
  13391. DiffTimeb(SeqStartTime, SeqEndTime),
  13392. V2G_SECC_CableCheck_Performance_Time);
  13393. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13394. Update_V2G_Flow_Status(Sequence_Timeout);
  13395. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13396. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  13397. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13398. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13399. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13400. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13401. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  13402. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  13403. break;
  13404. }
  13405. #endif
  13406. //STEP 2: Check for CableCheckReq message
  13407. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13408. {
  13409. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13410. //STEP 3: Execute Cable Check Process
  13411. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  13412. {
  13413. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13414. }
  13415. else
  13416. {
  13417. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  13418. Update_V2G_Flow_Status(Other_Fault);
  13419. }
  13420. req_is_responsed = TRUE;
  13421. break;
  13422. }
  13423. //STEP 3: Check for PreChargeReq message
  13424. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13425. {
  13426. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13427. Update_V2G_Flow_Status(PreChargeRequest);
  13428. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  13429. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13430. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  13431. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13432. ftime(&SeqStartTime);
  13433. #endif
  13434. }
  13435. //STEP 3: Wait for PowerDeliveryReq Message
  13436. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13437. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13438. {
  13439. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13440. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13441. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13442. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13443. ftime(&SeqStartTime);
  13444. #endif
  13445. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13446. {
  13447. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13448. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13449. }
  13450. else
  13451. {
  13452. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13453. Update_V2G_Flow_Status(Other_Fault);
  13454. }
  13455. break;
  13456. }
  13457. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13458. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13459. {
  13460. sprintf((char*)buf_log_evcomm,
  13461. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13462. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13463. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13464. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13465. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13466. }
  13467. else
  13468. {
  13469. break;
  13470. }
  13471. }
  13472. //-------------------------------------------
  13473. case PreChargeRequest: //39
  13474. {
  13475. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  13476. {
  13477. Update_V2G_Flow_Status(PreChargeResponse);
  13478. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13479. }
  13480. else
  13481. {
  13482. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  13483. Update_V2G_Flow_Status(Other_Fault);
  13484. }
  13485. req_is_responsed = TRUE;
  13486. break;
  13487. }
  13488. case PreChargeResponse: //40
  13489. {
  13490. //STEP 1: Check for Process Timeout
  13491. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13492. ftime(&SeqEndTime);
  13493. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  13494. {
  13495. sprintf((char*)buf_log_evcomm,
  13496. "Precharge Timeout - (%.02lf of %d ms)\n",
  13497. DiffTimeb(SeqStartTime, SeqEndTime),
  13498. V2G_SECC_PreCharge_Performance_Time);
  13499. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13500. Update_V2G_Flow_Status(Sequence_Timeout);
  13501. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13502. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  13503. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13504. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13505. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13506. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13507. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  13508. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  13509. break;
  13510. }
  13511. #endif
  13512. //STEP 2: Check for PreChargeReq message
  13513. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13514. {
  13515. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13516. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  13517. {
  13518. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13519. }
  13520. else
  13521. {
  13522. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  13523. Update_V2G_Flow_Status(Other_Fault);
  13524. }
  13525. req_is_responsed = TRUE;
  13526. break;
  13527. }
  13528. //STEP 3: Check for PowerDeliveryReq message
  13529. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13530. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13531. {
  13532. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13533. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  13534. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  13535. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13536. ftime(&SeqStartTime);
  13537. #endif
  13538. }
  13539. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13540. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13541. {
  13542. sprintf((char*)buf_log_evcomm,
  13543. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13544. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13545. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13546. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13547. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13548. }
  13549. else
  13550. {
  13551. break;
  13552. }
  13553. }
  13554. //-------------------------------------------
  13555. case PowerDeliveryRequestStart: //41
  13556. {
  13557. if (Proc_iso2_PowerDeliveryStartReq(AcceptFd) == 0)
  13558. {
  13559. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  13560. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13561. }
  13562. else
  13563. {
  13564. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  13565. Update_V2G_Flow_Status(Other_Fault);
  13566. }
  13567. req_is_responsed = TRUE;
  13568. break;
  13569. }
  13570. case PowerDeliveryResponsetStart: //42
  13571. {
  13572. //STEP 1: Check for Process Timeout
  13573. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13574. if (ccs_exi_doc_ISO2.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  13575. {
  13576. ftime(&SeqEndTime);
  13577. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  13578. {
  13579. sprintf((char*)buf_log_evcomm,
  13580. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  13581. DiffTimeb(SeqStartTime, SeqEndTime),
  13582. 2000);
  13583. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13584. Update_V2G_Flow_Status(Sequence_Timeout);
  13585. }
  13586. break;
  13587. }
  13588. #endif
  13589. //STEP 2: Wait for CurrentDemandReq Message
  13590. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13591. {
  13592. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13593. Update_V2G_Flow_Status(CurrentDemandRequest);
  13594. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  13595. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  13596. }
  13597. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13598. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13599. {
  13600. sprintf((char*)buf_log_evcomm,
  13601. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13602. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13603. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13604. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13605. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13606. }
  13607. else
  13608. {
  13609. break;
  13610. }
  13611. }
  13612. //-------------------------------------------
  13613. case CurrentDemandRequest: //45,
  13614. {
  13615. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  13616. {
  13617. Update_V2G_Flow_Status(CurrentDemandResponse);
  13618. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13619. }
  13620. else
  13621. {
  13622. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  13623. Update_V2G_Flow_Status(Other_Fault);
  13624. }
  13625. req_is_responsed = TRUE;
  13626. break;
  13627. }
  13628. case CurrentDemandResponse: //46,
  13629. {
  13630. //STEP 1: Wait for CurrentDemandReq Message
  13631. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13632. {
  13633. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13634. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  13635. {
  13636. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13637. }
  13638. else
  13639. {
  13640. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  13641. Update_V2G_Flow_Status(Other_Fault);
  13642. }
  13643. req_is_responsed = TRUE;
  13644. break;
  13645. }
  13646. //STEP 2: Wait for PowerDeliveryReq Message
  13647. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13648. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13649. {
  13650. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13651. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13652. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  13653. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13654. ftime(&SeqStartTime);
  13655. #endif
  13656. }
  13657. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13658. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13659. {
  13660. sprintf((char*)buf_log_evcomm,
  13661. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13662. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13663. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13664. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13665. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13666. }
  13667. else
  13668. {
  13669. break;
  13670. }
  13671. }
  13672. //-------------------------------------------
  13673. case PowerDeliveryRequestStop: //49,
  13674. {
  13675. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13676. {
  13677. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13678. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13679. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13680. ftime(&SeqStartTime);
  13681. #endif
  13682. }
  13683. else
  13684. {
  13685. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13686. Update_V2G_Flow_Status(Other_Fault);
  13687. }
  13688. req_is_responsed = TRUE;
  13689. break;
  13690. }
  13691. case PowerDeliveryResponseStop: //50,
  13692. {
  13693. //STEP 1: Check for Process Timeout
  13694. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13695. ftime(&SeqEndTime);
  13696. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  13697. {
  13698. sprintf((char*)buf_log_evcomm,
  13699. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13700. DiffTimeb(SeqStartTime, SeqEndTime),
  13701. 2000);
  13702. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13703. Update_V2G_Flow_Status(Sequence_Timeout);
  13704. break;
  13705. }
  13706. #endif
  13707. //STEP 2: Check for WeldingDetectionReq Message
  13708. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13709. {
  13710. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13711. Update_V2G_Flow_Status(WeldingDetectionRequest);
  13712. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  13713. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  13714. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13715. ftime(&SeqStartTime);
  13716. #endif
  13717. }
  13718. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13719. {
  13720. Update_V2G_Flow_Status(SessionStopRequest);
  13721. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13722. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  13723. {
  13724. Update_V2G_Flow_Status(SessionStopResponse);
  13725. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13726. }
  13727. else
  13728. {
  13729. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  13730. Update_V2G_Flow_Status(Other_Fault);
  13731. }
  13732. break;
  13733. }
  13734. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13735. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13736. {
  13737. sprintf((char*)buf_log_evcomm,
  13738. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13739. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13740. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13741. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13742. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13743. }
  13744. else
  13745. {
  13746. break;
  13747. }
  13748. }
  13749. //-------------------------------------------
  13750. case WeldingDetectionRequest: //51,
  13751. {
  13752. if (Proc_iso2_WeldingDetectionReq(AcceptFd) == 0)
  13753. {
  13754. Update_V2G_Flow_Status(WeldingDetectionResponse);
  13755. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13756. }
  13757. else
  13758. {
  13759. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  13760. Update_V2G_Flow_Status(Other_Fault);
  13761. }
  13762. req_is_responsed = TRUE;
  13763. break;
  13764. }
  13765. case WeldingDetectionResponse: //52,
  13766. {
  13767. //STEP 1: Check for Process Timeout
  13768. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13769. ftime(&SeqEndTime);
  13770. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  13771. {
  13772. sprintf((char*)buf_log_evcomm,
  13773. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13774. DiffTimeb(SeqStartTime, SeqEndTime),
  13775. V2G_SECC_WeldingDetection_Performance_Time);
  13776. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13777. Update_V2G_Flow_Status(Sequence_Timeout);
  13778. break;
  13779. }
  13780. #endif
  13781. //STEP 2: Check for WeldingDetectionReq Message
  13782. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13783. {
  13784. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13785. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13786. {
  13787. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13788. }
  13789. else
  13790. {
  13791. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  13792. Update_V2G_Flow_Status(Other_Fault);
  13793. }
  13794. req_is_responsed = TRUE;
  13795. break;
  13796. }
  13797. //STEP 3: Check for SessionStopReq Message
  13798. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13799. {
  13800. Update_V2G_Flow_Status(SessionStopRequest);
  13801. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13802. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  13803. }
  13804. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13805. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13806. {
  13807. sprintf((char*)buf_log_evcomm,
  13808. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13809. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13810. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13811. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13812. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13813. }
  13814. else
  13815. {
  13816. break;
  13817. }
  13818. }
  13819. //-------------------------------------------
  13820. case SessionStopRequest: //53,
  13821. {
  13822. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  13823. {
  13824. Update_V2G_Flow_Status(SessionStopResponse);
  13825. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13826. }
  13827. else
  13828. {
  13829. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  13830. Update_V2G_Flow_Status(Other_Fault);
  13831. }
  13832. req_is_responsed = TRUE;
  13833. //break;
  13834. }
  13835. case SessionStopResponse: //54,
  13836. {
  13837. break;
  13838. }
  13839. #endif
  13840. //-------------------------------------------
  13841. default:
  13842. {
  13843. break;
  13844. }
  13845. }
  13846. }
  13847. return 0;
  13848. }
  13849. /*===========================================================================
  13850. FUNCTION: V2gMsg_Process_iso2_AC
  13851. DESCRIPTION:
  13852. PRE-CONDITION:
  13853. INPUT:
  13854. 1. V2gFlowStatus
  13855. OUTPUT:
  13856. GLOBAL VARIABLES:
  13857. 1. V2gFlowStatus
  13858. =============================================================================*/
  13859. int V2gMsg_Process_iso2_AC(int AcceptFd)
  13860. {
  13861. return 0;
  13862. }
  13863. /*===========================================================================
  13864. FUNCTION: V2gMsg_Process_iso2
  13865. DESCRIPTION:
  13866. PRE-CONDITION:
  13867. INPUT:
  13868. 1. V2gFlowStatus
  13869. OUTPUT:
  13870. GLOBAL VARIABLES:
  13871. 1. V2gFlowStatus
  13872. =============================================================================*/
  13873. int V2gMsg_Process_iso2(int AcceptFd, unsigned char EnergyTransferMode)
  13874. {
  13875. switch (EnergyTransferMode)
  13876. {
  13877. case DC_extended:
  13878. {
  13879. V2gMsg_Process_iso2_DC(AcceptFd);
  13880. break;
  13881. }
  13882. case AC_single_phase_core:
  13883. case AC_three_phase_core:
  13884. {
  13885. V2gMsg_Process_iso2_AC(AcceptFd);
  13886. break;
  13887. }
  13888. default:
  13889. {
  13890. sprintf((char*)buf_log_evcomm,
  13891. "[ISO2][Warning]Unexpected EnergyTransferMode(%d)",
  13892. EnergyTransferMode);
  13893. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13894. break;
  13895. }
  13896. }
  13897. return 0;
  13898. }
  13899. /*===========================================================================
  13900. FUNCTION: V2gMsg_Process
  13901. DESCRIPTION:
  13902. PRE-CONDITION:
  13903. INPUT:
  13904. OUTPUT:
  13905. GLOBAL VARIABLES:
  13906. =============================================================================*/
  13907. int V2gMsg_Process(int AcceptFd)
  13908. {
  13909. int errn = 0;
  13910. switch (ShmCcsData->CommProtocol)
  13911. {
  13912. case V2GT_MSG_PROTOCOL_DIN70121: //0
  13913. {
  13914. V2gMsg_Process_din(AcceptFd);
  13915. break;
  13916. }
  13917. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  13918. {
  13919. V2gMsg_Process_iso1(AcceptFd, ShmCcsData->EnergyTransferMode);
  13920. break;
  13921. }
  13922. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  13923. {
  13924. V2gMsg_Process_iso2(AcceptFd, ShmCcsData->EnergyTransferMode);
  13925. break;
  13926. }
  13927. default:
  13928. {
  13929. sprintf((char*)buf_log_evcomm,
  13930. "[Warning]Unexpected CommProtocol(%d)",
  13931. ShmCcsData->CommProtocol);
  13932. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13933. break;
  13934. }
  13935. }
  13936. return errn;
  13937. }
  13938. /*===========================================================================
  13939. FUNCTION: V2gMsg_Rx
  13940. DESCRIPTION:
  13941. PRE-CONDITION:
  13942. INPUT:
  13943. OUTPUT:
  13944. GLOBAL VARIABLES:
  13945. =============================================================================*/
  13946. int V2gMsg_Rx(int AcceptFd)
  13947. {
  13948. int errn = 0;
  13949. unsigned int packet_size = 0;
  13950. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  13951. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  13952. //[CAUTION] Everytime recv() is called, it will take a default time to wait for TCP packets.
  13953. //The more time you call recv(), the more time you will waste here.
  13954. //Here it is suggested that response immediatedly once you receive any packets.
  13955. //For configuring the Rx waiting time, please use setsockopt().
  13956. if(packet_size > 0) //[Joseph] If there is no data, ignore. (TBD)
  13957. {
  13958. //DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got TCP V2GTP Message: size = %d Bytes\n", packet_size);
  13959. errn = V2gMsgDecoder(V2gtpMsgRxBuf, packet_size, V2gFlowStatus);
  13960. if (errn < 0)
  13961. {
  13962. sprintf((char*)buf_log_evcomm, "[ERROR]V2gMsgDecoder (%d)", errn);
  13963. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13964. }
  13965. }
  13966. return errn;
  13967. }
  13968. /*===========================================================================
  13969. FUNCTION: V2gComm
  13970. DESCRIPTION:
  13971. PRE-CONDITION:
  13972. 1. TCP socket is connected.
  13973. INPUT:
  13974. 1. AcceptFd //TCP Connection ID
  13975. 2. V2gtpMsgRxBuf[] //V2GTP Messages (Header + Payload)
  13976. 3. V2GTP_MSG_RX_BUFFER_SIZE //64*1024 = 65,536 = 65.5K (Bytes)
  13977. OUTPUT:
  13978. GLOBAL VARIABLES:
  13979. 1. V2gtpMsgRxBuf[]
  13980. =============================================================================*/
  13981. int V2gComm(int AcceptFd)
  13982. {
  13983. int errn = 0;
  13984. if (V2gMsg_Rx(AcceptFd) < 0)
  13985. {
  13986. Update_V2G_Flow_Status(Other_Fault);
  13987. errn = -1;
  13988. }
  13989. //following are the response message handling according to status flag
  13990. if (V2gMsg_Process(AcceptFd) < 0)
  13991. {
  13992. errn = -1;
  13993. }
  13994. //Error Check
  13995. //V2G_Error_Monitor();
  13996. return errn;
  13997. }
  13998. /*===========================================================================
  13999. FUNCTION: SdpUdpConnected
  14000. DESCRIPTION:
  14001. PRE-CONDITION:
  14002. INPUT:
  14003. OUTPUT:
  14004. GLOBAL VARIABLES:
  14005. =============================================================================*/
  14006. int SdpUdpConnected()
  14007. {
  14008. int packet_size,Rtn;
  14009. struct sockaddr_in6 ServerAddr,ClientAddr;
  14010. struct V2gtpHeader *header;
  14011. unsigned char *payload;
  14012. if(UdpSock <= 0)
  14013. {
  14014. if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
  14015. {
  14016. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SdpUdpConnected: Fail to open UdpSock");
  14017. return 0;
  14018. }
  14019. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  14020. ServerAddr.sin6_family = AF_INET6;
  14021. ServerAddr.sin6_addr = in6addr_any;
  14022. ServerAddr.sin6_port = htons(SdpUdpServerPort);
  14023. if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  14024. {
  14025. sprintf((char*)buf_log_evcomm,
  14026. "SdpUdpConnected: Fail to bind UdpSock(%d)",
  14027. UdpSock);
  14028. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14029. close(UdpSock);
  14030. UdpSock = -1;
  14031. return 0;
  14032. }
  14033. sprintf((char*)buf_log_evcomm, "[UdpSock]opend:%d", UdpSock);
  14034. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14035. sprintf((char*)buf_log_evcomm, "[SDP]Req from EVCC: waiting...(%d)", UdpSock);
  14036. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14037. }
  14038. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  14039. memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
  14040. Rtn = sizeof(struct sockaddr_in6);
  14041. packet_size = recvfrom(UdpSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, (socklen_t *)&Rtn);
  14042. if(packet_size > 0)
  14043. {
  14044. header = (struct V2gtpHeader *) V2gtpMsgRxBuf;
  14045. payload = V2gtpMsgRxBuf+sizeof(struct V2gtpHeader);
  14046. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  14047. {
  14048. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got UDP packet_size = %d (Bytes)\n", packet_size);
  14049. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
  14050. DEBUG_PRINTF_EVCOMM_DETAIL("***** Received SDP Packet *****\n");
  14051. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  14052. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  14053. for(Rtn = 0; Rtn < 16; Rtn += 2)
  14054. {
  14055. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  14056. }
  14057. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14058. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n",ClientAddr.sin6_port);
  14059. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n",header->ProtocolVersion);
  14060. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n",header->InverseProtocolVersion);
  14061. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n",htons(header->PayloadType));
  14062. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n",htonl(header->PayloadLength));
  14063. DEBUG_PRINTF_EVCOMM_DETAIL("htons(header->PayloadType)=0x%x\n",htons(header->PayloadType));
  14064. }
  14065. #endif
  14066. if( (header->ProtocolVersion == 0x01) &&
  14067. (header->InverseProtocolVersion == 0xFE) &&
  14068. (htons(header->PayloadType) == V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
  14069. {
  14070. sprintf((char*)buf_log_evcomm, "[SDP][Rx]Req from EVCC: GOT(%d)", UdpSock);
  14071. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14072. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", *(payload + 0));
  14073. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", *(payload + 1));
  14074. header->PayloadType = htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
  14075. header->PayloadLength = htonl(20); //Fixed Length=20
  14076. memset(payload, 0, 20);
  14077. // MAC address[0:2] + FFFE + MAC address[3:5]
  14078. payload[0] = (IPV6_LINK_LOCAL_PREFIX>>8) & 0xFF;
  14079. payload[1] = IPV6_LINK_LOCAL_PREFIX & 0xFF;
  14080. payload[8 ]= CsuMac[0];
  14081. payload[8] ^= 0x02;// bit 1 should complemented.
  14082. payload[9] = CsuMac[1];
  14083. payload[10] = CsuMac[2];
  14084. payload[11] = 0xFF;
  14085. payload[12] = 0xFE;
  14086. payload[13] = CsuMac[3];
  14087. payload[14] = CsuMac[4];
  14088. payload[15] = CsuMac[5];
  14089. //TCP port
  14090. payload[16] = (EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active>>8) & 0xFF;
  14091. payload[17] = EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active & 0xFF;
  14092. payload[18] = SDP_PAYLOAD_SECURITY_NONE; //Security
  14093. payload[19] = SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
  14094. //[To-Do] Setup the TCP in advance to receive the coming TCP handshke messages after SDP response.
  14095. Rtn = sendto(UdpSock, V2gtpMsgRxBuf, sizeof(struct V2gtpHeader) + htonl(header->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
  14096. sprintf((char*)buf_log_evcomm, "[SDP][Tx]Res from SECC");
  14097. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14098. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  14099. {
  14100. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response SDP Packet *****\n");
  14101. DEBUG_PRINTF_EVCOMM_DETAIL("Send size=%d\n",Rtn);
  14102. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Address=");
  14103. for(Rtn = 0; Rtn < 16; Rtn++)
  14104. {
  14105. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ", ClientAddr.sin6_addr.s6_addr[Rtn]);
  14106. }
  14107. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14108. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Port=%d\n", ClientAddr.sin6_port);
  14109. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n", header->ProtocolVersion);
  14110. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n", header->InverseProtocolVersion);
  14111. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n", htons(header->PayloadType));
  14112. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n", htonl(header->PayloadLength));
  14113. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Ipv6 Address=");
  14114. for(Rtn = 0; Rtn < 16; Rtn++)
  14115. {
  14116. DEBUG_PRINTF_EVCOMM_DETAIL("%02x:",payload[Rtn]);
  14117. }
  14118. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14119. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Port=%d\n", (payload[16]<<8 | payload[17]));
  14120. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", payload[19]);
  14121. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", payload[20]);
  14122. }
  14123. #endif
  14124. if(Rtn > 0)
  14125. {
  14126. return 1;
  14127. }
  14128. }
  14129. }
  14130. return 0;
  14131. }
  14132. /*===========================================================================
  14133. FUNCTION: V2gTcpConnected
  14134. DESCRIPTION:
  14135. PRE-CONDITION:
  14136. INPUT:
  14137. OUTPUT:
  14138. GLOBAL VARIABLES:
  14139. =============================================================================*/
  14140. int V2gTcpConnected()
  14141. {
  14142. int Rtn,AcceptFd;
  14143. struct sockaddr_in6 ServerAddr,ClientAddr;
  14144. if(TcpSock <= 0)
  14145. {
  14146. if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) < 0)
  14147. {
  14148. sprintf((char*)buf_log_evcomm,
  14149. "V2gTcpConnected: Fail to open TcpSock (%s)",
  14150. strerror(errno));
  14151. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14152. usleep(100000); //100ms
  14153. return 0;
  14154. }
  14155. fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
  14156. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]socket set: DONE");
  14157. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  14158. ServerAddr.sin6_family = PF_INET6;
  14159. ServerAddr.sin6_addr = in6addr_any;
  14160. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  14161. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 10) + 1);
  14162. //printf("SdpTcpServerPort = %d(DEC)\n", htons(ServerAddr.sin6_port));
  14163. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  14164. {
  14165. sprintf((char*)buf_log_evcomm,
  14166. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  14167. strerror(errno),
  14168. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  14169. );
  14170. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14171. //Change to another TCP port
  14172. /*
  14173. memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
  14174. ServerAddr.sin6_family = PF_INET6;
  14175. ServerAddr.sin6_addr = in6addr_any;
  14176. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 1000) + 1);
  14177. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  14178. */
  14179. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  14180. {
  14181. sprintf((char*)buf_log_evcomm,
  14182. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  14183. strerror(errno),
  14184. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  14185. );
  14186. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14187. usleep(100000); //100ms
  14188. close(TcpSock);
  14189. TcpSock = -1;
  14190. return 0;
  14191. }
  14192. }
  14193. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]blid: DONE");
  14194. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]listen: START");
  14195. if(listen(TcpSock, 1) == -1) //only accept one connection
  14196. {
  14197. sprintf((char*)buf_log_evcomm,
  14198. "V2gTcpConnected: Fail to listen TcpSock (%s)",
  14199. strerror(errno));
  14200. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14201. usleep(100000); //100ms
  14202. close(TcpSock);
  14203. TcpSock = -1;
  14204. return 0;
  14205. }
  14206. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]listen: DONE");
  14207. sprintf((char*)buf_log_evcomm, "[TCP]TcpSock: opened(%d), port=%d", TcpSock, htons(ServerAddr.sin6_port));
  14208. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14209. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]accept: START");
  14210. }
  14211. Rtn = sizeof(struct sockaddr_in6);
  14212. if((AcceptFd = accept(TcpSock, (struct sockaddr *)&ClientAddr, (socklen_t *)&Rtn)) == -1)
  14213. {
  14214. static BOOL tmp = 0;
  14215. if (tmp == 0)
  14216. {
  14217. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]Wait TCP connection...");
  14218. tmp = 1;
  14219. }
  14220. else
  14221. {
  14222. //DEBUG_PRINTF_EVCOMM_DETAIL(".");
  14223. }
  14224. return 0;
  14225. }
  14226. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]accept: DONE\n");
  14227. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  14228. {
  14229. DEBUG_PRINTF_EVCOMM_DETAIL("\n\nAccept one TCP connection:\n");
  14230. DEBUG_PRINTF_EVCOMM_DETAIL("AcceptFd=%d\n",AcceptFd);
  14231. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  14232. for(Rtn = 0; Rtn < 16; Rtn += 2)
  14233. {
  14234. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:", ClientAddr.sin6_addr.s6_addr[Rtn], ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  14235. }
  14236. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14237. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n", ClientAddr.sin6_port);
  14238. }
  14239. #endif
  14240. return AcceptFd;
  14241. }
  14242. /*===========================================================================
  14243. FUNCTION: End_Process
  14244. DESCRIPTION:
  14245. PRE-CONDITION:
  14246. 1. <CAUTION> This function could only be used in SeccComm fork2.
  14247. INPUT:
  14248. OUTPUT:
  14249. GLOBAL VARIABLES:
  14250. =============================================================================*/
  14251. int End_Process()
  14252. {
  14253. if(EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  14254. {
  14255. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "End_Process has been triggered by another event.");
  14256. return -1;
  14257. }
  14258. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Entering...");
  14259. //STEP 1: Ask CSU to Stop
  14260. EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  14261. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  14262. EVCOMM_SYS_INFO.ConnectorLocked = FALSE;
  14263. ShmInternalComm->ChargingPermission = FALSE;
  14264. //Step 2: Close sockets
  14265. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Close sockets...");
  14266. if(RawSock > 0)
  14267. {
  14268. close(RawSock);
  14269. }
  14270. if(UdpSock > 0)
  14271. {
  14272. close(UdpSock);
  14273. }
  14274. if(TcpSock > 0)
  14275. {
  14276. close(TcpSock);
  14277. close(TcpAcceptFd);
  14278. }
  14279. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  14280. //STEP 3: Switch to State E
  14281. //SwitchCpStateE(ENABLE);
  14282. //STEP 4: Close tcpdump
  14283. Sniffer_Tcpdump(DISABLE);
  14284. //STEP 5: Keep 100% PWM for 5 seconds
  14285. OutputCpPwmDuty(100);
  14286. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 5");
  14287. sleep(1);
  14288. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 4");
  14289. sleep(1);
  14290. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 3");
  14291. sleep(1);
  14292. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 2");
  14293. sleep(1);
  14294. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 1");
  14295. sleep(1);
  14296. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 0");
  14297. AttenProfileCnt = 0;
  14298. init_appHandEXIDocument(&ccs_handshake);
  14299. //Qca7kPowerReset(); //reset QCA7000
  14300. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  14301. {
  14302. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[End_Process]1st sync...");
  14303. system("sync");
  14304. }
  14305. #endif
  14306. //STEP 4: Switch to State E
  14307. //Keep State E for 5 seconds
  14308. #if 0
  14309. SwitchCpStateE(ENABLE); //Set PWM Duty as 0 and set State as E (0V)
  14310. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 5");
  14311. sleep(1);
  14312. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 4");
  14313. sleep(1);
  14314. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 3");
  14315. sleep(1);
  14316. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 2");
  14317. sleep(1);
  14318. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 1");
  14319. sleep(1);
  14320. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 0");
  14321. #endif
  14322. //Reset Memory
  14323. unsigned char SlaveAddress_backup;
  14324. unsigned int matched_backup;
  14325. //unsigned char state_backup;
  14326. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Soft reset (closing SeccComm)...");
  14327. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14328. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "-- EVCOMM: END --");
  14329. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------\n");
  14330. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  14331. {
  14332. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "2nd sync...");
  14333. system("sync");
  14334. }
  14335. #endif
  14336. system("sleep 1");
  14337. //Backup CsuComm flags
  14338. SlaveAddress_backup = ShmInternalComm->SlaveAddress;
  14339. matched_backup = CSUCOMMDC_TASK_FLAG.matched;
  14340. //state_backup = Check_V2G_Flow_Status();
  14341. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  14342. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14343. memset(&ccs_handshake, 0, sizeof(struct appHandEXIDocument));
  14344. memset(&ccs_exi_doc_DIN, 0, sizeof(struct dinEXIDocument));
  14345. memset(V2GTP_Tx_buf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14346. memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  14347. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  14348. memset(ShmInternalComm, 0, sizeof(struct InternalComm));
  14349. memset(ShmCcsData, 0, sizeof(struct CcsData));
  14350. //Resume CsuComm flags
  14351. ShmInternalComm->SlaveAddress = SlaveAddress_backup;
  14352. CSUCOMMDC_TASK_FLAG.matched = matched_backup;
  14353. Sniffer_Candump(DISABLE);
  14354. Sniffer_Candump(ENABLE);
  14355. //memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo)); //EVCOMM_SYS_INFO.End_Process_inused = FALSE;
  14356. //EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  14357. //Update_V2G_Flow_Status(state_backup);
  14358. //CP_Detection_Pid = 0;
  14359. //PP_Detection_Pid = 0;
  14360. //Error_Monitor_Pid = 0;
  14361. //system("cd /root;./reset_soft.sh");
  14362. system("pkill Module_CCS");
  14363. while(1)
  14364. {
  14365. //wait for CSU configrm
  14366. }
  14367. }
  14368. /*===========================================================================
  14369. FUNCTION: Parameters_Init
  14370. DESCRIPTION:
  14371. PRE-CONDITION:
  14372. INPUT:
  14373. OUTPUT:
  14374. GLOBAL VARIABLES:
  14375. =============================================================================*/
  14376. int Parameters_Init()
  14377. {
  14378. //Step 0: Generate random number
  14379. unsigned int value_random;
  14380. struct timeb time_seed;
  14381. ftime(&time_seed);
  14382. srand(time_seed.millitm);
  14383. //Step 1: Init SDP TCP Port
  14384. value_random = rand();
  14385. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active = (unsigned short)(SdpTcpServerPort + (value_random % 10000) + 1);
  14386. sprintf((char*)buf_log_evcomm,
  14387. "[Init]TCP Port:OK(%d)",
  14388. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  14389. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14390. //Step 2: Init SessionID
  14391. value_random = rand();
  14392. memcpy(&EVCOMM_SYS_INFO.SessionID[0], &value_random, 4);
  14393. value_random = rand();
  14394. memcpy(&EVCOMM_SYS_INFO.SessionID[4], &value_random, 4);
  14395. sprintf((char*)buf_log_evcomm,
  14396. "[Init]SessionID:OK(%02X%02X%02X%02X%02X%02X%02X%02X)",
  14397. EVCOMM_SYS_INFO.SessionID[0],
  14398. EVCOMM_SYS_INFO.SessionID[1],
  14399. EVCOMM_SYS_INFO.SessionID[2],
  14400. EVCOMM_SYS_INFO.SessionID[3],
  14401. EVCOMM_SYS_INFO.SessionID[4],
  14402. EVCOMM_SYS_INFO.SessionID[5],
  14403. EVCOMM_SYS_INFO.SessionID[6],
  14404. EVCOMM_SYS_INFO.SessionID[7]);
  14405. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14406. return 0;
  14407. }
  14408. /*===========================================================================
  14409. FUNCTION: main
  14410. DESCRIPTION:
  14411. PRE-CONDITION:
  14412. INPUT:
  14413. OUTPUT:
  14414. GLOBAL VARIABLES:
  14415. =============================================================================*/
  14416. int main(int argc, char *argv[])
  14417. {
  14418. //unsigned char Rtn;
  14419. //Initialization
  14420. ShareMemory_Init();
  14421. memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
  14422. if(RawSock > 0)
  14423. {
  14424. close(RawSock);
  14425. }
  14426. if(UdpSock > 0)
  14427. {
  14428. close(UdpSock);
  14429. }
  14430. if(TcpSock > 0)
  14431. {
  14432. close(TcpSock);
  14433. }
  14434. RawSock = UdpSock = TcpSock = -1;
  14435. Update_V2G_Flow_Status(IDLE);
  14436. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14437. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "-- EVCOMM: START --");
  14438. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14439. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "init...");
  14440. //Init V2G TCP/IPv6 packets buffer
  14441. V2gtpMsgRxBuf = (unsigned char *)malloc(V2GTP_MSG_RX_BUFFER_SIZE);
  14442. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  14443. V2gtpMsgTxBuf = (unsigned char *)malloc(V2GTP_MSG_TX_BUFFER_SIZE);
  14444. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14445. //Release State E Control
  14446. SwitchCpStateE(DISABLE);
  14447. OutputCpPwmDuty(100);
  14448. //start to detect CP pilot state
  14449. CP_Detection_Pid = 0;
  14450. CP_Detection(); //fork1
  14451. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1]CP Detection: ON");
  14452. //start to detect errors
  14453. Error_Monitor(); //fork2
  14454. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Error Monitor: ON");
  14455. //start to detect PP
  14456. PP_Detection_Pid = 0;
  14457. #if (PP_PROTECTION_MECHANISM == ENABLE)
  14458. PP_Detection();
  14459. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork3]PP Detection: ON");
  14460. #else
  14461. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork3]PP Detection: OFF");
  14462. #endif
  14463. //Init communication parameters
  14464. GetEthMac((uint8_t*)QcaInterface, CsuMac);
  14465. AttenProfileCnt = 0;
  14466. init_appHandEXIDocument(&ccs_handshake);
  14467. //Init Energy transfer mode
  14468. //[To-Do] Parsing Model Name
  14469. ShmCcsData->EnergyTransferMode = CCS_ENERGY_TRANSFER_MODE;
  14470. //struct ChargingInfoData *ccs;
  14471. //ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  14472. Parameters_Init();
  14473. Sniffer_Tcpdump(ENABLE);
  14474. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  14475. sleep(1); //wait for tcpdump getting ready
  14476. #endif
  14477. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Init]DONE");
  14478. while(1)
  14479. {
  14480. //DEBUG_PRINTF_EVCOMM_DETAIL("\nV2gFlowStatus = %d\n", V2gFlowStatus);
  14481. //if((ShmInternalComm->ChargingPermission == 0x01) && (CheckConnectorPlugIn() == 1))
  14482. //if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
  14483. //if(ShmInternalComm->ChargingPermission == 0x01)
  14484. //if(CheckConnectorPlugIn() == TRUE)
  14485. if (EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  14486. {
  14487. if(V2gFlowStatus < SLACC_SDP_UDP_Connection)
  14488. {
  14489. SlacComm();
  14490. }
  14491. else if(V2gFlowStatus == SLACC_SDP_UDP_Connection)
  14492. {
  14493. if(SdpUdpConnected() == 1)
  14494. {
  14495. Update_V2G_Flow_Status(SLACC_SDP_TCP_Connection);
  14496. continue;
  14497. }
  14498. SlacComm(); //TC_SECC_VTB_CmSlacMatch_004
  14499. ftime(&SeqEndTime);
  14500. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  14501. {
  14502. sprintf((char*)buf_log_evcomm,
  14503. "Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join (%.02lf of %d ms)\n",
  14504. DiffTimeb(SeqStartTime, SeqEndTime),
  14505. TT_match_join);
  14506. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14507. Update_V2G_Flow_Status(Sequence_Timeout);
  14508. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14509. //CCS_SECC_TIMEOUT_SLACC_SDP_UDP_TT_match_join (023823)
  14510. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14511. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14512. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14513. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14514. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  14515. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  14516. //CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  14517. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  14518. }
  14519. }
  14520. else if(V2gFlowStatus == SLACC_SDP_TCP_Connection)
  14521. {
  14522. if((TcpAcceptFd = V2gTcpConnected()) > 0)
  14523. {
  14524. Update_V2G_Flow_Status(SupportedAppProtocolRequest);
  14525. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14526. continue;
  14527. }
  14528. SlacComm();
  14529. ftime(&SeqEndTime);
  14530. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  14531. {
  14532. sprintf((char*)buf_log_evcomm,
  14533. "Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join (%.02lf / %d ms)",
  14534. DiffTimeb(SeqStartTime, SeqEndTime),
  14535. TT_match_join);
  14536. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14537. Update_V2G_Flow_Status(Sequence_Timeout);
  14538. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14539. //CCS_SECC_TIMEOUT_SLACC_SDP_TCP_TT_match_join (023824)
  14540. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14541. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14542. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14543. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14544. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  14545. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  14546. //CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  14547. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  14548. }
  14549. }
  14550. else if(V2gFlowStatus <= SessionStopResponse)
  14551. {
  14552. if (V2gComm(TcpAcceptFd) < 0)
  14553. {
  14554. //error occours
  14555. }
  14556. }
  14557. else if (V2gFlowStatus >= Performance_Timeout)
  14558. {
  14559. //End_Process
  14560. }
  14561. else
  14562. {
  14563. //null
  14564. }
  14565. }
  14566. usleep(100000);
  14567. } //while
  14568. }//main while