Module_CCS.c 664 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507
  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[V2GTP_MSG_RX_BUFFER_SIZE] = {0};
  31. unsigned char V2gtpMsgTxBuf[V2GTP_MSG_TX_BUFFER_SIZE] = {0};
  32. unsigned short Aag[64];
  33. struct MmeHeader SendMmePacket;
  34. int SendMmePacketSize;
  35. unsigned char CsuMac[6],QcaMac[6],EvMac[6],SlacRunId[8];
  36. struct sockaddr_ll DestSocketAddress;
  37. struct ifreq Req;
  38. unsigned int PwmStartTime;
  39. struct timeb SeqStartTime, SeqEndTime;
  40. unsigned char AagGroupsNum, MnbcSoundNum, AttenProfileCnt;
  41. unsigned char NewNmkKey[16], Nid[7];
  42. uint8_t get_V2G_Status_Name(uint8_t statusCode, char *statusName)
  43. {
  44. int result = PASS;
  45. switch(statusCode)
  46. {
  47. case IDLE:
  48. sprintf(statusName, "IDLE");
  49. break;
  50. case CM_SLAC_PARM_REQ:
  51. sprintf(statusName, "CM_SLAC_PARM_REQ");
  52. break;
  53. case CM_SLAC_PARM_CONF:
  54. sprintf(statusName, "CM_SLAC_PARM_CONF");
  55. break;
  56. case CM_START_ATTEN_CHAR_IND:
  57. sprintf(statusName, "CM_START_ATTEN_CHAR_IND");
  58. break;
  59. case CM_MNBC_SOUND_IND:
  60. sprintf(statusName, "CM_MNBC_SOUND_IND");
  61. break;
  62. case CM_ATTEN_CHAR_IND:
  63. sprintf(statusName, "CM_ATTEN_CHAR_IND");
  64. break;
  65. case CM_ATTEN_CHAR_RSP:
  66. sprintf(statusName, "CM_ATTEN_CHAR_RSP");
  67. break;
  68. case CM_VALIDATE_REQ:
  69. sprintf(statusName, "CM_VALIDATE_REQ");
  70. break;
  71. case CM_VALIDATE_CNF:
  72. sprintf(statusName, "CM_VALIDATE_CNF");
  73. break;
  74. case CM_SLAC_MATCH_REQ:
  75. sprintf(statusName, "CM_SLAC_MATCH_REQ");
  76. break;
  77. case CM_SLAC_MATCH_CNF:
  78. sprintf(statusName, "CM_SLAC_MATCH_CNF");
  79. break;
  80. case CM_AMP_MAP_REQ:
  81. sprintf(statusName, "CM_AMP_MAP_REQ");
  82. break;
  83. case CM_AMP_MAP_CNF:
  84. sprintf(statusName, "CM_AMP_MAP_CNF");
  85. break;
  86. case CM_SET_KEY_REQ:
  87. sprintf(statusName, "CM_SET_KEY_REQ");
  88. break;
  89. case CM_SET_KEY_CNF:
  90. sprintf(statusName, "CM_SET_KEY_CNF");
  91. break;
  92. case SLACC_SDP_UDP_Connection:
  93. sprintf(statusName, "SLACC_SDP_UDP_Connection");
  94. break;
  95. case SLACC_SDP_TCP_Connection:
  96. sprintf(statusName, "SLACC_SDP_TCP_Connection");
  97. break;
  98. case SupportedAppProtocolRequest:
  99. sprintf(statusName, "SupportedAppProtocolRequest");
  100. break;
  101. case SupportedAppProtocolResponse:
  102. sprintf(statusName, "SupportedAppProtocolResponse");
  103. break;
  104. case SessionSetupRequest:
  105. sprintf(statusName, "SessionSetupRequest");
  106. break;
  107. case SessionSetupResponse:
  108. sprintf(statusName, "UnSessionSetupResponseknown");
  109. break;
  110. case ServiceDiscoveryRequest:
  111. sprintf(statusName, "ServiceDiscoveryRequest");
  112. break;
  113. case ServiceDiscoveryResponse:
  114. sprintf(statusName, "ServiceDiscoveryResponse");
  115. break;
  116. case ServiceDetailRequest:
  117. sprintf(statusName, "ServiceDetailRequest");
  118. break;
  119. case ServiceDetailResponse:
  120. sprintf(statusName, "ServiceDetailResponse");
  121. break;
  122. case ServiceAndPaymentSelectionRequest:
  123. sprintf(statusName, "ServiceAndPaymentSelectionRequest");
  124. break;
  125. case ServiceAndPaymentSelectionResponse:
  126. sprintf(statusName, "ServiceAndPaymentSelectionResponse");
  127. break;
  128. case PaymentDetailsRequest:
  129. sprintf(statusName, "PaymentDetailsRequest");
  130. break;
  131. case PaymentDetailsResponse:
  132. sprintf(statusName, "PaymentDetailsResponse");
  133. break;
  134. case AuthorizationRequest:
  135. sprintf(statusName, "AuthorizationRequest");
  136. break;
  137. case AuthorizationResponse:
  138. sprintf(statusName, "AuthorizationResponse");
  139. break;
  140. case CertificateUpdateRequest:
  141. sprintf(statusName, "CertificateUpdateRequest");
  142. break;
  143. case CertificateUpdateResponse:
  144. sprintf(statusName, "CertificateUpdateResponse");
  145. break;
  146. case CertificateInstallationRequest:
  147. sprintf(statusName, "CertificateInstallationRequest");
  148. break;
  149. case CertificateInstallationResponse:
  150. sprintf(statusName, "CertificateInstallationResponse");
  151. break;
  152. case ChargeParameterDiscoveryRequest:
  153. sprintf(statusName, "ChargeParameterDiscoveryRequest");
  154. break;
  155. case ChargeParameterDiscoveryResponse:
  156. sprintf(statusName, "ChargeParameterDiscoveryResponse");
  157. break;
  158. case CableCheckRequest:
  159. sprintf(statusName, "CableCheckRequest");
  160. break;
  161. case CableCheckResponse:
  162. sprintf(statusName, "CableCheckResponse");
  163. break;
  164. case PreChargeRequest:
  165. sprintf(statusName, "PreChargeRequest");
  166. break;
  167. case PreChargeResponse:
  168. sprintf(statusName, "PreChargeResponse");
  169. break;
  170. case PowerDeliveryRequestStart:
  171. sprintf(statusName, "PowerDeliveryRequestStart");
  172. break;
  173. case PowerDeliveryResponsetStart:
  174. sprintf(statusName, "PowerDeliveryResponsetStart");
  175. break;
  176. case ChargingStatusRequest:
  177. sprintf(statusName, "ChargingStatusRequest");
  178. break;
  179. case ChargingStatusResponse:
  180. sprintf(statusName, "ChargingStatusResponse");
  181. break;
  182. case CurrentDemandRequest:
  183. sprintf(statusName, "CurrentDemandRequest");
  184. break;
  185. case CurrentDemandResponse:
  186. sprintf(statusName, "CurrentDemandResponse");
  187. break;
  188. case MeteringReceiptRequest:
  189. sprintf(statusName, "MeteringReceiptRequest");
  190. break;
  191. case MeteringReceiptResponse:
  192. sprintf(statusName, "MeteringReceiptResponse");
  193. break;
  194. case PowerDeliveryRequestStop:
  195. sprintf(statusName, "PowerDeliveryRequestStop");
  196. break;
  197. case PowerDeliveryResponseStop:
  198. sprintf(statusName, "PowerDeliveryResponseStop");
  199. break;
  200. case WeldingDetectionRequest:
  201. sprintf(statusName, "WeldingDetectionRequest");
  202. break;
  203. case WeldingDetectionResponse:
  204. sprintf(statusName, "WeldingDetectionResponse");
  205. break;
  206. case SessionStopRequest:
  207. sprintf(statusName, "SessionStopRequest");
  208. break;
  209. case SessionStopResponse:
  210. sprintf(statusName, "SessionStopResponse");
  211. break;
  212. case Performance_Timeout:
  213. sprintf(statusName, "Performance_Timeout");
  214. break;
  215. case Sequence_Timeout:
  216. sprintf(statusName, "Sequence_Timeout");
  217. break;
  218. case Other_Fault:
  219. sprintf(statusName, "Other_Fault");
  220. break;
  221. default:
  222. sprintf(statusName, "Unknown");
  223. result = FAIL;
  224. break;
  225. }
  226. return result;
  227. }
  228. /*===========================================================================
  229. FUNCTION: Check_V2G_Flow_Status
  230. DESCRIPTION:
  231. PRE-CONDITION:
  232. INPUT:
  233. OUTPUT:
  234. GLOBAL VARIABLES:
  235. =============================================================================*/
  236. unsigned char Check_V2G_Flow_Status()
  237. {
  238. unsigned char result = 0;
  239. switch (ShmCcsData->CommProtocol)
  240. {
  241. case V2GT_MSG_PROTOCOL_DIN70121: //0
  242. {
  243. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  244. break;
  245. }
  246. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  247. {
  248. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  249. break;
  250. }
  251. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  252. {
  253. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  254. break;
  255. }
  256. default:
  257. break;
  258. }
  259. return result;
  260. }
  261. /*===========================================================================
  262. FUNCTION: CAN_Tx_MSG
  263. DESCRIPTION:
  264. PRE-CONDITION:
  265. INPUT:
  266. OUTPUT:
  267. GLOBAL VARIABLES:
  268. =============================================================================*/
  269. int CAN_Tx_MSG(int Fd, unsigned int MsgId, unsigned char SlaveAddress, unsigned char DataLength, unsigned char *SendData)
  270. {
  271. #if 0
  272. struct can_frame frame;
  273. struct timeb StartTime, EndTime;
  274. unsigned int tmp = 0;
  275. int nbytes = 0;
  276. int i = 0;
  277. //Protection: To avoid unexpected length for CAN bus payload.
  278. if (DataLength > 8)
  279. {
  280. DataLength = 8;
  281. }
  282. memset(&frame, 0, sizeof(struct can_frame));
  283. frame.can_id = 0x80000000 | CAN_SEND_DIRECTION | MsgId | SlaveAddress; //0x80000000: extension ID format
  284. frame.can_dlc = DataLength;
  285. memcpy(frame.data, SendData, DataLength);
  286. nbytes = write(Fd, &frame, sizeof(struct can_frame));
  287. #if 0
  288. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][CAN_Tx_MSG] <%X> ", frame.can_id);
  289. for (i = 0; i < frame.can_dlc; i++)
  290. {
  291. DEBUG_PRINTF_EVCOMM_DETAIL("%02X ", frame.data[i]);
  292. }
  293. DEBUG_PRINTF_EVCOMM_DETAIL("(%d Bytes)\n", frame.can_dlc);
  294. #endif
  295. return nbytes;
  296. #else
  297. return -1;
  298. #endif
  299. }
  300. /*===========================================================================
  301. FUNCTION: Proc_EVStopRes
  302. DESCRIPTION:
  303. PRE-CONDITION:
  304. INPUT:
  305. OUTPUT:
  306. GLOBAL VARIABLES:
  307. =============================================================================*/
  308. int Proc_EVStopRes(int Fd)
  309. {
  310. int nbytes;
  311. unsigned char Buffer[8];
  312. memset(Buffer, 0, sizeof(Buffer));
  313. if (CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency == TRUE)
  314. {
  315. Buffer[0] = EV_EMERGENCY_STOP; //2
  316. }
  317. else
  318. {
  319. Buffer[0] = EV_NORMAL_STOP; //1
  320. }
  321. /*
  322. if(strlen(ShmStatusCodeData->PresentStatusCode[0]) > 0)
  323. {
  324. memcpy(Buffer + 2, ShmStatusCodeData->PresentStatusCode[0], 6);
  325. }
  326. */
  327. Buffer[1] = ShmStatusCodeData->PresentStatusCode[0][0];
  328. Buffer[2] = ShmStatusCodeData->PresentStatusCode[0][1];
  329. Buffer[3] = ShmStatusCodeData->PresentStatusCode[0][2];
  330. Buffer[4] = ShmStatusCodeData->PresentStatusCode[0][3];
  331. Buffer[5] = ShmStatusCodeData->PresentStatusCode[0][4];
  332. Buffer[6] = ShmStatusCodeData->PresentStatusCode[0][5];
  333. nbytes = CAN_Tx_MSG(Fd, CAN_CMD_EV_STOP_EVENT, ShmInternalComm->SlaveAddress, 7, Buffer);
  334. //system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); //for test only
  335. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  336. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_EVStopRes] Sending STOP Command to CSU");
  337. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = FALSE;
  338. return nbytes;
  339. }
  340. /*===========================================================================
  341. FUNCTION: Sniffer_Candump
  342. DESCRIPTION:
  343. 1. Only used in End_Process(), which is in fork2 of SeccComm task.
  344. PRE-CONDITION:
  345. INPUT:
  346. OUTPUT:
  347. 0: accept
  348. -1: invalid
  349. GLOBAL VARIABLES:
  350. =============================================================================*/
  351. int Sniffer_Candump(char cmd)
  352. {
  353. #if (CANDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  354. if (cmd == ENABLE)
  355. {
  356. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]init");
  357. system("cd /mnt/;rm -rf candump/");
  358. system("cd /mnt/;mkdir candump");
  359. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]on");
  360. system("cd /mnt/candump;candump -l can0 &");
  361. return 0;
  362. }
  363. else if (cmd == DISABLE)
  364. {
  365. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]off");
  366. system("killall candump");
  367. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[candump]save");
  368. system("cd /;cp -rfv /mnt/candump /Storage/SystemLog/");
  369. return 0;
  370. }
  371. else
  372. {
  373. sprintf((char*)buf_log_evcomm_fork2, "[candump]unexpected cmd(%d)", cmd);
  374. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  375. return -1;
  376. }
  377. #endif
  378. return 0;
  379. }
  380. /*===========================================================================
  381. FUNCTION: Sniffer_Tcpdump
  382. DESCRIPTION:
  383. PRE-CONDITION:
  384. INPUT:
  385. OUTPUT:
  386. GLOBAL VARIABLES:
  387. =============================================================================*/
  388. int Sniffer_Tcpdump(char cmd)
  389. {
  390. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  391. if (cmd == ENABLE)
  392. {
  393. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]init...");
  394. system("cd /mnt/;rm -rf tcpdump/");
  395. system("cd /mnt/;mkdir tcpdump");
  396. unsigned char buf[256];
  397. time_t CurrentTime;
  398. struct tm *tm;
  399. struct timeval tv;
  400. memset(buf, 0, sizeof(buf));
  401. CurrentTime = time(NULL);
  402. tm = localtime(&CurrentTime);
  403. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  404. sprintf((char*)buf,
  405. "tcpdump -i eth1 -w /mnt/tcpdump/[%s][%04d%02d%02d-%02d:%02d:%02d.%06d]packets.pcap&",
  406. FIRMWARE_VERSION,
  407. tm->tm_year + 1900,
  408. tm->tm_mon + 1,
  409. tm->tm_mday,
  410. tm->tm_hour,
  411. tm->tm_min,
  412. tm->tm_sec,
  413. tv.tv_usec
  414. );
  415. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]on");
  416. system(buf);
  417. return 0;
  418. }
  419. else if (cmd == DISABLE)
  420. {
  421. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]off");
  422. system("killall tcpdump");
  423. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]wait: 2s");
  424. sleep(1);
  425. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]wait: 1s");
  426. sleep(1);
  427. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[tcpdump]save");
  428. system("cd /;cp -rfv /mnt/tcpdump /Storage/SystemLog/");
  429. return 0;
  430. }
  431. else
  432. {
  433. sprintf((char*)buf_log_evcomm, "[tcpdump]unexpected cmd(%d)", cmd);
  434. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  435. return -1;
  436. }
  437. #endif
  438. return 0;
  439. }
  440. /*===========================================================================
  441. FUNCTION: Check_V2G_Flow_Status_pre
  442. DESCRIPTION:
  443. PRE-CONDITION:
  444. INPUT:
  445. OUTPUT:
  446. GLOBAL VARIABLES:
  447. =============================================================================*/
  448. unsigned char Check_V2G_Flow_Status_pre()
  449. {
  450. unsigned char result = 0;
  451. switch (ShmCcsData->CommProtocol)
  452. {
  453. case V2GT_MSG_PROTOCOL_DIN70121: //0
  454. {
  455. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre;
  456. break;
  457. }
  458. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  459. {
  460. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre;
  461. break;
  462. }
  463. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  464. {
  465. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre;
  466. break;
  467. }
  468. default:
  469. break;
  470. }
  471. return result;
  472. }
  473. /*===========================================================================
  474. FUNCTION: Update_V2G_Flow_Status
  475. DESCRIPTION:
  476. PRE-CONDITION:
  477. INPUT:
  478. OUTPUT:
  479. 1. V2gFlowStatus
  480. GLOBAL VARIABLES:
  481. 1. V2gFlowStatus
  482. =============================================================================*/
  483. int Update_V2G_Flow_Status(unsigned int state_new)
  484. {
  485. unsigned char state_now;
  486. char nameNow[64], nameNew[64];
  487. state_now = Check_V2G_Flow_Status();
  488. get_V2G_Status_Name(state_now, nameNow);
  489. get_V2G_Status_Name(state_new, nameNew);
  490. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE ||
  491. CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused == TRUE)
  492. {
  493. if (state_now != Performance_Timeout && //253
  494. state_now != Sequence_Timeout && //254
  495. state_now != Other_Fault) //255
  496. {
  497. sprintf((char*)buf_log_evcomm,
  498. "[Warning]state-%s(%d) change: ignored (End_Process_inused:%d, FW_Update_Task_inused:%d)",
  499. nameNew, state_new,
  500. EVCOMM_SYS_INFO.End_Process_inused,
  501. CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused
  502. );
  503. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  504. return -1;
  505. }
  506. }
  507. if (state_now != state_new)
  508. {
  509. //Step 1: Check if Error Occours
  510. if (state_now == Performance_Timeout || //253
  511. state_now == Sequence_Timeout || //254
  512. state_now == Other_Fault) //255
  513. {
  514. if (state_new != IDLE)
  515. {
  516. if (EVCOMM_SYS_INFO.State_Change_Ignored_Notice == FALSE)
  517. {
  518. EVCOMM_SYS_INFO.State_Change_Ignored_Notice = TRUE;
  519. sprintf((char*)buf_log_evcomm,
  520. "[Warning]state-%s(%d) change: ignored(now in error state-%s(%d))",
  521. nameNow, state_new,
  522. nameNew, state_now);
  523. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  524. }
  525. return -1;
  526. }
  527. }
  528. //Updating the state formally.
  529. sprintf((char*)buf_log_evcomm,
  530. "%s(%02d) >> %s(%02d)",
  531. nameNow, state_now,
  532. nameNew, state_new
  533. );
  534. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  535. V2gFlowStatus = state_new;
  536. state_now = state_new;
  537. switch (ShmCcsData->CommProtocol)
  538. {
  539. case V2GT_MSG_PROTOCOL_DIN70121: //0
  540. {
  541. ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  542. ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus = V2gFlowStatus;
  543. break;
  544. }
  545. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  546. {
  547. ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  548. ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus = V2gFlowStatus;
  549. break;
  550. }
  551. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  552. {
  553. ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  554. ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus = V2gFlowStatus;
  555. break;
  556. }
  557. default:
  558. break;
  559. }
  560. }
  561. return 0;
  562. }
  563. double DiffTimeb(struct timeb ST, struct timeb ET)
  564. {
  565. //return milli-second
  566. double StartTime, EndTime;
  567. double t_diff;
  568. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  569. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  570. t_diff = EndTime - StartTime;
  571. if (t_diff < 0)
  572. {
  573. #if 0
  574. if (t_diff < -1000) //1000ms
  575. {
  576. sprintf((char*)buf_log_evcomm,
  577. "[Warning]StartTime(%.02lf) > EndTime(%.02lf), d(%.02lf)",
  578. StartTime,
  579. EndTime,
  580. t_diff);
  581. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  582. }
  583. #endif
  584. return -1;
  585. }
  586. return t_diff;
  587. }
  588. double DiffTimeb_fork1_Error_Monitor(struct timeb ST, struct timeb ET)
  589. {
  590. //return milli-second
  591. static double StartTime, EndTime;
  592. static double t_diff;
  593. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  594. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  595. t_diff = EndTime - StartTime;
  596. if (t_diff < 0)
  597. {
  598. #if 0
  599. if (t_diff < -1000) //1000ms
  600. {
  601. sprintf((char*)buf_log_evcomm_fork2,
  602. "[fork1][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
  603. StartTime,
  604. EndTime,
  605. t_diff);
  606. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  607. }
  608. #endif
  609. return -1;
  610. }
  611. return t_diff;
  612. }
  613. double DiffTimeb_fork2_Error_Monitor(struct timeb ST, struct timeb ET)
  614. {
  615. //return milli-second
  616. static double StartTime, EndTime;
  617. static double t_diff;
  618. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  619. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  620. t_diff = EndTime - StartTime;
  621. if (t_diff < 0)
  622. {
  623. #if 0
  624. if (t_diff < -1000) //1000ms
  625. {
  626. sprintf((char*)buf_log_evcomm_fork2,
  627. "[fork2][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
  628. StartTime,
  629. EndTime,
  630. t_diff);
  631. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  632. }
  633. #endif
  634. return -1;
  635. }
  636. return t_diff;
  637. }
  638. /*===========================================================================
  639. FUNCTION: ShareMemory_Init
  640. DESCRIPTION:
  641. PRE-CONDITION:
  642. INPUT:
  643. OUTPUT:
  644. GLOBAL VARIABLES:
  645. =============================================================================*/
  646. int ShareMemory_Init()
  647. {
  648. int MeterSMId;
  649. //create ShmSysConfigAndInfo
  650. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  651. {
  652. DEBUG_ERROR("ShareMemory_Init:shmget ShmSysConfigAndInfo NG");
  653. return 0;
  654. }
  655. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  656. {
  657. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "ShareMemory_Init:shmat ShmSysConfigAndInfo NG");
  658. return 0;
  659. }
  660. //create ShmStatusCodeData
  661. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  662. {
  663. DEBUG_ERROR("ShareMemory_Init:shmget ShmStatusCodeData NG");
  664. return 0;
  665. }
  666. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  667. {
  668. DEBUG_ERROR("ShareMemory_Init:shmat ShmStatusCodeData NG");
  669. return 0;
  670. }
  671. //create ShmCcsData
  672. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  673. {
  674. DEBUG_ERROR("ShareMemory_Init:shmget ShmCcsData NG");
  675. return 0;
  676. }
  677. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  678. {
  679. DEBUG_ERROR("ShareMemory_Init:shmat ShmCcsData NG");
  680. return 0;
  681. }
  682. //create ShmInternalComm
  683. if ((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), IPC_CREAT | 0777)) < 0)
  684. {
  685. DEBUG_ERROR("ShareMemory_Init:shmget ShmInternalComm NG");
  686. return 0;
  687. }
  688. else if ((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  689. {
  690. DEBUG_ERROR("ShareMemory_Init:shmat ShmInternalComm NG");
  691. return 0;
  692. }
  693. //Initial ShmCharger
  694. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0)
  695. {
  696. DEBUG_ERROR("shmget ShmChargerKey NG\r\n");
  697. return 0;
  698. }
  699. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  700. {
  701. DEBUG_ERROR("shmat ShmChargerKey NG\r\n");
  702. return 0;
  703. }
  704. //[To-Do] The initialization here is reduntant and should be removed partially.
  705. //SHM_Init_supportedAppProtocolRes(ShmCcsData);
  706. //SHM_Init_din_SessionSetupRes(ShmCcsData);
  707. //SHM_Init_din_ServiceDiscoveryRes(ShmCcsData);
  708. //SHM_Init_din_ServiceAndPaymentSelectionRes(ShmCcsData);
  709. //SHM_Init_din_ContractAuthenticationRes(ShmCcsData);
  710. SHM_Init_din_ChargeParameterDiscoveryRes(ShmCcsData);
  711. SHM_Init_din_CableCheckRes(ShmCcsData);
  712. SHM_Init_din_PreChargeRes(ShmCcsData);
  713. SHM_Init_din_PowerDeliveryRes(ShmCcsData);
  714. SHM_Init_din_CurrentDemandRes(ShmCcsData);
  715. SHM_Init_din_WeldingDetectionRes(ShmCcsData);
  716. SHM_Init_din_SessionStopRes(ShmCcsData);
  717. return 1;
  718. }
  719. /*===========================================================================
  720. FUNCTION: GetEthMac
  721. DESCRIPTION:
  722. 1. Accessing current CsuMac address, if Eth = eth1
  723. 2. The address of eth1(for QCA7000) is a random number, which will be modified
  724. after each time of booting up system.
  725. PRE-CONDITION:
  726. INPUT:
  727. OUTPUT:
  728. GLOBAL VARIABLES:
  729. =============================================================================*/
  730. int GetEthMac(unsigned char *Eth, unsigned char *mac)
  731. {
  732. //Parameters:MAC,IP,Mask,Gateway
  733. int fd;
  734. unsigned char addr[18], Buffer[128];
  735. memset(Buffer, 0, sizeof(Buffer));
  736. sprintf((char*)Buffer, "cat /sys/class/net/%s/address > /mnt/GetEthInfo", Eth); //CsuMac (Eth = eth1)
  737. system((char*)Buffer);
  738. fd = open("/mnt/GetEthInfo", O_RDONLY);
  739. if(fd < 0)
  740. {
  741. system("rm -f /mnt/GetEthInfo");
  742. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "GetEthMac: MAC Address open error");
  743. return 0;
  744. }
  745. memset(mac, 0, 6);
  746. memset(addr, 0, sizeof(addr));
  747. read(fd, addr, 17);
  748. close(fd);
  749. system("rm -f /mnt/GetEthInfo");
  750. 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)
  751. sprintf((char*)buf_log_evcomm,
  752. "[GetEthMac]EVSE MACAddr(CsuMac): %02x:%02x:%02x:%02x:%02x:%02x",
  753. mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); //CsuMac (Eth = eth1)
  754. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  755. return 1;
  756. }
  757. /*===========================================================================
  758. FUNCTION: ReadAdcVolt
  759. DESCRIPTION:
  760. 1. fork1
  761. PRE-CONDITION:
  762. INPUT:
  763. OUTPUT:
  764. GLOBAL VARIABLES:
  765. =============================================================================*/
  766. float ReadAdcVolt(unsigned char AdcChannel)
  767. {
  768. //AIN0=CCS GUN Temp 1
  769. //AIN1=CCS GUN Temp 2
  770. //AIN2=CCS_Proximity/2
  771. //AIN3=pilot voltage
  772. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  773. return 0;
  774. #else
  775. if(AdcChannel == 3)
  776. {
  777. int fd,count,AvgTimes;
  778. unsigned char SampleBuf[4];
  779. float TmpVolt, MinSample, AvgSample = 0;
  780. fd = open("/sys/bus/iio/devices/iio\\:device0/in_voltage3_raw", O_RDONLY);
  781. if(fd > 0)
  782. {
  783. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  784. for(AvgTimes = 0; AvgTimes < 3; AvgTimes++) //period = 60~91 ms(renice -10, , CurrentDemand()) /*+++ 20200909, vern, extend detection time for interference ---*/
  785. {
  786. count = 0;
  787. MinSample = 2306;
  788. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  789. while(count < 40) //period = 21~42ms (renice -10, CurrentDemand()) /*+++ 20200909, vern, extend detection time for interference ---*/
  790. {
  791. //re-sampling period = 3~13ms (renice -10, SLAC())
  792. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  793. read(fd, SampleBuf, 4); //period = 3.2~10ms (renice -10, SLAC())
  794. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  795. TmpVolt = atoi((char*)SampleBuf);
  796. if((TmpVolt < 2306) && (TmpVolt > 0))//positive voltage
  797. {
  798. if(TmpVolt < MinSample)
  799. {
  800. MinSample = TmpVolt;
  801. }
  802. count++;
  803. }
  804. lseek(fd, 0, SEEK_SET);
  805. }
  806. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  807. AvgSample += MinSample;
  808. }
  809. AvgSample /= AvgTimes;
  810. close(fd);
  811. //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
  812. return ((0.954-(1.8*AvgSample/4095))/0.06);
  813. }
  814. else
  815. {
  816. return -1;
  817. }
  818. }
  819. else
  820. {
  821. FILE *fp;
  822. unsigned char str[64];
  823. unsigned char AdcValue[8];
  824. if(AdcChannel > 7)
  825. {
  826. return -1;
  827. }
  828. memset(str,0,sizeof(str));
  829. memset(AdcValue,0,sizeof(AdcValue));
  830. sprintf((char*)str, "cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw", AdcChannel);
  831. fp=popen((char*)str, "r");
  832. if(fgets((char*)AdcValue,sizeof(AdcValue),fp) == NULL)
  833. {
  834. pclose(fp);
  835. return -1;
  836. }
  837. pclose(fp);
  838. //Vin = Vref *D / (2^n - 1)
  839. return ((float)1.8*(float)atoi((char*)AdcValue))/4095;
  840. }
  841. #endif
  842. }
  843. /*===========================================================================
  844. FUNCTION: ReadAdcVolt
  845. DESCRIPTION:
  846. //AIN0=CCS GUN Temp 1
  847. //AIN1=CCS GUN Temp 2
  848. //AIN2=CCS_Proximity/2
  849. //AIN3=pilot voltage
  850. PRE-CONDITION:
  851. INPUT:
  852. OUTPUT:
  853. GLOBAL VARIABLES:
  854. =============================================================================*/
  855. float ReadAdcVolt_PP_fork3()
  856. {
  857. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  858. return 0;
  859. #else
  860. int fd, AvgTimes;
  861. unsigned char SampleBuf[4];
  862. float TmpVolt = 0;
  863. float AvgSample = 0;
  864. float V_pp = 0;
  865. fd = open("/sys/bus/iio/devices/iio\\:device0/in_voltage2_raw", O_RDONLY); //PP
  866. if(fd > 0)
  867. {
  868. for(AvgTimes = 0; AvgTimes < 5; AvgTimes++) //get 5 samples
  869. {
  870. read(fd, SampleBuf, 4);
  871. TmpVolt = atoi((char*)SampleBuf);
  872. lseek(fd, 0, SEEK_SET);
  873. AvgSample += TmpVolt;
  874. }
  875. close(fd);
  876. AvgSample /= AvgTimes;
  877. V_pp = (3.6*AvgSample)/4095; //PP
  878. #if 0
  879. printf("PP_adc = %.02f, PP_v = %.02f\n", AvgSample, V_pp);
  880. usleep(3000000); //300ms
  881. #endif
  882. usleep(20000); //20ms
  883. return V_pp;
  884. }
  885. else
  886. {
  887. return -1;
  888. }
  889. #endif
  890. }
  891. /*===========================================================================
  892. FUNCTION: Qca7kPowerReset
  893. DESCRIPTION:
  894. PRE-CONDITION:
  895. INPUT:
  896. OUTPUT:
  897. GLOBAL VARIABLES:
  898. =============================================================================*/
  899. void Qca7kPowerReset()
  900. {
  901. //printf("\n[CCS Board]Reset QCA7000...\n");
  902. system("echo 1 > /sys/class/gpio/gpio88/value");
  903. usleep(500000);
  904. system("echo 0 > /sys/class/gpio/gpio88/value");
  905. }
  906. /*===========================================================================
  907. FUNCTION: SwitchCpStateE
  908. DESCRIPTION:
  909. PRE-CONDITION:
  910. INPUT:
  911. OUTPUT:
  912. GLOBAL VARIABLES:
  913. =============================================================================*/
  914. int SwitchCpStateE(unsigned char OnOff)
  915. {
  916. /*
  917. * TODO: Request CP change to state E
  918. */
  919. if((OnOff != ENABLE) && (OnOff != DISABLE))
  920. {
  921. return -1;
  922. }
  923. struct ChargingInfoData *ccs;
  924. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  925. ccs->SwitchCpStateE_status = OnOff;
  926. //OnOff = 1 => switch State to E
  927. //OnOff = 0 => return noraml
  928. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  929. {
  930. if(OnOff == DISABLE)
  931. {
  932. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: released\n");
  933. CSUCOMMAC_SHM.CpSetStateE = DISABLE;
  934. }
  935. else
  936. {
  937. OutputCpPwmDuty(100); //set CP duty as 100, firstly.
  938. CSUCOMMAC_SHM.CpSetStateE = ENABLE;
  939. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: enabled!\n");
  940. }
  941. }
  942. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  943. {
  944. if(OnOff == DISABLE)
  945. {
  946. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: released\n");
  947. system("echo 0 > /sys/class/gpio/gpio86/value");
  948. }
  949. else
  950. {
  951. OutputCpPwmDuty(100); //set CP duty as 100, firstly.
  952. system("echo 1 > /sys/class/gpio/gpio86/value");
  953. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SwitchCpStateE: enabled!\n");
  954. }
  955. }
  956. #endif
  957. if (ccs->SwitchCpStateE_status_pre != ccs->SwitchCpStateE_status)
  958. {
  959. sprintf((char*)buf_log_evcomm,
  960. "SwitchCpStateE: %d >> %d",
  961. ccs->SwitchCpStateE_status_pre,
  962. ccs->SwitchCpStateE_status
  963. );
  964. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  965. ccs->SwitchCpStateE_status_pre = ccs->SwitchCpStateE_status;
  966. }
  967. return 0;
  968. }
  969. /*===========================================================================
  970. FUNCTION: OutputCpPwmDuty
  971. DESCRIPTION:
  972. PRE-CONDITION:
  973. INPUT:
  974. OUTPUT:
  975. GLOBAL VARIABLES:
  976. =============================================================================*/
  977. int OutputCpPwmDuty(unsigned char Duty)
  978. {
  979. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  980. int DutyInNanoSec;
  981. #endif
  982. struct ChargingInfoData *ccs;
  983. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  984. if((Duty < 0)||(Duty > 100))
  985. {
  986. return -1;
  987. }
  988. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  989. {
  990. CSUCOMMAC_SHM.CpSetPWMDuty = Duty;
  991. }
  992. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  993. {
  994. DutyInNanoSec = 10000 * Duty;
  995. sprintf((char*)buf_log_evcomm, "echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle", DutyInNanoSec);//nanoseconds
  996. system((char*)buf_log_evcomm);
  997. }
  998. #endif
  999. ccs->CpDuty = Duty;
  1000. //CP Duty
  1001. if (ccs->CpDuty != ccs->CpDuty_pre)
  1002. {
  1003. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  1004. sprintf((char*)buf_log_evcomm, "CP Duty: %d %% >> %d %%", ccs->CpDuty_pre, ccs->CpDuty);
  1005. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  1006. ccs->CpDuty_pre = ccs->CpDuty;
  1007. }
  1008. return 0;
  1009. }
  1010. /*===========================================================================
  1011. FUNCTION: Check_Plugin_Status_Update_fork1
  1012. DESCRIPTION:
  1013. PRE-CONDITION:
  1014. INPUT:
  1015. OUTPUT:
  1016. GLOBAL VARIABLES:
  1017. =============================================================================*/
  1018. //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  1019. void Check_Plugin_Status_Update_fork1(struct ChargingInfoData *ccs)
  1020. {
  1021. if (ccs->ConnectorPlugIn != ccs->ConnectorPlugIn_new)
  1022. {
  1023. sprintf((char*)buf_log_evcomm_fork1, "[fork1]Plugin: %d >> %d (CP=%.2fV, PP=%.2fV)",
  1024. ccs->ConnectorPlugIn,
  1025. ccs->ConnectorPlugIn_new,
  1026. ccs->CpVoltage,
  1027. ccs->PpVoltage
  1028. );
  1029. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1030. ccs->ConnectorPlugIn_pre = ccs->ConnectorPlugIn;
  1031. ccs->ConnectorPlugIn = ccs->ConnectorPlugIn_new;
  1032. //ccs->CpVoltage_pre = ccs->CpVoltage;
  1033. }
  1034. }
  1035. //#endif
  1036. /*===========================================================================
  1037. FUNCTION: ConnectorPlugIn
  1038. DESCRIPTION:
  1039. PRE-CONDITION:
  1040. INPUT:
  1041. OUTPUT:
  1042. 0: Unplug
  1043. 1: Plug-in
  1044. GLOBAL VARIABLES:
  1045. =============================================================================*/
  1046. int CheckConnectorPlugIn()
  1047. {
  1048. /*
  1049. * TODO: Return connector status depedon CP
  1050. */
  1051. static struct ChargingInfoData *ccs;
  1052. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1053. #if (CP_PROTECTION_MECHANISM == ENABLE)
  1054. return (int)ccs->ConnectorPlugIn;
  1055. #else
  1056. return TRUE;
  1057. #endif
  1058. }
  1059. /*===========================================================================
  1060. FUNCTION: Check_CP_State_Error_fork1
  1061. DESCRIPTION:
  1062. PRE-CONDITION:
  1063. INPUT:
  1064. OUTPUT:
  1065. GLOBAL VARIABLES:
  1066. =============================================================================*/
  1067. int Check_CP_State_Error_fork1(struct ChargingInfoData *ccs)
  1068. {
  1069. #if (CP_PROTECTION_MECHANISM == DISABLE)
  1070. {
  1071. return -1;
  1072. }
  1073. #endif
  1074. unsigned char state = 0;
  1075. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  1076. double time_diff = 0;
  1077. #endif
  1078. state = Check_V2G_Flow_Status();
  1079. //SLAC, SLAAC, SDP, ..., ChargeParameterDiscovery
  1080. if (state >= CM_SLAC_PARM_CONF && //by considering 15118(SLAC first)
  1081. state < ChargeParameterDiscoveryRequest &&
  1082. state != IDLE &&
  1083. state != CM_SET_KEY_REQ &&
  1084. state != CM_SET_KEY_CNF &&
  1085. state != CM_VALIDATE_REQ &&
  1086. state != CM_VALIDATE_CNF)
  1087. {
  1088. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  1089. {
  1090. if((ccs->CpState != 2) && (ccs->CpState != 3))
  1091. {
  1092. if (ccs->CpState_err == FALSE)
  1093. {
  1094. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  1095. //CPD: ChargeParameterDiscovery
  1096. }
  1097. ccs->CpState_err = TRUE;
  1098. }
  1099. }
  1100. #else
  1101. {
  1102. if(ccs->CpState != 3)
  1103. {
  1104. if (ccs->CpState_err == FALSE)
  1105. {
  1106. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
  1107. //CPD: ChargeParameterDiscovery
  1108. }
  1109. ccs->CpState_err = TRUE;
  1110. }
  1111. }
  1112. #endif
  1113. }
  1114. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  1115. {
  1116. //ChargeParameterDiscovery
  1117. if(state >= ChargeParameterDiscoveryRequest && //35
  1118. state <= ChargeParameterDiscoveryResponse) //36
  1119. {
  1120. if(ccs->CpState != 3)
  1121. {
  1122. if (ccs->CpState_err == FALSE)
  1123. {
  1124. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD");
  1125. //PRC: Precharge
  1126. //CUD: CurrentDemand
  1127. }
  1128. ccs->CpState_err = TRUE;
  1129. }
  1130. }
  1131. //ChargingStatus
  1132. if(state >= ChargingStatusRequest && //43
  1133. state <= ChargingStatusResponse) //44
  1134. {
  1135. if(ccs->CpState != 4 && ccs->CpState != 5)
  1136. {
  1137. if (ccs->CpState_err == FALSE)
  1138. {
  1139. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CGS");
  1140. //PRC: Precharge
  1141. //CUD: CurrentDemand
  1142. }
  1143. ccs->CpState_err = TRUE;
  1144. }
  1145. }
  1146. }
  1147. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  1148. {
  1149. //ChargeParameterDiscovery, CableCheck
  1150. if (state >= ChargeParameterDiscoveryRequest && //35
  1151. state <= CableCheckResponse) //38
  1152. {
  1153. if(ccs->CableCheckPreCountDownDone == FALSE &&
  1154. state >= CableCheckRequest)
  1155. {
  1156. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  1157. time_diff = DiffTimeb_fork1_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  1158. if(time_diff >= V2G_SECC_CP_Timeout_CableCheck) //2 sec
  1159. {
  1160. sprintf((char*)buf_log_evcomm_fork1,
  1161. "[fork1][CP]check C(4),D(5): ON (%.02lf of %dms)",
  1162. time_diff,
  1163. V2G_SECC_CP_Timeout_CableCheck);
  1164. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1165. ccs->CableCheckPreCountDownDone = TRUE;
  1166. }
  1167. }
  1168. if(ccs->CableCheckPreCountDownDone == TRUE)
  1169. {
  1170. if(ccs->CpState != 4 && ccs->CpState != 5)
  1171. {
  1172. if (ccs->CpState_err == FALSE)
  1173. {
  1174. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD and CCK (after CNT)");
  1175. //CPD: ChargeParameterDiscovery
  1176. //CCK: CableCheck
  1177. //CNT: count down
  1178. }
  1179. ccs->CpState_err = TRUE;
  1180. }
  1181. }
  1182. else
  1183. {
  1184. if(ccs->CpState != 3 && ccs->CpState != 4 && ccs->CpState != 5)
  1185. {
  1186. if (ccs->CpState_err == FALSE)
  1187. {
  1188. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]CPD and CCK (before CNT)");
  1189. //CPD: ChargeParameterDiscovery
  1190. //CCK: CableCheck
  1191. //CNT: count down
  1192. }
  1193. ccs->CpState_err = TRUE;
  1194. }
  1195. }
  1196. }
  1197. //Precharge, CurrentDemand
  1198. if(state >= PreChargeRequest && //39
  1199. state <= CurrentDemandResponse) //46
  1200. {
  1201. if(ccs->CpState != 4 && ccs->CpState != 5)
  1202. {
  1203. if (ccs->CpState_err == FALSE)
  1204. {
  1205. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CP][Error]PRC and CUD");
  1206. //PRC: Precharge
  1207. //CUD: CurrentDemand
  1208. }
  1209. ccs->CpState_err = TRUE;
  1210. }
  1211. }
  1212. }
  1213. #endif
  1214. if(ccs->CpState_err == TRUE && ccs->CpState_err_logged == FALSE)
  1215. {
  1216. OutputCpPwmDuty(100);
  1217. //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
  1218. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1219. //CCS_SECC_CP_State_Error (023889)
  1220. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1221. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1222. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1223. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1224. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1225. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1226. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1227. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1228. sprintf((char*)buf_log_evcomm_fork1, "[fork1][Erorr]CP(%d) Error in state %d(%d)",
  1229. ccs->CpState,
  1230. state,
  1231. ccs->CableCheckPreCountDownDone
  1232. );
  1233. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1234. ccs->CpState_err_logged = TRUE;
  1235. }
  1236. return 0;
  1237. }
  1238. /*===========================================================================
  1239. FUNCTION: Check_CP_State_Update_fork1
  1240. DESCRIPTION:
  1241. PRE-CONDITION:
  1242. INPUT:
  1243. OUTPUT:
  1244. GLOBAL VARIABLES:
  1245. =============================================================================*/
  1246. //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
  1247. void Check_CP_State_Update_fork1(struct ChargingInfoData *ccs)
  1248. {
  1249. //CP State
  1250. if (ccs->CpState != ccs->CpState_pre)
  1251. {
  1252. sprintf((char*)buf_log_evcomm_fork1, "[fork1]CP State: %d >> %d (%.2fV)",
  1253. ccs->CpState_pre,
  1254. ccs->CpState,
  1255. ccs->CpVoltage
  1256. );
  1257. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork1);
  1258. ccs->CpState_pre = ccs->CpState;
  1259. }
  1260. }
  1261. //#endif
  1262. /*===========================================================================
  1263. FUNCTION: CP_Detection
  1264. DESCRIPTION:
  1265. 1. In order to detect CP in efficient response time, we creat an independent
  1266. thead for this procedure.
  1267. 2. The priority of this thread is set as the same as other tasks.
  1268. 3. fork1
  1269. PRE-CONDITION:
  1270. INPUT:
  1271. OUTPUT:
  1272. GLOBAL VARIABLES:
  1273. =============================================================================*/
  1274. void CP_Detection()
  1275. {
  1276. pid_t tmp = 0;
  1277. // struct timeb StartTime, EndTime;
  1278. #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
  1279. unsigned char Statetmp;
  1280. float TotalTmpVolt;
  1281. #endif
  1282. struct ChargingInfoData *ccs;
  1283. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1284. if(CP_Detection_Pid == 0)
  1285. {
  1286. tmp = fork();
  1287. if(tmp > 0)
  1288. {
  1289. CP_Detection_Pid = tmp;
  1290. #if 1
  1291. unsigned char buf[64];
  1292. memset(buf, 0, sizeof(buf));
  1293. //sprintf((char*)buf, "renice -20 -p %d", tmp);
  1294. sprintf((char*)buf, "renice -10 -p %d", tmp);
  1295. system((char*)buf);
  1296. #endif
  1297. return;
  1298. }
  1299. }
  1300. while(1)
  1301. {
  1302. //ADC_Voltage = (1+RE62/RE63)*0.9 - (RE62/RE63)*Pilot_Voltage, RE62/RE63=0.06
  1303. //=>Pilot_Voltage=(0.954-ADC_Voltage)/0.06
  1304. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
  1305. {
  1306. ccs->CpVoltage = ShmInternalComm->AC_CpPositiveVoltage;
  1307. ccs->CpState = ShmInternalComm->AC_CpPresentState;
  1308. }
  1309. #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
  1310. {
  1311. TotalTmpVolt = ReadAdcVolt(3);
  1312. ccs->CpVoltage = TotalTmpVolt;
  1313. if (ccs->CpVoltage_pre != ccs->CpVoltage)
  1314. {
  1315. ccs->CpVoltage_pre = ccs->CpVoltage;
  1316. }
  1317. //printf("TotalTmpVolt = %.02f\n", TotalTmpVolt);
  1318. //If CP voltage is higer than 13.5V
  1319. if(TotalTmpVolt >= 13.5)
  1320. {
  1321. //Pilot Error
  1322. if((ccs->CpState == 1) &&
  1323. (TotalTmpVolt < 13.75))
  1324. {
  1325. //V_cp = 13.5 ~ 13.75
  1326. Statetmp = 1;
  1327. }
  1328. else
  1329. {
  1330. //V_cp = 13.5 ~
  1331. Statetmp = 8;
  1332. }
  1333. }
  1334. else if((TotalTmpVolt >= 10.5) && (TotalTmpVolt < 13.5)) //V_cp = 10.5 ~ 13.5
  1335. {
  1336. //State A (12V)
  1337. if((ccs->CpState >= 2) &&
  1338. (ccs->CpState <= 3) &&
  1339. (TotalTmpVolt < 10.75))
  1340. {
  1341. if((ccs->CpDuty >= 5) &&
  1342. (ccs->CpDuty < 100))
  1343. {
  1344. Statetmp = 3;
  1345. }
  1346. else
  1347. {
  1348. Statetmp = 2;
  1349. }
  1350. }
  1351. else if((ccs->CpState == 8) &&
  1352. (TotalTmpVolt >= 13.25))
  1353. {
  1354. Statetmp = 8;
  1355. }
  1356. else
  1357. {
  1358. Statetmp = 1;
  1359. }
  1360. }
  1361. else if((TotalTmpVolt >= 7.5) && (TotalTmpVolt < 10.5))
  1362. {
  1363. //State B (9V)
  1364. if((ccs->CpState == 4) && (TotalTmpVolt < 7.75))
  1365. {
  1366. Statetmp = 4;
  1367. }
  1368. else if((ccs->CpState == 1) && (TotalTmpVolt >= 10.25))
  1369. {
  1370. Statetmp = 1;
  1371. }
  1372. else
  1373. {
  1374. if((ccs->CpDuty >= 5) && (ccs->CpDuty < 100))
  1375. {
  1376. Statetmp = 3;
  1377. }
  1378. else
  1379. {
  1380. Statetmp = 2;
  1381. }
  1382. }
  1383. }
  1384. else if((TotalTmpVolt >= 4.5) && (TotalTmpVolt < 7.5))
  1385. {
  1386. //State C (6V)
  1387. if((ccs->CpState == 5) && (TotalTmpVolt < 4.75))
  1388. {
  1389. Statetmp = 5;
  1390. }
  1391. else if((ccs->CpState >= 2) && (ccs->CpState <= 3) && (TotalTmpVolt >= 7.25))
  1392. {
  1393. if((ccs->CpDuty >= 5)&&(ccs->CpDuty < 100))
  1394. {
  1395. Statetmp = 3;
  1396. }
  1397. else
  1398. {
  1399. Statetmp = 2;
  1400. }
  1401. }
  1402. else
  1403. {
  1404. Statetmp = 4;
  1405. }
  1406. }
  1407. else if((TotalTmpVolt >= 1.5) && (TotalTmpVolt < 4.5))
  1408. {
  1409. //State D (3V)
  1410. if((ccs->CpState == 6)&&(TotalTmpVolt < 1.75))
  1411. {
  1412. Statetmp = 6;
  1413. }
  1414. else if((ccs->CpState == 4)&&(TotalTmpVolt >= 4.25))
  1415. {
  1416. Statetmp = 4;
  1417. }
  1418. else
  1419. {
  1420. Statetmp = 5;
  1421. }
  1422. }
  1423. else if((TotalTmpVolt >= -1.5) && (TotalTmpVolt < 1.5)) //V_cp = -1.5V ~ 1.5V
  1424. {
  1425. //State E (0V)
  1426. if((ccs->CpState == 8) &&
  1427. (TotalTmpVolt < -1.25))
  1428. {
  1429. Statetmp = 8;
  1430. }
  1431. else if((ccs->CpState == 5) &&
  1432. (TotalTmpVolt >= 1.25))
  1433. {
  1434. Statetmp = 5;
  1435. }
  1436. else
  1437. {
  1438. Statetmp = 6;
  1439. }
  1440. }
  1441. else if((TotalTmpVolt >= -13.5) && (TotalTmpVolt < -10.5)) //V_cp = -10.5V ~ -13.5V
  1442. {
  1443. //State F (-12V)
  1444. if((ccs->CpState == 8) &&
  1445. (TotalTmpVolt >= -10.75))
  1446. {
  1447. Statetmp = 8;
  1448. }
  1449. else
  1450. {
  1451. Statetmp = 7;
  1452. }
  1453. }
  1454. else
  1455. {
  1456. //null
  1457. }
  1458. ccs->CpState = Statetmp;
  1459. }
  1460. #endif
  1461. Check_CP_State_Update_fork1(ccs);
  1462. Check_CP_State_Error_fork1(ccs);
  1463. //Updating Plugin status
  1464. #if (PP_PROTECTION_MECHANISM == ENABLE)
  1465. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ) && (ccs->PpVoltage >= 1.0)) //PP >= 1.0V
  1466. #else
  1467. if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ))
  1468. #endif
  1469. {
  1470. ccs->ConnectorPlugIn_new = TRUE;
  1471. }
  1472. else
  1473. {
  1474. ccs->ConnectorPlugIn_new = FALSE;
  1475. OutputCpPwmDuty(100);
  1476. }
  1477. Check_Plugin_Status_Update_fork1(ccs);
  1478. //ftime(&EndTime);
  1479. //DEBUG_PRINTF_EVCOMM_DETAIL("duration:%.02lf\n", DiffTimeb(StartTime, EndTime));
  1480. usleep(1000);
  1481. }//while
  1482. }
  1483. /*===========================================================================
  1484. FUNCTION: PP_Detection
  1485. DESCRIPTION:
  1486. 0. SeccComm fork3
  1487. 1. In order to detect CP in efficient response time, we creat an independent
  1488. thead for this procedure.
  1489. 2. The priority of this thread is set as the same as other tasks.
  1490. PRE-CONDITION:
  1491. INPUT:
  1492. OUTPUT:
  1493. GLOBAL VARIABLES:
  1494. =============================================================================*/
  1495. void PP_Detection()
  1496. {
  1497. pid_t tmp = 0;
  1498. // struct timeb StartTime, EndTime;
  1499. #if ((CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED))
  1500. //unsigned char Statetmp;
  1501. #endif
  1502. float TotalTmpVolt;
  1503. if(PP_Detection_Pid == 0)
  1504. {
  1505. tmp = fork();
  1506. if(tmp > 0)
  1507. {
  1508. PP_Detection_Pid = tmp;
  1509. #if 0
  1510. unsigned char buf[64];
  1511. memset(buf, 0, sizeof(buf));
  1512. sprintf((char*)buf, "renice -20 -p %d", tmp);
  1513. system(buf);
  1514. #endif
  1515. return;
  1516. }
  1517. }
  1518. while(1)
  1519. {
  1520. TotalTmpVolt = ReadAdcVolt_PP_fork3();
  1521. EVCOMM_SYS_INFO.PpVoltage = TotalTmpVolt;
  1522. if (EVCOMM_SYS_INFO.PpVoltage_pre != EVCOMM_SYS_INFO.PpVoltage)
  1523. {
  1524. if ((EVCOMM_SYS_INFO.PpVoltage_pre < 0.5 && EVCOMM_SYS_INFO.PpVoltage >= 1.0) ||
  1525. (EVCOMM_SYS_INFO.PpVoltage_pre >= 1.0 && EVCOMM_SYS_INFO.PpVoltage < 0.5))
  1526. {
  1527. sprintf((char*)buf_log_evcomm_fork3,
  1528. "[fork3]PP(%.2f >> %.2fV)",
  1529. EVCOMM_SYS_INFO.PpVoltage_pre,
  1530. EVCOMM_SYS_INFO.PpVoltage
  1531. );
  1532. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork3);
  1533. EVCOMM_SYS_INFO.PpVoltage_pre = EVCOMM_SYS_INFO.PpVoltage;
  1534. }
  1535. }
  1536. #if 0
  1537. sleep(5);
  1538. printf("V_pp = %.02f\n", TotalTmpVolt);
  1539. #endif
  1540. usleep(1000);
  1541. }//while
  1542. }
  1543. /*===========================================================================
  1544. FUNCTION: Error_Monitor
  1545. DESCRIPTION:
  1546. 1. This function only works in SeccComm fork2.
  1547. PRE-CONDITION:
  1548. INPUT:
  1549. OUTPUT:
  1550. GLOBAL VARIABLES:
  1551. =============================================================================*/
  1552. void Error_Monitor()
  1553. {
  1554. pid_t tmp = 0;
  1555. double time_diff = 0;
  1556. unsigned char status = 0;
  1557. struct ChargingInfoData *ccs;
  1558. ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  1559. if(Error_Monitor_Pid == 0)
  1560. {
  1561. tmp = fork(); //SeccComm fork2
  1562. if(tmp > 0)
  1563. {
  1564. Error_Monitor_Pid = tmp;
  1565. #if 0
  1566. unsigned char buf[64];
  1567. memset(buf, 0, sizeof(buf));
  1568. sprintf((char*)buf, "renice -20 -p %d", tmp);
  1569. system(buf);
  1570. #endif
  1571. return;
  1572. }
  1573. }
  1574. while(1)
  1575. {
  1576. //Step 0
  1577. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  1578. {
  1579. //If the End_Process is in processing, disable Error_Monitor.
  1580. continue;
  1581. }
  1582. //Step1 1: Check and Response to Plugin Status
  1583. if(CheckConnectorPlugIn() == FALSE)
  1584. {
  1585. status = Check_V2G_Flow_Status();
  1586. if (status > IDLE &&
  1587. status < Performance_Timeout &&
  1588. status != CM_SET_KEY_REQ &&
  1589. status != CM_SET_KEY_CNF &&
  1590. EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  1591. {
  1592. #if (CP_PROTECTION_MECHANISM == ENABLE)
  1593. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2] Emergency Stop (due to Connector is plugged out during communication.)");
  1594. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Plug out Error => End_Process");
  1595. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1596. //CCS_SECC_CP_State_Error (023889)
  1597. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1598. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1599. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1600. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1601. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1602. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1603. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1604. End_Process();
  1605. #else
  1606. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CP_PROTECTION_MECHANISM is disabled. Emergency Stop: skipped" );
  1607. #endif
  1608. }
  1609. }
  1610. //Step 2: Check for V2G_SECC_Sequence_Timeout
  1611. //#if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  1612. #if 1
  1613. status = Check_V2G_Flow_Status();
  1614. if (status >= SupportedAppProtocolRequest &&
  1615. status < SessionStopRequest)
  1616. {
  1617. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1618. time_diff = DiffTimeb_fork2_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
  1619. if(time_diff > V2G_SECC_Sequence_Timeout) //60s
  1620. {
  1621. sprintf((char*)buf_log_evcomm_fork2,
  1622. "[fork2]V2G_SECC_Sequence_Timeout in state %d - (%.02lf of %d ms)\n",
  1623. status,
  1624. time_diff,
  1625. V2G_SECC_Sequence_Timeout);
  1626. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1627. Update_V2G_Flow_Status(Sequence_Timeout);
  1628. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1629. //CCS_SECC_TIMEOUT_V2G_Sequence_Time (023844)
  1630. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1631. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1632. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1633. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1634. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  1635. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  1636. End_Process();
  1637. break;
  1638. }
  1639. else if (time_diff > 4000) //4s
  1640. {
  1641. //Check for CSU command of "Stop by EVSE"
  1642. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown)
  1643. {
  1644. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]EVSE_Shutdown");
  1645. Update_V2G_Flow_Status(Other_Fault);
  1646. }
  1647. else if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1648. {
  1649. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]EVSE_EmergencyShutdown");
  1650. Update_V2G_Flow_Status(Other_Fault);
  1651. }
  1652. else if (ShmInternalComm->ChargingPermission == FALSE)
  1653. {
  1654. if (status >= ChargeParameterDiscoveryRequest) //&& status < SessionStopRequest
  1655. {
  1656. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error_Monitor]ChargingPermission = FALSE");
  1657. Update_V2G_Flow_Status(Other_Fault);
  1658. }
  1659. }
  1660. else
  1661. {
  1662. //null
  1663. }
  1664. }
  1665. else
  1666. {
  1667. //null
  1668. }
  1669. }
  1670. #endif
  1671. //Step 3: Check and Response to Error V2gFlowStatus
  1672. status = Check_V2G_Flow_Status();
  1673. if (status == Performance_Timeout ||
  1674. status == Sequence_Timeout ||
  1675. status == Other_Fault)
  1676. {
  1677. sprintf((char*)buf_log_evcomm_fork2,
  1678. "[fork2]Timeout or Fault State(%d) => End_Process",
  1679. status);
  1680. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1681. //Normal Stop
  1682. //alarm and duty to 100%
  1683. //OutputCpPwmDuty(100);
  1684. //SwitchCpStateE(ENABLE); //Set CP duty as 100% and set CP state as E (0V).
  1685. //[Joseph/ To-Do] Set State E (0V) via GPIO setting
  1686. End_Process();
  1687. }
  1688. //Step 4: Check and Response to CP State Error
  1689. if(ccs->CpState_err == TRUE)
  1690. {
  1691. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]CP Error => End_Process");
  1692. Update_V2G_Flow_Status(Other_Fault);
  1693. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1694. //CCS_SECC_CP_State_Error (023889)
  1695. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1696. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1697. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1698. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1699. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  1700. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1701. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1702. End_Process();
  1703. }
  1704. //Step 5: Check and Response to Shutdown Commnad from CSU
  1705. if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown ||
  1706. EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
  1707. {
  1708. if (Check_V2G_Flow_Status() <= SLACC_SDP_TCP_Connection)
  1709. {
  1710. sprintf((char*)buf_log_evcomm_fork2,
  1711. "[fork2]EVSE Shutdown(%d) => End_Process",
  1712. EVCOMM_SYS_INFO.DC_EVSEStatus);
  1713. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1714. Update_V2G_Flow_Status(Other_Fault);
  1715. End_Process();
  1716. }
  1717. }
  1718. //Step 6: Check and Response to SessionStop
  1719. status = Check_V2G_Flow_Status();
  1720. if (status == SessionStopResponse)
  1721. {
  1722. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]SessionStopResponse => End_Process");
  1723. End_Process();
  1724. }
  1725. //Step 7: Check for ChargingPermission from TRUE to FALSE before V2G Messages
  1726. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  1727. if ((ShmInternalComm->ChargingPermission == FALSE) &&
  1728. (ShmInternalComm->ChargingPermission_pre >= 1) &&
  1729. (ccs->CpState >= 3) && (ccs->CpState <=5))
  1730. {
  1731. if (status >= CM_SLAC_PARM_REQ &&
  1732. status != CM_SET_KEY_REQ &&
  1733. status != CM_SET_KEY_CNF &&
  1734. status <= SLACC_SDP_TCP_Connection)
  1735. {
  1736. sprintf((char*)buf_log_evcomm_fork2,
  1737. "[fork2]Permission OFF before V2G msg(%d) => End_Process",
  1738. ShmInternalComm->ChargingPermission);
  1739. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1740. Update_V2G_Flow_Status(Other_Fault);
  1741. End_Process();
  1742. }
  1743. }
  1744. //Step 8: DC OVP Protection
  1745. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1746. status > CableCheckResponse &&
  1747. status <= SessionStopRequest &&
  1748. status != ChargingStatusRequest &&
  1749. status != ChargingStatusResponse &&
  1750. EVCOMM_SYS_INFO.EvBatteryMaxVoltage != 0)
  1751. {
  1752. //Part A: OVP Protection
  1753. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)) // 2%
  1754. {
  1755. sprintf((char*)buf_log_evcomm_fork2,
  1756. "[fork2][Error]OVP => End_Process (%.02f > %.02f)",
  1757. EVCOMM_SYS_INFO.PresentChargingVoltage,
  1758. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02));
  1759. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1760. Update_V2G_Flow_Status(Other_Fault);
  1761. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1762. //System CCS output OVP (012219)
  1763. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1764. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1765. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1766. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1767. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1768. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1769. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1770. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1771. End_Process();
  1772. }
  1773. //Part B: Over Voltage Request Protection
  1774. if (EVCOMM_SYS_INFO.EvBatterytargetVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02))
  1775. {
  1776. sprintf((char*)buf_log_evcomm_fork2,
  1777. "[fork2]Over V Req => End_Process (%.02f > %.02f)",
  1778. EVCOMM_SYS_INFO.EvBatterytargetVoltage,
  1779. (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)
  1780. );
  1781. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm_fork2);
  1782. Update_V2G_Flow_Status(Other_Fault);
  1783. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1784. //System CCS output OVP (012219)
  1785. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1786. ShmStatusCodeData->PresentStatusCode[0][1] = 1;
  1787. ShmStatusCodeData->PresentStatusCode[0][2] = 2;
  1788. ShmStatusCodeData->PresentStatusCode[0][3] = 2;
  1789. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  1790. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  1791. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1792. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1793. End_Process();
  1794. }
  1795. }
  1796. //Step 9: Check 60V
  1797. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  1798. if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
  1799. ShmInternalComm->ChargingPermission >= 1 &&
  1800. status < CableCheckRequest)
  1801. {
  1802. if (EVCOMM_SYS_INFO.PresentChargingVoltage >= 60) //60V
  1803. {
  1804. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]DC Output Voltage is over 60V => End_Process");
  1805. Update_V2G_Flow_Status(Other_Fault);
  1806. //Update_ShmStatusCode(); //[To-Do] to be implemented
  1807. //CCS_SECC_Unexpected_60V_Before_Charing_Error (023890)
  1808. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  1809. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  1810. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  1811. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  1812. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  1813. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  1814. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  1815. //Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  1816. End_Process();
  1817. }
  1818. }
  1819. //Step 10: Check if the connector is unplug from plugin
  1820. if (EVCOMM_SYS_INFO.ConnectorPlugIn_pre == TRUE && EVCOMM_SYS_INFO.ConnectorPlugIn == FALSE)
  1821. {
  1822. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Unplug Reset => End_Process");
  1823. Update_V2G_Flow_Status(Other_Fault);
  1824. End_Process();
  1825. }
  1826. usleep(1000);
  1827. }//while
  1828. }
  1829. /*===========================================================================
  1830. FUNCTION: SendSetKey
  1831. DESCRIPTION:
  1832. PRE-CONDITION:
  1833. INPUT:
  1834. OUTPUT:
  1835. GLOBAL VARIABLES:
  1836. =============================================================================*/
  1837. int SendSetKey()
  1838. {
  1839. int i = 0;
  1840. unsigned char nRandValue = 0x0;
  1841. unsigned char ConstString[16] = "PhihongKey000000";
  1842. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  1843. memcpy(SendMmePacket.ODA,QcaMac,6);
  1844. memcpy(SendMmePacket.OSA,CsuMac,6);
  1845. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  1846. SendMmePacket.MMV = 0x01;
  1847. SendMmePacket.MMTYPE = MMTYPE_CM_SET_KEY_REQ;
  1848. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  1849. SendMmePacketSize = 0;
  1850. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate ��NMK��
  1851. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
  1852. SendMmePacketSize+=4;
  1853. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
  1854. SendMmePacketSize+=4;
  1855. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
  1856. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
  1857. SendMmePacketSize+=2;
  1858. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00;//PMN, Fixed value(0x00) encrypted payload not used
  1859. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//CCo Capablility
  1860. srand(time(NULL));
  1861. for (i = 10; i < 16; i++)
  1862. {
  1863. nRandValue = (rand()%62) + 1;
  1864. if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
  1865. {
  1866. ConstString[i]= nRandValue + 0x30;
  1867. }
  1868. else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
  1869. {
  1870. ConstString[i]= nRandValue -10 + 0x41;
  1871. }
  1872. else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
  1873. {
  1874. ConstString[i]= nRandValue -37 + 0x61;
  1875. }
  1876. else
  1877. {
  1878. ConstString[i]= 0x30;
  1879. }
  1880. }
  1881. memset(NewNmkKey,0,sizeof(NewNmkKey));
  1882. memset(Nid,0,sizeof(Nid));
  1883. HPAVKeyNMK(NewNmkKey, (char*)ConstString);
  1884. HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
  1885. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid)); //NID, 54 LSBs contain the NID 2 MSBs = 0b00
  1886. SendMmePacketSize+=sizeof(Nid);
  1887. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
  1888. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
  1889. SendMmePacketSize += sizeof(NewNmkKey);
  1890. SendMmePacketSize += 19; //the size before MMENTRY
  1891. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Tx]CM_SET_KEY_REQ");
  1892. i = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1893. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  1894. DEBUG_PRINTF_EVCOMM_DETAIL("SendSetKey: send size =%d\n",i);
  1895. return 0;
  1896. }
  1897. /*===========================================================================
  1898. FUNCTION: GetQca7kMac
  1899. DESCRIPTION:
  1900. PRE-CONDITION:
  1901. INPUT:
  1902. OUTPUT:
  1903. GLOBAL VARIABLES:
  1904. =============================================================================*/
  1905. int GetQca7kMac()
  1906. {
  1907. struct QcaVendorMmeHeader SendPacket;
  1908. memset(&SendPacket, 0, sizeof(struct QcaVendorMmeHeader));
  1909. memset(SendPacket.ODA, 0xFF, 6); //broadcast
  1910. memcpy(SendPacket.OSA, CsuMac, 6);
  1911. SendPacket.MTYPE = htons(EtherType_HomePlug);
  1912. SendPacket.MMV = 0x00;
  1913. SendPacket.MMTYPE = MMTYPE_VENDOR_VS_NW_INFO;
  1914. SendPacket.OUI[0] = 0x00;
  1915. SendPacket.OUI[1] = 0xB0;
  1916. SendPacket.OUI[2] = 0x52;
  1917. DEBUG_PRINTF_EVCOMM_DETAIL("GetQca7kMac: send size =%d\n", sendto(RawSock, &SendPacket, 20, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll)));
  1918. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Req for QCA7K MacAddr");
  1919. return 0;
  1920. }
  1921. /*===========================================================================
  1922. FUNCTION: Array_Check_All_Zero
  1923. DESCRIPTION:
  1924. PRE-CONDITION:
  1925. INPUT:
  1926. OUTPUT:
  1927. result:
  1928. (1) TRUE: all zero
  1929. (2) FALSE: not all zero
  1930. GLOBAL VARIABLES:
  1931. =============================================================================*/
  1932. int Array_Check_All_Zero(unsigned char *ptr, int size)
  1933. {
  1934. int result = TRUE;
  1935. int i = 0;
  1936. for (i = 0; i < size; i++)
  1937. {
  1938. if (ptr[i] != 0)
  1939. {
  1940. result = FALSE;
  1941. break;
  1942. }
  1943. }
  1944. return result;
  1945. }
  1946. /*===========================================================================
  1947. FUNCTION: Array_Compare_Identity
  1948. DESCRIPTION:
  1949. PRE-CONDITION:
  1950. INPUT:
  1951. OUTPUT:
  1952. result = FALSE (not identical)
  1953. result = TRUE (identical)
  1954. GLOBAL VARIABLES:
  1955. =============================================================================*/
  1956. int Array_Compare_Identity(unsigned char *ptrA, unsigned char *ptrB, int size)
  1957. {
  1958. int result = TRUE;
  1959. int i = 0;
  1960. for (i = 0; i < size; i++)
  1961. {
  1962. if (ptrA[i] != ptrB[i])
  1963. {
  1964. result = FALSE;
  1965. #if 0
  1966. sprintf((char*)buf_log_evcomm,
  1967. "[Array_Compare_Identity]%02X%02X%02X%02X%02X%02X,%02X%02X%02X%02X%02X%02X(%d)\n",
  1968. ptrA[0], ptrA[1], ptrA[2], ptrA[3], ptrA[4], ptrA[5],
  1969. ptrB[0], ptrB[1], ptrB[2], ptrB[3], ptrB[4], ptrB[5],
  1970. result);
  1971. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  1972. #endif
  1973. break;
  1974. }
  1975. }
  1976. return result;
  1977. }
  1978. /*===========================================================================
  1979. FUNCTION: SLAC_DB_Search_EvMac_idx
  1980. DESCRIPTION:
  1981. PRE-CONDITION:
  1982. INPUT:
  1983. OUTPUT:
  1984. idx = -1 (not found)
  1985. GLOBAL VARIABLES:
  1986. =============================================================================*/
  1987. int SLAC_DB_Search_EvMac_idx(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in)
  1988. {
  1989. int idx = -1;
  1990. int i = 0;
  1991. if (evcc->arrayLen == 0)
  1992. {
  1993. //printf("[SLAC_DB_Search_EvMac_idx]arrayLen is empty (%d)\n", evcc->arrayLen);
  1994. //no need to search
  1995. }
  1996. else if (evcc->arrayLen > EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE)
  1997. {
  1998. //error
  1999. sprintf((char*)buf_log_evcomm,
  2000. "[ERROR][SLAC_DB_Search_EvMac_idx]DB length(%d) > %d",
  2001. evcc->arrayLen,
  2002. EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE);
  2003. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2004. evcc->arrayLen = 0; //reset
  2005. }
  2006. else
  2007. {
  2008. //start searching
  2009. for (i = 0; i < evcc->arrayLen; i++)
  2010. {
  2011. //printf("[SLAC_DB_Search_EvMac_idx]checking DB[%d]...\n", i);
  2012. if (Array_Compare_Identity(evcc->array[i].EvMac, EvMac_in, SLAC_EVMAC_LENGTH) == TRUE)
  2013. {
  2014. //printf("[SLAC_DB_Search_EvMac_idx]identical at DB[%d]...\n", i);
  2015. idx = i;
  2016. break;
  2017. }
  2018. }
  2019. }
  2020. //printf("[SLAC_DB_Search_EvMac_idx]return = %d\n", idx);
  2021. return idx;
  2022. }
  2023. /*===========================================================================
  2024. FUNCTION: SLAC_DB_Check_EvMac_RunID_Matching
  2025. DESCRIPTION:
  2026. PRE-CONDITION:
  2027. INPUT:
  2028. OUTPUT:
  2029. res = FALSE (unmatched)
  2030. res = TRUE (matched)
  2031. GLOBAL VARIABLES:
  2032. =============================================================================*/
  2033. int SLAC_DB_Check_EvMac_RunID_Matching(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in, unsigned char *RunID_in)
  2034. {
  2035. int res = FALSE;
  2036. int idx = -1;
  2037. idx = SLAC_DB_Search_EvMac_idx(evcc, EvMac_in);
  2038. if (idx >= 0)
  2039. {
  2040. res = Array_Compare_Identity(evcc->array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2041. }
  2042. else
  2043. {
  2044. //not found the EvMac data in DB
  2045. res = FALSE;
  2046. }
  2047. return res;
  2048. }
  2049. /*===========================================================================
  2050. FUNCTION: SLAC_DB_Add
  2051. DESCRIPTION:
  2052. 1. Saving each CM_SLAC_PARM_REQ data into EVCC database if its
  2053. EvMac and RunID data are different, respectively.
  2054. PRE-CONDITION:
  2055. INPUT:
  2056. OUTPUT:
  2057. idx = saved index (must be a positive value)
  2058. GLOBAL VARIABLES:
  2059. =============================================================================*/
  2060. int SLAC_DB_Add(unsigned char *EvMac_in, unsigned char *RunID_in)
  2061. {
  2062. int idx = -1;
  2063. //Search if this EvMac and RunID already exists
  2064. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2065. if (idx < 0) //not exist, yet.
  2066. {
  2067. if (SLAC_INFO.arrayLen < EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE) //20
  2068. {
  2069. sprintf((char*)buf_log_evcomm,
  2070. "[SLAC_DB_Add]data does not exist => added to %d-th",
  2071. SLAC_INFO.arrayLen);
  2072. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  2073. if (SLAC_INFO.arrayLen >= 0)
  2074. {
  2075. memset(&SLAC_INFO.array[SLAC_INFO.arrayLen], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  2076. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  2077. memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2078. idx = SLAC_INFO.arrayLen;
  2079. SLAC_INFO.arrayLen++;
  2080. }
  2081. else
  2082. {
  2083. sprintf((char*)buf_log_evcomm,
  2084. "[ERROR][SLAC_DB_Add]arrayLen: unexpected(%d)",
  2085. SLAC_INFO.arrayLen);
  2086. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  2087. SLAC_INFO.arrayLen = 0;
  2088. }
  2089. }
  2090. else
  2091. {
  2092. //DB is full
  2093. sprintf((char*)buf_log_evcomm,
  2094. "[SLAC_DB_Add]DB is full(%d) => bypass",
  2095. SLAC_INFO.arrayLen);
  2096. DEBUG_PRINTF_EVCOMM_DETAIL("%s\n", buf_log_evcomm);
  2097. }
  2098. }
  2099. else
  2100. {
  2101. #if 0
  2102. sprintf((char*)buf_log_evcomm,
  2103. "[SLAC_DB_Add]EvMac: existed (%d)",
  2104. idx);
  2105. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2106. #endif
  2107. //Check RunID
  2108. if (Array_Compare_Identity(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH) == TRUE)
  2109. {
  2110. //RunID is the same
  2111. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Add]RunID: same");
  2112. }
  2113. else
  2114. {
  2115. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Add]RunID: diff");
  2116. }
  2117. //Reset all corresponding parameters
  2118. #if 0
  2119. sprintf((char*)buf_log_evcomm,
  2120. "[SLAC_DB_Add]EvMac: reset para(%d)",
  2121. idx);
  2122. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2123. #endif
  2124. memset(&SLAC_INFO.array[idx], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
  2125. memcpy(SLAC_INFO.array[idx].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
  2126. memcpy(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
  2127. }
  2128. return idx;
  2129. }
  2130. /*===========================================================================
  2131. FUNCTION: SLAC_DB_Reset
  2132. DESCRIPTION:
  2133. PRE-CONDITION:
  2134. INPUT:
  2135. OUTPUT:
  2136. GLOBAL VARIABLES:
  2137. =============================================================================*/
  2138. int SLAC_DB_Reset()
  2139. {
  2140. memset(&SLAC_INFO, 0, sizeof(struct EVCC_SLAC_DATA_TYPE));
  2141. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC_DB_Reset]DONE");
  2142. return 0;
  2143. }
  2144. /*===========================================================================
  2145. FUNCTION: MmeProcess
  2146. DESCRIPTION:
  2147. PRE-CONDITION:
  2148. INPUT:
  2149. OUTPUT:
  2150. GLOBAL VARIABLES:
  2151. =============================================================================*/
  2152. int MmeProcess(unsigned char *Buffer, int DataLength)
  2153. {
  2154. //struct ethhdr *EthPacket;
  2155. struct MmeHeader *MmePacket;
  2156. static unsigned char counter;
  2157. unsigned char state = 0;
  2158. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2159. unsigned char tmpBuf[2048]={0};
  2160. #endif
  2161. int Rtn = 0;
  2162. #if(NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2163. int idx = 0;
  2164. unsigned char *EvMac_in;
  2165. unsigned char *RunID_in;
  2166. #endif
  2167. MmePacket = (struct MmeHeader *)Buffer;
  2168. state = Check_V2G_Flow_Status();
  2169. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2170. {
  2171. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  2172. DEBUG_PRINTF_EVCOMM_DETAIL("******* Received MME Packet *******\n");
  2173. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  2174. DEBUG_PRINTF_EVCOMM_DETAIL("DataLength=%d\n",DataLength);
  2175. DEBUG_PRINTF_EVCOMM_DETAIL("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Destination MAC Address
  2176. MmePacket->ODA[0], MmePacket->ODA[1],
  2177. MmePacket->ODA[2], MmePacket->ODA[3],
  2178. MmePacket->ODA[4], MmePacket->ODA[5]);
  2179. DEBUG_PRINTF_EVCOMM_DETAIL("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Source MAC Address (EV MAC)
  2180. MmePacket->OSA[0], MmePacket->OSA[1],
  2181. MmePacket->OSA[2], MmePacket->OSA[3],
  2182. MmePacket->OSA[4], MmePacket->OSA[5]);
  2183. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  2184. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", MmePacket->MMV);
  2185. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  2186. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n",
  2187. MmePacket->FMI[0],MmePacket->FMI[1]);
  2188. }
  2189. #endif
  2190. #if (SLAC_FIRST_RESPONSE_METHOD == SET_NO_PWM_IF_NOT_GET_PERMISSION)
  2191. {
  2192. //Check CP as 5%
  2193. if (EVCOMM_SYS_INFO.CpState != 3 &&
  2194. EVCOMM_SYS_INFO.CpState != 4 &&
  2195. MmePacket->MMTYPE != MMTYPE_CM_SET_KEY_CNF &&
  2196. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_HOST_ACTION &&
  2197. MmePacket->MMTYPE != MMTYPE_VENDOR_ATTEN_CHAR &&
  2198. MmePacket->MMTYPE != MMTYPE_VENDOR_VS_NW_INFO_CNF
  2199. )
  2200. {
  2201. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC]ignored(wrong CP state)");
  2202. return 0;
  2203. }
  2204. }
  2205. #endif
  2206. //[To-Do] Adding a pre-check filter mechanism for Source and Destination MAC Address
  2207. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  2208. switch(MmePacket->MMTYPE)
  2209. {
  2210. case MMTYPE_CM_SET_KEY_CNF:
  2211. {
  2212. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SET_KEY_CNF ---\n");
  2213. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[0]);
  2214. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Rx]CM_SET_KEY_CNF (SetKey: DONE)");
  2215. Update_V2G_Flow_Status(CM_SET_KEY_CNF);
  2216. break;
  2217. }
  2218. case MMTYPE_CM_SLAC_PARM_REQ:
  2219. {
  2220. //Check QCA7000 status
  2221. if (EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  2222. {
  2223. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(QCA7K init...)");
  2224. break;
  2225. }
  2226. //Check error state
  2227. state = Check_V2G_Flow_Status();
  2228. if (state == Performance_Timeout || //253
  2229. state == Sequence_Timeout || //254
  2230. state == Other_Fault) //255
  2231. {
  2232. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(in error state)");
  2233. break;
  2234. }
  2235. //Printing EV MAC Address
  2236. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_PARM_REQ");
  2237. //Avoid Coupled SLAC_PARM_REQ
  2238. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2239. {
  2240. #if 0
  2241. sprintf((char*)buf_log_evcomm,
  2242. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(coupled SLAC,%d)",
  2243. CheckConnectorPlugIn());
  2244. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2245. #endif
  2246. break;
  2247. }
  2248. //[TC_SECC_VTB_CmSlacParm_003] SECURITY_TYPE needs to be 0x00 (no security)
  2249. if (MmePacket->MMENTRY[1] != 0)
  2250. {
  2251. sprintf((char*)buf_log_evcomm,
  2252. "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(invalid SECURITY_TYPE,%d)", //Source MAC Address (EV MAC)
  2253. MmePacket->MMENTRY[1]);
  2254. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2255. break;
  2256. }
  2257. //=================== Legal CM_SLAC_PARM_REQ Zone =================
  2258. Update_V2G_Flow_Status(CM_SLAC_PARM_REQ);
  2259. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_RX_CM_SLAC_PARM_REQ)
  2260. {
  2261. //Once receiving CM_SLAC_PARM_REQ, set PWM as 5%
  2262. SwitchCpStateE(DISABLE);
  2263. OutputCpPwmDuty(5);
  2264. }
  2265. #endif
  2266. //Checking if this SLAC Req comes before 5% PWM (for 15118)
  2267. if(ShmInternalComm->ChargingPermission == FALSE)
  2268. {
  2269. //Sniffer_Tcpdump(ENABLE);
  2270. sprintf((char*)buf_log_evcomm, "Check Permission: %d (SLAC first => START)", ShmInternalComm->ChargingPermission);
  2271. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2272. }
  2273. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2274. {
  2275. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
  2276. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2277. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2278. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2279. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2280. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2281. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2282. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2283. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  2284. DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuite [1]: 0x%x,0x%x\n",
  2285. MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  2286. }
  2287. #endif
  2288. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2289. {
  2290. //Saving each CM_SLAC_PARM_REQ data into EVCC database
  2291. EvMac_in = &MmePacket->OSA[0];
  2292. RunID_in = &MmePacket->MMENTRY[2];
  2293. idx = SLAC_DB_Add(EvMac_in, RunID_in); //(EvMac, RunID)
  2294. if (idx < 0)
  2295. {
  2296. sprintf((char*)buf_log_evcomm,
  2297. "[WARNING][CM_SLAC_PARM_REQ]DB is full or errors occour(%d) => ignore",
  2298. idx);
  2299. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2300. break;
  2301. }
  2302. //Select the 1st EV MAC address
  2303. if (SLAC_INFO.arrayLen == 1) //1st Req
  2304. {
  2305. #if 1
  2306. sprintf((char*)buf_log_evcomm,
  2307. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):selected",
  2308. (idx + 1),
  2309. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2310. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2311. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2312. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2313. #endif
  2314. /*
  2315. sprintf((char*)buf_log_evcomm,
  2316. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (selected)", //Source MAC Address (EV MAC)
  2317. SLAC_INFO.arrayLen,
  2318. MmePacket->OSA[0], MmePacket->OSA[1],
  2319. MmePacket->OSA[2], MmePacket->OSA[3],
  2320. MmePacket->OSA[4], MmePacket->OSA[5]);
  2321. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2322. sprintf((char*)buf_log_evcomm,
  2323. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (selected)", //RunID (from EVCC)
  2324. SLAC_INFO.arrayLen,
  2325. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2326. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2327. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2328. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2329. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2330. */
  2331. }
  2332. else //2nd Req
  2333. {
  2334. #if 1
  2335. sprintf((char*)buf_log_evcomm,
  2336. "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):not selected",
  2337. (idx + 1),
  2338. MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
  2339. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2340. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2341. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2342. #endif
  2343. /*
  2344. sprintf((char*)buf_log_evcomm,
  2345. "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (not selected)", //Source MAC Address (EV MAC)
  2346. SLAC_INFO.arrayLen,
  2347. MmePacket->OSA[0], MmePacket->OSA[1],
  2348. MmePacket->OSA[2], MmePacket->OSA[3],
  2349. MmePacket->OSA[4], MmePacket->OSA[5]);
  2350. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2351. sprintf((char*)buf_log_evcomm,
  2352. "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (not selected)", //RunID (from EVCC)
  2353. SLAC_INFO.arrayLen,
  2354. MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2355. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
  2356. MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
  2357. MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
  2358. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2359. */
  2360. }
  2361. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2362. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, SLAC_EVMAC_LENGTH);
  2363. memcpy(SlacRunId, MmePacket->MMENTRY + 2, SLAC_RUNID_LENGTH);
  2364. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2365. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2366. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2367. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2368. SendMmePacket.MMV = MmePacket->MMV;
  2369. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2370. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2371. SendMmePacketSize = 0;
  2372. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2373. SendMmePacketSize += 6;
  2374. 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
  2375. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2376. 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
  2377. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SLAC_INFO.array[idx].EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2378. SendMmePacketSize += 6;
  2379. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2380. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2381. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, SLAC_RUNID_LENGTH); //RunID (8-byte)
  2382. SendMmePacketSize += SLAC_RUNID_LENGTH;
  2383. SendMmePacketSize += 19; //the size before MMENTRY
  2384. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2385. {
  2386. DEBUG_PRINTF_EVCOMM_DETAIL("***** Response MME Packet *****\n");
  2387. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2388. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2389. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2390. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2391. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2392. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2393. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2394. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2395. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2396. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2397. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2398. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2399. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2400. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2401. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2402. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2403. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2404. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2405. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2406. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2407. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2408. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2409. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2410. }
  2411. #endif
  2412. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2413. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2414. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2415. ftime(&SeqStartTime);
  2416. counter = 0;
  2417. break;
  2418. }
  2419. #else
  2420. {
  2421. memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
  2422. memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, sizeof(EvMac));
  2423. memcpy(SlacRunId,MmePacket->MMENTRY + 2, sizeof(SlacRunId));
  2424. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2425. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  2426. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2427. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2428. SendMmePacket.MMV = MmePacket->MMV;
  2429. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
  2430. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2431. SendMmePacketSize = 0;
  2432. memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  2433. SendMmePacketSize += 6;
  2434. 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
  2435. SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
  2436. 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
  2437. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
  2438. SendMmePacketSize += 6;
  2439. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
  2440. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
  2441. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, sizeof(SlacRunId)); //RunID (8-byte)
  2442. SendMmePacketSize += sizeof(SlacRunId);
  2443. SendMmePacketSize += 19; //the size before MMENTRY
  2444. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2445. {
  2446. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  2447. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2448. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  2449. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2450. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  2451. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  2452. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  2453. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  2454. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  2455. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
  2456. DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2457. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  2458. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  2459. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  2460. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  2461. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  2462. DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  2463. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  2464. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  2465. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  2466. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  2467. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2468. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  2469. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  2470. }
  2471. #endif
  2472. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  2473. Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
  2474. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  2475. ftime(&SeqStartTime);
  2476. counter = 0;
  2477. break;
  2478. }
  2479. #endif
  2480. }
  2481. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  2482. {
  2483. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2484. {
  2485. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(timeup)");
  2486. break;
  2487. }
  2488. //Avoid Coupled CM_START_ATTEN_CHAR_IND
  2489. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2490. {
  2491. sprintf((char*)buf_log_evcomm,
  2492. "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(coupled SLAC,%d)",
  2493. CheckConnectorPlugIn());
  2494. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2495. break;
  2496. }
  2497. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2498. {
  2499. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n", counter);
  2500. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2501. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2502. DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  2503. DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  2504. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]); //Fixed value (0x01) indicating ��other Green PHY station��
  2505. DEBUG_PRINTF_EVCOMM_DETAIL("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2506. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  2507. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  2508. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2509. MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
  2510. MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
  2511. }
  2512. #endif
  2513. //New SLAC architecture designed by Joseph
  2514. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2515. {
  2516. EvMac_in = &MmePacket->OSA[0];
  2517. RunID_in = &MmePacket->MMENTRY[11];
  2518. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2519. if (idx >= 0)
  2520. {
  2521. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2522. counter++;
  2523. //[TC_SECC_VTB_AttenuationCharacterization_013]
  2524. if (MmePacket->MMENTRY[0] != 0) //APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  2525. {
  2526. sprintf((char*)buf_log_evcomm,
  2527. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]APPLICATION_TYPE(%d): invalid => ignore Req",
  2528. MmePacket->MMENTRY[0]);
  2529. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2530. break;
  2531. }
  2532. //[TC_SECC_VTB_AttenuationCharacterization_014]
  2533. if (MmePacket->MMENTRY[1] != 0) //SECURITY_TYPE must be 0x00(No Security)
  2534. {
  2535. sprintf((char*)buf_log_evcomm,
  2536. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]SECURITY_TYPE(%d): invalid => ignore Req",
  2537. MmePacket->MMENTRY[1]);
  2538. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2539. break;
  2540. }
  2541. //[TC_SECC_VTB_AttenuationCharacterization_017]
  2542. if (MmePacket->MMENTRY[4] != 0x01) //RESP_TYPE must be 0x01(Send to another GP STA(EV))
  2543. {
  2544. sprintf((char*)buf_log_evcomm,
  2545. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]RESP_TYPE(%d): invalid => ignore Req",
  2546. MmePacket->MMENTRY[4]);
  2547. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2548. break;
  2549. }
  2550. //[TC_SECC_VTB_AttenuationCharacterization_021]
  2551. //FORWARDING_STA: MAC Address of the EV HLE (station which the measurement results shall be sent to)
  2552. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[5], SLAC_EVMAC_LENGTH) == FALSE)
  2553. {
  2554. sprintf((char*)buf_log_evcomm,
  2555. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]FORWARDING_STA(%02X:%02X:%02X:%02X:%02X:%02X): invalid => ignore Req",
  2556. MmePacket->MMENTRY[5], MmePacket->MMENTRY[6],
  2557. MmePacket->MMENTRY[7], MmePacket->MMENTRY[8],
  2558. MmePacket->MMENTRY[9], MmePacket->MMENTRY[10]);
  2559. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2560. SLAC_INFO.array[idx].StartAttenCharErr = TRUE;
  2561. break;
  2562. }
  2563. //Check RunID
  2564. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2565. {
  2566. SLAC_INFO.array[idx].MnbcSoundNum = MmePacket->MMENTRY[2];
  2567. SLAC_INFO.array[idx].StartAttenCharCnt++;
  2568. #if 0
  2569. sprintf((char*)buf_log_evcomm,
  2570. "[SLAC][Rx]CM_START_ATTEN_CHAR_IND[%d]:%d-th",
  2571. (idx + 1),
  2572. SLAC_INFO.array[idx].StartAttenCharCnt);
  2573. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2574. #endif
  2575. if (SLAC_INFO.array[idx].StartAttenCharCnt == 1)
  2576. {
  2577. memset(SLAC_INFO.array[idx].AAG, 0, sizeof(SLAC_INFO.array[idx].AAG));
  2578. SLAC_INFO.array[idx].AttenProfileCnt = 0;
  2579. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2580. }
  2581. else if (SLAC_INFO.array[idx].StartAttenCharCnt >= 3)
  2582. {
  2583. sprintf((char*)buf_log_evcomm,
  2584. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]counter(%d): unexpected",
  2585. SLAC_INFO.array[idx].StartAttenCharCnt);
  2586. }
  2587. else
  2588. {
  2589. //null
  2590. }
  2591. }
  2592. else
  2593. {
  2594. //This RunID is not matched with this EvMac,
  2595. //or this RunID is not found in DB.
  2596. sprintf((char*)buf_log_evcomm,
  2597. "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]EvMac-RunID: unmatched => ignore Req");
  2598. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2599. //Response: ignore
  2600. }
  2601. }
  2602. else
  2603. {
  2604. //this msg source is not in database
  2605. //ignore
  2606. }
  2607. break;
  2608. }
  2609. #else //Old SLAC architecture designed by Vern
  2610. {
  2611. MnbcSoundNum = MmePacket->MMENTRY[2];
  2612. Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
  2613. counter++;
  2614. if(counter == 1)
  2615. {
  2616. memset(Aag, 0, sizeof(Aag));
  2617. AttenProfileCnt = 0;
  2618. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  2619. }
  2620. else if(counter >= 3)
  2621. {
  2622. counter = 0;
  2623. }
  2624. break;
  2625. }
  2626. #endif
  2627. }
  2628. case MMTYPE_CM_MNBC_SOUND_IND:
  2629. {
  2630. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2631. {
  2632. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(timeup)");
  2633. break;
  2634. }
  2635. //Avoid Coupled CM_MNBC_SOUND_IND
  2636. if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
  2637. {
  2638. sprintf((char*)buf_log_evcomm,
  2639. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(coupled SLAC,%d)",
  2640. CheckConnectorPlugIn());
  2641. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2642. break;
  2643. }
  2644. if(V2gFlowStatus == CM_START_ATTEN_CHAR_IND)
  2645. {
  2646. counter = 0;
  2647. }
  2648. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2649. {
  2650. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n", counter, SLAC_INFO.array[idx].MnbcSoundNum);
  2651. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2652. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2653. DEBUG_PRINTF_EVCOMM_DETAIL("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2654. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2655. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
  2656. MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
  2657. MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
  2658. MmePacket->MMENTRY[18]);
  2659. DEBUG_PRINTF_EVCOMM_DETAIL("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  2660. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2661. MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
  2662. MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
  2663. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2664. MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
  2665. MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
  2666. DEBUG_PRINTF_EVCOMM_DETAIL("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2667. MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
  2668. MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
  2669. MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
  2670. MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
  2671. }
  2672. #endif
  2673. //New SLAC architecture designed by Joseph
  2674. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2675. {
  2676. EvMac_in = &MmePacket->OSA[0];
  2677. RunID_in = &MmePacket->MMENTRY[20];
  2678. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2679. if (idx >= 0)
  2680. {
  2681. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2682. counter++;
  2683. //Check for RunID
  2684. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
  2685. {
  2686. SLAC_INFO.array[idx].MnbcSoundCnt++;
  2687. /*
  2688. sprintf((char*)buf_log_evcomm,
  2689. "[SLAC][Rx]CM_MNBC_SOUND_IND[%d]:%d-th",
  2690. (idx + 1),
  2691. SLAC_INFO.array[idx].MnbcSoundCnt);
  2692. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2693. */
  2694. }
  2695. else
  2696. {
  2697. //RunID is not matched or does not exist.
  2698. sprintf((char*)buf_log_evcomm,
  2699. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac-RunID: unmatched");
  2700. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2701. }
  2702. }
  2703. else
  2704. {
  2705. //ignore
  2706. sprintf((char*)buf_log_evcomm,
  2707. "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac does not exist");
  2708. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2709. }
  2710. break;
  2711. }
  2712. #else //Old SLAC architecture designed by Vern
  2713. {
  2714. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2715. counter++;
  2716. break;
  2717. }
  2718. #endif
  2719. }
  2720. case MMTYPE_CM_ATTEN_PROFILE_IND:
  2721. {
  2722. if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
  2723. {
  2724. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[WARNING][SLAC][Rx]CM_ATTEN_PROFILE_IND: ignore(timeup)");
  2725. break;
  2726. }
  2727. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2728. {
  2729. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n", counter, SLAC_INFO.array[idx].MnbcSoundNum);
  2730. DEBUG_PRINTF_EVCOMM_DETAIL("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2731. MmePacket->MMENTRY[0], MmePacket->MMENTRY[1], MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
  2732. MmePacket->MMENTRY[4], MmePacket->MMENTRY[5]);
  2733. DEBUG_PRINTF_EVCOMM_DETAIL("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]); //NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2734. //NumGroups: Number of OFDM carrier groups used for the SLAC signal characterization.
  2735. //AAG[i]: Average Attenuation of Group i (i = 1 ~ 58)
  2736. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  2737. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
  2738. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2739. {
  2740. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, MmePacket->MMENTRY[8 + Rtn]);
  2741. }
  2742. DEBUG_PRINTF_EVCOMM_DETAIL("AAG: %s\n", tmpBuf);
  2743. }
  2744. #endif
  2745. //New SLAC architecture designed by Joseph
  2746. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2747. {
  2748. EvMac_in = &MmePacket->MMENTRY[0]; //[CAUTION] The EvMac address is not &MmePacket->OSA[0]
  2749. //[CAUTION] There is no RunID information of CM_ATTEN_PROFILE_IND
  2750. // packet, which means SECC cannot use the RunID to
  2751. // distinguish those SLAC request with identical EvMac
  2752. // but with different RunID.
  2753. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2754. /*
  2755. printf("%d, %d, %d, %d\n",
  2756. idx,
  2757. SLAC_INFO.array[idx].AagGroupsNum,
  2758. MmePacket->MMENTRY[6],
  2759. SLAC_INFO.array[idx].AttenProfileCnt);
  2760. */
  2761. if (idx >= 0)
  2762. {
  2763. SLAC_INFO.array[idx].AttenProfileCnt++;
  2764. /*
  2765. sprintf((char*)buf_log_evcomm,
  2766. "[SLAC][Rx]CM_ATTEN_PROFILE_IND[%d]:%d-th",
  2767. (idx + 1),
  2768. SLAC_INFO.array[idx].AttenProfileCnt);
  2769. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2770. */
  2771. //printf("%d, %d\n", SLAC_INFO.array[idx].AagGroupsNum, MmePacket->MMENTRY[6]);
  2772. SLAC_INFO.array[idx].AagGroupsNum = MmePacket->MMENTRY[6];
  2773. ////NumGroups, Number of AAG Groups (ex: 0x3A = 58)
  2774. for(Rtn = 0; Rtn < SLAC_INFO.array[idx].AagGroupsNum; Rtn++) //ex:58
  2775. {
  2776. SLAC_INFO.array[idx].AAG[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2777. }
  2778. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2779. break;
  2780. }
  2781. else
  2782. {
  2783. //The EvMac is not in the database
  2784. //ignore
  2785. sprintf((char*)buf_log_evcomm,
  2786. "[SLAC][Rx][CM_ATTEN_PROFILE_IND]EvMac(%02X%02X%02X%02X%02X%02X): not exist => ignore",
  2787. EvMac_in[0], EvMac_in[1], EvMac_in[2], EvMac_in[3], EvMac_in[4], EvMac_in[5]);
  2788. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2789. break;
  2790. }
  2791. }
  2792. #else //Old SLAC architecture designed by Vern
  2793. {
  2794. AagGroupsNum = MmePacket->MMENTRY[6];
  2795. for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
  2796. {
  2797. Aag[Rtn] += MmePacket->MMENTRY[8 + Rtn];
  2798. }
  2799. AttenProfileCnt++;
  2800. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2801. break;
  2802. }
  2803. #endif
  2804. }
  2805. case MMTYPE_CM_ATTEN_CHAR_RSP:
  2806. {
  2807. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2808. {
  2809. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_CHAR_RSP ---\n");
  2810. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  2811. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  2812. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  2813. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  2814. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  2815. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  2816. MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
  2817. MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
  2818. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
  2819. for(Rtn = 0; Rtn < 17; Rtn++)
  2820. {
  2821. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, MmePacket->MMENTRY[16 + Rtn]);
  2822. }
  2823. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: %s\n", tmpBuf);
  2824. ;
  2825. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
  2826. for(Rtn = 0; Rtn < 17; Rtn++)
  2827. {
  2828. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, MmePacket->MMENTRY[33 + Rtn]);
  2829. }
  2830. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: %s\n", tmpBuf);
  2831. DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[50]); //Fixed value of 0x00 indicates a successful SLAC process
  2832. }
  2833. #endif
  2834. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2835. {
  2836. //Check ODA (Destination Address)
  2837. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  2838. {
  2839. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx][CM_ATTEN_CHAR_RSP]wrong ODA: ignore");
  2840. break;
  2841. }
  2842. EvMac_in = &MmePacket->OSA[0];
  2843. RunID_in = &MmePacket->MMENTRY[8];
  2844. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2845. //Check Parameters
  2846. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2847. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2848. (SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in) < 0) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2849. (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2850. (Array_Check_All_Zero(&MmePacket->MMENTRY[16], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] SourceID(17 bytes) must be all zero.
  2851. (Array_Check_All_Zero(&MmePacket->MMENTRY[33], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] RESP_ID (17 bytes) must be all zero.
  2852. (MmePacket->MMENTRY[50] != 0) //Result: must be 0x00(Success)
  2853. )
  2854. {
  2855. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2856. sprintf((char*)buf_log_evcomm,
  2857. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para(%d,%d,%d,%d,%d) => %d-th retry",
  2858. MmePacket->MMENTRY[0], //applicationType must be 0x00
  2859. MmePacket->MMENTRY[1], //securityType must be 0x00
  2860. SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in),
  2861. SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in),
  2862. MmePacket->MMENTRY[50],
  2863. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry
  2864. );
  2865. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2866. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2867. {
  2868. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2869. ftime(&SeqStartTime);
  2870. break;
  2871. }
  2872. else
  2873. {
  2874. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para => 2-retry fail => End_Process");
  2875. Update_V2G_Flow_Status(Other_Fault);
  2876. break;
  2877. }
  2878. }
  2879. else
  2880. {
  2881. //The CM_ATTEN_CHAR_IND is legal
  2882. SLAC_INFO.array[idx].AttenCharRspCnt++;
  2883. sprintf((char*)buf_log_evcomm,
  2884. "[SLAC][Rx]CM_ATTEN_CHAR_RSP[%d]:%d-th",
  2885. (idx + 1),
  2886. SLAC_INFO.array[idx].AttenCharRspCnt);
  2887. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2888. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2889. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2890. ftime(&SeqStartTime);
  2891. break;
  2892. }
  2893. }
  2894. #else
  2895. {
  2896. //Check Parameters
  2897. if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
  2898. (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
  2899. (Array_Compare_Identity(SLAC_INFO.array[0].EvMac, &MmePacket->MMENTRY[2], 6) == TRUE) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
  2900. (Array_Compare_Identity(SLAC_INFO.array[0].RunID, &MmePacket->MMENTRY[8], 8) == TRUE) //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
  2901. )
  2902. {
  2903. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
  2904. sprintf((char*)buf_log_evcomm,
  2905. "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP: invalid parameters(%d-th)",
  2906. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  2907. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2908. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
  2909. {
  2910. Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
  2911. ftime(&SeqStartTime);
  2912. break;
  2913. }
  2914. else
  2915. {
  2916. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]CM_ATTEN_CHAR_RSP: invalid parameters => End_Process");
  2917. Update_V2G_Flow_Status(Other_Fault);
  2918. ftime(&SeqStartTime);
  2919. break;
  2920. }
  2921. }
  2922. else
  2923. {
  2924. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
  2925. Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
  2926. ftime(&SeqStartTime);
  2927. break;
  2928. }
  2929. }
  2930. #endif
  2931. }
  2932. case MMTYPE_CM_VALIDATE_REQ: //BCB Toggle
  2933. {
  2934. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  2935. {
  2936. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_VALIDATE_REQ ---\n");
  2937. DEBUG_PRINTF_EVCOMM_DETAIL("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]); //Fixed value (0x00) to indicate ��PEV S2 toggles on control pilot line��
  2938. 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.
  2939. 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��.
  2940. }
  2941. #endif
  2942. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  2943. {
  2944. counter = 0;
  2945. EvMac_in = &MmePacket->OSA[0];
  2946. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  2947. if (idx >= 0)
  2948. {
  2949. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  2950. SLAC_INFO.array[idx].ValidateReqCnt++;
  2951. sprintf((char*)buf_log_evcomm,
  2952. "[SLAC][Rx]CM_VALIDATE_REQ[%d]:%d-th",
  2953. (idx + 1),
  2954. SLAC_INFO.array[idx].ValidateReqCnt);
  2955. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  2956. //[To-Do] Protection
  2957. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  2958. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  2959. memcpy(SendMmePacket.OSA, CsuMac, 6);
  2960. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  2961. SendMmePacket.MMV = 0x01;
  2962. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  2963. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  2964. SendMmePacketSize = 0;
  2965. if(counter == 0)
  2966. {
  2967. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  2968. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SignalType(0x00): Fixed value to indicate "EV S2 toggles on control pilot line"
  2969. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //ToggleNum(0x00): Fixed value. In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  2970. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  2971. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  2972. #else
  2973. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  2974. #endif
  2975. }
  2976. else
  2977. {
  2978. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  2979. unsigned char PreStatus = 3;
  2980. unsigned char ToggleNum = 0;
  2981. ftime(&SeqStartTime);
  2982. while(1)
  2983. {
  2984. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  2985. {
  2986. ToggleNum++;
  2987. PreStatus = 4;
  2988. }
  2989. else
  2990. {
  2991. PreStatus = 3;
  2992. }
  2993. ftime(&SeqEndTime);
  2994. if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
  2995. {
  2996. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate "PEV S2 toggles on control pilot line"
  2997. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  2998. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  2999. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  3000. #else
  3001. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3002. #endif
  3003. break;
  3004. }
  3005. }
  3006. }
  3007. SendMmePacketSize += 19; //the size before MMENTRY
  3008. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3009. ftime(&SeqStartTime);
  3010. }
  3011. else
  3012. {
  3013. //EvMac does not exist.
  3014. //ignore
  3015. }
  3016. break;
  3017. }
  3018. #else
  3019. {
  3020. counter = 0;
  3021. for(Rtn = 0; Rtn < 6; Rtn++)
  3022. {
  3023. if(MmePacket->ODA[Rtn] != CsuMac[Rtn])
  3024. {
  3025. counter = 1;
  3026. break;
  3027. }
  3028. }
  3029. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3030. memcpy(SendMmePacket.ODA, EvMac,6);
  3031. memcpy(SendMmePacket.OSA, CsuMac,6);
  3032. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3033. SendMmePacket.MMV = 0x01;
  3034. SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
  3035. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3036. SendMmePacketSize = 0;
  3037. if(counter == 0)
  3038. {
  3039. //The First MMTYPE_CM_VALIDATE_REQ because Unicast
  3040. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  3041. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  3042. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3043. SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
  3044. #else
  3045. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3046. #endif
  3047. }
  3048. else
  3049. {
  3050. //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
  3051. unsigned char PreStatus = 3, ToggleNum = 0;
  3052. ftime(&SeqStartTime);
  3053. while(1)
  3054. {
  3055. ftime(&SeqEndTime);
  3056. if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
  3057. {
  3058. ToggleNum++;
  3059. PreStatus = 4;
  3060. }
  3061. else
  3062. {
  3063. PreStatus = 3;
  3064. }
  3065. if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
  3066. {
  3067. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
  3068. SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
  3069. #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
  3070. SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
  3071. #else
  3072. SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
  3073. #endif
  3074. break;
  3075. }
  3076. }
  3077. }
  3078. SendMmePacketSize += 19; //the size before MMENTRY
  3079. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3080. Update_V2G_Flow_Status(CM_VALIDATE_CNF);
  3081. ftime(&SeqStartTime);
  3082. break;
  3083. }
  3084. #endif
  3085. }
  3086. case MMTYPE_CM_SLAC_MATCH_REQ:
  3087. {
  3088. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3089. {
  3090. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  3091. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  3092. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  3093. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
  3094. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3095. for(Rtn=0; Rtn<17; Rtn++)
  3096. {
  3097. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  3098. }
  3099. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3100. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3101. for(Rtn=0; Rtn<6; Rtn++)
  3102. {
  3103. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  3104. }
  3105. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3106. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3107. for(Rtn=0; Rtn<17; Rtn++)
  3108. {
  3109. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  3110. }
  3111. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3112. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3113. for(Rtn=0; Rtn<6; Rtn++)
  3114. {
  3115. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  3116. }
  3117. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3118. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3119. for(Rtn=0; Rtn<8; Rtn++)
  3120. {
  3121. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  3122. }
  3123. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3124. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3125. for(Rtn=0; Rtn<8; Rtn++)
  3126. {
  3127. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  3128. }
  3129. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3130. }
  3131. #endif
  3132. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  3133. {
  3134. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3135. //Check ODA (Destination Address)
  3136. if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
  3137. {
  3138. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx][CM_SLAC_MATCH_REQ]wrong ODA: ignore");
  3139. //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
  3140. }
  3141. EvMac_in = &MmePacket->OSA[0];
  3142. RunID_in = &MmePacket->MMENTRY[50];
  3143. idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
  3144. if (idx >= 0)
  3145. {
  3146. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3147. SLAC_INFO.array[idx].MatchReqNum++;
  3148. sprintf((char*)buf_log_evcomm,
  3149. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:%d-th",
  3150. (idx + 1),
  3151. SLAC_INFO.array[idx].MatchReqNum);
  3152. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3153. //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
  3154. //[TC_SECC_VTB_CmSlacMatch_008]
  3155. if (MmePacket->MMENTRY[0] != 0)
  3156. {
  3157. sprintf((char*)buf_log_evcomm,
  3158. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong APPLICATION_TYPE(%d)",
  3159. (idx + 1),
  3160. MmePacket->MMENTRY[0]);
  3161. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3162. break;
  3163. }
  3164. //[TC_SECC_VTB_CmSlacMatch_009] SECURITY_TYPE must be 0x00(No Security)
  3165. //[TC_SECC_VTB_CmSlacMatch_010]
  3166. if (MmePacket->MMENTRY[1] != 0)
  3167. {
  3168. sprintf((char*)buf_log_evcomm,
  3169. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong SECURITY_TYPE(%d)",
  3170. (idx + 1),
  3171. MmePacket->MMENTRY[1]);
  3172. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3173. break;
  3174. }
  3175. //[TC_SECC_VTB_CmSlacMatch_011] MVFLength must be 0x3E(MatchVarField Length)
  3176. //[TC_SECC_VTB_CmSlacMatch_012]
  3177. if (MmePacket->MMENTRY[2] != 0x3E || MmePacket->MMENTRY[3] != 0x00)
  3178. {
  3179. sprintf((char*)buf_log_evcomm,
  3180. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong MVFLength(%d,%d)",
  3181. (idx + 1),
  3182. MmePacket->MMENTRY[2],
  3183. MmePacket->MMENTRY[3]);
  3184. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3185. break;
  3186. }
  3187. //[TC_SECC_VTB_CmSlacMatch_013] EV ID (muxt be all zero)
  3188. //[TC_SECC_VTB_CmSlacMatch_014]
  3189. if (Array_Check_All_Zero(&MmePacket->MMENTRY[4], 17) == FALSE)
  3190. {
  3191. sprintf((char*)buf_log_evcomm,
  3192. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV ID",
  3193. (idx + 1));
  3194. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3195. break;
  3196. }
  3197. //[TC_SECC_VTB_CmSlacMatch_015] EV MAC
  3198. //[TC_SECC_VTB_CmSlacMatch_016]
  3199. if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[21], SLAC_EVMAC_LENGTH) == FALSE)
  3200. {
  3201. sprintf((char*)buf_log_evcomm,
  3202. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3203. (idx + 1),
  3204. MmePacket->MMENTRY[21], MmePacket->MMENTRY[22], MmePacket->MMENTRY[23],
  3205. MmePacket->MMENTRY[24], MmePacket->MMENTRY[25], MmePacket->MMENTRY[26]);
  3206. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3207. break;
  3208. }
  3209. //[TC_SECC_VTB_CmSlacMatch_017] EVSE ID should be all zero
  3210. //[TC_SECC_VTB_CmSlacMatch_018]
  3211. if (Array_Check_All_Zero(&MmePacket->MMENTRY[27], 17) == FALSE)
  3212. {
  3213. sprintf((char*)buf_log_evcomm,
  3214. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE ID",
  3215. (idx + 1));
  3216. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3217. break;
  3218. }
  3219. //[TC_SECC_VTB_CmSlacMatch_019] EVSE MAC
  3220. //[TC_SECC_VTB_CmSlacMatch_020]
  3221. if (Array_Compare_Identity(CsuMac, &MmePacket->MMENTRY[44], SLAC_EVSE_MAC_LENGTH) == FALSE)
  3222. {
  3223. sprintf((char*)buf_log_evcomm,
  3224. "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
  3225. (idx + 1),
  3226. MmePacket->MMENTRY[44], MmePacket->MMENTRY[45], MmePacket->MMENTRY[46],
  3227. MmePacket->MMENTRY[47], MmePacket->MMENTRY[48], MmePacket->MMENTRY[49]);
  3228. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3229. break;
  3230. }
  3231. //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
  3232. //[TC_SECC_VTB_CmSlacMatch_022]
  3233. if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
  3234. (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
  3235. {
  3236. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3237. memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
  3238. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3239. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3240. SendMmePacket.MMV = MmePacket->MMV;
  3241. SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_MATCH_CNF;
  3242. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3243. SendMmePacketSize = 0;
  3244. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //APPLICATION_TYPE: Fixed value (0x00: EV-EVSE matching)
  3245. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //SECURITY_TYPE: Fixed value (0x00: No Security)
  3246. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x56; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3247. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
  3248. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EV ID
  3249. SendMmePacketSize += 17;
  3250. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //EV MAC
  3251. SendMmePacketSize += 6;
  3252. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EVSE ID
  3253. SendMmePacketSize += 17;
  3254. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, CsuMac, 6); //EVSE MAC
  3255. SendMmePacketSize += 6;
  3256. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  3257. SendMmePacketSize += SLAC_RUNID_LENGTH;
  3258. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 8); //RSVD
  3259. SendMmePacketSize += 8;
  3260. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, Nid, sizeof(Nid)); //NID: Network ID given by the CCo(EVSE)
  3261. SendMmePacketSize += sizeof(Nid); //NID caculated from the random NMK that will be set.
  3262. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //RSVD
  3263. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, NewNmkKey, sizeof(NewNmkKey)); //NMK: Random value
  3264. SendMmePacketSize += sizeof(NewNmkKey); //NMK: Private NMK of the EVSE (random value)
  3265. SendMmePacketSize += 19; //the size before MMENTRY
  3266. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3267. {
  3268. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3269. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3270. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3271. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3272. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3273. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3274. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3275. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3276. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3277. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3278. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3279. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3280. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3281. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3282. for(Rtn=0; Rtn<17; Rtn++)
  3283. {
  3284. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3285. }
  3286. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3287. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3288. for(Rtn=0; Rtn<6; Rtn++)
  3289. {
  3290. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3291. }
  3292. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3293. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3294. for(Rtn=0; Rtn<17; Rtn++)
  3295. {
  3296. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3297. }
  3298. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3299. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3300. for(Rtn=0; Rtn<6; Rtn++)
  3301. {
  3302. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3303. }
  3304. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3305. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3306. for(Rtn=0; Rtn<8; Rtn++)
  3307. {
  3308. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3309. }
  3310. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3311. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3312. for(Rtn=0; Rtn<8; Rtn++)
  3313. {
  3314. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3315. }
  3316. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3317. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3318. for(Rtn=0; Rtn<7; Rtn++)
  3319. {
  3320. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3321. }
  3322. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3323. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3324. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3325. for(Rtn=0; Rtn<16; Rtn++)
  3326. {
  3327. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3328. }
  3329. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3330. }
  3331. #endif
  3332. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3333. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3334. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3335. sprintf((char*)buf_log_evcomm,
  3336. "[SLAC][Tx]CM_SLAC_MATCH_CNF[%d]",
  3337. (idx + 1));
  3338. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3339. ftime(&SeqStartTime);
  3340. }
  3341. else
  3342. {
  3343. //RunID does not match and it's not the first SLAC request
  3344. //Reset the SLAC database to embrace SLAC retry
  3345. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
  3346. SLAC_DB_Reset();
  3347. }
  3348. }
  3349. else
  3350. {
  3351. //OSA(EvMac) does not exist
  3352. }
  3353. break;
  3354. }
  3355. #else
  3356. {
  3357. Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
  3358. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Rx]CM_SLAC_MATCH_REQ");
  3359. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  3360. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  3361. memcpy(SendMmePacket.OSA,CsuMac,6);
  3362. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  3363. SendMmePacket.MMV=MmePacket->MMV;
  3364. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_MATCH_CNF;
  3365. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  3366. SendMmePacketSize=0;
  3367. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating ��PEV-EVSE matching��
  3368. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating ��No Security��
  3369. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56; //Fixed value (0x0056) for matching
  3370. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x0056) for matching
  3371. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //PEV ID
  3372. SendMmePacketSize+=17;
  3373. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  3374. SendMmePacketSize+=6;
  3375. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //EVSE ID
  3376. SendMmePacketSize+=17;
  3377. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
  3378. SendMmePacketSize+=6;
  3379. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  3380. SendMmePacketSize+=sizeof(SlacRunId);
  3381. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8); //RSVD
  3382. SendMmePacketSize+=8;
  3383. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
  3384. SendMmePacketSize+=sizeof(Nid);
  3385. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //RSVD
  3386. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
  3387. SendMmePacketSize+=sizeof(NewNmkKey);
  3388. SendMmePacketSize+=19; //the size before MMENTRY
  3389. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3390. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
  3391. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3392. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3393. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3394. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3395. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3396. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3397. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3398. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3399. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
  3400. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3401. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3402. DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  3403. DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
  3404. for(Rtn=0; Rtn<17; Rtn++)
  3405. {
  3406. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  3407. }
  3408. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3409. DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
  3410. for(Rtn=0; Rtn<6; Rtn++)
  3411. {
  3412. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  3413. }
  3414. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3415. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
  3416. for(Rtn=0; Rtn<17; Rtn++)
  3417. {
  3418. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  3419. }
  3420. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3421. DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
  3422. for(Rtn=0; Rtn<6; Rtn++)
  3423. {
  3424. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  3425. }
  3426. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3427. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
  3428. for(Rtn=0; Rtn<8; Rtn++)
  3429. {
  3430. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  3431. }
  3432. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3433. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
  3434. for(Rtn=0; Rtn<8; Rtn++)
  3435. {
  3436. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  3437. }
  3438. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3439. DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
  3440. for(Rtn=0; Rtn<7; Rtn++)
  3441. {
  3442. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  3443. }
  3444. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3445. DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  3446. DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
  3447. for(Rtn=0; Rtn<16; Rtn++)
  3448. {
  3449. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  3450. }
  3451. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3452. #endif
  3453. Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
  3454. Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3455. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  3456. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[SLAC][Tx]CM_SLAC_MATCH_CNF");
  3457. ftime(&SeqStartTime);
  3458. break;
  3459. }
  3460. #endif
  3461. }
  3462. case MMTYPE_VENDOR_VS_HOST_ACTION:
  3463. {
  3464. struct QcaVendorMmeHeader *RecvPacket;
  3465. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3466. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_HOST_ACTION ---\n");
  3467. switch (RecvPacket->MBODY[0])
  3468. {
  3469. case 0x00:
  3470. //Loader (Device Softloader or Bootloader) ready
  3471. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader Ready\n");
  3472. break;
  3473. case 0x01:
  3474. //Firmware Upgrade Ready
  3475. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade Ready\n");
  3476. break;
  3477. case 0x02:
  3478. //PIB Update Ready
  3479. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: PIB Update Ready\n");
  3480. break;
  3481. case 0x03:
  3482. //Firmware Upgrade and PIB Update ready
  3483. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade and PIB Update ready\n");
  3484. break;
  3485. case 0x04:
  3486. //Loader (Bootloader) ready to receive SDRAM configuration.
  3487. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader ready to receive SDRAM configuration\n");
  3488. break;
  3489. case 0x05:
  3490. //Reset to Factory Defaults.
  3491. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reset to Factory Defaults\n");
  3492. break;
  3493. default:
  3494. //Reserved
  3495. DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reserved\n");
  3496. break;
  3497. }
  3498. break;
  3499. }
  3500. case MMTYPE_VENDOR_ATTEN_CHAR:
  3501. {
  3502. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_ATTEN_CHAR ---\n");
  3503. break;
  3504. }
  3505. case MMTYPE_VENDOR_VS_NW_INFO_CNF:
  3506. {
  3507. memcpy(QcaMac, MmePacket->OSA, 6);
  3508. sprintf((char*)buf_log_evcomm,
  3509. "[QCA7K][Rx][VENDOR_VS_NW_INFO_CNF]Got QCA7K MacAddr:%02X:%02X:%02X:%02X:%02X:%02X (comm:OK)",
  3510. QcaMac[0], QcaMac[1], QcaMac[2], QcaMac[3], QcaMac[4], QcaMac[5]);
  3511. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3512. DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
  3513. DEBUG_PRINTF_EVCOMM_DETAIL("QcaMac: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3514. QcaMac[0],
  3515. QcaMac[1],
  3516. QcaMac[2],
  3517. QcaMac[3],
  3518. QcaMac[4],
  3519. QcaMac[5]);
  3520. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  3521. ftime(&SeqStartTime);
  3522. break;
  3523. }
  3524. case MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF:
  3525. {
  3526. struct QcaVendorMmeHeader *RecvPacket;
  3527. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  3528. if(RecvPacket->MBODY[1]==0)
  3529. {
  3530. //PLC disconnected
  3531. sprintf((char*)buf_log_evcomm,
  3532. "[QCA7K][Rx][MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF]Got PLC Link Status:%d",
  3533. RecvPacket->MBODY[1]);
  3534. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3535. Update_V2G_Flow_Status(Other_Fault);
  3536. }
  3537. else
  3538. Update_V2G_Flow_Status(CM_SET_KEY_REQ);
  3539. ftime(&SeqStartTime);
  3540. break;
  3541. }
  3542. default:
  3543. {
  3544. break;
  3545. }
  3546. }
  3547. return 0;
  3548. }
  3549. /*===========================================================================
  3550. FUNCTION: SlacComm
  3551. DESCRIPTION:
  3552. PRE-CONDITION:
  3553. INPUT:
  3554. OUTPUT:
  3555. GLOBAL VARIABLES:
  3556. =============================================================================*/
  3557. int SlacComm()
  3558. {
  3559. static unsigned char qca7k_comm_retry = 0;
  3560. double t_diff = 0;
  3561. int packet_size = 0;
  3562. int count = 0;
  3563. //int idx = 0;
  3564. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3565. unsigned char tmpBuf[2048]={0};
  3566. #endif
  3567. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  3568. unsigned char *EvMac_in;
  3569. unsigned char *RunID_in;
  3570. int i = 0;
  3571. #endif
  3572. if(RawSock >= 0)
  3573. {
  3574. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  3575. packet_size = recvfrom(RawSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0, NULL, NULL);
  3576. if(packet_size > 0)
  3577. {
  3578. /*#ifdef Debug
  3579. DEBUG_PRINTF_EVCOMM_DETAIL("Raw Data: ");
  3580. for(count=0;count<packet_size;count++)
  3581. DEBUG_PRINTF_EVCOMM_DETAIL("0x%x, ",V2gtpMsgRxBuf[count]);
  3582. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  3583. #endif*/
  3584. MmeProcess(V2gtpMsgRxBuf, packet_size);
  3585. }
  3586. }
  3587. switch(Check_V2G_Flow_Status())
  3588. {
  3589. case IDLE:
  3590. {
  3591. if(RawSock < 0)
  3592. {
  3593. RawSock = socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  3594. sprintf((char*)buf_log_evcomm, "[RawSock]opened(%d)", RawSock);
  3595. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3596. if(RawSock == -1)
  3597. {
  3598. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Failed to create socket");
  3599. Update_V2G_Flow_Status(Other_Fault);
  3600. return -1;
  3601. }
  3602. if (setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE, QcaInterface, 4) < 0)
  3603. {
  3604. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_BINDTODEVICE NG");
  3605. Update_V2G_Flow_Status(Other_Fault);
  3606. return -1;
  3607. }
  3608. struct timeval tv;
  3609. tv.tv_sec = 0;
  3610. tv.tv_usec = 100000; //100ms (Rx timeout)
  3611. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3612. {
  3613. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_RCVTIMEO NG");
  3614. Update_V2G_Flow_Status(Other_Fault);
  3615. return -1;
  3616. }
  3617. tv.tv_usec = 100000; //100ms (Tx timeout)
  3618. if (setsockopt(RawSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  3619. {
  3620. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm:Set SO_SNDTIMEO NG");
  3621. Update_V2G_Flow_Status(Other_Fault);
  3622. return -1;
  3623. }
  3624. memset(&Req, 0, sizeof(struct ifreq));
  3625. strcpy( (char*)Req.ifr_name, QcaInterface);
  3626. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  3627. {
  3628. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SlacComm: ioctl NG");
  3629. Update_V2G_Flow_Status(Other_Fault);
  3630. return -1;
  3631. }
  3632. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll));
  3633. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  3634. DestSocketAddress.sll_halen = ETH_ALEN;
  3635. PwmStartTime = 0;
  3636. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = FALSE;
  3637. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K]connecting...");
  3638. //Get QCA7K MAC address
  3639. GetQca7kMac();
  3640. ftime(&SeqStartTime);
  3641. break;
  3642. }
  3643. else //RawSock: opened
  3644. {
  3645. if(EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
  3646. {
  3647. ftime(&SeqEndTime);
  3648. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3649. if (t_diff > V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD) //3 secs
  3650. {
  3651. qca7k_comm_retry++;
  3652. sprintf((char*)buf_log_evcomm,
  3653. "Re-try connecting...(%.02lf/%dms)",
  3654. t_diff,
  3655. V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD);
  3656. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3657. GetQca7kMac(); //re-send req
  3658. ftime(&SeqStartTime);
  3659. break;
  3660. }
  3661. else
  3662. {
  3663. //null
  3664. }
  3665. //Retry by 3 times
  3666. if (qca7k_comm_retry >= 3)
  3667. {
  3668. sprintf((char*)buf_log_evcomm,
  3669. "[Error]Comm: fail (retry by %d times)",
  3670. qca7k_comm_retry);
  3671. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3672. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3673. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3674. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3675. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3676. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3677. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3678. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3679. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3680. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3681. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3682. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  3683. Update_V2G_Flow_Status(Sequence_Timeout);
  3684. qca7k_comm_retry = 0;
  3685. break;
  3686. }
  3687. }
  3688. else //RawSock: opened; Set Key: DONE
  3689. {
  3690. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  3691. if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission >= 1))
  3692. {
  3693. if(PwmStartTime <= 0)
  3694. {
  3695. //Sniffer_Tcpdump(ENABLE);
  3696. //#if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  3697. //sleep(1); //wait for tcpdump to be ready.
  3698. //#endif
  3699. SwitchCpStateE(DISABLE);
  3700. OutputCpPwmDuty(5);
  3701. PwmStartTime = time(NULL);
  3702. }
  3703. else
  3704. {
  3705. if((time(NULL) - PwmStartTime) > TT_EVSE_SLAC_init)
  3706. {
  3707. sprintf((char*)buf_log_evcomm,
  3708. "SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init, NowTime(%ld)-PwmStartTime(%d)>%d (sec)",
  3709. time(NULL),
  3710. PwmStartTime,
  3711. TT_EVSE_SLAC_init);
  3712. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3713. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3714. //CCS_SECC_TIMEOUT_SLAC_TT_EVSE_SLAC_init (023809)
  3715. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3716. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3717. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3718. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3719. ShmStatusCodeData->PresentStatusCode[0][4] = 0;
  3720. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  3721. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  3722. Update_V2G_Flow_Status(Sequence_Timeout);
  3723. PwmStartTime = 0;
  3724. return -1;
  3725. }
  3726. else
  3727. {
  3728. //waiting for CM_SLAC_PARM_REQ
  3729. }
  3730. }
  3731. }
  3732. else
  3733. {
  3734. PwmStartTime = 0;
  3735. }
  3736. }
  3737. }
  3738. break;
  3739. }
  3740. case CM_SET_KEY_REQ: //13
  3741. {
  3742. //CM_SET_KEY_REQ
  3743. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[QCA7K][Rx]CM_SET_KEY_REQ");
  3744. ftime(&SeqEndTime);
  3745. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3746. if (t_diff > V2G_SECC_QCA7000_COMM_TIMEOUT) //10 seconds
  3747. {
  3748. sprintf((char*)buf_log_evcomm,
  3749. "[QCA7K]Failed on SetKey => End_Process (%.02lf/%dms)",
  3750. t_diff,
  3751. V2G_SECC_QCA7000_COMM_TIMEOUT);
  3752. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3753. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3754. //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
  3755. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3756. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3757. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3758. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3759. ShmStatusCodeData->PresentStatusCode[0][4] = 9;
  3760. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  3761. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3762. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3763. Update_V2G_Flow_Status(Sequence_Timeout);
  3764. }
  3765. else if (t_diff > V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD) //2 seconds
  3766. {
  3767. sprintf((char*)buf_log_evcomm,
  3768. "[QCA7K]SetKey: proceed (%.02lf/%dms)",
  3769. t_diff,
  3770. V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD);
  3771. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3772. SendSetKey();
  3773. ftime(&SeqStartTime);
  3774. }
  3775. else
  3776. {
  3777. //null
  3778. }
  3779. break;
  3780. }
  3781. case CM_SET_KEY_CNF: //14
  3782. {
  3783. sprintf((char*)buf_log_evcomm,
  3784. "[SECCReady]Wait: plugin(%d), matached(%d), permission(%d)...",
  3785. CheckConnectorPlugIn(),
  3786. CSUCOMMDC_TASK_FLAG.matched,
  3787. ShmInternalComm->ChargingPermission
  3788. );
  3789. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3790. EVCOMM_SYS_INFO.QCA7K_SetKeyDone = TRUE;
  3791. PwmStartTime = 0;
  3792. Update_V2G_Flow_Status(IDLE);
  3793. break;
  3794. }
  3795. case CM_SLAC_PARM_CONF:
  3796. {
  3797. ftime(&SeqEndTime);
  3798. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  3799. {
  3800. sprintf((char*)buf_log_evcomm,
  3801. "SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence (%.02lf of %dms)",
  3802. DiffTimeb(SeqStartTime, SeqEndTime),
  3803. TT_match_sequence);
  3804. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3805. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3806. //CCS_SECC_TIMEOUT_CM_START_ATTEN_CHAR_IND (023811):
  3807. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3808. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3809. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3810. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3811. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3812. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3813. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3814. ShmStatusCodeData->PresentStatusCode[0][5] = 1;
  3815. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3816. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3817. Update_V2G_Flow_Status(Sequence_Timeout);
  3818. return -1;
  3819. }
  3820. break;
  3821. }
  3822. case CM_START_ATTEN_CHAR_IND:
  3823. {
  3824. ftime(&SeqEndTime);
  3825. if(DiffTimeb(SeqStartTime, SeqEndTime) > (TP_EV_batch_msg_interval)) //one more time interval for tolerance
  3826. {
  3827. sprintf((char*)buf_log_evcomm,
  3828. "SlacComm: Wait CM_MNBC_SOUND_IND Timeout - TP_EV_batch_msg_interval (%.02lf of %dms)",
  3829. DiffTimeb(SeqStartTime, SeqEndTime),
  3830. TP_EV_batch_msg_interval);
  3831. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3832. //Update_ShmStatusCode(); //[To-Do] to be implemented
  3833. //CCS_SECC_TIMEOUT_SLAC_CM_MNBC_SOUND_IND (023818):
  3834. //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
  3835. //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
  3836. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  3837. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  3838. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  3839. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  3840. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  3841. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  3842. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  3843. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  3844. Update_V2G_Flow_Status(Sequence_Timeout);
  3845. return -1;
  3846. }
  3847. break;
  3848. }
  3849. case CM_MNBC_SOUND_IND:
  3850. {
  3851. #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
  3852. {
  3853. ftime(&SeqEndTime);
  3854. t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
  3855. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  3856. if(t_diff > TT_EVSE_match_MNBC ||
  3857. (SLAC_INFO.array[0].AttenProfileCnt >= SLAC_INFO.array[0].MnbcSoundNum) ||
  3858. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)) //TC_SECC_VTB_AttenuationCharacterization_003
  3859. {
  3860. //Wait for other SLAC Req sets
  3861. if ((SLAC_INFO.arrayLen >= 2) &&
  3862. (t_diff < TT_EVSE_match_MNBC) &&
  3863. (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)) //not a retry
  3864. {
  3865. break;
  3866. }
  3867. //Check if it is a timeup response
  3868. if (t_diff > TT_EVSE_match_MNBC)
  3869. {
  3870. sprintf((char*)buf_log_evcomm,
  3871. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: timeup(%.2f/%dms) => send",
  3872. (i + 1),
  3873. t_diff,
  3874. TT_EVSE_match_MNBC);
  3875. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3876. }
  3877. //Sending all CM_ATTEN_CHAR_IND according to all corresponding SLAC Req sets
  3878. for (i = 0; i < SLAC_INFO.arrayLen; i++)
  3879. {
  3880. if ((SLAC_INFO.array[i].AttenProfileCnt == 0) ||
  3881. (SLAC_INFO.array[i].AagGroupsNum == 0) ||
  3882. (SLAC_INFO.array[i].StartAttenCharCnt == 0) ||
  3883. (SLAC_INFO.array[i].MnbcSoundNum != 10) || //received in CM_START_ATTEN_CHAR_IND
  3884. (SLAC_INFO.array[i].StartAttenCharErr == TRUE)
  3885. )
  3886. {
  3887. //Ignoring those SLAC request sets without sending CM_MNBC_SOUND_IND(CM_ATTEN_PROFILE_IND)
  3888. sprintf((char*)buf_log_evcomm,
  3889. "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: para err(%d,%d,%d,%d,%d) => canceled",
  3890. (i + 1),
  3891. SLAC_INFO.array[i].AttenProfileCnt,
  3892. SLAC_INFO.array[i].AagGroupsNum,
  3893. SLAC_INFO.array[i].StartAttenCharCnt,
  3894. SLAC_INFO.array[i].MnbcSoundNum,
  3895. SLAC_INFO.array[i].StartAttenCharErr);
  3896. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3897. continue;
  3898. }
  3899. //In CM_ATTEN_CHAR_IND retry process, here only re-send this message according to the 1st coming SLAC request
  3900. if ((EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0) && (i != 0))
  3901. {
  3902. sprintf((char*)buf_log_evcomm,
  3903. "[NOTE][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: canceled",
  3904. (i + 1));
  3905. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  3906. break;
  3907. }
  3908. EvMac_in = SLAC_INFO.array[i].EvMac;
  3909. RunID_in = SLAC_INFO.array[i].RunID;
  3910. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  3911. memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
  3912. memcpy(SendMmePacket.OSA, CsuMac, 6);
  3913. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  3914. SendMmePacket.MMV = 0x01;
  3915. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  3916. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  3917. SendMmePacketSize = 0;
  3918. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  3919. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  3920. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //SOURCE_ADDRESS, MAC address of the EV Host
  3921. SendMmePacketSize += SLAC_EVMAC_LENGTH;
  3922. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
  3923. SendMmePacketSize += SLAC_RUNID_LENGTH;
  3924. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //SOURCE_ID(0x00)
  3925. SendMmePacketSize += 17;
  3926. memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //RESP_ID(0x00)
  3927. SendMmePacketSize += 17;
  3928. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AttenProfileCnt; //NumSounds: Number of M-Sounds used for generation of the ATTEN_PROFILE
  3929. SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AagGroupsNum; //NumGroups
  3930. for(count = 0; count < SLAC_INFO.array[i].AagGroupsNum; count++)
  3931. {
  3932. unsigned char TmpAag;
  3933. TmpAag = ((SLAC_INFO.array[i].AAG[count] / SLAC_INFO.array[i].AttenProfileCnt) & 0xFF);
  3934. SLAC_INFO.array[i].AAG_quality_ori += (float) TmpAag; //original signal quality
  3935. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  3936. #if 1
  3937. //TC_SECC_VTB_AttenuationCharacterization_019
  3938. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  3939. #else
  3940. if(TmpAag >= 39) //original method proposed by Vern
  3941. {
  3942. TmpAag = 37;
  3943. }
  3944. #endif
  3945. #endif
  3946. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  3947. SLAC_INFO.array[i].AAG_quality_refined += (float) TmpAag; //refined signal quality
  3948. }
  3949. SendMmePacketSize += 19; //the size before MMENTRY
  3950. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  3951. {
  3952. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  3953. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3954. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  3955. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  3956. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  3957. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  3958. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  3959. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  3960. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  3961. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  3962. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  3963. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  3964. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  3965. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  3966. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  3967. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  3968. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  3969. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  3970. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
  3971. for(count=0; count<17; count++)
  3972. {
  3973. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, SendMmePacket.MMENTRY[16+count]);
  3974. }
  3975. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: %s\n", tmpBuf);
  3976. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
  3977. for(count=0; count<17; count++)
  3978. {
  3979. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, SendMmePacket.MMENTRY[33+count]);
  3980. }
  3981. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: %s\n", tmpBuf);
  3982. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  3983. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
  3984. for(count=0; count<AagGroupsNum; count++)
  3985. {
  3986. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, SendMmePacket.MMENTRY[51+count]);
  3987. }
  3988. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: %s\n", tmpBuf);
  3989. }
  3990. #endif
  3991. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  3992. SLAC_INFO.array[i].AAG_quality_ori /= SLAC_INFO.array[i].AagGroupsNum;
  3993. SLAC_INFO.array[i].AAG_quality_refined /= SLAC_INFO.array[i].AagGroupsNum;
  3994. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  3995. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  3996. {
  3997. sprintf((char*)buf_log_evcomm,
  3998. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: %d-th resend (Q=%.2f/%.2f)(%d/%d)",
  3999. (i + 1),
  4000. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry,
  4001. SLAC_INFO.array[i].AAG_quality_refined,
  4002. SLAC_INFO.array[i].AAG_quality_ori,
  4003. SLAC_INFO.array[i].AttenProfileCnt,
  4004. SLAC_INFO.array[i].MnbcSoundNum);
  4005. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4006. }
  4007. else if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)
  4008. {
  4009. sprintf((char*)buf_log_evcomm,
  4010. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: Q=%.2f/%.2f(%d/%d)",
  4011. (i + 1),
  4012. SLAC_INFO.array[i].AAG_quality_refined,
  4013. SLAC_INFO.array[i].AAG_quality_ori,
  4014. SLAC_INFO.array[i].AttenProfileCnt,
  4015. SLAC_INFO.array[i].MnbcSoundNum);
  4016. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4017. }
  4018. else
  4019. {
  4020. sprintf((char*)buf_log_evcomm,
  4021. "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: unexpected CM_ATTEN_CHAR_IND_retry(%d))",
  4022. i,
  4023. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  4024. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4025. }
  4026. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  4027. } //end of for loop
  4028. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  4029. ftime(&SeqStartTime);
  4030. }
  4031. break;
  4032. }
  4033. #else
  4034. {
  4035. ftime(&SeqEndTime);
  4036. //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
  4037. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_MNBC || (AttenProfileCnt >= MnbcSoundNum) || (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0))
  4038. {
  4039. memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
  4040. memcpy(SendMmePacket.ODA, EvMac, 6);
  4041. memcpy(SendMmePacket.OSA, CsuMac, 6);
  4042. SendMmePacket.MTYPE = htons(EtherType_HomePlug);
  4043. SendMmePacket.MMV = 0x01;
  4044. SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
  4045. SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
  4046. SendMmePacketSize = 0;
  4047. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
  4048. SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
  4049. memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //SOURCE_ADDRESS, MAC address of the EV Host
  4050. SendMmePacketSize += 6;
  4051. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize, SlacRunId, sizeof(SlacRunId));
  4052. SendMmePacketSize += sizeof(SlacRunId);
  4053. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //SOURCE_ID
  4054. SendMmePacketSize += 17;
  4055. memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //RESP_ID
  4056. SendMmePacketSize += 17;
  4057. SendMmePacket.MMENTRY[SendMmePacketSize++] = AttenProfileCnt; //NumSounds
  4058. SendMmePacket.MMENTRY[SendMmePacketSize++] = AagGroupsNum; //NumGroups
  4059. for(count=0; count < AagGroupsNum; count++)
  4060. {
  4061. unsigned char TmpAag;
  4062. TmpAag = ((Aag[count] / AttenProfileCnt) & 0xFF);
  4063. #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
  4064. #if 1
  4065. //TC_SECC_VTB_AttenuationCharacterization_019
  4066. TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
  4067. #else
  4068. if(TmpAag >= 39) //original method proposed by Vern
  4069. {
  4070. /*
  4071. // [To-do] If this statement is enabled, SLAC will fail due to timeout.
  4072. {
  4073. unsigned char TmpBuf[64];
  4074. memset(TmpBuf,0,sizeof(TmpBuf));
  4075. sprintf((char*)TmpBuf,"SlacComm: bad Aag[%d]=%d",count,TmpAag);
  4076. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", TmpBuf);
  4077. }
  4078. */
  4079. printf("%d,", TmpAag);
  4080. TmpAag = 37;
  4081. }
  4082. #endif
  4083. #endif
  4084. SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
  4085. }
  4086. SendMmePacketSize += 19; //the size before MMENTRY
  4087. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  4088. {
  4089. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
  4090. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4091. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  4092. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  4093. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  4094. DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  4095. DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
  4096. DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  4097. DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  4098. DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
  4099. DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  4100. DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  4101. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  4102. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  4103. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  4104. DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  4105. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  4106. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  4107. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
  4108. for(count=0; count<17; count++)
  4109. {
  4110. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, SendMmePacket.MMENTRY[16+count]);
  4111. }
  4112. DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: %s\n", tmpBuf);
  4113. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));;
  4114. for(count=0; count<17; count++)
  4115. {
  4116. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, SendMmePacket.MMENTRY[33+count]);
  4117. }
  4118. DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: %s\n", tmpBuf);
  4119. DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  4120. memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
  4121. for(count=0; count<AagGroupsNum; count++)
  4122. {
  4123. sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, SendMmePacket.MMENTRY[51+count]);
  4124. }
  4125. DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: %s\n", tmpBuf);
  4126. }
  4127. #endif
  4128. Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
  4129. count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  4130. //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
  4131. if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
  4132. {
  4133. sprintf((char*)buf_log_evcomm,
  4134. "[SLAC][Tx]CM_ATTEN_CHAR_IND: resend(%d-th)",
  4135. EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
  4136. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4137. }
  4138. DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
  4139. ftime(&SeqStartTime);
  4140. }
  4141. break;
  4142. }
  4143. #endif
  4144. }
  4145. case CM_ATTEN_CHAR_IND:
  4146. {
  4147. ftime(&SeqEndTime);
  4148. //if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  4149. 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.
  4150. {
  4151. sprintf((char*)buf_log_evcomm,
  4152. "SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response (%.02lf of %dms)",
  4153. DiffTimeb(SeqStartTime, SeqEndTime),
  4154. TT_match_response);
  4155. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4156. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4157. //CCS_SECC_TIMEOUT_SLAC_CM_ATTEN_CHAR_RSP (023814):
  4158. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4159. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4160. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4161. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4162. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4163. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4164. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  4165. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  4166. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4167. Update_V2G_Flow_Status(Sequence_Timeout);
  4168. return -1;
  4169. }
  4170. break;
  4171. }
  4172. case CM_ATTEN_CHAR_RSP:
  4173. {
  4174. ftime(&SeqEndTime);
  4175. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_session)
  4176. {
  4177. sprintf((char*)buf_log_evcomm,
  4178. "SlacComm: Wait CM_VALIDATE_REQ_1ST or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session (%.02lf of %dms)",
  4179. DiffTimeb(SeqStartTime, SeqEndTime),
  4180. TT_EVSE_match_session);
  4181. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4182. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4183. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_1ST__CM_SLAC_MATCH_REQ (023815):
  4184. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4185. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4186. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4187. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4188. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4189. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4190. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  4191. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  4192. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4193. Update_V2G_Flow_Status(Sequence_Timeout);
  4194. return -1;
  4195. }
  4196. break;
  4197. }
  4198. case CM_VALIDATE_CNF:
  4199. {
  4200. ftime(&SeqEndTime);
  4201. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
  4202. {
  4203. sprintf((char*)buf_log_evcomm,
  4204. "SlacComm: Wait CM_VALIDATE_REQ_2ND or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence (%.02lf of %dms)",
  4205. DiffTimeb(SeqStartTime, SeqEndTime),
  4206. TT_match_sequence);
  4207. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4208. //Update_ShmStatusCode(); //[To-Do] to be implemented
  4209. //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_2ND__CM_SLAC_MATCH_REQ (023819):
  4210. //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
  4211. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  4212. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  4213. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  4214. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  4215. ShmStatusCodeData->PresentStatusCode[0][4] = 1;
  4216. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  4217. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
  4218. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  4219. Update_V2G_Flow_Status(Sequence_Timeout);
  4220. return -1;
  4221. }
  4222. break;
  4223. }
  4224. case CM_SLAC_MATCH_CNF:
  4225. {
  4226. if(UdpSock > 0)
  4227. {
  4228. close(UdpSock);
  4229. UdpSock = -1;
  4230. }
  4231. if(TcpSock > 0)
  4232. {
  4233. close(TcpSock);
  4234. TcpSock = -1;
  4235. }
  4236. ftime(&SeqStartTime);
  4237. V2gTcpConnected();
  4238. Update_V2G_Flow_Status(SLACC_SDP_UDP_Connection);
  4239. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SLAAC,SDP,UDP: connecting...");
  4240. break;
  4241. }
  4242. default:
  4243. {
  4244. break;
  4245. }
  4246. }
  4247. return 0;
  4248. }
  4249. /*===========================================================================
  4250. FUNCTION: V2gMsgDecoder
  4251. DESCRIPTION:
  4252. 1. Decode the V2GTP messages inside "msg" and save the decoded
  4253. messages in ccs_exi_doc_DIN, ccs_exi_doc_ISO1, and ccs_exi_doc_ISO2,
  4254. respectively.
  4255. 2. After decoding, V2gMsg_Process() could then use
  4256. ccs_exi_doc_DIN, ccs_exi_doc_ISO1, or ccs_exi_doc_ISO2
  4257. to deal with the corresponding Response messages, respectively.
  4258. PRE-CONDITION:
  4259. 1. msg_length > 0
  4260. INPUT:
  4261. 1. msg
  4262. 2. msg_length
  4263. OUTPUT:
  4264. 1. ccs_exi_doc_DIN //global variable
  4265. ccs_exi_doc_ISO1
  4266. ccs_exi_doc_ISO2
  4267. 2. v2g_state //Status Flag
  4268. //indicating the V2gMsg_Process_din to proceed
  4269. the next process.
  4270. 3. return value // < 0: ERROR
  4271. // > 0: Message Type
  4272. GLOBAL VARIABLES:
  4273. =============================================================================*/
  4274. int V2gMsgDecoder(unsigned char *msg, unsigned int msg_length, unsigned int v2g_state)
  4275. {
  4276. int errn = 0;
  4277. //Checking the minimum Header size requirement
  4278. if(msg_length < V2GTP_MSG_HEADER_LENGTH) //The minimum requirement should be 8-byte header.
  4279. {
  4280. errn = -1;
  4281. return errn;
  4282. }
  4283. //Decode the 1st V2GMSG: AppProtocol
  4284. if(v2g_state == SupportedAppProtocolRequest) //17
  4285. {
  4286. if ((errn = API_V2GMSG_EXI_Decoder_AppProtocol(msg, msg_length, &ccs_handshake)) < 0)
  4287. {
  4288. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: SupportedAppProtocolRequest()\n", errn);
  4289. }
  4290. else //decoded successfully.
  4291. {
  4292. //PRINT_XML_DOC_supportedAppProtocolReq(&ccs_handshake);
  4293. }
  4294. }
  4295. //Decode the subsequent V2GMSG (DIN 70121, ISO 15118-2, ISO 15118-20)
  4296. else if(v2g_state > SupportedAppProtocolRequest && v2g_state <= SessionStopResponse)
  4297. {
  4298. //Decoding according to its own protocol
  4299. switch (ShmCcsData->CommProtocol)
  4300. {
  4301. case V2GT_MSG_PROTOCOL_DIN70121: //0
  4302. {
  4303. //DIN
  4304. if((errn = API_V2GMSG_EXI_Decoder_DIN(msg, msg_length, &ccs_exi_doc_DIN)) < 0)
  4305. {
  4306. sprintf((char*)buf_log_evcomm,
  4307. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_DIN()",
  4308. errn);
  4309. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4310. }
  4311. break;
  4312. }
  4313. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  4314. {
  4315. //ISO1
  4316. if((errn = API_V2GMSG_EXI_Decoder_ISO1(msg, msg_length, &ccs_exi_doc_ISO1)) < 0)
  4317. {
  4318. sprintf((char*)buf_log_evcomm,
  4319. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO1()",
  4320. errn);
  4321. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4322. }
  4323. break;
  4324. }
  4325. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  4326. {
  4327. //ISO2
  4328. if((errn = API_V2GMSG_EXI_Decoder_ISO2(msg, msg_length, &ccs_exi_doc_ISO2)) < 0)
  4329. {
  4330. sprintf((char*)buf_log_evcomm,
  4331. "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO2()",
  4332. errn);
  4333. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4334. }
  4335. break;
  4336. }
  4337. default:
  4338. break;
  4339. }
  4340. }
  4341. else
  4342. {
  4343. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: Unexpected v2g_state\n", errn);
  4344. errn = -1;
  4345. }
  4346. return errn;
  4347. }
  4348. /*===========================================================================
  4349. FUNCTION: encode_din_V2GTP_stream
  4350. DESCRIPTION:
  4351. PRE-CONDITION:
  4352. INPUT:
  4353. OUTPUT:
  4354. GLOBAL VARIABLES:
  4355. =============================================================================*/
  4356. int encode_din_V2GTP_stream(bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4357. {
  4358. int errn = 0;
  4359. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4360. errn = encode_dinExiDocument(v2g_tx_stream, ccs_exi_doc_DIN);
  4361. if (errn == 0)
  4362. {
  4363. //successfully encoded
  4364. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4365. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4366. if (errn != 0)
  4367. {
  4368. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4369. }
  4370. }
  4371. else
  4372. {
  4373. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]encode_dinExiDocument(): %d (DEC)\n", errn);
  4374. }
  4375. return errn;
  4376. }
  4377. /*===========================================================================
  4378. FUNCTION: encode_iso1_V2GTP_stream
  4379. DESCRIPTION:
  4380. PRE-CONDITION:
  4381. INPUT:
  4382. OUTPUT:
  4383. GLOBAL VARIABLES:
  4384. =============================================================================*/
  4385. int encode_iso1_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4386. {
  4387. int errn = 0;
  4388. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4389. errn = encode_iso1ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO1);
  4390. if (errn == 0)
  4391. {
  4392. //successfully encoded
  4393. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4394. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4395. if (errn != 0)
  4396. {
  4397. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4398. }
  4399. }
  4400. else
  4401. {
  4402. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]encode_iso1ExiDocument(): %d (DEC)\n", errn);
  4403. }
  4404. return errn;
  4405. }
  4406. /*===========================================================================
  4407. FUNCTION: encode_iso2_V2GTP_stream
  4408. DESCRIPTION:
  4409. PRE-CONDITION:
  4410. INPUT:
  4411. OUTPUT:
  4412. GLOBAL VARIABLES:
  4413. =============================================================================*/
  4414. int encode_iso2_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4415. {
  4416. int errn = 0;
  4417. *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
  4418. errn = encode_iso2ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO2);
  4419. if (errn == 0)
  4420. {
  4421. //successfully encoded
  4422. errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
  4423. v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
  4424. if (errn != 0)
  4425. {
  4426. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
  4427. }
  4428. }
  4429. else
  4430. {
  4431. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]encode_iso2ExiDocument(): %d (DEC)\n", errn);
  4432. }
  4433. return errn;
  4434. }
  4435. /*===========================================================================
  4436. FUNCTION: send_encoded_din_V2GTP_Stream
  4437. DESCRIPTION:
  4438. PRE-CONDITION:
  4439. INPUT:
  4440. OUTPUT:
  4441. GLOBAL VARIABLES:
  4442. =============================================================================*/
  4443. int send_encoded_din_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
  4444. {
  4445. int errn = 0;
  4446. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4447. errn = encode_din_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_DIN);
  4448. // STEP 2: =========== Send Response Packet ===========
  4449. int rtn = 0;
  4450. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4451. if (rtn == v2g_tx_stream->size)
  4452. {
  4453. /*
  4454. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_din_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4455. rtn, v2g_tx_stream->size);
  4456. */
  4457. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4458. }
  4459. else if (rtn >= 0)
  4460. {
  4461. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_din_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n", rtn, v2g_tx_stream->size);
  4462. }
  4463. else
  4464. {
  4465. errn = rtn;
  4466. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_din_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4467. }
  4468. //STEP 3: ========= Reset V2G MSG Flags ==========
  4469. init_dinBodyType(&ccs_exi_doc_DIN->V2G_Message.Body);
  4470. return errn;
  4471. }
  4472. /*===========================================================================
  4473. FUNCTION: send_encoded_iso1_V2GTP_Stream
  4474. DESCRIPTION:
  4475. PRE-CONDITION:
  4476. INPUT:
  4477. OUTPUT:
  4478. GLOBAL VARIABLES:
  4479. =============================================================================*/
  4480. int send_encoded_iso1_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
  4481. {
  4482. int errn = 0;
  4483. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4484. errn = encode_iso1_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO1);
  4485. // STEP 2: =========== Send Response Packet ===========
  4486. int rtn = 0;
  4487. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4488. if (rtn == v2g_tx_stream->size)
  4489. {
  4490. /*
  4491. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso1_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4492. rtn, v2g_tx_stream->size);
  4493. */
  4494. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4495. }
  4496. else if (rtn >= 0)
  4497. {
  4498. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso1_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n", rtn, v2g_tx_stream->size);
  4499. }
  4500. else
  4501. {
  4502. errn = rtn;
  4503. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso1_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4504. }
  4505. //STEP 3: ========= Reset V2G MSG Flags ==========
  4506. init_iso1BodyType(&ccs_exi_doc_ISO1->V2G_Message.Body);
  4507. return errn;
  4508. }
  4509. /*===========================================================================
  4510. FUNCTION: send_encoded_iso2_V2GTP_Stream
  4511. DESCRIPTION:
  4512. PRE-CONDITION:
  4513. INPUT:
  4514. OUTPUT:
  4515. GLOBAL VARIABLES:
  4516. =============================================================================*/
  4517. int send_encoded_iso2_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
  4518. {
  4519. int errn = 0;
  4520. // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
  4521. errn = encode_iso2_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO2);
  4522. // STEP 2: =========== Send Response Packet ===========
  4523. int rtn = 0;
  4524. rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
  4525. if (rtn == v2g_tx_stream->size)
  4526. {
  4527. /*
  4528. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso2_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
  4529. rtn, v2g_tx_stream->size);
  4530. */
  4531. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  4532. }
  4533. else if (rtn >= 0)
  4534. {
  4535. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso2_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
  4536. rtn, v2g_tx_stream->size);
  4537. }
  4538. else
  4539. {
  4540. errn = rtn;
  4541. DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso2_V2GTP_Stream]send(): %d (DEC)\n", errn);
  4542. }
  4543. //STEP 3: ========= Reset V2G MSG Flags ==========
  4544. init_iso2BodyType(&ccs_exi_doc_ISO2->V2G_Message.Body);
  4545. return errn;
  4546. }
  4547. /*===========================================================================
  4548. FUNCTION: Check_din_V2G_Rx_MSG_SessionID
  4549. DESCRIPTION:
  4550. PRE-CONDITION:
  4551. INPUT:
  4552. OUTPUT:
  4553. GLOBAL VARIABLES:
  4554. =============================================================================*/
  4555. int Check_din_V2G_Rx_MSG_SessionID(struct dinEXIDocument *exi_doc_DIN)
  4556. {
  4557. int i = 0;
  4558. int leng = 0;
  4559. int errn = 0;
  4560. leng = exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen;
  4561. //Step 1: Check SessionID Length
  4562. if (leng != 8) //8-byte
  4563. {
  4564. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4565. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4566. errn = -1;
  4567. }
  4568. else
  4569. {
  4570. //Step 2-1: Check SessionID content
  4571. for (i = 0; i < leng; i++)
  4572. {
  4573. if (exi_doc_DIN->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4574. {
  4575. errn = -2;
  4576. break;
  4577. }
  4578. }
  4579. }
  4580. //Step 2-2: Print Incorrect ID
  4581. if (errn == -2) //incorrect ID
  4582. {
  4583. sprintf((char*)buf_log_evcomm,
  4584. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4585. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[0],
  4586. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[1],
  4587. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[2],
  4588. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[3],
  4589. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[4],
  4590. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[5],
  4591. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[6],
  4592. exi_doc_DIN->V2G_Message.Header.SessionID.bytes[7],
  4593. EVCOMM_SYS_INFO.SessionID[0],
  4594. EVCOMM_SYS_INFO.SessionID[1],
  4595. EVCOMM_SYS_INFO.SessionID[2],
  4596. EVCOMM_SYS_INFO.SessionID[3],
  4597. EVCOMM_SYS_INFO.SessionID[4],
  4598. EVCOMM_SYS_INFO.SessionID[5],
  4599. EVCOMM_SYS_INFO.SessionID[6],
  4600. EVCOMM_SYS_INFO.SessionID[7]
  4601. );
  4602. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4603. }
  4604. //Step 3: Correct SessionID for Res Message
  4605. if (errn != 0)
  4606. {
  4607. exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen = 8;
  4608. memset(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, 0, 8);
  4609. memcpy(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4610. }
  4611. return errn;
  4612. }
  4613. /*===========================================================================
  4614. FUNCTION: Check_iso1_V2G_Rx_MSG_SessionID
  4615. DESCRIPTION:
  4616. PRE-CONDITION:
  4617. INPUT:
  4618. OUTPUT:
  4619. GLOBAL VARIABLES:
  4620. =============================================================================*/
  4621. int Check_iso1_V2G_Rx_MSG_SessionID(struct iso1EXIDocument *exi_doc_ISO1)
  4622. {
  4623. int i = 0;
  4624. int leng = 0;
  4625. int errn = 0;
  4626. leng = exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen;
  4627. //Step 1: Check SessionID Length
  4628. if (leng != 8) //8-byte
  4629. {
  4630. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4631. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4632. errn = -1;
  4633. }
  4634. else
  4635. {
  4636. //Step 2-1: Check SessionID content
  4637. for (i = 0; i < leng; i++)
  4638. {
  4639. if (exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4640. {
  4641. errn = -2;
  4642. break;
  4643. }
  4644. }
  4645. }
  4646. //Step 2-2: Print Incorrect ID
  4647. if (errn == -2) //incorrect ID
  4648. {
  4649. sprintf((char*)buf_log_evcomm,
  4650. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4651. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[0],
  4652. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[1],
  4653. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[2],
  4654. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[3],
  4655. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[4],
  4656. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[5],
  4657. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[6],
  4658. exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[7],
  4659. EVCOMM_SYS_INFO.SessionID[0],
  4660. EVCOMM_SYS_INFO.SessionID[1],
  4661. EVCOMM_SYS_INFO.SessionID[2],
  4662. EVCOMM_SYS_INFO.SessionID[3],
  4663. EVCOMM_SYS_INFO.SessionID[4],
  4664. EVCOMM_SYS_INFO.SessionID[5],
  4665. EVCOMM_SYS_INFO.SessionID[6],
  4666. EVCOMM_SYS_INFO.SessionID[7]
  4667. );
  4668. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4669. }
  4670. //Step 3: Correct SessionID for Res Message
  4671. if (errn != 0)
  4672. {
  4673. exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen = 8;
  4674. memset(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, 0, 8);
  4675. memcpy(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4676. }
  4677. return errn;
  4678. }
  4679. /*===========================================================================
  4680. FUNCTION: Check_iso2_V2G_Rx_MSG_SessionID
  4681. DESCRIPTION:
  4682. PRE-CONDITION:
  4683. INPUT:
  4684. OUTPUT:
  4685. GLOBAL VARIABLES:
  4686. =============================================================================*/
  4687. int Check_iso2_V2G_Rx_MSG_SessionID(struct iso2EXIDocument *exi_doc_ISO2)
  4688. {
  4689. int i = 0;
  4690. int leng = 0;
  4691. int errn = 0;
  4692. leng = exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen;
  4693. //Step 1: Check SessionID Length
  4694. if (leng != 8) //8-byte
  4695. {
  4696. sprintf((char*)buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
  4697. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4698. errn = -1;
  4699. }
  4700. else
  4701. {
  4702. //Step 2-1: Check SessionID content
  4703. for (i = 0; i < leng; i++)
  4704. {
  4705. if (exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
  4706. {
  4707. errn = -2;
  4708. break;
  4709. }
  4710. }
  4711. }
  4712. //Step 2-2: Print Incorrect ID
  4713. if (errn == -2) //incorrect ID
  4714. {
  4715. sprintf((char*)buf_log_evcomm,
  4716. "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
  4717. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[0],
  4718. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[1],
  4719. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[2],
  4720. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[3],
  4721. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[4],
  4722. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[5],
  4723. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[6],
  4724. exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[7],
  4725. EVCOMM_SYS_INFO.SessionID[0],
  4726. EVCOMM_SYS_INFO.SessionID[1],
  4727. EVCOMM_SYS_INFO.SessionID[2],
  4728. EVCOMM_SYS_INFO.SessionID[3],
  4729. EVCOMM_SYS_INFO.SessionID[4],
  4730. EVCOMM_SYS_INFO.SessionID[5],
  4731. EVCOMM_SYS_INFO.SessionID[6],
  4732. EVCOMM_SYS_INFO.SessionID[7]
  4733. );
  4734. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4735. }
  4736. //Step 3: Correct SessionID for Res Message
  4737. if (errn != 0)
  4738. {
  4739. exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen = 8;
  4740. memset(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, 0, 8);
  4741. memcpy(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  4742. }
  4743. return errn;
  4744. }
  4745. /*===========================================================================
  4746. FUNCTION: GetSchemaID_of_Protocol
  4747. DESCRIPTION:
  4748. 1. Get the SchemaID accroding to the input target
  4749. *V2GT_MSG_PROTOCOL_DIN70121: choose DIN 70121
  4750. *V2GT_MSG_PROTOCOL_ISO15118_2014: choose ISO 15118-2 (ed1)
  4751. *V2GT_MSG_PROTOCOL_ISO15118_2018: choose ISO 15118-20 (ed2)
  4752. *V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY: choose the one with the highest priority
  4753. 2. [To-do] Checking Major and Minor version
  4754. 3. The parsing method will not support those private protocols,
  4755. such as "usr:tesla...," since "tesla" is 5 bytes but "din" and "iso" are 3 bytes.
  4756. 4. [To-do] If the target is selected as DIN," but there is no DIN.
  4757. However, if EV and EVSE all support ISO, how to use ISO instead?
  4758. PRE-CONDITION:
  4759. INPUT:
  4760. 1. target: target protocol
  4761. OUTPUT:
  4762. 1. id: SchemaID of selected protocol by EVSE
  4763. 2. ShmCcsData->CommProtocol (selected protocol)
  4764. 3. SupportedAppProtocol_result
  4765. (1) appHandresponseCodeType_OK_SuccessfulNegotiation = 0,
  4766. (2) appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation = 1,
  4767. (3) appHandresponseCodeType_Failed_NoNegotiation = 2
  4768. GLOBAL VARIABLES:
  4769. 1. ccs_handshake
  4770. 2. ShmCcsData
  4771. =============================================================================*/
  4772. int GetSchemaID_of_Protocol(unsigned char target)
  4773. {
  4774. int i = 0;
  4775. int ii = 0;
  4776. int id = 0;
  4777. //unsigned char tmp = 0;
  4778. unsigned char pri = 20; //priority = 1(highest)~20(lowerest)
  4779. char num[10];
  4780. //struct CCS_ProtocolNamespacestructCharacters pro;
  4781. //Choose the 1st protocol as default.
  4782. //id = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  4783. id = -1;
  4784. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4785. for(i = 0; i < CCS_HANDSHAKE_PROTOCOLS.arrayLen; i++)
  4786. {
  4787. //Checking for <ProtocolNamespace>urn:din:70121:2012:MsgDef</ProtocolNamespace>
  4788. //[To-Do] Ignoring the priority from EV and force DIN 70121 as our only option. (for temp)
  4789. //[CAUTION] The parsing method will not support those private protocols, such as "usr:tesla..."
  4790. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[8];
  4791. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[9];
  4792. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[10];
  4793. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[11];
  4794. num[4] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[12];
  4795. num[5] = '\0';
  4796. if (atoi(num) == 70121)
  4797. {
  4798. sprintf((char*)buf_log_evcomm,
  4799. "[GetSchemaID_of_Protocol]supported(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  4800. (i+1),
  4801. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4802. atoi(num),
  4803. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4804. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4805. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4806. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4807. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4808. if (target == V2GT_MSG_PROTOCOL_DIN70121)
  4809. {
  4810. sprintf((char*)buf_log_evcomm,
  4811. "[GetSchemaID_of_Protocol]selected(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
  4812. (i+1),
  4813. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4814. atoi(num),
  4815. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4816. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4817. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4818. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4819. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4820. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == DIN_SPEC_70121_2012_VersionNumberMajor)
  4821. {
  4822. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == DIN_SPEC_70121_2012_VersionNumberMinor)
  4823. {
  4824. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4825. }
  4826. else
  4827. { //[TC_SECC_VTB_SupportedAppProtocol_005]
  4828. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4829. }
  4830. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4831. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4832. return id;
  4833. }
  4834. else
  4835. {
  4836. //keep looking for the suitable protocol
  4837. }
  4838. }
  4839. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4840. {
  4841. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4842. {
  4843. ii = i;
  4844. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4845. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4846. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
  4847. }
  4848. else
  4849. {
  4850. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4851. }
  4852. }
  4853. else
  4854. {
  4855. //null
  4856. }
  4857. }
  4858. else if (atoi(num) == 15118)
  4859. {
  4860. //urn:din:70121:2012:MsgDef
  4861. //urn:iso:15118:2:2013:MsgDef
  4862. memset(num, 0, sizeof(num));
  4863. num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[16];
  4864. num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[17];
  4865. num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[18];
  4866. num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[19];
  4867. num[4] = '\0';
  4868. if (atoi(num) < 2018 && atoi(num) >= 2010)
  4869. {
  4870. sprintf((char*)buf_log_evcomm,
  4871. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-2(ed1,%d:v%d.%d;id=%d,pri=%d)",
  4872. (i+1),
  4873. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4874. atoi(num),
  4875. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4876. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4877. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4878. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4879. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4880. if (target == V2GT_MSG_PROTOCOL_ISO15118_2014)
  4881. {
  4882. sprintf((char*)buf_log_evcomm,
  4883. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-2,ed1(%d:v%d.%d;id=%d,pri=%d)",
  4884. (i+1),
  4885. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4886. atoi(num),
  4887. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4888. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4889. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4890. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4891. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4892. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO1_15118_2013_VersionNumberMajor)
  4893. {
  4894. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO1_15118_2013_VersionNumberMinor)
  4895. {
  4896. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4897. }
  4898. else
  4899. {
  4900. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4901. }
  4902. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4903. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  4904. return id;
  4905. }
  4906. else
  4907. {
  4908. //keep looking for the suitable protocol
  4909. }
  4910. }
  4911. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4912. {
  4913. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4914. {
  4915. ii = i;
  4916. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4917. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4918. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
  4919. }
  4920. else
  4921. {
  4922. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4923. }
  4924. }
  4925. else
  4926. {
  4927. //null
  4928. }
  4929. }
  4930. else if (atoi(num) >= 2018 && atoi(num) <= 2100) // >= 2018
  4931. {
  4932. sprintf((char*)buf_log_evcomm,
  4933. "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-20(ed2,%d:v%d.%d;id=%d,pri=%d)",
  4934. (i+1),
  4935. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4936. atoi(num),
  4937. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4938. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4939. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4940. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4941. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4942. if (target == V2GT_MSG_PROTOCOL_ISO15118_2018)
  4943. {
  4944. sprintf((char*)buf_log_evcomm,
  4945. "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-20,ed2(%d:v%d.%d;id=%d,pri=%d)",
  4946. (i+1),
  4947. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4948. atoi(num),
  4949. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  4950. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  4951. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  4952. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  4953. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  4954. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO2_15118_2018_VersionNumberMajor)
  4955. {
  4956. if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO2_15118_2018_VersionNumberMinor)
  4957. {
  4958. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
  4959. }
  4960. else
  4961. {
  4962. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
  4963. }
  4964. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4965. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  4966. return id;
  4967. }
  4968. else
  4969. {
  4970. //keep looking for the suitable protocol
  4971. }
  4972. }
  4973. else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
  4974. {
  4975. if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
  4976. {
  4977. ii = i;
  4978. id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
  4979. pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
  4980. ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
  4981. }
  4982. else
  4983. {
  4984. //not using this SchemaID, and keep looking for that SchemaID with higer priority
  4985. }
  4986. }
  4987. else
  4988. {
  4989. //null
  4990. }
  4991. }
  4992. else
  4993. {
  4994. //Unexpected Year
  4995. sprintf((char*)buf_log_evcomm,
  4996. "[GetSchemaID_of_Protocol]unsupported(%d-th/%d): ISO 15118-X(unexpected year:%d,v%d.%d),id=%d,pri=%d",
  4997. (i+1),
  4998. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  4999. atoi(num),
  5000. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5001. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5002. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5003. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5004. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5005. //return -1;
  5006. }
  5007. }
  5008. else
  5009. {
  5010. sprintf((char*)buf_log_evcomm,
  5011. "[GetSchemaID_of_Protocol]unsupported protocol(%d-th/%d)(%d:v%d.%d;id=%d,pri=%d)",
  5012. (i+1),
  5013. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5014. atoi(num),
  5015. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
  5016. CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
  5017. CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
  5018. CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
  5019. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5020. //return -1;
  5021. }
  5022. }
  5023. //The final result of highest priority protocol
  5024. sprintf((char*)buf_log_evcomm,
  5025. "[GetSchemaID_of_Protocol]selected(%d-th/%d): pro=%d(0:DIN,1:ISO1,2:ISO2);id=%d,pri=%d",
  5026. (ii+1),
  5027. CCS_HANDSHAKE_PROTOCOLS.arrayLen,
  5028. ShmCcsData->CommProtocol,
  5029. id,
  5030. pri);
  5031. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5032. if (id < 0)
  5033. {
  5034. EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_Failed_NoNegotiation;
  5035. }
  5036. return id;
  5037. }
  5038. /*===========================================================================
  5039. FUNCTION: Proc_supportedAppProtocolRes
  5040. DESCRIPTION:
  5041. PRE-CONDITION:
  5042. INPUT:
  5043. OUTPUT:
  5044. GLOBAL VARIABLES:
  5045. =============================================================================*/
  5046. int Proc_supportedAppProtocolRes(int AcceptFd)
  5047. {
  5048. int errn = 0;
  5049. bitstream_t v2g_tx_stream;
  5050. static struct ChargingInfoData *sys;
  5051. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5052. //STEP 1: =========== Setting the Response Message ===========
  5053. init_appHandEXIDocument(&ccs_handshake);
  5054. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
  5055. ccs_handshake.supportedAppProtocolRes_isUsed = 1u;
  5056. //select the 1st one as the default
  5057. ccs_handshake.supportedAppProtocolRes.SchemaID = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
  5058. ccs_handshake.supportedAppProtocolRes.SchemaID_isUsed = 1u;
  5059. int id = 0;
  5060. /*+++ 20200808, vern, support both DIN and ISO +++*/
  5061. //id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_PREFERENCE); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5062. id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
  5063. /*--- 20200808, vern, support both DIN and ISO ---*/
  5064. ccs_handshake.supportedAppProtocolRes.ResponseCode = EVCOMM_SYS_INFO.SupportedAppProtocol_result; //updating the response code
  5065. if (id < 0)
  5066. {
  5067. sprintf((char*)buf_log_evcomm,
  5068. "[Error]No avalible CCS protocol (id = %d, preference = %d)",
  5069. id,
  5070. V2GT_MSG_PROTOCOL_PREFERENCE);
  5071. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5072. }
  5073. else
  5074. {
  5075. //selected SchemaID
  5076. ccs_handshake.supportedAppProtocolRes.SchemaID = (unsigned char) id;
  5077. }
  5078. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  5079. {
  5080. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_supportedAppProtocolRes]EVSE_Shutdown => End_Process");
  5081. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5082. errn = -1;
  5083. }
  5084. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5085. {
  5086. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_supportedAppProtocolRes]EVSE_EmergencyShutdown => End_Process");
  5087. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5088. errn = -1;
  5089. }
  5090. else
  5091. {
  5092. //null
  5093. }
  5094. //Check for Permission Changing from TRUE to FALSE
  5095. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5096. if (ShmInternalComm->ChargingPermission_pre >= 1 &&
  5097. ShmInternalComm->ChargingPermission == FALSE)
  5098. {
  5099. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][supportedAppProtocolRes]Permission OFF");
  5100. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5101. //errn = -1;
  5102. }
  5103. #if (CP_PROTECTION_MECHANISM == ENABLE)
  5104. {
  5105. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  5106. {
  5107. //Detect for CP State should be 9V with 5% PWM or 100%PWM (State B1, B2)
  5108. if (sys->CpState != 2 && sys->CpState != 3) //State B1, B2
  5109. {
  5110. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5111. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5112. Update_V2G_Flow_Status(Other_Fault);
  5113. sprintf((char*)buf_log_evcomm,
  5114. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5115. sys->CpState,
  5116. sys->CpVoltage);
  5117. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5118. }
  5119. }
  5120. #else
  5121. {
  5122. //Detect for CP State should be 9V (State B)
  5123. if (sys->CpState != 3) //B2
  5124. {
  5125. ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
  5126. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5127. Update_V2G_Flow_Status(Other_Fault);
  5128. sprintf((char*)buf_log_evcomm,
  5129. "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  5130. sys->CpState,
  5131. sys->CpVoltage);
  5132. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5133. }
  5134. }
  5135. #endif
  5136. }
  5137. #endif
  5138. //STEP 2: =========== Encode into EXI ===========
  5139. if ((errn = API_V2GMSG_EXI_Encoder_AppProtocol(&ccs_handshake, &v2g_tx_stream)) !=0)
  5140. {
  5141. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Error]API_V2GMSG_EXI_Encoder_AppProtocol\n");
  5142. return errn;
  5143. }
  5144. //STEP 3: =========== Send Response Packet ===========
  5145. int Rtn = 0;
  5146. Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5147. //Rtn = send(6, v2g_tx_stream.data, v2g_tx_stream.size, 0);
  5148. DEBUG_PRINTF_EVCOMM_DETAIL("Send V2GTP Packet Size = %d, Rtn = %d (Bytes, DEC)\n", v2g_tx_stream.size, Rtn);
  5149. if (Rtn < 0)
  5150. {
  5151. return Rtn;
  5152. }
  5153. //STEP 4: =========== Save into Share Memory =========
  5154. //[Joseph, To-Do] Adding a mechanism to choose DIN 70121 as our 1st priority. (for multiple protocols)
  5155. //STEP 5: =========== Updating the Flow State Flag =========
  5156. if (id < 0)
  5157. {
  5158. errn = -1;
  5159. }
  5160. //STEP 6: =========== Reset Flags ============
  5161. //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
  5162. init_appHandEXIDocument(&ccs_handshake);
  5163. return errn;
  5164. }
  5165. /*===========================================================================
  5166. FUNCTION: Proc_supportedAppProtocolReq
  5167. DESCRIPTION:
  5168. PRE-CONDITION:
  5169. INPUT:
  5170. OUTPUT:
  5171. GLOBAL VARIABLES:
  5172. =============================================================================*/
  5173. int Proc_supportedAppProtocolReq(int AcceptFd)
  5174. {
  5175. //[Joseph, To-Do] analysis on Req message and choose the prefered protocol
  5176. //Default: DIN 70121 (find SchemaID)
  5177. int errn = 0;
  5178. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]supportedAppProtocolReq");
  5179. SHM_Save_din_supportedAppProtocolReq(ShmCcsData, &ccs_handshake, ShmSysConfigAndInfo);
  5180. errn = Proc_supportedAppProtocolRes(AcceptFd);
  5181. if (errn == 0)
  5182. {
  5183. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]supportedAppProtocolRes");
  5184. }
  5185. else
  5186. {
  5187. DEBUG_PRINTF_EVCOMM_DETAIL("[Error]Proc_supportedAppProtocolRes(): %d (DEC)\n", errn);
  5188. }
  5189. return errn;
  5190. }
  5191. /*===========================================================================
  5192. FUNCTION: Proc_din_SessionSetupRes
  5193. DESCRIPTION:
  5194. PRE-CONDITION:
  5195. INPUT:
  5196. OUTPUT:
  5197. GLOBAL VARIABLES:
  5198. =============================================================================*/
  5199. int Proc_din_SessionSetupRes(int AcceptFd)
  5200. {
  5201. //int i = 0;
  5202. int errn = 0;
  5203. bitstream_t v2g_tx_stream;
  5204. static struct ChargingInfoData *sys;
  5205. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5206. size_t pos = 0;
  5207. v2g_tx_stream.pos = &pos;
  5208. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5209. v2g_tx_stream.data = V2GTP_Tx_buf;
  5210. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5211. init_dinSessionSetupResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes);
  5212. // ====== [BODY (1/2) ResponseCode ======
  5213. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5214. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_OK_NewSessionEstablished;
  5215. //[HEADER] Assign Res SessionID
  5216. ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytesLen = 8;
  5217. memset(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, 0, 8);
  5218. memcpy(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5219. //Check for SequenceError
  5220. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5221. {
  5222. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError;
  5223. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5224. errn = -1;
  5225. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5226. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5227. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5228. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5229. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5230. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5231. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5232. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5233. }
  5234. //#if PARAMETER_NORMAL_MODE == ENABLE
  5235. //SHM_Read_din_V2GMSG_Header(&ccs_exi_doc_DIN, ShmCcsData);
  5236. //#endif
  5237. //Detect for CP State should be 9V (State B)
  5238. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5239. {
  5240. #if CP_PROTECTION_MECHANISM == ENABLE
  5241. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5242. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5243. Update_V2G_Flow_Status(Other_Fault);
  5244. errn = -1;
  5245. sprintf((char*)buf_log_evcomm,
  5246. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5247. sys->CpState);
  5248. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5249. #else
  5250. sprintf((char*)buf_log_evcomm,
  5251. "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5252. sys->CpState);
  5253. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5254. #endif
  5255. }
  5256. //Check for shutdown commands from EVSE(DC Main Board)
  5257. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5258. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5259. {
  5260. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5261. sprintf((char*)buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5262. EVSE_Shutdown,
  5263. EVSE_EmergencyShutdown,
  5264. sys->DC_EVSEStatus);
  5265. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5266. errn = -1;
  5267. }
  5268. //Check for Permission Changing from TRUE to FALSE
  5269. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5270. if (ShmInternalComm->ChargingPermission_pre >= 1 &&
  5271. ShmInternalComm->ChargingPermission == FALSE)
  5272. {
  5273. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][SessionSetupRes]Permission OFF");
  5274. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
  5275. errn = -1;
  5276. }
  5277. // ====== [BODY (2/3) EVSEID ======
  5278. //EVSEID = all zero
  5279. memset(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes, 0, sizeof(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes));
  5280. //vern, should be encode by SN
  5281. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytesLen = 1; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5282. // ====== [BODY (3/3) DateTimeNow ======
  5283. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow_isUsed = 1u;
  5284. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5285. #if PARAMETER_NORMAL_MODE == ENABLE
  5286. ///////////SHM_Read_din_SessionSetupRes(&ccs_exi_doc_DIN, ShmCcsData);
  5287. #endif
  5288. // ============ Encode and Send Response Message ===========
  5289. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5290. {
  5291. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_SessionSetupRes][Error]Tx encoded msg error");
  5292. errn = -1;
  5293. }
  5294. return errn;
  5295. }
  5296. /*===========================================================================
  5297. FUNCTION: Proc_iso1_SessionSetupRes
  5298. DESCRIPTION:
  5299. PRE-CONDITION:
  5300. INPUT:
  5301. OUTPUT:
  5302. GLOBAL VARIABLES:
  5303. =============================================================================*/
  5304. int Proc_iso1_SessionSetupRes(int AcceptFd)
  5305. {
  5306. //int i = 0;
  5307. int errn = 0;
  5308. bitstream_t v2g_tx_stream;
  5309. static struct ChargingInfoData *sys;
  5310. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5311. size_t pos = 0;
  5312. v2g_tx_stream.pos = &pos;
  5313. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5314. v2g_tx_stream.data = V2GTP_Tx_buf;
  5315. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5316. init_iso1SessionSetupResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes);
  5317. // ====== [BODY (1/2) ResponseCode ======
  5318. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5319. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_OK_NewSessionEstablished;
  5320. //[HEADER] Assign Res SessionID
  5321. ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytesLen = 8;
  5322. memset(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, 0, 8);
  5323. memcpy(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5324. //Check for SequenceError
  5325. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5326. {
  5327. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5328. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5329. errn = -1;
  5330. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5331. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5332. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5333. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5334. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5335. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5336. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5337. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5338. }
  5339. //#if PARAMETER_NORMAL_MODE == ENABLE
  5340. //SHM_Read_iso1_V2GMSG_Header(&ccs_exi_doc_ISO1, ShmCcsData);
  5341. //#endif
  5342. //Detect for CP State should be 9V (State B)
  5343. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5344. {
  5345. #if CP_PROTECTION_MECHANISM == ENABLE
  5346. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5347. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5348. Update_V2G_Flow_Status(Other_Fault);
  5349. errn = -1;
  5350. sprintf((char*)buf_log_evcomm,
  5351. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
  5352. sys->CpState);
  5353. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5354. #else
  5355. sprintf((char*)buf_log_evcomm,
  5356. "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
  5357. sys->CpState);
  5358. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5359. #endif
  5360. }
  5361. //Check for shutdown commands from EVSE(DC Main Board)
  5362. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5363. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5364. {
  5365. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5366. sprintf((char*)buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5367. EVSE_Shutdown,
  5368. EVSE_EmergencyShutdown,
  5369. sys->DC_EVSEStatus);
  5370. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5371. errn = -1;
  5372. }
  5373. //Check for Permission Changing from TRUE to FALSE
  5374. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  5375. ShmInternalComm->ChargingPermission == FALSE)
  5376. {
  5377. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][SessionSetupRes]Permission OFF");
  5378. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
  5379. errn = -1;
  5380. }
  5381. // ====== [BODY (2/3) EVSEID ======
  5382. //EVSEID = all zero
  5383. memset(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5384. /*+++ 20200808, vern, set default EVSEID +++*/
  5385. //vern, should be encoded by SN
  5386. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[0]='Z';
  5387. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[1]='Z';
  5388. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[2]='0';
  5389. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[3]='0';
  5390. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[4]='0';
  5391. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[5]='0';
  5392. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[6]='0';
  5393. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 7; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5394. /*--- 20200808, vern, set default EVSEID ---*/
  5395. // ====== [BODY (3/3) DateTimeNow ======
  5396. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5397. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5398. #if PARAMETER_NORMAL_MODE == ENABLE
  5399. ///////////SHM_Read_iso1_SessionSetupRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5400. #endif
  5401. // ============ Encode and Send Response Message ===========
  5402. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5403. {
  5404. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_SessionSetupRes][Error]Tx encoded msg error");
  5405. errn = -1;
  5406. }
  5407. return errn;
  5408. }
  5409. /*===========================================================================
  5410. FUNCTION: Proc_iso2_SessionSetupRes
  5411. DESCRIPTION:
  5412. PRE-CONDITION:
  5413. INPUT:
  5414. OUTPUT:
  5415. GLOBAL VARIABLES:
  5416. =============================================================================*/
  5417. int Proc_iso2_SessionSetupRes(int AcceptFd)
  5418. {
  5419. //int i = 0;
  5420. int errn = 0;
  5421. bitstream_t v2g_tx_stream;
  5422. static struct ChargingInfoData *sys;
  5423. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5424. size_t pos = 0;
  5425. v2g_tx_stream.pos = &pos;
  5426. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5427. v2g_tx_stream.data = V2GTP_Tx_buf;
  5428. init_iso2BodyType(&ccs_exi_doc_ISO2.V2G_Message.Body);
  5429. init_iso2SessionSetupResType(&ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes);
  5430. // ====== [BODY (1/2) ResponseCode ======
  5431. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
  5432. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_OK_NewSessionEstablished;
  5433. //[HEADER] Assign Res SessionID
  5434. ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytesLen = 8;
  5435. memset(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, 0, 8);
  5436. memcpy(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
  5437. //Check for SequenceError
  5438. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5439. {
  5440. ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5441. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5442. errn = -1;
  5443. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5444. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5445. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5446. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5447. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5448. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5449. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5450. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5451. }
  5452. //#if PARAMETER_NORMAL_MODE == ENABLE
  5453. //SHM_Read_iso2_V2GMSG_Header(&ccs_exi_doc_ISO2, ShmCcsData);
  5454. //#endif
  5455. //Detect for CP State should be 9V (State B)
  5456. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5457. {
  5458. #if CP_PROTECTION_MECHANISM == ENABLE
  5459. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5460. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5461. Update_V2G_Flow_Status(Other_Fault);
  5462. errn = -1;
  5463. sprintf((char*)buf_log_evcomm,
  5464. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d)",
  5465. sys->CpState);
  5466. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5467. #else
  5468. sprintf((char*)buf_log_evcomm,
  5469. "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d): ignored",
  5470. sys->CpState);
  5471. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5472. #endif
  5473. }
  5474. //Check for shutdown commands from EVSE(DC Main Board)
  5475. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5476. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5477. {
  5478. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5479. sprintf((char*)buf_log_evcomm, "[Proc_iso2_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
  5480. EVSE_Shutdown,
  5481. EVSE_EmergencyShutdown,
  5482. sys->DC_EVSEStatus);
  5483. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5484. errn = -1;
  5485. }
  5486. //Check for Permission Changing from TRUE to FALSE
  5487. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5488. if (ShmInternalComm->ChargingPermission_pre >= 1 &&
  5489. ShmInternalComm->ChargingPermission == FALSE)
  5490. {
  5491. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO2][SessionSetupRes]Permission OFF");
  5492. ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
  5493. errn = -1;
  5494. }
  5495. // ====== [BODY (2/3) EVSEID ======
  5496. //EVSEID = all zero
  5497. memset(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
  5498. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
  5499. // ====== [BODY (3/3) DateTimeNow ======
  5500. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
  5501. ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
  5502. #if PARAMETER_NORMAL_MODE == ENABLE
  5503. ///////////SHM_Read_iso2_SessionSetupRes(&ccs_exi_doc_ISO2, ShmCcsData);
  5504. #endif
  5505. // ============ Encode and Send Response Message ===========
  5506. if (send_encoded_iso2_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO2) != 0)
  5507. {
  5508. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso2_SessionSetupRes][Error]Tx encoded msg error");
  5509. errn = -1;
  5510. }
  5511. return errn;
  5512. }
  5513. /*===========================================================================
  5514. FUNCTION: Proc_din_SessionSetupReq
  5515. DESCRIPTION:
  5516. PRE-CONDITION:
  5517. INPUT:
  5518. OUTPUT:
  5519. GLOBAL VARIABLES:
  5520. 2. ccs_exi_doc_DIN
  5521. =============================================================================*/
  5522. int Proc_din_SessionSetupReq(int AcceptFd)
  5523. {
  5524. int errn = 0;
  5525. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_din_SessionSetupReq]Got SessionSetupReq\n");
  5526. //Print the decoded XML Document
  5527. PRINT_XML_DOC_DIN_SessionSetupReq(&ccs_exi_doc_DIN);
  5528. //Save into Share Memory
  5529. SHM_Save_din_SessionSetupReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5530. errn = Proc_din_SessionSetupRes(AcceptFd);
  5531. if (errn == 0)
  5532. {
  5533. //successfully send response.
  5534. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]SessionSetupRes");
  5535. }
  5536. else
  5537. {
  5538. sprintf((char*)buf_log_evcomm,
  5539. "[Error]Proc_din_SessionSetupRes(): %d (DEC)",
  5540. errn);
  5541. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5542. }
  5543. return errn;
  5544. }
  5545. /*===========================================================================
  5546. FUNCTION: Proc_iso1_SessionSetupReq
  5547. DESCRIPTION:
  5548. PRE-CONDITION:
  5549. INPUT:
  5550. OUTPUT:
  5551. GLOBAL VARIABLES:
  5552. 2. ccs_exi_doc_ISO1
  5553. =============================================================================*/
  5554. int Proc_iso1_SessionSetupReq(int AcceptFd)
  5555. {
  5556. int errn = 0;
  5557. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso1_SessionSetupReq]Got SessionSetupReq\n");
  5558. //Print the decoded XML Document
  5559. PRINT_XML_DOC_ISO1_SessionSetupReq(&ccs_exi_doc_ISO1);
  5560. //Save into Share Memory
  5561. SHM_Save_iso1_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5562. errn = Proc_iso1_SessionSetupRes(AcceptFd);
  5563. if (errn == 0)
  5564. {
  5565. //successfully send response.
  5566. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]SessionSetupRes");
  5567. }
  5568. else
  5569. {
  5570. sprintf((char*)buf_log_evcomm,
  5571. "[Error]Proc_iso1_SessionSetupRes(): %d (DEC)",
  5572. errn);
  5573. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5574. }
  5575. return errn;
  5576. }
  5577. /*===========================================================================
  5578. FUNCTION: Proc_iso2_SessionSetupReq
  5579. DESCRIPTION:
  5580. PRE-CONDITION:
  5581. INPUT:
  5582. OUTPUT:
  5583. GLOBAL VARIABLES:
  5584. 2. ccs_exi_doc_ISO2
  5585. =============================================================================*/
  5586. int Proc_iso2_SessionSetupReq(int AcceptFd)
  5587. {
  5588. int errn = 0;
  5589. DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso2_SessionSetupReq]Got SessionSetupReq\n");
  5590. //Print the decoded XML Document
  5591. PRINT_XML_DOC_ISO2_SessionSetupReq(&ccs_exi_doc_ISO2);
  5592. //Save into Share Memory
  5593. SHM_Save_iso2_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO2, ShmSysConfigAndInfo);
  5594. errn = Proc_iso2_SessionSetupRes(AcceptFd);
  5595. if (errn == 0)
  5596. {
  5597. //successfully send response.
  5598. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO2][V2G][Tx]SessionSetupRes");
  5599. }
  5600. else
  5601. {
  5602. sprintf((char*)buf_log_evcomm,
  5603. "[Error]Proc_iso2_SessionSetupRes(): %d (DEC)",
  5604. errn);
  5605. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5606. }
  5607. return errn;
  5608. }
  5609. /*===========================================================================
  5610. FUNCTION: Proc_din_ServiceDiscoveryRes
  5611. DESCRIPTION:
  5612. PRE-CONDITION:
  5613. INPUT:
  5614. OUTPUT:
  5615. GLOBAL VARIABLES:
  5616. =============================================================================*/
  5617. int Proc_din_ServiceDiscoveryRes(int AcceptFd)
  5618. {
  5619. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5620. //if it is not the same, the packet should be ignored.
  5621. //int i = 0;
  5622. int errn = 0;
  5623. bitstream_t v2g_tx_stream;
  5624. struct ChargingInfoData *sys;
  5625. //struct ServiceDiscoveryRequest_DIN70121 *req;
  5626. struct ServiceDiscoveryResponse_DIN70121 *res;
  5627. size_t pos = 0;
  5628. v2g_tx_stream.pos = &pos;
  5629. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5630. v2g_tx_stream.data = V2GTP_Tx_buf;
  5631. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5632. //req = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryRequest;
  5633. res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5634. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5635. init_dinServiceDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes);
  5636. //[1/4] Response Code
  5637. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5638. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_OK;
  5639. //[HEADER] Check Req SessionID
  5640. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5641. {
  5642. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5643. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5644. errn = -1;
  5645. }
  5646. //Check for SequenceError
  5647. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5648. {
  5649. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5650. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5651. errn = -1;
  5652. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5653. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5654. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5655. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5656. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5657. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5658. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5659. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5660. }
  5661. //Detect for CP State should be 9V (State B)
  5662. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5663. {
  5664. #if CP_PROTECTION_MECHANISM == ENABLE
  5665. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5666. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5667. Update_V2G_Flow_Status(Other_Fault);
  5668. errn = -1;
  5669. sprintf((char*)buf_log_evcomm, "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)", sys->CpState);
  5670. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5671. #else
  5672. sprintf((char*)buf_log_evcomm,
  5673. "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5674. sys->CpState);
  5675. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5676. #endif
  5677. }
  5678. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5679. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5680. {
  5681. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5682. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
  5683. errn = -1;
  5684. }
  5685. //Check for Permission Changing from TRUE to FALSE
  5686. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5687. if (ShmInternalComm->ChargingPermission_pre >= 1 &&
  5688. ShmInternalComm->ChargingPermission == FALSE)
  5689. {
  5690. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ServiceDiscoveryRes]Permission OFF");
  5691. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
  5692. errn = -1;
  5693. }
  5694. //[2/4] PaymentOptions
  5695. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.arrayLen = 1u;
  5696. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.array[0] = dinpaymentOptionType_ExternalPayment; //1
  5697. //[3/4] Charge Service
  5698. res->ChargeService_DIN70121.Services.ServiceTag.ServiceID = 1;
  5699. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceID = (unsigned short) res->ChargeService_DIN70121.Services.ServiceTag.ServiceID;
  5700. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceCategory = dinserviceCategoryType_EVCharging;
  5701. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5702. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.EnergyTransferType = dinEVSESupportedEnergyTransferType_DC_extended;
  5703. //[4/4] Service List (null, not be uesed for now.)
  5704. //#if PARAMETER_NORMAL_MODE == ENABLE
  5705. ///////////////SHM_Read_din_ServiceDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  5706. //#endif
  5707. // ============ Encode and Send Response Message ===========
  5708. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  5709. {
  5710. errn = -1;
  5711. }
  5712. return errn;
  5713. }
  5714. /*===========================================================================
  5715. FUNCTION: Proc_iso1_ServiceDiscoveryRes
  5716. DESCRIPTION:
  5717. PRE-CONDITION:
  5718. INPUT:
  5719. OUTPUT:
  5720. GLOBAL VARIABLES:
  5721. =============================================================================*/
  5722. int Proc_iso1_ServiceDiscoveryRes(int AcceptFd)
  5723. {
  5724. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5725. //if it is not the same, the packet should be ignored.
  5726. //int i = 0;
  5727. int errn = 0;
  5728. bitstream_t v2g_tx_stream;
  5729. struct ChargingInfoData *sys;
  5730. //struct ServiceDiscoveryRequest_ISO15118_2014 *req;
  5731. struct ServiceDiscoveryResponse_ISO15118_2014 *res;
  5732. size_t pos = 0;
  5733. v2g_tx_stream.pos = &pos;
  5734. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5735. v2g_tx_stream.data = V2GTP_Tx_buf;
  5736. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5737. //req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryRequest;
  5738. res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  5739. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  5740. init_iso1ServiceDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes);
  5741. //[1/4] Response Code
  5742. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
  5743. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_OK;
  5744. //[HEADER] Check Req SessionID
  5745. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  5746. {
  5747. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  5748. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5749. errn = -1;
  5750. }
  5751. //Check for SequenceError
  5752. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5753. {
  5754. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  5755. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5756. errn = -1;
  5757. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5758. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  5759. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5760. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5761. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5762. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5763. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  5764. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5765. }
  5766. //Detect for CP State should be 9V (State B)
  5767. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  5768. {
  5769. #if CP_PROTECTION_MECHANISM == ENABLE
  5770. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5771. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5772. Update_V2G_Flow_Status(Other_Fault);
  5773. errn = -1;
  5774. sprintf((char*)buf_log_evcomm,
  5775. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
  5776. sys->CpState);
  5777. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5778. #else
  5779. sprintf((char*)buf_log_evcomm,
  5780. "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
  5781. sys->CpState);
  5782. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5783. #endif
  5784. }
  5785. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  5786. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  5787. {
  5788. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5789. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
  5790. errn = -1;
  5791. }
  5792. //Check for Permission Changing from TRUE to FALSE
  5793. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  5794. if (ShmInternalComm->ChargingPermission_pre >= 1 &&
  5795. ShmInternalComm->ChargingPermission == FALSE)
  5796. {
  5797. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][ServiceDiscoveryRes]Permission OFF");
  5798. ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
  5799. errn = -1;
  5800. }
  5801. //[2/4] PaymentOptionList
  5802. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 1u;
  5803. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = iso1paymentOptionType_ExternalPayment; //1
  5804. //[3/4] Charge Service
  5805. res->ChargeService.Services.ServiceID = 1;
  5806. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = (unsigned short) res->ChargeService.Services.ServiceID;
  5807. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1; //new in ISO1, not be used, yet.
  5808. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = xxx;
  5809. //ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[i] = xxx;
  5810. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = iso1serviceCategoryType_EVCharging;
  5811. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
  5812. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 1u; //[ISO1] max = 6
  5813. switch (ShmCcsData->EnergyTransferMode)
  5814. {
  5815. case DC_extended:
  5816. {
  5817. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
  5818. break;
  5819. }
  5820. case AC_single_phase_core:
  5821. {
  5822. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_single_phase_core;
  5823. break;
  5824. }
  5825. case AC_three_phase_core:
  5826. {
  5827. ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_three_phase_core;
  5828. break;
  5829. }
  5830. default:
  5831. {
  5832. sprintf((char*)buf_log_evcomm,
  5833. "[ISO1][ServiceDiscoveryRes][Warning]unexpected EnergyTransferMode(%d)",
  5834. ShmCcsData->EnergyTransferMode);
  5835. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5836. break;
  5837. }
  5838. }
  5839. //[4/4] Service List (null, not be uesed for now.)
  5840. //#if PARAMETER_NORMAL_MODE == ENABLE
  5841. ///////////////SHM_Read_iso1_ServiceDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  5842. //#endif
  5843. // ============ Encode and Send Response Message ===========
  5844. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  5845. {
  5846. errn = -1;
  5847. }
  5848. return errn;
  5849. }
  5850. /*===========================================================================
  5851. FUNCTION: Proc_din_ServiceDiscoveryReq
  5852. DESCRIPTION:
  5853. PRE-CONDITION:
  5854. INPUT:
  5855. OUTPUT:
  5856. GLOBAL VARIABLES:
  5857. =============================================================================*/
  5858. int Proc_din_ServiceDiscoveryReq(int AcceptFd)
  5859. {
  5860. int errn = 0;
  5861. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  5862. //Print the decoded XML Document
  5863. PRINT_XML_DOC_DIN_ServiceDiscoveryReq(&ccs_exi_doc_DIN);
  5864. //Save into Share Memory
  5865. SHM_Save_din_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  5866. errn = Proc_din_ServiceDiscoveryRes(AcceptFd);
  5867. if (errn == 0)
  5868. {
  5869. //send response successfully.
  5870. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ServiceDiscoveryRes");
  5871. }
  5872. else
  5873. {
  5874. sprintf((char*)buf_log_evcomm,
  5875. "[Error][SeccComm][Proc_din_ServiceDiscoveryReq]Proc_din_ServiceDiscoveryRes(): %d (DEC)",
  5876. errn
  5877. );
  5878. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5879. }
  5880. return errn;
  5881. }
  5882. /*===========================================================================
  5883. FUNCTION: Proc_iso1_ServiceDiscoveryReq
  5884. DESCRIPTION:
  5885. PRE-CONDITION:
  5886. INPUT:
  5887. OUTPUT:
  5888. GLOBAL VARIABLES:
  5889. =============================================================================*/
  5890. int Proc_iso1_ServiceDiscoveryReq(int AcceptFd)
  5891. {
  5892. int errn = 0;
  5893. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
  5894. //Print the decoded XML Document
  5895. PRINT_XML_DOC_ISO1_ServiceDiscoveryReq(&ccs_exi_doc_ISO1);
  5896. //Save into Share Memory
  5897. SHM_Save_iso1_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  5898. errn = Proc_iso1_ServiceDiscoveryRes(AcceptFd);
  5899. if (errn == 0)
  5900. {
  5901. //send response successfully.
  5902. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ServiceDiscoveryRes");
  5903. }
  5904. else
  5905. {
  5906. sprintf((char*)buf_log_evcomm,
  5907. "[Error][SeccComm][Proc_iso1_ServiceDiscoveryReq]Proc_iso1_ServiceDiscoveryRes(): %d (DEC)",
  5908. errn
  5909. );
  5910. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5911. }
  5912. return errn;
  5913. }
  5914. /*===========================================================================
  5915. FUNCTION: Proc_din_ServiceAndPaymentSelectionRes
  5916. DESCRIPTION:
  5917. PRE-CONDITION:
  5918. INPUT:
  5919. OUTPUT:
  5920. GLOBAL VARIABLES:
  5921. =============================================================================*/
  5922. int Proc_din_ServiceAndPaymentSelectionRes(int AcceptFd)
  5923. {
  5924. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  5925. //if it is not the same, the packet should be ignored.
  5926. //int i = 0;
  5927. int errn = 0;
  5928. bitstream_t v2g_tx_stream;
  5929. struct ServiceAndPaymentSelectionRequest_DIN70121 *req;
  5930. //struct ServiceAndPaymentSelectionResponse_DIN70121 *res;
  5931. struct ServiceDiscoveryResponse_DIN70121 *sd_res;
  5932. struct ChargingInfoData *sys;
  5933. size_t pos = 0;
  5934. v2g_tx_stream.pos = &pos;
  5935. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  5936. v2g_tx_stream.data = V2GTP_Tx_buf;
  5937. req = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionRequest;
  5938. //res = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionResponse;
  5939. sd_res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
  5940. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  5941. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  5942. init_dinServicePaymentSelectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes);
  5943. //[1/1] Response Code
  5944. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes_isUsed = 1u;
  5945. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_OK;
  5946. //[HEADER] Check Req SessionID
  5947. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  5948. {
  5949. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  5950. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  5951. errn = -1;
  5952. }
  5953. //Check for SequenceError
  5954. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  5955. {
  5956. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  5957. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  5958. errn = -1;
  5959. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5960. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  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] = 5;
  5966. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  5967. }
  5968. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  5969. if (req->SelectedPaymentOption != ExternalPayment) //1
  5970. {
  5971. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_PaymentSelectionInvalid;
  5972. sprintf((char*)buf_log_evcomm,
  5973. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  5974. req->SelectedPaymentOption);
  5975. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5976. errn = -1;
  5977. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5978. //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
  5979. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5980. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  5981. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  5982. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  5983. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  5984. ShmStatusCodeData->PresentStatusCode[0][5] = 2;
  5985. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  5986. }
  5987. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  5988. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService_DIN70121.Services.ServiceTag.ServiceID)
  5989. {
  5990. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_ServiceSelectionInvalid; //8
  5991. sprintf((char*)buf_log_evcomm,
  5992. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  5993. req->SelectedServiceList.SelectedService[0].ServiceID);
  5994. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  5995. errn = -1;
  5996. //Update_ShmStatusCode(); //[To-Do] to be implemented
  5997. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  5998. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  5999. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6000. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6001. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6002. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6003. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6004. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6005. }
  6006. //Detect for CP State should be 9V (State B)
  6007. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6008. {
  6009. #if CP_PROTECTION_MECHANISM == ENABLE
  6010. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6011. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6012. Update_V2G_Flow_Status(Other_Fault);
  6013. errn = -1;
  6014. sprintf((char*)buf_log_evcomm,
  6015. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6016. sys->CpState);
  6017. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6018. #else
  6019. sprintf((char*)buf_log_evcomm,
  6020. "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6021. sys->CpState);
  6022. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6023. #endif
  6024. }
  6025. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  6026. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6027. {
  6028. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6029. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6030. errn = -1;
  6031. }
  6032. //Check for Permission Changing from TRUE to FALSE
  6033. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6034. if (ShmInternalComm->ChargingPermission_pre >= 1 &&
  6035. ShmInternalComm->ChargingPermission == FALSE)
  6036. {
  6037. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ServicePaymentSelectionRes]Permission OFF");
  6038. ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
  6039. errn = -1;
  6040. }
  6041. // ============ Encode and Send Response Message ===========
  6042. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6043. {
  6044. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6045. errn = -1;
  6046. }
  6047. return errn;
  6048. }
  6049. /*===========================================================================
  6050. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionRes
  6051. DESCRIPTION:
  6052. PRE-CONDITION:
  6053. INPUT:
  6054. OUTPUT:
  6055. GLOBAL VARIABLES:
  6056. =============================================================================*/
  6057. int Proc_iso1_ServiceAndPaymentSelectionRes(int AcceptFd)
  6058. {
  6059. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6060. //if it is not the same, the packet should be ignored.
  6061. //int i = 0;
  6062. int errn = 0;
  6063. bitstream_t v2g_tx_stream;
  6064. struct ServiceAndPaymentSelectionRequest_ISO15118_2014 *req;
  6065. //struct ServiceAndPaymentSelectionResponse_ISO15118_2014 *res;
  6066. struct ServiceDiscoveryResponse_ISO15118_2014 *sd_res;
  6067. static struct ChargingInfoData *sys;
  6068. size_t pos = 0;
  6069. v2g_tx_stream.pos = &pos;
  6070. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6071. v2g_tx_stream.data = V2GTP_Tx_buf;
  6072. req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionRequest;
  6073. //res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionResponse;
  6074. sd_res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
  6075. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6076. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6077. init_iso1PaymentServiceSelectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes);
  6078. //[1/1] Response Code
  6079. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes_isUsed = 1u;
  6080. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_OK;
  6081. //[HEADER] Check Req SessionID
  6082. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6083. {
  6084. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6085. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6086. errn = -1;
  6087. }
  6088. //Check for SequenceError
  6089. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6090. {
  6091. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6092. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6093. errn = -1;
  6094. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6095. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6096. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6097. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6098. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6099. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6100. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6101. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6102. }
  6103. //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
  6104. if (req->SelectedPaymentOption != ExternalPayment) //1
  6105. {
  6106. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
  6107. sprintf((char*)buf_log_evcomm,
  6108. "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
  6109. req->SelectedPaymentOption);
  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_Payment SelectionInvalid (023762)
  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] = 2;
  6120. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6121. }
  6122. //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
  6123. if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService.Services.ServiceID)
  6124. {
  6125. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
  6126. sprintf((char*)buf_log_evcomm,
  6127. "[ERROR]Wrong selected ServiceID(%d) => End_Process",
  6128. req->SelectedServiceList.SelectedService[0].ServiceID);
  6129. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6130. errn = -1;
  6131. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6132. //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
  6133. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6134. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6135. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6136. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6137. ShmStatusCodeData->PresentStatusCode[0][4] = 6;
  6138. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6139. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6140. }
  6141. //Detect for CP State should be 9V (State B)
  6142. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6143. {
  6144. #if CP_PROTECTION_MECHANISM == ENABLE
  6145. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6146. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6147. Update_V2G_Flow_Status(Other_Fault);
  6148. errn = -1;
  6149. sprintf((char*)buf_log_evcomm,
  6150. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
  6151. sys->CpState);
  6152. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6153. #else
  6154. sprintf((char*)buf_log_evcomm,
  6155. "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
  6156. sys->CpState);
  6157. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6158. #endif
  6159. }
  6160. if (sys->DC_EVSEStatus == EVSE_Shutdown ||
  6161. sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6162. {
  6163. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
  6164. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6165. errn = -1;
  6166. }
  6167. //Check for Permission Changing from TRUE to FALSE
  6168. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6169. if (ShmInternalComm->ChargingPermission_pre >= 1 &&
  6170. ShmInternalComm->ChargingPermission == FALSE)
  6171. {
  6172. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][PaymentServiceSelectionRes]Permission OFF");
  6173. ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
  6174. errn = -1;
  6175. }
  6176. // ============ Encode and Send Response Message ===========
  6177. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6178. {
  6179. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ServiceAndPaymentSelectionRes]Tx encoded msg error");
  6180. errn = -1;
  6181. }
  6182. return errn;
  6183. }
  6184. /*===========================================================================
  6185. FUNCTION: Proc_din_ServiceAndPaymentSelectionReq
  6186. DESCRIPTION:
  6187. PRE-CONDITION:
  6188. INPUT:
  6189. OUTPUT:
  6190. GLOBAL VARIABLES:
  6191. =============================================================================*/
  6192. int Proc_din_ServiceAndPaymentSelectionReq(int AcceptFd)
  6193. {
  6194. int errn = 0;
  6195. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_din_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6196. //Print the decoded XML Document
  6197. PRINT_XML_DOC_DIN_ServiceAndPaymentSelectionReq(&ccs_exi_doc_DIN);
  6198. //Save into Share Memory
  6199. SHM_Save_din_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6200. errn = Proc_din_ServiceAndPaymentSelectionRes(AcceptFd);
  6201. if (errn == 0)
  6202. {
  6203. //send response successfully.
  6204. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ServiceAndPaymentSelectionRes");
  6205. }
  6206. else
  6207. {
  6208. sprintf((char*)buf_log_evcomm,
  6209. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6210. errn);
  6211. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6212. }
  6213. return errn;
  6214. }
  6215. /*===========================================================================
  6216. FUNCTION: Proc_iso1_ServiceAndPaymentSelectionReq
  6217. DESCRIPTION:
  6218. PRE-CONDITION:
  6219. INPUT:
  6220. OUTPUT:
  6221. GLOBAL VARIABLES:
  6222. =============================================================================*/
  6223. int Proc_iso1_ServiceAndPaymentSelectionReq(int AcceptFd)
  6224. {
  6225. int errn = 0;
  6226. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
  6227. //Print the decoded XML Document
  6228. PRINT_XML_DOC_ISO1_ServiceAndPaymentSelectionReq(&ccs_exi_doc_ISO1);
  6229. //Save into Share Memory
  6230. SHM_Save_iso1_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6231. errn = Proc_iso1_ServiceAndPaymentSelectionRes(AcceptFd);
  6232. if (errn == 0)
  6233. {
  6234. //send response successfully.
  6235. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ServiceAndPaymentSelectionRes");
  6236. }
  6237. else
  6238. {
  6239. sprintf((char*)buf_log_evcomm,
  6240. "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
  6241. errn);
  6242. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6243. }
  6244. return errn;
  6245. }
  6246. /*===========================================================================
  6247. FUNCTION: Proc_din_ContractAuthenticationRes
  6248. DESCRIPTION:
  6249. PRE-CONDITION:
  6250. INPUT:
  6251. OUTPUT:
  6252. GLOBAL VARIABLES:
  6253. =============================================================================*/
  6254. int Proc_din_ContractAuthenticationRes(int AcceptFd)
  6255. {
  6256. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6257. //if it is not the same, the packet should be ignored.
  6258. //int i = 0;
  6259. int errn = 0;
  6260. bitstream_t v2g_tx_stream;
  6261. static struct ChargingInfoData *sys;
  6262. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6263. size_t pos = 0;
  6264. v2g_tx_stream.pos = &pos;
  6265. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6266. v2g_tx_stream.data = V2GTP_Tx_buf;
  6267. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6268. init_dinContractAuthenticationResType(&ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes);
  6269. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes_isUsed = 1u;
  6270. //[BODY (1/2)] ResponseCode
  6271. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_OK;
  6272. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6273. //[HEADER] Check Req SessionID
  6274. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6275. {
  6276. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6277. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6278. errn = -1;
  6279. }
  6280. //Check for SequenceError
  6281. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6282. {
  6283. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6284. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6285. errn = -1;
  6286. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6287. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6288. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6289. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6290. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6291. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6292. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6293. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6294. }
  6295. //Detect for CP State should be 9V (State B)
  6296. #if CP_PROTECTION_MECHANISM == ENABLE
  6297. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  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. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6302. Update_V2G_Flow_Status(Other_Fault);
  6303. errn = -1;
  6304. sprintf((char*)buf_log_evcomm,
  6305. "[Proc_din_ContractAuthenticationRes]Emergency Stop by CP Error (%d)",
  6306. sys->CpState);
  6307. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6308. }
  6309. #endif
  6310. //Check for CSU command of "Stop by EVSE"
  6311. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6312. {
  6313. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6314. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6315. errn = -1;
  6316. }
  6317. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6318. {
  6319. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6320. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6321. errn = -1;
  6322. }
  6323. //[BODY (2/2)] EVSEProcessing
  6324. if(ShmInternalComm->ChargingPermission == TRUE)
  6325. {
  6326. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6327. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CSU Permission: OK");
  6328. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6329. {
  6330. //Set PWM as 5% (for SLAC first case)
  6331. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Set PWM as 5%%");
  6332. SwitchCpStateE(DISABLE);
  6333. OutputCpPwmDuty(5);
  6334. }
  6335. #endif
  6336. }
  6337. //Check for Permission Changing from TRUE to FALSE
  6338. if (ShmInternalComm->ChargingPermission_pre == TRUE &&
  6339. ShmInternalComm->ChargingPermission == FALSE)
  6340. {
  6341. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ContractAuthenticationRes]Permission OFF");
  6342. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
  6343. ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
  6344. errn = -1;
  6345. }
  6346. #if PARAMETER_NORMAL_MODE == ENABLE
  6347. ////////////SHM_Read_din_ContractAuthenticationRes(&ccs_exi_doc_DIN, ShmCcsData);
  6348. #endif
  6349. // ============ Encode and Send Response Message ===========
  6350. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  6351. {
  6352. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6353. errn = -1;
  6354. }
  6355. return errn;
  6356. }
  6357. /*===========================================================================
  6358. FUNCTION: Proc_iso1_AuthorizationRes
  6359. DESCRIPTION:
  6360. PRE-CONDITION:
  6361. INPUT:
  6362. OUTPUT:
  6363. GLOBAL VARIABLES:
  6364. =============================================================================*/
  6365. int Proc_iso1_AuthorizationRes(int AcceptFd)
  6366. {
  6367. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6368. //if it is not the same, the packet should be ignored.
  6369. //int i = 0;
  6370. int errn = 0;
  6371. bitstream_t v2g_tx_stream;
  6372. static struct ChargingInfoData *sys;
  6373. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6374. size_t pos = 0;
  6375. v2g_tx_stream.pos = &pos;
  6376. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6377. v2g_tx_stream.data = V2GTP_Tx_buf;
  6378. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6379. init_iso1AuthorizationResType(&ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes);
  6380. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes_isUsed = 1u;
  6381. //[BODY (1/2)] ResponseCode
  6382. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_OK;
  6383. /*+++ 20200808, vern, EVSEProcessing should be waiting for Customer during authrization +++*/
  6384. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction; //0
  6385. /*--- 20200808, vern, should be waiting for Customer during authrization ---*/
  6386. //[HEADER] Check Req SessionID
  6387. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  6388. {
  6389. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  6390. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6391. errn = -1;
  6392. }
  6393. //Check for SequenceError
  6394. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6395. {
  6396. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  6397. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6398. errn = -1;
  6399. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6400. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6401. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6402. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6403. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6404. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6405. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6406. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6407. }
  6408. //Detect for CP State should be 9V (State B)
  6409. #if CP_PROTECTION_MECHANISM == ENABLE
  6410. if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
  6411. {
  6412. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED;
  6413. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6414. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6415. Update_V2G_Flow_Status(Other_Fault);
  6416. errn = -1;
  6417. sprintf((char*)buf_log_evcomm,
  6418. "[Proc_iso1_AuthorizationRes]Emergency Stop by CP Error (%d)",
  6419. sys->CpState);
  6420. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6421. }
  6422. #endif
  6423. //Check for CSU command of "Stop by EVSE"
  6424. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  6425. {
  6426. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6427. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6428. errn = -1;
  6429. }
  6430. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  6431. {
  6432. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6433. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6434. errn = -1;
  6435. }
  6436. //[BODY (2/2)] EVSEProcessing
  6437. //Check for Permission from CSU
  6438. if(ShmInternalComm->ChargingPermission == TRUE)
  6439. {
  6440. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  6441. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "CSU Permission: OK");
  6442. #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
  6443. {
  6444. //Set PWM as 5% (for SLAC first case)
  6445. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Set PWM as 5%");
  6446. SwitchCpStateE(DISABLE);
  6447. OutputCpPwmDuty(5);
  6448. }
  6449. #endif
  6450. }
  6451. //Check for Permission Changing from TRUE to FALSE
  6452. /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
  6453. if (ShmInternalComm->ChargingPermission_pre >= 1 &&
  6454. ShmInternalComm->ChargingPermission == FALSE)
  6455. {
  6456. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][AuthorizationRes]Permission OFF");
  6457. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
  6458. ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
  6459. errn = -1;
  6460. }
  6461. #if PARAMETER_NORMAL_MODE == ENABLE
  6462. ////////////SHM_Read_iso1_AuthorizationRes(&ccs_exi_doc_ISO1, ShmCcsData);
  6463. #endif
  6464. // ============ Encode and Send Response Message ===========
  6465. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  6466. {
  6467. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  6468. errn = -1;
  6469. }
  6470. return errn;
  6471. }
  6472. /*===========================================================================
  6473. FUNCTION: Proc_din_ContractAuthenticationReq
  6474. DESCRIPTION:
  6475. PRE-CONDITION:
  6476. INPUT:
  6477. OUTPUT:
  6478. GLOBAL VARIABLES:
  6479. =============================================================================*/
  6480. int Proc_din_ContractAuthenticationReq(int AcceptFd)
  6481. {
  6482. int errn = 0;
  6483. DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ContractAuthenticationReq]Got Proc_din_ContractAuthenticationReq\n");
  6484. //Print the decoded XML Document
  6485. PRINT_XML_DOC_DIN_ContractAuthenticationReq(&ccs_exi_doc_DIN);
  6486. //Save into Share Memory
  6487. SHM_Save_din_ContractAuthenticationReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  6488. errn = Proc_din_ContractAuthenticationRes(AcceptFd);
  6489. if (errn == 0)
  6490. {
  6491. //send response successfully.
  6492. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ContractAuthenticationRes");
  6493. }
  6494. else
  6495. {
  6496. sprintf((char*)buf_log_evcomm,
  6497. "[Error][SeccComm][Proc_din_ContractAuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  6498. errn);
  6499. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6500. }
  6501. return errn;
  6502. }
  6503. /*===========================================================================
  6504. FUNCTION: Proc_iso1_AuthenticationReq
  6505. DESCRIPTION:
  6506. PRE-CONDITION:
  6507. INPUT:
  6508. OUTPUT:
  6509. GLOBAL VARIABLES:
  6510. =============================================================================*/
  6511. int Proc_iso1_AuthenticationReq(int AcceptFd)
  6512. {
  6513. int errn = 0;
  6514. DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_AuthenticationReq]Got AuthorizationReq\n");
  6515. //Print the decoded XML Document
  6516. PRINT_XML_DOC_ISO1_AuthorizationReq(&ccs_exi_doc_ISO1);
  6517. //Save into Share Memory
  6518. SHM_Save_iso1_AuthorizationReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  6519. errn = Proc_iso1_AuthorizationRes(AcceptFd);
  6520. if (errn == 0)
  6521. {
  6522. //send response successfully.
  6523. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]AuthorizationRes");
  6524. }
  6525. else
  6526. {
  6527. sprintf((char*)buf_log_evcomm,
  6528. "[Error][SeccComm][Proc_iso1_AuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
  6529. errn);
  6530. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6531. }
  6532. return errn;
  6533. }
  6534. /*===========================================================================
  6535. FUNCTION: SHM_Init_dinDC_EVSEStatusType
  6536. DESCRIPTION:
  6537. PRE-CONDITION:
  6538. INPUT:
  6539. 1. in
  6540. OUTPUT:
  6541. 2. out
  6542. GLOBAL VARIABLES:
  6543. =============================================================================*/
  6544. void SHM_Init_dinDC_EVSEStatusType(struct DC_EVSEStatusType_DIN70121 *in)
  6545. {
  6546. in->EVSEIsolationStatus = dinisolationLevelType_Valid;
  6547. // dinisolationLevelType_Invalid = 0,
  6548. // dinisolationLevelType_Valid = 1, (default)
  6549. // dinisolationLevelType_Warning = 2,
  6550. // dinisolationLevelType_Fault = 3
  6551. in->EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  6552. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6553. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1, (default)
  6554. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6555. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6556. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6557. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6558. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6559. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  6560. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  6561. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  6562. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  6563. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  6564. in->EVSENotification = dinEVSENotificationType_None;
  6565. // dinEVSENotificationType_None = 0, (default)
  6566. // dinEVSENotificationType_StopCharging = 1,
  6567. // dinEVSENotificationType_ReNegotiation = 2
  6568. }
  6569. /*===========================================================================
  6570. FUNCTION: SHM_Save_dinPhysicalValueType
  6571. DESCRIPTION:
  6572. PRE-CONDITION:
  6573. INPUT:
  6574. OUTPUT:
  6575. GLOBAL VARIABLES:
  6576. =============================================================================*/
  6577. void SHM_Save_dinPhysicalValueType(struct PhysicalValueType_DIN70121 *obj, short value, int multiplier, unsigned char unit)
  6578. {
  6579. obj->Value = value;
  6580. obj->Multiplier = multiplier;
  6581. obj->Unit =unit;
  6582. }
  6583. /*===========================================================================
  6584. FUNCTION: SHM_Init_din_ChargeParameterDiscoveryRes
  6585. DESCRIPTION:
  6586. PRE-CONDITION:
  6587. INPUT:
  6588. 1. shm_ccs
  6589. OUTPUT:
  6590. 2. shm_ccs
  6591. GLOBAL VARIABLES:
  6592. =============================================================================*/
  6593. void SHM_Init_din_ChargeParameterDiscoveryRes(struct CcsData *shm_ccs)
  6594. {
  6595. struct ChargeParameterDiscoveryResponse_DIN70121 *in;
  6596. in = &shm_ccs->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  6597. //----- [BODY (1/5)] ResponseCode -----
  6598. in->ResponseCode = dinresponseCodeType_OK;
  6599. //----- [BODY (2/5)] EVSEProcessing -----
  6600. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
  6601. // dinEVSEProcessingType_Finished = 0,
  6602. // dinEVSEProcessingType_Ongoing = 1
  6603. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6604. //be fixed in another function.
  6605. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6606. //ignore, since DIN doesn't support AC
  6607. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6608. struct DC_EVSEChargeParameterType_DIN70121 *in_para;
  6609. in_para = &in->DC_EVSEChargeParameter;
  6610. //DC_EVSEStatus
  6611. SHM_Init_dinDC_EVSEStatusType(&in_para->DC_EVSEStatus);
  6612. in_para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  6613. short value = 0; int multiplier = 0; unsigned char unit = 0;
  6614. //EVSEMaximumCurrentLimit
  6615. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  6616. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumCurrentLimit, value, multiplier, unit);
  6617. //EVSEMaximumPowerLimit
  6618. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  6619. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumPowerLimit, value, multiplier, unit);
  6620. //EVSEMaximumVoltageLimit
  6621. value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  6622. SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumVoltageLimit, value, multiplier, unit);
  6623. //EVSEMinimumVoltageLimit
  6624. value = 1500; multiplier = -1; unit = V_DIN70121; //150V
  6625. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumVoltageLimit, value, multiplier, unit);
  6626. //EVSEMinimumCurrentLimit
  6627. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  6628. SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumCurrentLimit, value, multiplier, unit);
  6629. //EVSECurrentRegulationTolerance
  6630. value = 10; multiplier = -1; unit = A_DIN70121; //1A
  6631. SHM_Save_dinPhysicalValueType(&in_para->EVSECurrentRegulationTolerance, value, multiplier, unit);
  6632. //EVSEPeakCurrentRipple
  6633. value = 2; multiplier = -1; unit = A_DIN70121; //0.2A
  6634. SHM_Save_dinPhysicalValueType(&in_para->EVSEPeakCurrentRipple, value, multiplier, unit);
  6635. //EVSEEnergyToBeDelivered (optional)
  6636. //SHM_Save_dinPhysicalValueType(&out_para->EVSEEnergyToBeDelivered, &in_para->EVSEEnergyToBeDelivered);
  6637. }
  6638. /*===========================================================================
  6639. FUNCTION: Sudo_Parameter_din_ChargeParameterDiscoveryRes
  6640. DESCRIPTION:
  6641. PRE-CONDITION:
  6642. INPUT:
  6643. OUTPUT:
  6644. GLOBAL VARIABLES:
  6645. =============================================================================*/
  6646. void Sudo_Parameter_din_ChargeParameterDiscoveryRes()
  6647. {
  6648. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  6649. init_dinChargeParameterDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes);
  6650. ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  6651. //----- [BODY (1/5)] ResponseCode -----
  6652. struct dinChargeParameterDiscoveryResType *res;
  6653. res = &ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes;
  6654. res->ResponseCode = dinresponseCodeType_OK;
  6655. //----- [BODY (2/5)] EVSEProcessing -----
  6656. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  6657. // dinEVSEProcessingType_Finished = 0,
  6658. // dinEVSEProcessingType_Ongoing = 1
  6659. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6660. res->SAScheduleList_isUsed = 1u;
  6661. struct dinSAScheduleListType *list;
  6662. list = &res->SAScheduleList;
  6663. //
  6664. list->SAScheduleTuple.arrayLen = 1;
  6665. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  6666. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleID = 0;
  6667. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  6668. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  6669. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  6670. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  6671. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  6672. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  6673. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  6674. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  6675. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  6676. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6677. //ignore, since DIN doesn't support AC
  6678. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6679. res->DC_EVSEChargeParameter_isUsed = 1u;
  6680. struct dinDC_EVSEChargeParameterType *para;
  6681. para = &res->DC_EVSEChargeParameter;
  6682. //DC_EVSEStatus
  6683. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  6684. para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  6685. // dinisolationLevelType_Invalid = 0,
  6686. // dinisolationLevelType_Valid = 1,
  6687. // dinisolationLevelType_Warning = 2,
  6688. // dinisolationLevelType_Fault = 3
  6689. para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  6690. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6691. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  6692. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6693. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6694. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6695. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6696. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6697. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  6698. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  6699. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  6700. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  6701. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  6702. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  6703. para->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  6704. // dinEVSENotificationType_None = 0,
  6705. // dinEVSENotificationType_StopCharging = 1,
  6706. // dinEVSENotificationType_ReNegotiation = 2
  6707. //EVSEMaximumCurrentLimit
  6708. para->EVSEMaximumCurrentLimit.Value = 2400;
  6709. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  6710. para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  6711. para->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  6712. // dinunitSymbolType_h = 0,
  6713. // dinunitSymbolType_m = 1,
  6714. // dinunitSymbolType_s = 2,
  6715. // dinunitSymbolType_A = 3,
  6716. // dinunitSymbolType_Ah = 4,
  6717. // dinunitSymbolType_V = 5,
  6718. // dinunitSymbolType_VA = 6,
  6719. // dinunitSymbolType_W = 7,
  6720. // dinunitSymbolType_W_s = 8,
  6721. // dinunitSymbolType_Wh = 9
  6722. //EVSEMaximumPowerLimit
  6723. para->EVSEMaximumPowerLimit.Value = 6000;
  6724. para->EVSEMaximumPowerLimit.Multiplier = 1;
  6725. para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  6726. para->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  6727. //EVSEMaximumVoltageLimit
  6728. para->EVSEMaximumVoltageLimit.Value = 7500;
  6729. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  6730. para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  6731. para->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  6732. //EVSEMinimumVoltageLimit
  6733. para->EVSEMinimumVoltageLimit.Value = 1500;
  6734. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  6735. para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  6736. para->EVSEMinimumVoltageLimit.Unit = dinunitSymbolType_V;
  6737. //EVSEMinimumCurrentLimit
  6738. para->EVSEMinimumCurrentLimit.Value = 20;
  6739. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  6740. para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  6741. para->EVSEMinimumCurrentLimit.Unit = dinunitSymbolType_A;
  6742. //EVSECurrentRegulationTolerance_isUsed
  6743. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  6744. //EVSECurrentRegulationTolerance
  6745. para->EVSECurrentRegulationTolerance.Value = 10;
  6746. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  6747. para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  6748. para->EVSECurrentRegulationTolerance.Unit = dinunitSymbolType_A;
  6749. //EVSEEnergyToBeDelivered_isUsed
  6750. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  6751. //EVSEPeakCurrentRipple
  6752. para->EVSEPeakCurrentRipple.Value = 2;
  6753. para->EVSEPeakCurrentRipple.Multiplier = -1;
  6754. para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  6755. para->EVSEPeakCurrentRipple.Unit = dinunitSymbolType_A;
  6756. //EVSEEnergyToBeDelivered (optional)
  6757. /*
  6758. para->EVSEEnergyToBeDelivered.Value = 360;
  6759. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  6760. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  6761. para->EVSEEnergyToBeDelivered.Unit = dinunitSymbolType_Wh;
  6762. */
  6763. }
  6764. /*===========================================================================
  6765. FUNCTION: Sudo_Parameter_iso1_ChargeParameterDiscoveryRes
  6766. DESCRIPTION:
  6767. PRE-CONDITION:
  6768. INPUT:
  6769. OUTPUT:
  6770. GLOBAL VARIABLES:
  6771. =============================================================================*/
  6772. void Sudo_Parameter_iso1_ChargeParameterDiscoveryRes()
  6773. {
  6774. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  6775. init_iso1ChargeParameterDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes);
  6776. ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
  6777. //----- [BODY (1/5)] ResponseCode -----
  6778. struct iso1ChargeParameterDiscoveryResType *res;
  6779. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes;
  6780. res->ResponseCode = iso1responseCodeType_OK;
  6781. //----- [BODY (2/5)] EVSEProcessing -----
  6782. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  6783. // iso1EVSEProcessingType_Finished = 0,
  6784. // iso1EVSEProcessingType_Ongoing = 1
  6785. //----- [BODY (3/5)] SAScheduleList of SASchedules -----
  6786. res->SAScheduleList_isUsed = 1u;
  6787. struct iso1SAScheduleListType *list;
  6788. list = &res->SAScheduleList;
  6789. //
  6790. list->SAScheduleTuple.arrayLen = 1;
  6791. list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
  6792. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
  6793. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
  6794. list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
  6795. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
  6796. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
  6797. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
  6798. //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
  6799. //list->SAScheduleTuple.array[0].SalesTariff.xxx
  6800. //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
  6801. //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
  6802. //ignore, since our ISO1 doesn't support AC, yet
  6803. //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
  6804. res->DC_EVSEChargeParameter_isUsed = 1u;
  6805. struct iso1DC_EVSEChargeParameterType *para;
  6806. para = &res->DC_EVSEChargeParameter;
  6807. //DC_EVSEStatus
  6808. para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  6809. para->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  6810. // iso1isolationLevelType_Invalid = 0,
  6811. // iso1isolationLevelType_Valid = 1,
  6812. // iso1isolationLevelType_Warning = 2,
  6813. // iso1isolationLevelType_Fault = 3
  6814. para->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  6815. // iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  6816. // iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  6817. // iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  6818. // iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  6819. // iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  6820. // iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  6821. // iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  6822. // iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  6823. // iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  6824. // iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  6825. // iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  6826. // iso1DC_EVSEStatusCodeType_Reserved_C = 11
  6827. para->DC_EVSEStatus.NotificationMaxDelay = 0u;
  6828. para->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  6829. // iso1EVSENotificationType_None = 0,
  6830. // iso1EVSENotificationType_StopCharging = 1,
  6831. // iso1EVSENotificationType_ReNegotiation = 2
  6832. //EVSEMaximumCurrentLimit
  6833. para->EVSEMaximumCurrentLimit.Value = 2400;
  6834. para->EVSEMaximumCurrentLimit.Multiplier = -1;
  6835. //para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  6836. para->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  6837. //iso1unitSymbolType_h = 0,
  6838. //iso1unitSymbolType_m = 1,
  6839. //iso1unitSymbolType_s = 2,
  6840. //iso1unitSymbolType_A = 3,
  6841. //iso1unitSymbolType_V = 4,
  6842. //iso1unitSymbolType_W = 5,
  6843. //iso1unitSymbolType_Wh = 6
  6844. //EVSEMaximumPowerLimit
  6845. para->EVSEMaximumPowerLimit.Value = 6000;
  6846. para->EVSEMaximumPowerLimit.Multiplier = 1;
  6847. //para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  6848. para->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  6849. //EVSEMaximumVoltageLimit
  6850. para->EVSEMaximumVoltageLimit.Value = 7500;
  6851. para->EVSEMaximumVoltageLimit.Multiplier = -1;
  6852. //para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  6853. para->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  6854. //EVSEMinimumVoltageLimit
  6855. para->EVSEMinimumVoltageLimit.Value = 1500;
  6856. para->EVSEMinimumVoltageLimit.Multiplier = -1;
  6857. //para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
  6858. para->EVSEMinimumVoltageLimit.Unit = iso1unitSymbolType_V;
  6859. //EVSEMinimumCurrentLimit
  6860. para->EVSEMinimumCurrentLimit.Value = 20;
  6861. para->EVSEMinimumCurrentLimit.Multiplier = -1;
  6862. //para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
  6863. para->EVSEMinimumCurrentLimit.Unit = iso1unitSymbolType_A;
  6864. //EVSECurrentRegulationTolerance_isUsed
  6865. para->EVSECurrentRegulationTolerance_isUsed = 1u;
  6866. //EVSECurrentRegulationTolerance
  6867. para->EVSECurrentRegulationTolerance.Value = 10;
  6868. para->EVSECurrentRegulationTolerance.Multiplier = -1;
  6869. //para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
  6870. para->EVSECurrentRegulationTolerance.Unit = iso1unitSymbolType_A;
  6871. //EVSEEnergyToBeDelivered_isUsed
  6872. para->EVSEEnergyToBeDelivered_isUsed = 1u;
  6873. //EVSEPeakCurrentRipple
  6874. para->EVSEPeakCurrentRipple.Value = 2;
  6875. para->EVSEPeakCurrentRipple.Multiplier = -1;
  6876. //para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
  6877. para->EVSEPeakCurrentRipple.Unit = iso1unitSymbolType_A;
  6878. //EVSEEnergyToBeDelivered (optional)
  6879. /*
  6880. para->EVSEEnergyToBeDelivered.Value = 360;
  6881. para->EVSEEnergyToBeDelivered.Multiplier = 3;
  6882. para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
  6883. para->EVSEEnergyToBeDelivered.Unit = iso1unitSymbolType_Wh;
  6884. */
  6885. }
  6886. /*===========================================================================
  6887. FUNCTION: Proc_din_ChargeParameterDiscoveryRes
  6888. DESCRIPTION:
  6889. PRE-CONDITION:
  6890. INPUT:
  6891. OUTPUT:
  6892. GLOBAL VARIABLES:
  6893. =============================================================================*/
  6894. int Proc_din_ChargeParameterDiscoveryRes(int AcceptFd)
  6895. {
  6896. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  6897. //if it is not the same, the packet should be ignored.
  6898. //STEP 1: ============ Initialize ============
  6899. int errn = 0;
  6900. bitstream_t v2g_tx_stream;
  6901. struct ChargeParameterDiscoveryResponse_DIN70121 *res;
  6902. struct ChargeParameterDiscoveryRequest_DIN70121 *req;
  6903. struct DC_EVSEChargeParameterType_DIN70121 *dc_para;
  6904. struct ChargingInfoData *sys;
  6905. size_t pos = 0;
  6906. v2g_tx_stream.pos = &pos;
  6907. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  6908. v2g_tx_stream.data = V2GTP_Tx_buf;
  6909. res = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
  6910. req = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest;
  6911. dc_para = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  6912. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  6913. res->ResponseCode = OK_DIN70121;
  6914. res->EVSEProcessing = Ongoing_DIN70121;
  6915. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready; //1
  6916. //[HEADER] Check Req SessionID
  6917. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  6918. {
  6919. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  6920. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  6921. errn = -1;
  6922. }
  6923. //Check for SequenceError
  6924. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  6925. {
  6926. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  6927. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  6928. errn = -1;
  6929. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6930. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  6931. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6932. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6933. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6934. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6935. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  6936. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  6937. }
  6938. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  6939. if (sys->EvBatteryMaxCurrent < 0)
  6940. {
  6941. sprintf((char*)buf_log_evcomm,
  6942. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  6943. sys->EvBatteryMaxCurrent);
  6944. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6945. res->ResponseCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  6946. res->EVSEProcessing = Finished_DIN70121;
  6947. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6948. errn = -1;
  6949. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6950. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  6951. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6952. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6953. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6954. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6955. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  6956. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  6957. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6958. }
  6959. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  6960. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  6961. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  6962. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  6963. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumVoltageLimit, 1500, V_DIN70121); //150V
  6964. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumCurrentLimit, 10, A_DIN70121); //1A
  6965. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSECurrentRegulationTolerance, 10, A_DIN70121); //1A
  6966. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEPeakCurrentRipple, 2, A_DIN70121); //0.2A
  6967. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEEnergyToBeDelivered, 0, WH_DIN70121); //optional
  6968. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  6969. if (sys->EvBatteryMaxVoltage <= 500)
  6970. {
  6971. SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  6972. }
  6973. #endif
  6974. //for test with Tesla Model 3, 10A
  6975. //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_DIN70121); //10A, for testing with Tesla Model 3
  6976. //Check for EnergyTransferMode [TC_SECC_VTB_ChargeParameterDiscovery_004]
  6977. if (req->EVRequestedEnergyTransferType != DC_extended)
  6978. {
  6979. sprintf((char*)buf_log_evcomm,
  6980. "[ERROR]Wrong EVRequestedEnergyTransferType(%d,%d)",
  6981. req->EVRequestedEnergyTransferType,
  6982. dinEVSESupportedEnergyTransferType_DC_extended);
  6983. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  6984. res->ResponseCode = FAILED_WrongEnergyTransferType_DIN70121;
  6985. res->EVSEProcessing = Finished_DIN70121;
  6986. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  6987. errn = -1;
  6988. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  6989. Update_V2G_Flow_Status(Other_Fault);
  6990. //Update_ShmStatusCode(); //[To-Do] to be implemented
  6991. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  6992. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  6993. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  6994. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  6995. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  6996. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  6997. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  6998. }
  6999. //Check for CSU command of "Stop by EVSE"
  7000. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7001. {
  7002. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7003. res->ResponseCode = FAILED_DIN70121;
  7004. res->EVSEProcessing = Finished_DIN70121;
  7005. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7006. errn = -1;
  7007. }
  7008. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7009. {
  7010. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7011. res->ResponseCode = FAILED_DIN70121;
  7012. res->EVSEProcessing = Finished_DIN70121;
  7013. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7014. errn = -1;
  7015. }
  7016. //Detect for CP State should be 9V (State B)
  7017. #if CP_PROTECTION_MECHANISM == ENABLE
  7018. if (sys->CpState != 3) //State B1, B2
  7019. {
  7020. res->ResponseCode = FAILED_DIN70121;
  7021. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7022. res->EVSEProcessing = Finished_DIN70121;
  7023. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7024. Update_V2G_Flow_Status(Other_Fault);
  7025. errn = -1;
  7026. sprintf((char*)buf_log_evcomm,
  7027. "[Proc_din_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7028. sys->CpState,
  7029. sys->CpVoltage);
  7030. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7031. }
  7032. #endif
  7033. //Check for Permission from CSU
  7034. if (ShmInternalComm->ChargingPermission == TRUE)
  7035. {
  7036. res->EVSEProcessing = Finished_DIN70121;
  7037. }
  7038. //Check for Permission Off
  7039. if (ShmInternalComm->ChargingPermission == FALSE)
  7040. {
  7041. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][DIN][ChargeParameterDiscoveryRes]Permission OFF");
  7042. res->ResponseCode = FAILED_DIN70121;
  7043. res->EVSEProcessing = Finished_DIN70121;
  7044. dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7045. errn = -1;
  7046. }
  7047. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7048. #if PARAMETER_NORMAL_MODE == ENABLE
  7049. SHM_Read_din_ChargeParameterDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  7050. #else
  7051. Sudo_Parameter_din_ChargeParameterDiscoveryRes();
  7052. #endif
  7053. //STEP 4: ============ Encode and Send Response Message ===========
  7054. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  7055. {
  7056. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7057. errn = -1;
  7058. }
  7059. //STPE 5: ============ Update Flags ============
  7060. return errn;
  7061. }
  7062. /*===========================================================================
  7063. FUNCTION: Proc_iso1_ChargeParameterDiscoveryRes
  7064. DESCRIPTION:
  7065. PRE-CONDITION:
  7066. INPUT:
  7067. OUTPUT:
  7068. GLOBAL VARIABLES:
  7069. =============================================================================*/
  7070. int Proc_iso1_ChargeParameterDiscoveryRes(int AcceptFd)
  7071. {
  7072. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7073. //if it is not the same, the packet should be ignored.
  7074. //STEP 1: ============ Initialize ============
  7075. int errn = 0;
  7076. bitstream_t v2g_tx_stream;
  7077. struct ChargeParameterDiscoveryResponse_ISO15118_2014 *res;
  7078. struct ChargeParameterDiscoveryRequest_ISO15118_2014 *req;
  7079. struct DC_EVSEChargeParameterType_ISO15118_2014 *dc_para;
  7080. struct AC_EVSEChargeParameterType_ISO15118_2014 *ac_para;
  7081. struct ChargingInfoData *sys;
  7082. size_t pos = 0;
  7083. v2g_tx_stream.pos = &pos;
  7084. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7085. v2g_tx_stream.data = V2GTP_Tx_buf;
  7086. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse;
  7087. req = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest;
  7088. dc_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
  7089. ac_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.AC_EVSEChargeParameter;
  7090. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7091. res->ResponseCode = OK_ISO15118_2014;
  7092. /*+++ 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery +++*/
  7093. res->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7094. /*--- 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery ---*/
  7095. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; //1
  7096. ac_para->AC_EVSEStatus.RCD = ShmInternalComm->AC_RcdStatus; //0:no error, 1:error
  7097. ac_para->AC_EVSEStatus.NotificationMaxDelay = 0; //unit: 1s
  7098. ac_para->AC_EVSEStatus.EVSENotification = ShmInternalComm->AC_EVSENotification; //0:none, 1:StopCharging, 2:RenNgotiation
  7099. //[HEADER] Check Req SessionID
  7100. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7101. {
  7102. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7103. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7104. errn = -1;
  7105. }
  7106. //Check for SequenceError
  7107. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7108. {
  7109. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7110. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7111. errn = -1;
  7112. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7113. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7114. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7115. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7116. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7117. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7118. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7119. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7120. }
  7121. //[TC_SECC_VTB_ChargeParameterDiscovery_005]
  7122. /*+++ 20200808, vern, should check the voltage and current to see if the range of battery parameter is accepted by charger ---*/
  7123. if ((sys->EvBatteryMaxCurrent < 0) ||(sys->EvBatteryMaxVoltage<150))
  7124. {
  7125. sprintf((char*)buf_log_evcomm,
  7126. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  7127. sys->EvBatteryMaxCurrent);
  7128. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7129. res->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  7130. res->EVSEProcessing = Finished_ISO15118_2014;
  7131. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7132. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7133. errn = -1;
  7134. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7135. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  7136. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7137. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7138. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7139. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7140. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7141. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  7142. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7143. }
  7144. //STEP 2: ============ Modify Parameters of ShmCcsData ============
  7145. //DC
  7146. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  7147. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7148. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  7149. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumVoltageLimit, 1500, V_ISO15118_2014); //150V
  7150. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumCurrentLimit, 10, A_ISO15118_2014); //1A
  7151. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSECurrentRegulationTolerance, 10, A_ISO15118_2014); //1A
  7152. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEPeakCurrentRipple, 2, A_ISO15118_2014); //0.2A
  7153. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEEnergyToBeDelivered, 0, Wh_ISO15118_2014); //optional
  7154. //AC
  7155. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSENominalVoltage, (int) (sys->AC_EVSENominalVoltage * 10), V_ISO15118_2014);
  7156. SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  7157. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  7158. if (sys->EvBatteryMaxVoltage <= 500)
  7159. {
  7160. SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  7161. }
  7162. #endif
  7163. //for test with Tesla Model 3, 10A
  7164. //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_ISO15118_2014); //10A, for testing with Tesla Model 3
  7165. //Check for EnergyTransferMode
  7166. if (req->RequestedEnergyTransferMode != ShmCcsData->EnergyTransferMode) //[CAUTION] Their table should be kept as the same.
  7167. {
  7168. sprintf((char*)buf_log_evcomm,
  7169. "[ERROR]Unmatched RequestedEnergyTransferMode(%d,%d)",
  7170. req->RequestedEnergyTransferMode,
  7171. ShmCcsData->EnergyTransferMode);
  7172. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7173. res->ResponseCode = FAILED_WrongEnergyTransferMode_ISO15118_2014;
  7174. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7175. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7176. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7177. errn = -1;
  7178. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7179. Update_V2G_Flow_Status(Other_Fault);
  7180. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7181. //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
  7182. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7183. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7184. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7185. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7186. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  7187. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  7188. }
  7189. //Check for CSU command of "Stop by EVSE"
  7190. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7191. {
  7192. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_Shutdown");
  7193. res->ResponseCode = FAILED_ISO15118_2014;
  7194. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7195. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7196. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7197. errn = -1;
  7198. }
  7199. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7200. {
  7201. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
  7202. res->ResponseCode = FAILED_ISO15118_2014;
  7203. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7204. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7205. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7206. errn = -1;
  7207. }
  7208. //Detect for CP State should be 9V (State B)
  7209. #if CP_PROTECTION_MECHANISM == ENABLE
  7210. if (sys->CpState != 3) //State B1, B2
  7211. {
  7212. res->ResponseCode = FAILED_ISO15118_2014;
  7213. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7214. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7215. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7216. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7217. Update_V2G_Flow_Status(Other_Fault);
  7218. errn = -1;
  7219. sprintf((char*)buf_log_evcomm,
  7220. "[Proc_iso1_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  7221. sys->CpState,
  7222. sys->CpVoltage);
  7223. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7224. }
  7225. #endif
  7226. //Check for Permission from CSU
  7227. if(ShmInternalComm->ChargingPermission == TRUE)
  7228. {
  7229. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7230. }
  7231. //Check for Permission Off
  7232. if (ShmInternalComm->ChargingPermission == FALSE)
  7233. {
  7234. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][ISO1][ChargeParameterDiscoveryRes]Permission OFF");
  7235. res->ResponseCode = FAILED_ISO15118_2014;
  7236. res->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7237. dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7238. ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  7239. errn = -1;
  7240. }
  7241. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7242. #if PARAMETER_NORMAL_MODE == ENABLE
  7243. SHM_Read_iso1_ChargeParameterDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7244. #else
  7245. Sudo_Parameter_iso1_ChargeParameterDiscoveryRes();
  7246. #endif
  7247. //STEP 4: ============ Encode and Send Response Message ===========
  7248. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7249. {
  7250. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
  7251. errn = -1;
  7252. }
  7253. //STPE 5: ============ Update Flags ============
  7254. return errn;
  7255. }
  7256. /*===========================================================================
  7257. FUNCTION: Proc_din_ChargeParameterDiscoveryReq
  7258. DESCRIPTION:
  7259. PRE-CONDITION:
  7260. INPUT:
  7261. OUTPUT:
  7262. GLOBAL VARIABLES:
  7263. =============================================================================*/
  7264. int Proc_din_ChargeParameterDiscoveryReq(int AcceptFd)
  7265. {
  7266. int errn = 0;
  7267. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7268. //ftime(&SeqStartTime);
  7269. //Print the decoded XML Document
  7270. PRINT_XML_DOC_DIN_ChargeParameterDiscoveryReq(&ccs_exi_doc_DIN);
  7271. //Save into Share Memory
  7272. SHM_Save_din_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7273. //Check for EV Error Code
  7274. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7275. errn = Proc_din_ChargeParameterDiscoveryRes(AcceptFd);
  7276. //ftime(&SeqEndTime);
  7277. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7278. if ( errn == 0)
  7279. {
  7280. //send response successfully.
  7281. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]ChargeParameterDiscoveryRes");
  7282. }
  7283. else
  7284. {
  7285. sprintf((char*)buf_log_evcomm,
  7286. "[Error][DIN][ChargeParameterDiscoveryRes]%d (DEC)",
  7287. errn);
  7288. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7289. }
  7290. return errn;
  7291. }
  7292. /*===========================================================================
  7293. FUNCTION: Proc_iso1_ChargeParameterDiscoveryReq
  7294. DESCRIPTION:
  7295. PRE-CONDITION:
  7296. INPUT:
  7297. OUTPUT:
  7298. GLOBAL VARIABLES:
  7299. =============================================================================*/
  7300. int Proc_iso1_ChargeParameterDiscoveryReq(int AcceptFd)
  7301. {
  7302. int errn = 0;
  7303. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
  7304. //ftime(&SeqStartTime);
  7305. //Print the decoded XML Document
  7306. PRINT_XML_DOC_ISO1_ChargeParameterDiscoveryReq(&ccs_exi_doc_ISO1);
  7307. //Save into Share Memory
  7308. SHM_Save_iso1_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7309. //Check for EV Error Code
  7310. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
  7311. errn = Proc_iso1_ChargeParameterDiscoveryRes(AcceptFd);
  7312. //ftime(&SeqEndTime);
  7313. //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
  7314. if (errn == 0)
  7315. {
  7316. //send response successfully.
  7317. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ChargeParameterDiscoveryRes");
  7318. }
  7319. else
  7320. {
  7321. sprintf((char*)buf_log_evcomm,
  7322. "[Error][ISO1][ChargeParameterDiscoveryRes]%d (DEC)",
  7323. errn);
  7324. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7325. }
  7326. return errn;
  7327. }
  7328. /*===========================================================================
  7329. FUNCTION: SHM_Init_din_CableCheckRes
  7330. DESCRIPTION:
  7331. PRE-CONDITION:
  7332. INPUT:
  7333. 1. shm_ccs
  7334. OUTPUT:
  7335. 1. shm_ccs
  7336. GLOBAL VARIABLES:
  7337. =============================================================================*/
  7338. void SHM_Init_din_CableCheckRes(struct CcsData *shm_ccs)
  7339. {
  7340. struct CableCheckResponse_DIN70121 *in;
  7341. in = &shm_ccs->V2GMessage_DIN70121.CableCheckResponse;
  7342. //----- [BODY (1/3)] ResponseCode -----
  7343. in->ResponseCode = dinresponseCodeType_OK;
  7344. //----- [BODY (2/3)] EVSEProcessing -----
  7345. //in->EVSEProcessing = dinEVSEProcessingType_Finished; //for test
  7346. in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //default
  7347. // dinEVSEProcessingType_Finished = 0,
  7348. // dinEVSEProcessingType_Ongoing = 1
  7349. //----- [BODY (3/3)] DC_EVSEStatus -----
  7350. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7351. in->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0 (default)
  7352. // dinisolationLevelType_Invalid = 0,
  7353. // dinisolationLevelType_Valid = 1, (default)
  7354. // dinisolationLevelType_Warning = 2,
  7355. // dinisolationLevelType_Fault = 3
  7356. }
  7357. /*===========================================================================
  7358. FUNCTION: Sudo_Parameter_din_CableCheckRes
  7359. DESCRIPTION:
  7360. PRE-CONDITION:
  7361. INPUT:
  7362. OUTPUT:
  7363. GLOBAL VARIABLES:
  7364. =============================================================================*/
  7365. void Sudo_Parameter_din_CableCheckRes()
  7366. {
  7367. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7368. init_dinCableCheckResType(&ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes);
  7369. ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  7370. //----- [BODY (1/3)] ResponseCode -----
  7371. struct dinCableCheckResType *res;
  7372. res = &ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes;
  7373. res->ResponseCode = dinresponseCodeType_OK;
  7374. //----- [BODY (2/3)] EVSEProcessing -----
  7375. res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
  7376. // dinEVSEProcessingType_Finished = 0,
  7377. // dinEVSEProcessingType_Ongoing = 1
  7378. //----- [BODY (3/3)] DC_EVSEStatus -----
  7379. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7380. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7381. // dinisolationLevelType_Invalid = 0,
  7382. // dinisolationLevelType_Valid = 1,
  7383. // dinisolationLevelType_Warning = 2,
  7384. // dinisolationLevelType_Fault = 3
  7385. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7386. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7387. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7388. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7389. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7390. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7391. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7392. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7393. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  7394. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  7395. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  7396. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  7397. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  7398. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7399. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  7400. // dinEVSENotificationType_None = 0,
  7401. // dinEVSENotificationType_StopCharging = 1,
  7402. // dinEVSENotificationType_ReNegotiation = 2
  7403. }
  7404. /*===========================================================================
  7405. FUNCTION: Sudo_Parameter_iso1_CableCheckRes
  7406. DESCRIPTION:
  7407. PRE-CONDITION:
  7408. INPUT:
  7409. OUTPUT:
  7410. GLOBAL VARIABLES:
  7411. =============================================================================*/
  7412. void Sudo_Parameter_iso1_CableCheckRes()
  7413. {
  7414. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  7415. init_iso1CableCheckResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes);
  7416. ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes_isUsed = 1u;
  7417. //----- [BODY (1/3)] ResponseCode -----
  7418. struct iso1CableCheckResType *res;
  7419. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes;
  7420. res->ResponseCode = iso1responseCodeType_OK;
  7421. //----- [BODY (2/3)] EVSEProcessing -----
  7422. res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
  7423. //iso1EVSEProcessingType_Finished = 0,
  7424. //iso1EVSEProcessingType_Ongoing = 1,
  7425. //iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction = 2
  7426. //----- [BODY (3/3)] DC_EVSEStatus -----
  7427. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7428. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  7429. //iso1isolationLevelType_Invalid = 0,
  7430. //iso1isolationLevelType_Valid = 1,
  7431. //iso1isolationLevelType_Warning = 2,
  7432. //iso1isolationLevelType_Fault = 3,
  7433. //iso1isolationLevelType_No_IMD = 4
  7434. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7435. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7436. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  7437. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7438. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7439. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7440. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  7441. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  7442. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  7443. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  7444. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  7445. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  7446. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  7447. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  7448. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  7449. //iso1EVSENotificationType_None = 0,
  7450. //iso1EVSENotificationType_StopCharging = 1,
  7451. //iso1EVSENotificationType_ReNegotiation = 2
  7452. }
  7453. /*===========================================================================
  7454. FUNCTION: Proc_din_CableCheckRes
  7455. DESCRIPTION:
  7456. PRE-CONDITION:
  7457. INPUT:
  7458. OUTPUT:
  7459. GLOBAL VARIABLES:
  7460. =============================================================================*/
  7461. int Proc_din_CableCheckRes(int AcceptFd)
  7462. {
  7463. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7464. //if it is not the same, the packet should be ignored.
  7465. //STEP 1: ============ Initialize ============
  7466. //int i = 0;
  7467. int errn = 0;
  7468. bitstream_t v2g_tx_stream;
  7469. static struct CableCheckResponse_DIN70121 *cab;
  7470. static struct ChargingInfoData *sys;
  7471. size_t pos = 0;
  7472. v2g_tx_stream.pos = &pos;
  7473. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7474. v2g_tx_stream.data = V2GTP_Tx_buf;
  7475. cab = &ShmCcsData->V2GMessage_DIN70121.CableCheckResponse;
  7476. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7477. cab->ResponseCode = OK_DIN70121;
  7478. cab->cnt++;
  7479. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  7480. sys->CpState,
  7481. sys->CpVoltage,
  7482. sys->PresentChargingVoltage,
  7483. sys->IsolationStatus,
  7484. cab->EVSEProcessing);
  7485. //[HEADER] Check Req SessionID
  7486. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  7487. {
  7488. cab->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  7489. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7490. errn = -1;
  7491. }
  7492. //Check for SequenceError
  7493. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7494. {
  7495. cab->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  7496. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7497. errn = -1;
  7498. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7499. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7500. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7501. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7502. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7503. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7504. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7505. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7506. }
  7507. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  7508. if (sys->IsolationStatus == GFD_Invalid) //0: on going
  7509. {
  7510. //For PSU
  7511. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  7512. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  7513. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7514. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive; //4
  7515. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  7516. }
  7517. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2: warning
  7518. {
  7519. //For PSU
  7520. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7521. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7522. if (sys->PresentChargingVoltage < 60) // < 60V
  7523. {
  7524. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  7525. sprintf((char*)buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  7526. sys->PresentChargingVoltage,
  7527. sys->IsolationStatus);
  7528. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7529. //IsolationStatus
  7530. if (sys->IsolationStatus == GFD_Valid)
  7531. {
  7532. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7533. }
  7534. else if (sys->IsolationStatus == GFD_Warning)
  7535. {
  7536. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning;
  7537. }
  7538. else
  7539. {
  7540. sprintf((char*)buf_log_evcomm,
  7541. "[WARNING]unexpected IsolationStatus(%d)",
  7542. sys->IsolationStatus);
  7543. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7544. }
  7545. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7546. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7547. }
  7548. else
  7549. {
  7550. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7551. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7552. cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
  7553. }
  7554. }
  7555. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  7556. {
  7557. //For PSU
  7558. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7559. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7560. cab->ResponseCode = FAILED_DIN70121;
  7561. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7562. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  7563. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7564. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]IsolationStatus = 3 (fault)");
  7565. errn = -1;
  7566. }
  7567. else
  7568. {
  7569. //For PSU
  7570. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7571. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7572. cab->ResponseCode = FAILED_DIN70121;
  7573. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  7574. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
  7575. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7576. sprintf((char*)buf_log_evcomm,
  7577. "[Proc_din_CableCheckRes]Undefined Isolation Status(%d)",
  7578. sys->IsolationStatus);
  7579. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7580. }
  7581. //Check for CSU command of "Stop by EVSE"
  7582. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7583. {
  7584. cab->ResponseCode = FAILED_DIN70121;
  7585. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7586. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7587. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7588. errn = -1;
  7589. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]EVSE_Shutdown");
  7590. }
  7591. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7592. {
  7593. cab->ResponseCode = FAILED_DIN70121;
  7594. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7595. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7596. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7597. errn = -1;
  7598. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckRes]EVSE_EmergencyShutdown");
  7599. }
  7600. else if (ShmInternalComm->ChargingPermission == FALSE)
  7601. {
  7602. cab->ResponseCode = FAILED_DIN70121;
  7603. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  7604. cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  7605. cab->EVSEProcessing = dinEVSEProcessingType_Finished;
  7606. errn = -1;
  7607. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_CableCheckRes]ChargingPermission = FALSE");
  7608. }
  7609. else
  7610. {
  7611. //null
  7612. }
  7613. //Response to CP Error
  7614. #if CP_PROTECTION_MECHANISM == ENABLE
  7615. //#if 1
  7616. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  7617. {
  7618. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  7619. {
  7620. cab->ResponseCode = FAILED_DIN70121;
  7621. cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7622. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7623. Update_V2G_Flow_Status(Other_Fault);
  7624. errn = -1;
  7625. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7626. //CCS_SECC_CP_State_Error (023889)
  7627. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7628. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7629. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7630. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  7631. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  7632. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  7633. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  7634. sprintf((char*)buf_log_evcomm,
  7635. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  7636. sys->CpState,
  7637. sys->CpVoltage,
  7638. cab->cnt
  7639. );
  7640. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7641. //cab->cnt = 0;
  7642. }
  7643. }
  7644. #endif
  7645. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7646. #if PARAMETER_NORMAL_MODE == ENABLE
  7647. SHM_Read_din_CableCheckRes(&ccs_exi_doc_DIN, ShmCcsData);
  7648. #else
  7649. Sudo_Parameter_din_CableCheckRes();
  7650. #endif
  7651. //STEP 4: ============ Encode and Send Response Message ===========
  7652. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  7653. {
  7654. errn = -1;
  7655. }
  7656. //STEP 5: ============ Update Flags ===========
  7657. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  7658. return errn;
  7659. }
  7660. /*===========================================================================
  7661. FUNCTION: Proc_iso1_CableCheckRes
  7662. DESCRIPTION:
  7663. PRE-CONDITION:
  7664. INPUT:
  7665. OUTPUT:
  7666. GLOBAL VARIABLES:
  7667. =============================================================================*/
  7668. int Proc_iso1_CableCheckRes(int AcceptFd)
  7669. {
  7670. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  7671. //if it is not the same, the packet should be ignored.
  7672. //STEP 1: ============ Initialize ============
  7673. //int i = 0;
  7674. int errn = 0;
  7675. bitstream_t v2g_tx_stream;
  7676. static struct CableCheckResponse_ISO15118_2014 *cab;
  7677. static struct ChargingInfoData *sys;
  7678. size_t pos = 0;
  7679. v2g_tx_stream.pos = &pos;
  7680. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  7681. v2g_tx_stream.data = V2GTP_Tx_buf;
  7682. cab = &ShmCcsData->V2GMessage_ISO15118_2014.CableCheckResponse;
  7683. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  7684. cab->ResponseCode = OK_ISO15118_2014;
  7685. cab->cnt++;
  7686. DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
  7687. sys->CpState,
  7688. sys->CpVoltage,
  7689. sys->PresentChargingVoltage,
  7690. sys->IsolationStatus,
  7691. cab->EVSEProcessing);
  7692. //[HEADER] Check Req SessionID
  7693. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  7694. {
  7695. cab->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  7696. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  7697. errn = -1;
  7698. }
  7699. //Check for SequenceError
  7700. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  7701. {
  7702. cab->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  7703. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  7704. errn = -1;
  7705. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7706. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  7707. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7708. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7709. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7710. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  7711. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  7712. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  7713. }
  7714. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  7715. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  7716. {
  7717. //For PSU
  7718. sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
  7719. sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
  7720. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7721. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7722. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7723. }
  7724. else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2:waring
  7725. {
  7726. //For PSU
  7727. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7728. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7729. if (sys->PresentChargingVoltage < 60) // < 60V
  7730. {
  7731. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  7732. sprintf((char*)buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
  7733. sys->PresentChargingVoltage,
  7734. sys->IsolationStatus);
  7735. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7736. //IsolationStatus
  7737. if (sys->IsolationStatus == GFD_Valid)
  7738. {
  7739. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  7740. }
  7741. else if (sys->IsolationStatus == GFD_Warning)
  7742. {
  7743. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning;
  7744. }
  7745. else
  7746. {
  7747. sprintf((char*)buf_log_evcomm,
  7748. "[WARNING]unexpected IsolationStatus(%d)",
  7749. sys->IsolationStatus);
  7750. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7751. }
  7752. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  7753. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7754. }
  7755. else
  7756. {
  7757. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  7758. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
  7759. cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
  7760. }
  7761. }
  7762. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  7763. {
  7764. //For PSU
  7765. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7766. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7767. cab->ResponseCode = FAILED_ISO15118_2014;
  7768. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7769. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  7770. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7771. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]IsolationStatus = 3 (fault)");
  7772. errn = -1;
  7773. }
  7774. //else if (sys->IsolationStatus == GFD_No_IMD){} //only for ISO15118
  7775. else
  7776. {
  7777. //For PSU
  7778. sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
  7779. sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
  7780. cab->ResponseCode = FAILED_ISO15118_2014;
  7781. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7782. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
  7783. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7784. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]Undefined Isolation Status.");
  7785. }
  7786. //Check for CSU command of "Stop by EVSE"
  7787. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  7788. {
  7789. cab->ResponseCode = FAILED_ISO15118_2014;
  7790. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7791. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7792. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7793. errn = -1;
  7794. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]EVSE_Shutdown");
  7795. }
  7796. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  7797. {
  7798. cab->ResponseCode = FAILED_ISO15118_2014;
  7799. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7800. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7801. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7802. errn = -1;
  7803. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckRes]EVSE_EmergencyShutdown");
  7804. }
  7805. else if (ShmInternalComm->ChargingPermission == FALSE)
  7806. {
  7807. cab->ResponseCode = FAILED_ISO15118_2014;
  7808. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  7809. cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  7810. cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
  7811. errn = -1;
  7812. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_CableCheckRes]ChargingPermission = FALSE");
  7813. }
  7814. else
  7815. {
  7816. //null
  7817. }
  7818. //Response to CP Error
  7819. #if CP_PROTECTION_MECHANISM == ENABLE
  7820. if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
  7821. {
  7822. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  7823. {
  7824. cab->ResponseCode = FAILED_ISO15118_2014;
  7825. cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  7826. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  7827. Update_V2G_Flow_Status(Other_Fault);
  7828. errn = -1;
  7829. //Update_ShmStatusCode(); //[To-Do] to be implemented
  7830. //CCS_SECC_CP_State_Error (023889)
  7831. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  7832. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  7833. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  7834. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  7835. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  7836. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  7837. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  7838. sprintf((char*)buf_log_evcomm,
  7839. "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
  7840. sys->CpState,
  7841. sys->CpVoltage,
  7842. cab->cnt
  7843. );
  7844. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7845. //cab->cnt = 0;
  7846. }
  7847. }
  7848. #endif
  7849. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  7850. #if PARAMETER_NORMAL_MODE == ENABLE
  7851. SHM_Read_iso1_CableCheckRes(&ccs_exi_doc_ISO1, ShmCcsData);
  7852. #else
  7853. Sudo_Parameter_iso1_CableCheckRes();
  7854. #endif
  7855. //STEP 4: ============ Encode and Send Response Message ===========
  7856. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  7857. {
  7858. errn = -1;
  7859. }
  7860. //STEP 5: ============ Update Flags ===========
  7861. sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
  7862. return errn;
  7863. }
  7864. /*===========================================================================
  7865. FUNCTION: Proc_din_CableCheckReq
  7866. DESCRIPTION:
  7867. PRE-CONDITION:
  7868. INPUT:
  7869. OUTPUT:
  7870. GLOBAL VARIABLES:
  7871. =============================================================================*/
  7872. int Proc_din_CableCheckReq(int AcceptFd)
  7873. {
  7874. int errn = 0;
  7875. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CableCheckReq] Got CableCheckReq\n");
  7876. //Print the decoded XML Document
  7877. PRINT_XML_DOC_DIN_CableCheckReq(&ccs_exi_doc_DIN);
  7878. //Save into Share Memory
  7879. SHM_Save_din_CableCheckReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  7880. //Check for EV Error Code
  7881. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CableCheckRequest.DC_EVStatus.EVErrorCode);
  7882. errn = Proc_din_CableCheckRes(AcceptFd);
  7883. if (errn == 0)
  7884. {
  7885. //send response successfully.
  7886. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]CableCheckRes");
  7887. }
  7888. else
  7889. {
  7890. sprintf((char*)buf_log_evcomm,
  7891. "[Error][SeccComm][Proc_din_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  7892. errn);
  7893. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7894. }
  7895. return errn;
  7896. }
  7897. /*===========================================================================
  7898. FUNCTION: Proc_iso1_CableCheckReq
  7899. DESCRIPTION:
  7900. PRE-CONDITION:
  7901. INPUT:
  7902. OUTPUT:
  7903. GLOBAL VARIABLES:
  7904. =============================================================================*/
  7905. int Proc_iso1_CableCheckReq(int AcceptFd)
  7906. {
  7907. int errn = 0;
  7908. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CableCheckReq] Got CableCheckReq");
  7909. //Print the decoded XML Document
  7910. PRINT_XML_DOC_ISO1_CableCheckReq(&ccs_exi_doc_ISO1);
  7911. //Save into Share Memory
  7912. SHM_Save_iso1_CableCheckReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  7913. //Check for EV Error Code
  7914. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CableCheckRequest.DC_EVStatus.EVErrorCode);
  7915. errn = Proc_iso1_CableCheckRes(AcceptFd);
  7916. if (errn == 0)
  7917. {
  7918. //send response successfully.
  7919. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]CableCheckRes");
  7920. }
  7921. else
  7922. {
  7923. sprintf((char*)buf_log_evcomm,
  7924. "[Error][SeccComm][Proc_iso1_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
  7925. errn);
  7926. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  7927. }
  7928. return errn;
  7929. }
  7930. /*===========================================================================
  7931. FUNCTION: SHM_Init_din_PreChargeRes
  7932. DESCRIPTION:
  7933. PRE-CONDITION:
  7934. INPUT:
  7935. 1. shm_ccs
  7936. OUTPUT:
  7937. 1. shm_ccs
  7938. GLOBAL VARIABLES:
  7939. =============================================================================*/
  7940. void SHM_Init_din_PreChargeRes(struct CcsData *shm_ccs)
  7941. {
  7942. struct PreChargeResponse_DIN70121 *in;
  7943. in = &shm_ccs->V2GMessage_DIN70121.PreChargeResponse;
  7944. //----- [BODY (1/3)] ResponseCode -----
  7945. in->ResponseCode = dinresponseCodeType_OK;
  7946. //----- [BODY (2/3)] EVSEPresentVoltage -----
  7947. short value = 0; int multiplier = 0; unsigned char unit = 0;
  7948. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for Test
  7949. value = 0; multiplier = 0; unit = V_DIN70121; //waiting for CsuComm to update V to fit EV Target
  7950. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  7951. //----- [BODY (3/3)] DC_EVSEStatus -----
  7952. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  7953. }
  7954. /*===========================================================================
  7955. FUNCTION: Sudo_Parameter_din_PreChargeRes
  7956. DESCRIPTION:
  7957. PRE-CONDITION:
  7958. INPUT:
  7959. OUTPUT:
  7960. GLOBAL VARIABLES:
  7961. =============================================================================*/
  7962. void Sudo_Parameter_din_PreChargeRes()
  7963. {
  7964. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  7965. init_dinPreChargeResType(&ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes);
  7966. ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  7967. //----- [BODY (1/3)] ResponseCode -----
  7968. struct dinPreChargeResType *res;
  7969. res = &ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes;
  7970. res->ResponseCode = dinresponseCodeType_OK;
  7971. //----- [BODY (2/3)] EVSEPresentVoltage -----
  7972. res->EVSEPresentVoltage.Value = 3820;
  7973. res->EVSEPresentVoltage.Multiplier = -1;
  7974. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  7975. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  7976. // dinunitSymbolType_h = 0,
  7977. // dinunitSymbolType_m = 1,
  7978. // dinunitSymbolType_s = 2,
  7979. // dinunitSymbolType_A = 3,
  7980. // dinunitSymbolType_Ah = 4,
  7981. // dinunitSymbolType_V = 5,
  7982. // dinunitSymbolType_VA = 6,
  7983. // dinunitSymbolType_W = 7,
  7984. // dinunitSymbolType_W_s = 8,
  7985. // dinunitSymbolType_Wh = 9
  7986. //----- [BODY (3/3)] DC_EVSEStatus -----
  7987. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  7988. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  7989. // dinisolationLevelType_Invalid = 0,
  7990. // dinisolationLevelType_Valid = 1,
  7991. // dinisolationLevelType_Warning = 2,
  7992. // dinisolationLevelType_Fault = 3
  7993. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  7994. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  7995. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  7996. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  7997. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  7998. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  7999. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8000. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8001. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8002. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8003. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8004. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8005. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8006. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8007. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8008. // dinEVSENotificationType_None = 0,
  8009. // dinEVSENotificationType_StopCharging = 1,
  8010. // dinEVSENotificationType_ReNegotiation = 2
  8011. }
  8012. /*===========================================================================
  8013. FUNCTION: Sudo_Parameter_iso1_PreChargeRes
  8014. DESCRIPTION:
  8015. PRE-CONDITION:
  8016. INPUT:
  8017. OUTPUT:
  8018. GLOBAL VARIABLES:
  8019. =============================================================================*/
  8020. void Sudo_Parameter_iso1_PreChargeRes()
  8021. {
  8022. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8023. init_iso1PreChargeResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes);
  8024. ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes_isUsed = 1u;
  8025. //----- [BODY (1/3)] ResponseCode -----
  8026. struct iso1PreChargeResType *res;
  8027. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes;
  8028. res->ResponseCode = iso1responseCodeType_OK;
  8029. //----- [BODY (2/3)] EVSEPresentVoltage -----
  8030. res->EVSEPresentVoltage.Value = 3820;
  8031. res->EVSEPresentVoltage.Multiplier = -1;
  8032. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8033. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  8034. //iso1unitSymbolType_h = 0,
  8035. //iso1unitSymbolType_m = 1,
  8036. //iso1unitSymbolType_s = 2,
  8037. //iso1unitSymbolType_A = 3,
  8038. //iso1unitSymbolType_V = 4,
  8039. //iso1unitSymbolType_W = 5,
  8040. //iso1unitSymbolType_Wh = 6
  8041. //----- [BODY (3/3)] DC_EVSEStatus -----
  8042. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8043. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8044. //iso1isolationLevelType_Invalid = 0,
  8045. //iso1isolationLevelType_Valid = 1,
  8046. //iso1isolationLevelType_Warning = 2,
  8047. //iso1isolationLevelType_Fault = 3,
  8048. //iso1isolationLevelType_No_IMD = 4
  8049. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8050. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8051. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8052. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8053. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8054. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8055. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8056. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8057. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8058. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8059. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8060. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8061. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8062. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8063. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8064. //iso1EVSENotificationType_None = 0,
  8065. //iso1EVSENotificationType_StopCharging = 1,
  8066. //iso1EVSENotificationType_ReNegotiation = 2
  8067. }
  8068. /*===========================================================================
  8069. FUNCTION: Proc_din_PreChargeRes
  8070. DESCRIPTION:
  8071. PRE-CONDITION:
  8072. INPUT:
  8073. OUTPUT:
  8074. GLOBAL VARIABLES:
  8075. =============================================================================*/
  8076. int Proc_din_PreChargeRes(int AcceptFd)
  8077. {
  8078. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8079. //if it is not the same, the packet should be ignored.
  8080. //STEP 1: ============ Initialize ============
  8081. //int i = 0;
  8082. int errn = 0;
  8083. bitstream_t v2g_tx_stream;
  8084. static struct PreChargeResponse_DIN70121 *pre;
  8085. static struct ChargingInfoData *sys;
  8086. size_t pos = 0;
  8087. v2g_tx_stream.pos = &pos;
  8088. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8089. v2g_tx_stream.data = V2GTP_Tx_buf;
  8090. pre = &ShmCcsData->V2GMessage_DIN70121.PreChargeResponse;
  8091. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8092. pre->ResponseCode = OK_DIN70121;
  8093. //EVSE Status Code
  8094. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8095. //[HEADER] Check Req SessionID
  8096. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8097. {
  8098. pre->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8099. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8100. errn = -1;
  8101. }
  8102. //Check for SequenceError
  8103. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8104. {
  8105. pre->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8106. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8107. errn = -1;
  8108. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8109. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8110. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8111. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8112. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8113. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8114. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8115. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8116. }
  8117. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8118. SAVE_PhysicalValueType_DIN70121(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  8119. //Isolation Status
  8120. if (sys->IsolationStatus == GFD_Invalid) //0: invalid
  8121. {
  8122. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  8123. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8124. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8125. Update_V2G_Flow_Status(Other_Fault);
  8126. errn = -1;
  8127. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8128. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8129. }
  8130. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8131. {
  8132. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8133. }
  8134. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  8135. {
  8136. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  8137. }
  8138. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8139. {
  8140. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8141. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8142. pre->ResponseCode = FAILED_DIN70121;
  8143. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8144. errn = -1;
  8145. }
  8146. else //GFD_No_IMD or other unexpected status
  8147. {
  8148. pre->ResponseCode = FAILED_DIN70121;
  8149. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  8150. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8151. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8152. Update_V2G_Flow_Status(Other_Fault);
  8153. errn = -1;
  8154. sprintf((char*)buf_log_evcomm,
  8155. "[Error][Proc_din_PreChargeRes]IsolationStatus = %d (undefined)",
  8156. sys->IsolationStatus);
  8157. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8158. }
  8159. //Check for CSU command of "Stop by EVSE"
  8160. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8161. {
  8162. //Check for Alarm Code: CCS GFD trip (012235)
  8163. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8164. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8165. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8166. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8167. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8168. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8169. {
  8170. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  8171. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8172. }
  8173. else
  8174. {
  8175. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]EVSE_Shutdown");
  8176. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8177. }
  8178. pre->ResponseCode = FAILED_DIN70121;
  8179. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8180. errn = -1;
  8181. }
  8182. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8183. {
  8184. //Check for Alarm Code: CCS GFD trip (012235)
  8185. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8186. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8187. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8188. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8189. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8190. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8191. {
  8192. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  8193. pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  8194. }
  8195. else
  8196. {
  8197. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]EVSE_EmergencyShutdown");
  8198. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8199. }
  8200. pre->ResponseCode = FAILED_DIN70121;
  8201. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8202. errn = -1;
  8203. }
  8204. else if (ShmInternalComm->ChargingPermission == FALSE)
  8205. {
  8206. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_PreChargeRes]ChargingPermission = FALSE");
  8207. pre->ResponseCode = FAILED_DIN70121;
  8208. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8209. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8210. errn = -1;
  8211. }
  8212. else
  8213. {
  8214. //null
  8215. }
  8216. //Response to CP Error
  8217. #if CP_PROTECTION_MECHANISM == ENABLE
  8218. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8219. {
  8220. pre->ResponseCode = FAILED_DIN70121;
  8221. pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8222. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8223. Update_V2G_Flow_Status(Other_Fault);
  8224. errn = -1;
  8225. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8226. //CCS_SECC_CP_State_Error (023889)
  8227. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8228. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8229. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8230. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8231. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8232. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8233. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8234. sprintf((char*)buf_log_evcomm,
  8235. "[Error][Proc_din_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8236. sys->CpState,
  8237. sys->CpVoltage
  8238. );
  8239. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8240. }
  8241. #endif
  8242. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8243. #if PARAMETER_NORMAL_MODE == ENABLE
  8244. SHM_Read_din_PreChargeRes(&ccs_exi_doc_DIN, ShmCcsData);
  8245. #else
  8246. Sudo_Parameter_din_PreChargeRes();
  8247. #endif
  8248. //STEP 4: ============ Encode and Send Response Message ===========
  8249. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8250. {
  8251. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][send_encoded_din_V2GTP_Stream]:Tx encoded msg error");
  8252. errn = -1;
  8253. }
  8254. //STEP 5: ============ Update Flags ===========
  8255. return errn;
  8256. }
  8257. /*===========================================================================
  8258. FUNCTION: Proc_iso1_PreChargeRes
  8259. DESCRIPTION:
  8260. PRE-CONDITION:
  8261. INPUT:
  8262. OUTPUT:
  8263. GLOBAL VARIABLES:
  8264. =============================================================================*/
  8265. int Proc_iso1_PreChargeRes(int AcceptFd)
  8266. {
  8267. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8268. //if it is not the same, the packet should be ignored.
  8269. //STEP 1: ============ Initialize ============
  8270. //int i = 0;
  8271. int errn = 0;
  8272. bitstream_t v2g_tx_stream;
  8273. static struct PreChargeResponse_ISO15118_2014 *pre;
  8274. static struct ChargingInfoData *sys;
  8275. size_t pos = 0;
  8276. v2g_tx_stream.pos = &pos;
  8277. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8278. v2g_tx_stream.data = V2GTP_Tx_buf;
  8279. pre = &ShmCcsData->V2GMessage_ISO15118_2014.PreChargeResponse;
  8280. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8281. pre->ResponseCode = OK_ISO15118_2014;
  8282. //EVSE Status Code
  8283. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8284. //[HEADER] Check Req SessionID
  8285. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8286. {
  8287. pre->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8288. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8289. errn = -1;
  8290. }
  8291. //Check for SequenceError
  8292. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8293. {
  8294. pre->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  8295. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8296. errn = -1;
  8297. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8298. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8299. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8300. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8301. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8302. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8303. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8304. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8305. }
  8306. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8307. SAVE_PhysicalValueType_ISO15118_2014(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  8308. //Isolation Status
  8309. if (sys->IsolationStatus == GFD_Invalid) //0: invalid(on going)
  8310. {
  8311. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  8312. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8313. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8314. Update_V2G_Flow_Status(Other_Fault);
  8315. errn = -1;
  8316. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
  8317. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8318. }
  8319. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  8320. {
  8321. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8322. }
  8323. else if (sys->IsolationStatus == GFD_Warning) //2: waring
  8324. {
  8325. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //1
  8326. }
  8327. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  8328. {
  8329. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]GFD_Fault => Emergency Shutdown");
  8330. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8331. pre->ResponseCode = FAILED_ISO15118_2014;
  8332. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8333. errn = -1;
  8334. }
  8335. else
  8336. {
  8337. pre->ResponseCode = FAILED_ISO15118_2014;
  8338. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  8339. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8340. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8341. Update_V2G_Flow_Status(Other_Fault);
  8342. errn = -1;
  8343. sprintf((char*)buf_log_evcomm,
  8344. "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d (undefined)",
  8345. sys->IsolationStatus);
  8346. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8347. }
  8348. //Check for CSU command of "Stop by EVSE"
  8349. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8350. {
  8351. //Check for Alarm Code: CCS GFD trip (012235)
  8352. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8353. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8354. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8355. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8356. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8357. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8358. {
  8359. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
  8360. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8361. }
  8362. else
  8363. {
  8364. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]EVSE_Shutdown");
  8365. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8366. }
  8367. pre->ResponseCode = FAILED_ISO15118_2014;
  8368. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8369. errn = -1;
  8370. }
  8371. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8372. {
  8373. //Check for Alarm Code: CCS GFD trip (012235)
  8374. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  8375. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  8376. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  8377. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  8378. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  8379. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  8380. {
  8381. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
  8382. pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  8383. }
  8384. else
  8385. {
  8386. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]EVSE_EmergencyShutdown");
  8387. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8388. }
  8389. pre->ResponseCode = FAILED_ISO15118_2014;
  8390. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8391. errn = -1;
  8392. }
  8393. else if (ShmInternalComm->ChargingPermission == FALSE)
  8394. {
  8395. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_PreChargeRes]ChargingPermission = FALSE");
  8396. pre->ResponseCode = FAILED_ISO15118_2014;
  8397. pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  8398. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8399. errn = -1;
  8400. }
  8401. else
  8402. {
  8403. //null
  8404. }
  8405. //Response to CP Error
  8406. #if CP_PROTECTION_MECHANISM == ENABLE
  8407. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  8408. {
  8409. pre->ResponseCode = FAILED_ISO15118_2014;
  8410. pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8411. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  8412. Update_V2G_Flow_Status(Other_Fault);
  8413. errn = -1;
  8414. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8415. //CCS_SECC_CP_State_Error (023889)
  8416. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8417. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8418. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8419. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  8420. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  8421. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  8422. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  8423. sprintf((char*)buf_log_evcomm,
  8424. "[Error][Proc_iso1_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
  8425. sys->CpState,
  8426. sys->CpVoltage
  8427. );
  8428. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8429. }
  8430. #endif
  8431. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8432. #if PARAMETER_NORMAL_MODE == ENABLE
  8433. SHM_Read_iso1_PreChargeRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8434. #else
  8435. Sudo_Parameter_iso1_PreChargeRes();
  8436. #endif
  8437. //STEP 4: ============ Encode and Send Response Message ===========
  8438. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8439. {
  8440. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][send_encoded_iso1_V2GTP_Stream]:Tx encoded msg error");
  8441. errn = -1;
  8442. }
  8443. //STEP 5: ============ Update Flags ===========
  8444. return errn;
  8445. }
  8446. /*===========================================================================
  8447. FUNCTION: Proc_din_PreChargeReq
  8448. DESCRIPTION:
  8449. PRE-CONDITION:
  8450. INPUT:
  8451. OUTPUT:
  8452. GLOBAL VARIABLES:
  8453. =============================================================================*/
  8454. int Proc_din_PreChargeReq(int AcceptFd)
  8455. {
  8456. int errn = 0;
  8457. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PreChargeReq] Got PreChargeReq");
  8458. //Print the decoded XML Document
  8459. PRINT_XML_DOC_DIN_PreChargeReq(&ccs_exi_doc_DIN);
  8460. //Save into Share Memory
  8461. SHM_Save_din_PreChargeReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8462. //Check for EV Error Code
  8463. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PreChargeRequest.DC_EVStatus.EVErrorCode);
  8464. errn = Proc_din_PreChargeRes(AcceptFd);
  8465. if (errn == 0)
  8466. {
  8467. //send response successfully.
  8468. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PreChargeRes");
  8469. }
  8470. else
  8471. {
  8472. sprintf((char*)buf_log_evcomm,
  8473. "[Error][SeccComm][Proc_din_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  8474. errn);
  8475. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8476. }
  8477. return errn;
  8478. }
  8479. /*===========================================================================
  8480. FUNCTION: Proc_iso1_PreChargeReq
  8481. DESCRIPTION:
  8482. PRE-CONDITION:
  8483. INPUT:
  8484. OUTPUT:
  8485. GLOBAL VARIABLES:
  8486. =============================================================================*/
  8487. int Proc_iso1_PreChargeReq(int AcceptFd)
  8488. {
  8489. int errn = 0;
  8490. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PreChargeReq] Got PreChargeReq");
  8491. //Print the decoded XML Document
  8492. PRINT_XML_DOC_ISO1_PreChargeReq(&ccs_exi_doc_ISO1);
  8493. //Save into Share Memory
  8494. SHM_Save_iso1_PreChargeReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8495. //Check for EV Error Code
  8496. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PreChargeRequest.DC_EVStatus.EVErrorCode);
  8497. errn = Proc_iso1_PreChargeRes(AcceptFd);
  8498. if (errn == 0)
  8499. {
  8500. //send response successfully.
  8501. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PreChargeRes");
  8502. }
  8503. else
  8504. {
  8505. sprintf((char*)buf_log_evcomm,
  8506. "[Error][SeccComm][Proc_iso1_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
  8507. errn);
  8508. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8509. }
  8510. return errn;
  8511. }
  8512. /*===========================================================================
  8513. FUNCTION: SHM_Init_din_PowerDeliveryRes
  8514. DESCRIPTION:
  8515. PRE-CONDITION:
  8516. INPUT:
  8517. 1. shm_ccs
  8518. OUTPUT:
  8519. 1. shm_ccs
  8520. GLOBAL VARIABLES:
  8521. =============================================================================*/
  8522. void SHM_Init_din_PowerDeliveryRes(struct CcsData *shm_ccs)
  8523. {
  8524. struct PowerDeliveryResponse_DIN70121 *in;
  8525. in = &shm_ccs->V2GMessage_DIN70121.PowerDeliveryResponse;
  8526. //----- [BODY (1/3)] ResponseCode -----
  8527. in->ResponseCode = dinresponseCodeType_OK;
  8528. //----- [BODY (2/3)] AC_EVSEStatus -----
  8529. //ignore, since DIN 70121 doesn't support AC, yet.
  8530. //----- [BODY (2/3)] DC_EVSEStatus -----
  8531. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8532. }
  8533. /*===========================================================================
  8534. FUNCTION: Sudo_Parameter_din_PowerDeliveryRes
  8535. DESCRIPTION:
  8536. PRE-CONDITION:
  8537. INPUT:
  8538. OUTPUT:
  8539. GLOBAL VARIABLES:
  8540. =============================================================================*/
  8541. void Sudo_Parameter_din_PowerDeliveryRes()
  8542. {
  8543. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8544. init_dinPowerDeliveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes);
  8545. ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  8546. //----- [BODY (1/3)] ResponseCode -----
  8547. struct dinPowerDeliveryResType *res;
  8548. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  8549. res->ResponseCode = dinresponseCodeType_OK;
  8550. //----- [BODY (2/3)] AC_EVSEStatus -----
  8551. //ignore, since DIN 70121 doesn't support AC, yet.
  8552. //----- [BODY (2/3)] DC_EVSEStatus -----
  8553. res->DC_EVSEStatus_isUsed = 1u;
  8554. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8555. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  8556. // dinisolationLevelType_Invalid = 0,
  8557. // dinisolationLevelType_Valid = 1,
  8558. // dinisolationLevelType_Warning = 2,
  8559. // dinisolationLevelType_Fault = 3
  8560. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8561. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8562. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8563. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8564. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8565. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8566. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8567. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8568. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8569. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8570. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8571. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8572. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8573. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8574. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8575. // dinEVSENotificationType_None = 0,
  8576. // dinEVSENotificationType_StopCharging = 1,
  8577. // dinEVSENotificationType_ReNegotiation = 2
  8578. }
  8579. /*===========================================================================
  8580. FUNCTION: Sudo_Parameter_iso1_PowerDeliveryRes
  8581. DESCRIPTION:
  8582. PRE-CONDITION:
  8583. INPUT:
  8584. OUTPUT:
  8585. GLOBAL VARIABLES:
  8586. =============================================================================*/
  8587. void Sudo_Parameter_iso1_PowerDeliveryRes()
  8588. {
  8589. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8590. init_iso1PowerDeliveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes);
  8591. ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
  8592. //----- [BODY (1/3)] ResponseCode -----
  8593. struct iso1PowerDeliveryResType *res;
  8594. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  8595. res->ResponseCode = iso1responseCodeType_OK;
  8596. //----- [BODY (2/3)] AC_EVSEStatus -----
  8597. //ignore, since our ISO1 70121 doesn't support AC, yet.
  8598. //----- [BODY (2/3)] DC_EVSEStatus -----
  8599. res->DC_EVSEStatus_isUsed = 1u;
  8600. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8601. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  8602. //iso1isolationLevelType_Invalid = 0,
  8603. //iso1isolationLevelType_Valid = 1,
  8604. //iso1isolationLevelType_Warning = 2,
  8605. //iso1isolationLevelType_Fault = 3,
  8606. //iso1isolationLevelType_No_IMD = 4
  8607. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8608. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8609. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8610. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8611. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8612. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8613. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8614. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8615. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8616. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8617. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8618. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8619. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  8620. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8621. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  8622. //iso1EVSENotificationType_None = 0,
  8623. //iso1EVSENotificationType_StopCharging = 1,
  8624. //iso1EVSENotificationType_ReNegotiation = 2
  8625. }
  8626. /*===========================================================================
  8627. FUNCTION: Proc_din_PowerDeliveryStartRes
  8628. DESCRIPTION:
  8629. PRE-CONDITION:
  8630. INPUT:
  8631. OUTPUT:
  8632. GLOBAL VARIABLES:
  8633. =============================================================================*/
  8634. int Proc_din_PowerDeliveryStartRes(int AcceptFd)
  8635. {
  8636. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8637. //if it is not the same, the packet should be ignored.
  8638. //STEP 1: ============ Initialize ============
  8639. //int i = 0;
  8640. int errn = 0;
  8641. bitstream_t v2g_tx_stream;
  8642. struct dinPowerDeliveryResType *res;
  8643. struct ChargingInfoData *sys;
  8644. size_t pos = 0;
  8645. v2g_tx_stream.pos = &pos;
  8646. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8647. v2g_tx_stream.data = V2GTP_Tx_buf;
  8648. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  8649. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8650. res->ResponseCode = OK_DIN70121;
  8651. //[HEADER] Check Req SessionID
  8652. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  8653. {
  8654. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  8655. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8656. errn = -1;
  8657. }
  8658. //Check for SequenceError
  8659. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  8660. {
  8661. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  8662. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  8663. errn = -1;
  8664. //Update_ShmStatusCode(); //[To-Do] to be implemented
  8665. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  8666. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  8667. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  8668. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  8669. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  8670. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  8671. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  8672. }
  8673. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8674. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8675. #if PARAMETER_NORMAL_MODE == ENABLE
  8676. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  8677. #else
  8678. Sudo_Parameter_din_PowerDeliveryRes();
  8679. #endif
  8680. //EVSE Status Code
  8681. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  8682. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8683. //Check for CSU command of "Stop by EVSE"
  8684. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8685. {
  8686. //res->ResponseCode = FAILED_DIN70121;
  8687. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8688. }
  8689. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8690. {
  8691. //res->ResponseCode = FAILED_DIN70121;
  8692. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8693. }
  8694. else if (ShmInternalComm->ChargingPermission == FALSE)
  8695. {
  8696. //res->ResponseCode = FAILED_DIN70121;
  8697. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  8698. }
  8699. //STEP 4: ============ Encode and Send Response Message ===========
  8700. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  8701. {
  8702. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PowerDeliveryStartRes][Error]Tx encoded msg error");
  8703. errn = -1;
  8704. }
  8705. //STEP 5: ============ Update Flags ===========
  8706. return errn;
  8707. }
  8708. /*===========================================================================
  8709. FUNCTION: Proc_iso1_PowerDeliveryStartRes
  8710. DESCRIPTION:
  8711. PRE-CONDITION:
  8712. INPUT:
  8713. OUTPUT:
  8714. GLOBAL VARIABLES:
  8715. =============================================================================*/
  8716. int Proc_iso1_PowerDeliveryStartRes(int AcceptFd)
  8717. {
  8718. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  8719. //if it is not the same, the packet should be ignored.
  8720. //STEP 1: ============ Initialize ============
  8721. //int i = 0;
  8722. int errn = 0;
  8723. bitstream_t v2g_tx_stream;
  8724. struct iso1PowerDeliveryResType *res;
  8725. struct ChargingInfoData *sys;
  8726. size_t pos = 0;
  8727. v2g_tx_stream.pos = &pos;
  8728. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  8729. v2g_tx_stream.data = V2GTP_Tx_buf;
  8730. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  8731. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  8732. res->ResponseCode = OK_ISO15118_2014;
  8733. //[HEADER] Check Req SessionID
  8734. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  8735. {
  8736. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  8737. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  8738. errn = -1;
  8739. }
  8740. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  8741. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  8742. #if PARAMETER_NORMAL_MODE == ENABLE
  8743. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  8744. #else
  8745. Sudo_Parameter_iso1_PowerDeliveryRes();
  8746. #endif
  8747. //EVSE Status Code
  8748. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  8749. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8750. //Check for CSU command of "Stop by EVSE"
  8751. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  8752. {
  8753. //res->ResponseCode = FAILED_ISO15118_2014;
  8754. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8755. }
  8756. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  8757. {
  8758. //res->ResponseCode = FAILED_ISO15118_2014;
  8759. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  8760. }
  8761. else if (ShmInternalComm->ChargingPermission == FALSE)
  8762. {
  8763. //res->ResponseCode = FAILED_ISO15118_2014;
  8764. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  8765. }
  8766. //STEP 4: ============ Encode and Send Response Message ===========
  8767. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  8768. {
  8769. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PowerDeliveryStartRes][Error]Tx encoded msg error");
  8770. errn = -1;
  8771. }
  8772. //STEP 5: ============ Update Flags ===========
  8773. return errn;
  8774. }
  8775. /*===========================================================================
  8776. FUNCTION: Proc_din_PowerDeliveryStartReq
  8777. DESCRIPTION:
  8778. PRE-CONDITION:
  8779. INPUT:
  8780. OUTPUT:
  8781. GLOBAL VARIABLES:
  8782. =============================================================================*/
  8783. int Proc_din_PowerDeliveryStartReq(int AcceptFd)
  8784. {
  8785. int errn = 0;
  8786. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryStartReq");
  8787. //Print the decoded XML Document
  8788. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  8789. //Save into Share Memory
  8790. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  8791. //Check for EV Error Code
  8792. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  8793. errn = Proc_din_PowerDeliveryStartRes(AcceptFd);
  8794. if (errn == 0)
  8795. {
  8796. //send response successfully.
  8797. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PowerDeliveryStartRes");
  8798. }
  8799. else
  8800. {
  8801. sprintf((char*)buf_log_evcomm,
  8802. "[Error][Proc_din_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  8803. errn);
  8804. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8805. }
  8806. return errn;
  8807. }
  8808. /*===========================================================================
  8809. FUNCTION: Proc_iso1_PowerDeliveryStartReq
  8810. DESCRIPTION:
  8811. PRE-CONDITION:
  8812. INPUT:
  8813. OUTPUT:
  8814. GLOBAL VARIABLES:
  8815. =============================================================================*/
  8816. int Proc_iso1_PowerDeliveryStartReq(int AcceptFd)
  8817. {
  8818. int errn = 0;
  8819. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryStartReq");
  8820. //Print the decoded XML Document
  8821. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  8822. //Save into Share Memory
  8823. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  8824. //Check for EV Error Code
  8825. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  8826. errn = Proc_iso1_PowerDeliveryStartRes(AcceptFd);
  8827. if (errn == 0)
  8828. {
  8829. //send response successfully.
  8830. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PowerDeliveryStartRes");
  8831. }
  8832. else
  8833. {
  8834. sprintf((char*)buf_log_evcomm,
  8835. "[Error][Proc_iso1_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
  8836. errn);
  8837. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  8838. }
  8839. return errn;
  8840. }
  8841. /*===========================================================================
  8842. FUNCTION: SHM_Init_din_CurrentDemandRes
  8843. DESCRIPTION:
  8844. PRE-CONDITION:
  8845. INPUT:
  8846. 1. shm_ccs
  8847. OUTPUT:
  8848. 1. shm_ccs
  8849. GLOBAL VARIABLES:
  8850. =============================================================================*/
  8851. void SHM_Init_din_CurrentDemandRes(struct CcsData *shm_ccs)
  8852. {
  8853. struct CurrentDemandResponse_DIN70121 *in;
  8854. in = &shm_ccs->V2GMessage_DIN70121.CurrentDemandResponse;
  8855. //----- [BODY (1/10)] ResponseCode -----
  8856. in->ResponseCode = dinresponseCodeType_OK;
  8857. //----- [BODY (2/10)] DC_EVSEStatus -----
  8858. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  8859. //----- [BODY (3/10)] EVSEPresentVoltage -----
  8860. short value = 0; int multiplier = 0; unsigned char unit = 0;
  8861. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  8862. value = 0; multiplier = 0; unit = V_DIN70121;
  8863. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  8864. //----- [BODY (4/10)] EVSEPresentCurrent -----
  8865. //value = 600; multiplier = -1; unit = A_DIN70121; //60A, for test only.
  8866. value = 0; multiplier = 0; unit = A_DIN70121;
  8867. SHM_Save_dinPhysicalValueType(&in->EVSEPresentCurrent, value, multiplier, unit);
  8868. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  8869. in->EVSECurrentLimitAchieved = FALSE;
  8870. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  8871. in->EVSEVoltageLimitAchieved = FALSE;
  8872. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  8873. in->EVSEPowerLimitAchieved = FALSE;
  8874. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  8875. //value = 7500; multiplier = -1; unit = V_DIN70121; //750V
  8876. value = 5000; multiplier = -1; unit = V_DIN70121; //500V
  8877. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumVoltageLimit, value, multiplier, unit);
  8878. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  8879. value = 600; multiplier = -1; unit = A_DIN70121; //60A
  8880. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumCurrentLimit, value, multiplier, unit);
  8881. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  8882. value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
  8883. SHM_Save_dinPhysicalValueType(&in->EVSEMaximumPowerLimit, value, multiplier, unit);
  8884. }
  8885. /*===========================================================================
  8886. FUNCTION: Sudo_Parameter_din_CurrentDemandRes
  8887. DESCRIPTION:
  8888. PRE-CONDITION:
  8889. INPUT:
  8890. OUTPUT:
  8891. GLOBAL VARIABLES:
  8892. =============================================================================*/
  8893. void Sudo_Parameter_din_CurrentDemandRes()
  8894. {
  8895. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  8896. init_dinCurrentDemandResType(&ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes);
  8897. ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  8898. //----- [BODY (1/10)] ResponseCode -----
  8899. struct dinCurrentDemandResType *res;
  8900. res = &ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes;
  8901. res->ResponseCode = dinresponseCodeType_OK;
  8902. //----- [BODY (2/10)] DC_EVSEStatus -----
  8903. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8904. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
  8905. // dinisolationLevelType_Invalid = 0,
  8906. // dinisolationLevelType_Valid = 1,
  8907. // dinisolationLevelType_Warning = 2,
  8908. // dinisolationLevelType_Fault = 3
  8909. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  8910. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8911. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  8912. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8913. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8914. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8915. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8916. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8917. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  8918. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  8919. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  8920. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  8921. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  8922. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  8923. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  8924. // dinEVSENotificationType_None = 0,
  8925. // dinEVSENotificationType_StopCharging = 1,
  8926. // dinEVSENotificationType_ReNegotiation = 2
  8927. //----- [BODY (3/10)] EVSEPresentVoltage -----
  8928. res->EVSEPresentVoltage.Value = 3820;
  8929. res->EVSEPresentVoltage.Multiplier = -1;
  8930. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  8931. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  8932. //----- [BODY (4/10)] EVSEPresentCurrent -----
  8933. res->EVSEPresentCurrent.Value = 1200;
  8934. res->EVSEPresentCurrent.Multiplier = -1;
  8935. res->EVSEPresentCurrent.Unit_isUsed = 1u;
  8936. res->EVSEPresentCurrent.Unit = dinunitSymbolType_A;
  8937. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  8938. res->EVSECurrentLimitAchieved = 0;
  8939. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  8940. res->EVSEVoltageLimitAchieved = 0;
  8941. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  8942. res->EVSEPowerLimitAchieved = 0;
  8943. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  8944. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  8945. res->EVSEMaximumVoltageLimit.Value = 7500;
  8946. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  8947. res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  8948. res->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
  8949. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  8950. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  8951. res->EVSEMaximumCurrentLimit.Value = 1200;
  8952. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  8953. res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  8954. res->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
  8955. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  8956. res->EVSEMaximumPowerLimit_isUsed = 1u;
  8957. res->EVSEMaximumPowerLimit.Value = 6000;
  8958. res->EVSEMaximumPowerLimit.Multiplier = 1;
  8959. res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  8960. res->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
  8961. }
  8962. /*===========================================================================
  8963. FUNCTION: Sudo_Parameter_iso1_CurrentDemandRes
  8964. DESCRIPTION:
  8965. PRE-CONDITION:
  8966. INPUT:
  8967. OUTPUT:
  8968. GLOBAL VARIABLES:
  8969. =============================================================================*/
  8970. void Sudo_Parameter_iso1_CurrentDemandRes()
  8971. {
  8972. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  8973. init_iso1CurrentDemandResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes);
  8974. ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
  8975. //----- [BODY (1/10)] ResponseCode -----
  8976. struct iso1CurrentDemandResType *res;
  8977. res = &ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes;
  8978. res->ResponseCode = iso1responseCodeType_OK;
  8979. //----- [BODY (2/10)] DC_EVSEStatus -----
  8980. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  8981. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
  8982. //iso1isolationLevelType_Invalid = 0,
  8983. //iso1isolationLevelType_Valid = 1,
  8984. //iso1isolationLevelType_Warning = 2,
  8985. //iso1isolationLevelType_Fault = 3,
  8986. //iso1isolationLevelType_No_IMD = 4
  8987. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  8988. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  8989. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  8990. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  8991. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  8992. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  8993. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  8994. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  8995. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  8996. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  8997. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  8998. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  8999. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  9000. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  9001. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9002. //iso1EVSENotificationType_None = 0,
  9003. //iso1EVSENotificationType_StopCharging = 1,
  9004. //iso1EVSENotificationType_ReNegotiation = 2
  9005. //----- [BODY (3/10)] EVSEPresentVoltage -----
  9006. res->EVSEPresentVoltage.Value = 3820;
  9007. res->EVSEPresentVoltage.Multiplier = -1;
  9008. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  9009. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  9010. //----- [BODY (4/10)] EVSEPresentCurrent -----
  9011. res->EVSEPresentCurrent.Value = 1200;
  9012. res->EVSEPresentCurrent.Multiplier = -1;
  9013. //res->EVSEPresentCurrent.Unit_isUsed = 1u;
  9014. res->EVSEPresentCurrent.Unit = iso1unitSymbolType_A;
  9015. //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
  9016. res->EVSECurrentLimitAchieved = 0;
  9017. //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
  9018. res->EVSEVoltageLimitAchieved = 0;
  9019. //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
  9020. res->EVSEPowerLimitAchieved = 0;
  9021. //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
  9022. res->EVSEMaximumVoltageLimit_isUsed = 1u;
  9023. res->EVSEMaximumVoltageLimit.Value = 7500;
  9024. res->EVSEMaximumVoltageLimit.Multiplier = -1;
  9025. //res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
  9026. res->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
  9027. //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
  9028. res->EVSEMaximumCurrentLimit_isUsed = 1u;
  9029. res->EVSEMaximumCurrentLimit.Value = 1200;
  9030. res->EVSEMaximumCurrentLimit.Multiplier = -1;
  9031. //res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
  9032. res->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
  9033. //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
  9034. res->EVSEMaximumPowerLimit_isUsed = 1u;
  9035. res->EVSEMaximumPowerLimit.Value = 6000;
  9036. res->EVSEMaximumPowerLimit.Multiplier = 1;
  9037. //res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
  9038. res->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
  9039. }
  9040. /*===========================================================================
  9041. FUNCTION: Sudo_Parameter_iso1_ChargingStatusRes
  9042. DESCRIPTION:
  9043. PRE-CONDITION:
  9044. INPUT:
  9045. OUTPUT:
  9046. GLOBAL VARIABLES:
  9047. =============================================================================*/
  9048. void Sudo_Parameter_iso1_ChargingStatusRes()
  9049. {
  9050. //int i = 0;
  9051. struct iso1ChargingStatusResType *res;
  9052. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  9053. init_iso1ChargingStatusResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes);
  9054. res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes;
  9055. ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes_isUsed = 1u;
  9056. //----- [BODY (1/10)] ResponseCode -----
  9057. res->ResponseCode = OK_ISO15118_2014;
  9058. //----- [BODY (2/10)] AC_EVSEStatus -----
  9059. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9060. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  9061. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9062. // iso1EVSENotificationType_None = 0,
  9063. // iso1EVSENotificationType_StopCharging = 1,
  9064. // iso1EVSENotificationType_ReNegotiation = 2
  9065. //----- [BODY (3/10)] EVSEMaxCurrent -----
  9066. res->EVSEMaxCurrent_isUsed = 1u;
  9067. res->EVSEMaxCurrent.Value = 32;
  9068. res->EVSEMaxCurrent.Multiplier = 0;
  9069. res->EVSEMaxCurrent.Unit = iso1unitSymbolType_A;
  9070. //----- [BODY (4/10)] SAScheduleTupleID -----
  9071. res->SAScheduleTupleID = 0;
  9072. //----- [BODY (5/10)] EVSEID -----
  9073. res->EVSEID.charactersLen = 37;
  9074. memset(res->EVSEID.characters, 0, sizeof(res->EVSEID.characters));
  9075. //sprintf((char*)res->EVSEID.characters, CCS_AC_EVSEID);
  9076. //----- [BODY (6/10)] MeterInfo -----
  9077. res->MeterInfo_isUsed = 1u;
  9078. memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  9079. memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  9080. //[MeterInfo][1/5] MeterID
  9081. //sprintf((char*)res->MeterInfo.MeterID , CCS_AC_METER_ID);
  9082. //[MeterInfo][2/5] SigMeterReading (optional)
  9083. //sprintf((char*)res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  9084. //[MeterInfo][3/5] MeterStatus (optional)
  9085. res->MeterInfo.MeterStatus = 0;
  9086. //[MeterInfo][4/5] MeterReading (optional)
  9087. res->MeterInfo.MeterReading = 12345;
  9088. //[MeterInfo][5/5] TMeter (optional)
  9089. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  9090. //----- [BODY (7/10)] ReceiptRequired -----
  9091. res->ReceiptRequired_isUsed = 1u;
  9092. res->ReceiptRequired = FALSE; //optional
  9093. }
  9094. /*===========================================================================
  9095. FUNCTION: Check_EVErrorCode
  9096. DESCRIPTION:
  9097. PRE-CONDITION:
  9098. INPUT:
  9099. OUTPUT:
  9100. GLOBAL VARIABLES:
  9101. =============================================================================*/
  9102. void Check_EVErrorCode(int code)
  9103. {
  9104. if (code != NO_ERROR) //NO_ERROR = 0
  9105. {
  9106. //Asking CSU to Stop
  9107. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9108. //Update_V2G_Flow_Status(Other_Fault);
  9109. //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  9110. sprintf((char*)buf_log_evcomm,
  9111. "Stop by EV (EVErrorCode = %d (DEC))",
  9112. code);
  9113. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9114. }
  9115. }
  9116. /*===========================================================================
  9117. FUNCTION: Proc_din_CurrentDemandRes
  9118. DESCRIPTION:
  9119. PRE-CONDITION:
  9120. INPUT:
  9121. OUTPUT:
  9122. GLOBAL VARIABLES:
  9123. =============================================================================*/
  9124. int Proc_din_CurrentDemandRes(int AcceptFd)
  9125. {
  9126. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9127. //if it is not the same, the packet should be ignored.
  9128. //STEP 1: ============ Initialize ============
  9129. int errn = 0;
  9130. bitstream_t v2g_tx_stream;
  9131. static struct CurrentDemandResponse_DIN70121 *cur;
  9132. static struct ChargingInfoData *sys;
  9133. // int i = 0;
  9134. // static int EVSE_max_current;
  9135. // int tmp = 0;
  9136. size_t pos = 0;
  9137. v2g_tx_stream.pos = &pos;
  9138. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9139. v2g_tx_stream.data = V2GTP_Tx_buf;
  9140. cur = &ShmCcsData->V2GMessage_DIN70121.CurrentDemandResponse;
  9141. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9142. cur->ResponseCode = OK_DIN70121;
  9143. //EVSE Status Code
  9144. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9145. //[HEADER] Check Req SessionID
  9146. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9147. {
  9148. cur->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  9149. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9150. errn = -1;
  9151. }
  9152. //Check for SequenceError
  9153. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9154. {
  9155. cur->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  9156. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9157. errn = -1;
  9158. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9159. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9160. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9161. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9162. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9163. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9164. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9165. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9166. }
  9167. //Check for negative EvBatteryMaxCurrent
  9168. if (sys->EvBatteryMaxCurrent < 0)
  9169. {
  9170. sprintf((char*)buf_log_evcomm,
  9171. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  9172. sys->EvBatteryMaxCurrent);
  9173. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9174. cur->DC_EVSEStatus.EVSEStatusCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
  9175. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9176. errn = -1;
  9177. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9178. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  9179. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9180. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9181. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9182. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9183. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9184. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  9185. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9186. }
  9187. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9188. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_DIN70121);
  9189. SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  9190. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  9191. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
  9192. #endif
  9193. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
  9194. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
  9195. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  9196. if (sys->EvBatteryMaxVoltage <= 500)
  9197. {
  9198. SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
  9199. }
  9200. #endif
  9201. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  9202. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  9203. {
  9204. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  9205. //[To-Do] Limit is achieved flag
  9206. }
  9207. //Isolation Status
  9208. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  9209. {
  9210. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  9211. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9212. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9213. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  9214. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9215. Update_V2G_Flow_Status(Other_Fault);
  9216. errn = -1;
  9217. }
  9218. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  9219. {
  9220. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  9221. }
  9222. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  9223. {
  9224. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  9225. }
  9226. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  9227. {
  9228. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  9229. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9230. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9231. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_CurrentDemandRes]GFD_Fault => Emergency Shutdown");
  9232. Update_V2G_Flow_Status(Other_Fault);
  9233. errn = -1;
  9234. }
  9235. else //GFD_No_IMD or other unexpected status
  9236. {
  9237. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  9238. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9239. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9240. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9241. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9242. Update_V2G_Flow_Status(Other_Fault);
  9243. errn = -1;
  9244. }
  9245. //For testing with Tesla Model 3
  9246. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  9247. //[CAUTION][To-Do] Decresement of Current is not implemented.
  9248. //SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, 10, A_DIN70121);
  9249. if (sys->EvBatterytargetCurrent <= 0)
  9250. {
  9251. EVSE_max_current = 50; //10A
  9252. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  9253. /*
  9254. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9255. sys->PresentChargingCurrent,
  9256. sys->EvBatterytargetCurrent,
  9257. EVSE_max_current,
  9258. cur->EVSEMaximumCurrentLimit.Value
  9259. );
  9260. */
  9261. }
  9262. else //1A
  9263. {
  9264. /*
  9265. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9266. sys->PresentChargingCurrent,
  9267. sys->EvBatterytargetCurrent,
  9268. EVSE_max_current,
  9269. cur->EVSEMaximumCurrentLimit.Value
  9270. );
  9271. */
  9272. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  9273. {
  9274. tmp = EVSE_max_current + 50; //10A
  9275. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  9276. {
  9277. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  9278. EVSE_max_current = tmp;
  9279. }
  9280. else
  9281. {
  9282. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  9283. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  9284. }
  9285. }
  9286. }
  9287. #endif
  9288. //Check for CSU command of "Stop by EVSE"
  9289. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9290. {
  9291. //Check for Alarm Code: CCS GFD trip (012235)
  9292. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9293. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9294. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9295. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9296. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9297. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9298. {
  9299. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  9300. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  9301. }
  9302. else
  9303. {
  9304. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]EVSE_Shutdown");
  9305. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9306. }
  9307. //cur->ResponseCode = FAILED_DIN70121;
  9308. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9309. //errn = -1;
  9310. }
  9311. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9312. {
  9313. //Check for Alarm Code: CCS GFD trip (012235)
  9314. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9315. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9316. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9317. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9318. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9319. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9320. {
  9321. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9322. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
  9323. }
  9324. else
  9325. {
  9326. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  9327. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9328. }
  9329. //cur->ResponseCode = FAILED_DIN70121;
  9330. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9331. //errn = -1;
  9332. }
  9333. else if (ShmInternalComm->ChargingPermission == FALSE)
  9334. {
  9335. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][Error][CurrentDemandRes]Permission OFF");
  9336. //cur->ResponseCode = FAILED_DIN70121;
  9337. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9338. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9339. //errn = -1;
  9340. }
  9341. else
  9342. {
  9343. //null
  9344. }
  9345. //Response to CP Error
  9346. #if CP_PROTECTION_MECHANISM == ENABLE
  9347. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9348. {
  9349. cur->ResponseCode = FAILED_DIN70121;
  9350. cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9351. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9352. Update_V2G_Flow_Status(Other_Fault);
  9353. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9354. //CCS_SECC_CP_State_Error (023889)
  9355. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9356. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9357. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9358. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9359. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9360. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9361. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9362. sprintf((char*)buf_log_evcomm,
  9363. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  9364. sys->CpState,
  9365. sys->CpVoltage);
  9366. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9367. }
  9368. #endif
  9369. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9370. #if PARAMETER_NORMAL_MODE == ENABLE
  9371. SHM_Read_din_CurrentDemandRes(&ccs_exi_doc_DIN, ShmCcsData);
  9372. #else
  9373. Sudo_Parameter_din_CurrentDemandRes();
  9374. #endif
  9375. //STEP 4: ============ Encode and Send Response Message ===========
  9376. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9377. {
  9378. errn = -1;
  9379. }
  9380. //STEP 5: ============ Update Flags ===========
  9381. return errn;
  9382. }
  9383. /*===========================================================================
  9384. FUNCTION: Proc_iso1_CurrentDemandRes
  9385. DESCRIPTION:
  9386. PRE-CONDITION:
  9387. INPUT:
  9388. OUTPUT:
  9389. GLOBAL VARIABLES:
  9390. =============================================================================*/
  9391. int Proc_iso1_CurrentDemandRes(int AcceptFd)
  9392. {
  9393. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9394. //if it is not the same, the packet should be ignored.
  9395. //STEP 1: ============ Initialize ============
  9396. int errn = 0;
  9397. bitstream_t v2g_tx_stream;
  9398. static struct CurrentDemandResponse_ISO15118_2014 *cur;
  9399. static struct ChargingInfoData *sys;
  9400. // int i = 0;
  9401. // static int EVSE_max_current;
  9402. // int tmp = 0;
  9403. size_t pos = 0;
  9404. v2g_tx_stream.pos = &pos;
  9405. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9406. v2g_tx_stream.data = V2GTP_Tx_buf;
  9407. cur = &ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandResponse;
  9408. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9409. cur->ResponseCode = OK_ISO15118_2014;
  9410. //EVSE Status Code
  9411. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  9412. //[HEADER] Check Req SessionID
  9413. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9414. {
  9415. cur->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9416. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9417. errn = -1;
  9418. }
  9419. //Check for SequenceError
  9420. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9421. {
  9422. cur->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  9423. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9424. errn = -1;
  9425. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9426. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9427. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9428. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9429. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9430. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9431. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9432. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9433. }
  9434. //Check for negative EvBatteryMaxCurrent
  9435. if (sys->EvBatteryMaxCurrent < 0)
  9436. {
  9437. sprintf((char*)buf_log_evcomm,
  9438. "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
  9439. sys->EvBatteryMaxCurrent);
  9440. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9441. cur->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
  9442. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9443. errn = -1;
  9444. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9445. //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
  9446. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9447. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9448. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9449. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9450. ShmStatusCodeData->PresentStatusCode[0][4] = 7;
  9451. ShmStatusCodeData->PresentStatusCode[0][5] = 5;
  9452. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9453. }
  9454. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9455. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_ISO15118_2014);
  9456. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  9457. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
  9458. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  9459. #endif
  9460. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
  9461. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
  9462. #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
  9463. if (sys->EvBatteryMaxVoltage <= 500)
  9464. {
  9465. SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
  9466. }
  9467. #endif
  9468. //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
  9469. if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
  9470. {
  9471. sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
  9472. //[To-Do] Limit is achieved flag
  9473. }
  9474. //Isolation Status
  9475. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  9476. {
  9477. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  9478. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9479. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9480. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
  9481. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9482. Update_V2G_Flow_Status(Other_Fault);
  9483. errn = -1;
  9484. }
  9485. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  9486. {
  9487. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  9488. }
  9489. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  9490. {
  9491. cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  9492. }
  9493. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  9494. {
  9495. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  9496. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9497. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9498. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_CurrentDemandRes]GFD_Fault => EmergencyShutdown");
  9499. Update_V2G_Flow_Status(Other_Fault);
  9500. errn = -1;
  9501. }
  9502. else
  9503. {
  9504. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  9505. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9506. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9507. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9508. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9509. Update_V2G_Flow_Status(Other_Fault);
  9510. errn = -1;
  9511. }
  9512. //For testing with Tesla Model 3
  9513. #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
  9514. //[CAUTION][To-Do] Decresement of Current is not implemented.
  9515. //SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, 10, A_ISO15118_2014);
  9516. if (sys->EvBatterytargetCurrent <= 0)
  9517. {
  9518. EVSE_max_current = 50; //10A
  9519. cur->EVSEMaximumCurrentLimit.Value = 50; //10A
  9520. /*
  9521. DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9522. sys->PresentChargingCurrent,
  9523. sys->EvBatterytargetCurrent,
  9524. EVSE_max_current,
  9525. cur->EVSEMaximumCurrentLimit.Value
  9526. );
  9527. */
  9528. }
  9529. else //1A
  9530. {
  9531. /*
  9532. DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
  9533. sys->PresentChargingCurrent,
  9534. sys->EvBatterytargetCurrent,
  9535. EVSE_max_current,
  9536. cur->EVSEMaximumCurrentLimit.Value
  9537. );
  9538. */
  9539. if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
  9540. {
  9541. tmp = EVSE_max_current + 50; //10A
  9542. if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
  9543. {
  9544. cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
  9545. EVSE_max_current = tmp;
  9546. }
  9547. else
  9548. {
  9549. cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
  9550. EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
  9551. }
  9552. }
  9553. }
  9554. #endif
  9555. //Check for CSU command of "Stop by EVSE"
  9556. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9557. {
  9558. //Check for Alarm Code: CCS GFD trip (012235)
  9559. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9560. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9561. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9562. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9563. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9564. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9565. {
  9566. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
  9567. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9568. }
  9569. else
  9570. {
  9571. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]EVSE_Shutdown");
  9572. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9573. }
  9574. //cur->ResponseCode = FAILED_ISO15118_2014;
  9575. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9576. //errn = -1;
  9577. }
  9578. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9579. {
  9580. //Check for Alarm Code: CCS GFD trip (012235)
  9581. if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
  9582. ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
  9583. ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
  9584. ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
  9585. ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
  9586. ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
  9587. {
  9588. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
  9589. cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
  9590. }
  9591. else
  9592. {
  9593. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
  9594. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9595. }
  9596. //cur->ResponseCode = FAILED_ISO15118_2014;
  9597. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9598. //errn = -1;
  9599. }
  9600. else if (ShmInternalComm->ChargingPermission == FALSE)
  9601. {
  9602. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][Error][CurrentDemandRes]Permission OFF");
  9603. //cur->ResponseCode = FAILED_ISO15118_2014;
  9604. cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
  9605. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  9606. //errn = -1;
  9607. }
  9608. else
  9609. {
  9610. //null
  9611. }
  9612. //Response to CP Error
  9613. #if CP_PROTECTION_MECHANISM == ENABLE
  9614. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9615. {
  9616. cur->ResponseCode = FAILED_ISO15118_2014;
  9617. cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9618. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9619. Update_V2G_Flow_Status(Other_Fault);
  9620. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9621. //CCS_SECC_CP_State_Error (023889)
  9622. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9623. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9624. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9625. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9626. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9627. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9628. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9629. sprintf((char*)buf_log_evcomm,
  9630. "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
  9631. sys->CpState,
  9632. sys->CpVoltage);
  9633. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9634. }
  9635. #endif
  9636. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9637. #if PARAMETER_NORMAL_MODE == ENABLE
  9638. SHM_Read_iso1_CurrentDemandRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9639. #else
  9640. Sudo_Parameter_iso1_CurrentDemandRes();
  9641. #endif
  9642. //STEP 4: ============ Encode and Send Response Message ===========
  9643. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9644. {
  9645. errn = -1;
  9646. }
  9647. //STEP 5: ============ Update Flags ===========
  9648. return errn;
  9649. }
  9650. /*===========================================================================
  9651. FUNCTION: Proc_iso1_ChargingStatusRes
  9652. DESCRIPTION:
  9653. PRE-CONDITION:
  9654. INPUT:
  9655. OUTPUT:
  9656. GLOBAL VARIABLES:
  9657. =============================================================================*/
  9658. int Proc_iso1_ChargingStatusRes(int AcceptFd)
  9659. {
  9660. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9661. //if it is not the same, the packet should be ignored.
  9662. //STEP 1: ============ Initialize ============
  9663. //int i = 0;
  9664. int errn = 0;
  9665. bitstream_t v2g_tx_stream;
  9666. static struct ChargingStatusResponse_ISO15118_2014 *res;
  9667. static struct ChargingInfoData *sys;
  9668. size_t pos = 0;
  9669. v2g_tx_stream.pos = &pos;
  9670. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9671. v2g_tx_stream.data = V2GTP_Tx_buf;
  9672. res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargingStatusResponse;
  9673. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9674. //Init
  9675. res->ResponseCode = OK_ISO15118_2014;
  9676. res->ReceiptRequired = FALSE; //optional
  9677. res->SAScheduleTupleID = 0;
  9678. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9679. res->AC_EVSEStatus.NotificationMaxDelay = 0;
  9680. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9681. // iso1EVSENotificationType_None = 0,
  9682. // iso1EVSENotificationType_StopCharging = 1,
  9683. // iso1EVSENotificationType_ReNegotiation = 2
  9684. //[HEADER] Check Req SessionID
  9685. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  9686. {
  9687. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  9688. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9689. errn = -1;
  9690. }
  9691. //Check for SequenceError
  9692. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9693. {
  9694. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  9695. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9696. errn = -1;
  9697. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9698. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9699. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9700. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9701. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9702. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9703. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9704. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9705. }
  9706. //EVSE ID
  9707. memset(res->EVSEID, 0, sizeof(res->EVSEID));
  9708. //sprintf((char*)res->EVSEID, CCS_AC_EVSEID);
  9709. //[MeterInfo][0/5] init
  9710. //memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
  9711. //memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
  9712. //[MeterInfo][1/5] MeterID
  9713. //sprintf((char*)res->MeterInfo.MeterID , CCS_AC_METER_ID);
  9714. //[MeterInfo][2/5] SigMeterReading (optional)
  9715. //sprintf((char*)res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
  9716. //[MeterInfo][3/5] MeterStatus (optional)
  9717. res->MeterInfo.MeterStatus = 0;
  9718. //[MeterInfo][4/5] MeterReading (optional)
  9719. res->MeterInfo.MeterReading = 12345;
  9720. //[MeterInfo][5/5] TMeter (optional)
  9721. res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
  9722. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9723. SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
  9724. //Isolation Status (RCD)
  9725. if (sys->IsolationStatus == 0) //Isolation is invalid
  9726. {
  9727. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  9728. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9729. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9730. sprintf((char*)buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d", sys->IsolationStatus);
  9731. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9732. Update_V2G_Flow_Status(Other_Fault);
  9733. errn = -1;
  9734. }
  9735. else if (sys->IsolationStatus == 1) //Isolation is valid
  9736. {
  9737. res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
  9738. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  9739. }
  9740. else
  9741. {
  9742. res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
  9743. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9744. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9745. sprintf((char*)buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  9746. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9747. Update_V2G_Flow_Status(Other_Fault);
  9748. errn = -1;
  9749. }
  9750. //Check for CSU command of "Stop by EVSE"
  9751. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9752. {
  9753. //res->ResponseCode = FAILED_ISO15118_2014;
  9754. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9755. //errn = -1;
  9756. }
  9757. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9758. {
  9759. //res->ResponseCode = FAILED_ISO15118_2014;
  9760. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9761. //errn = -1;
  9762. }
  9763. else if (ShmInternalComm->ChargingPermission == FALSE)
  9764. {
  9765. //res->ResponseCode = FAILED_ISO15118_2014;
  9766. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9767. //errn = -1;
  9768. }
  9769. //Response to CP Error
  9770. #if CP_PROTECTION_MECHANISM == ENABLE
  9771. if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
  9772. {
  9773. res->ResponseCode = FAILED_ISO15118_2014;
  9774. res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
  9775. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  9776. Update_V2G_Flow_Status(Other_Fault);
  9777. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9778. //CCS_SECC_CP_State_Error (023889)
  9779. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9780. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9781. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9782. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  9783. ShmStatusCodeData->PresentStatusCode[0][4] = 8;
  9784. ShmStatusCodeData->PresentStatusCode[0][5] = 9;
  9785. CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  9786. sprintf((char*)buf_log_evcomm,
  9787. "[ChargingStatus]Emergency Stop by CP Error (%d, %.02f V)",
  9788. sys->CpState,
  9789. sys->CpVoltage);
  9790. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9791. }
  9792. #endif
  9793. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9794. #if PARAMETER_NORMAL_MODE == ENABLE
  9795. SHM_Read_iso1_ChargingStatusRes(&ccs_exi_doc_ISO1, ShmCcsData);
  9796. #else
  9797. Sudo_Parameter_iso1_ChargingStatusRes();
  9798. #endif
  9799. //STEP 4: ============ Encode and Send Response Message ===========
  9800. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  9801. {
  9802. errn = -1;
  9803. }
  9804. //STEP 5: ============ Update Flags ===========
  9805. return errn;
  9806. }
  9807. /*===========================================================================
  9808. FUNCTION: Proc_din_CurrentDemandReq
  9809. DESCRIPTION:
  9810. PRE-CONDITION:
  9811. INPUT:
  9812. OUTPUT:
  9813. GLOBAL VARIABLES:
  9814. =============================================================================*/
  9815. int Proc_din_CurrentDemandReq(int AcceptFd)
  9816. {
  9817. int errn = 0;
  9818. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_CurrentDemandReq] Got CurrentDemandReq\n");
  9819. //Print the decoded XML Document
  9820. PRINT_XML_DOC_DIN_CurrentDemandReq(&ccs_exi_doc_DIN);
  9821. //Save into Share Memory
  9822. SHM_Save_din_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  9823. //Check for EV Error Code
  9824. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  9825. errn = Proc_din_CurrentDemandRes(AcceptFd);
  9826. if (errn == 0)
  9827. {
  9828. //Response is sent successfully.
  9829. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]CurrentDemandRes");
  9830. }
  9831. else
  9832. {
  9833. sprintf((char*)buf_log_evcomm,
  9834. "[DIN][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  9835. errn);
  9836. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9837. }
  9838. return errn;
  9839. }
  9840. /*===========================================================================
  9841. FUNCTION: Proc_iso1_CurrentDemandReq
  9842. DESCRIPTION:
  9843. PRE-CONDITION:
  9844. INPUT:
  9845. OUTPUT:
  9846. GLOBAL VARIABLES:
  9847. =============================================================================*/
  9848. int Proc_iso1_CurrentDemandReq(int AcceptFd)
  9849. {
  9850. int errn = 0;
  9851. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_CurrentDemandReq] Got CurrentDemandReq\n");
  9852. //Print the decoded XML Document
  9853. PRINT_XML_DOC_ISO1_CurrentDemandReq(&ccs_exi_doc_ISO1);
  9854. //Save into Share Memory
  9855. SHM_Save_iso1_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9856. //Check for EV Error Code
  9857. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
  9858. errn = Proc_iso1_CurrentDemandRes(AcceptFd);
  9859. if (errn == 0)
  9860. {
  9861. //Response is sent successfully.
  9862. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]CurrentDemandRes");
  9863. }
  9864. else
  9865. {
  9866. sprintf((char*)buf_log_evcomm,
  9867. "[ISO1][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
  9868. errn);
  9869. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9870. }
  9871. return errn;
  9872. }
  9873. /*===========================================================================
  9874. FUNCTION: Proc_iso1_ChargingStatusReq
  9875. DESCRIPTION:
  9876. PRE-CONDITION:
  9877. INPUT:
  9878. OUTPUT:
  9879. GLOBAL VARIABLES:
  9880. =============================================================================*/
  9881. int Proc_iso1_ChargingStatusReq(int AcceptFd)
  9882. {
  9883. int errn = 0;
  9884. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_ChargingStatusReq] Got ChargingStatusReq\n");
  9885. //Print the decoded XML Document
  9886. PRINT_XML_DOC_ISO1_ChargingStatusReq(&ccs_exi_doc_ISO1);
  9887. //Save into Share Memory
  9888. SHM_Save_iso1_ChargingStatusReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  9889. //Check for EV Error Code
  9890. //no content in ISO1
  9891. errn = Proc_iso1_ChargingStatusRes(AcceptFd);
  9892. if (errn == 0)
  9893. {
  9894. //Response is sent successfully.
  9895. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]ChargingStatusRes");
  9896. }
  9897. else
  9898. {
  9899. sprintf((char*)buf_log_evcomm,
  9900. "[ISO1][Error][ChargingStatusReq]ChargingStatusRes: fail(%d,DEC)",
  9901. errn);
  9902. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  9903. }
  9904. return errn;
  9905. }
  9906. /*===========================================================================
  9907. FUNCTION: Proc_din_PowerDeliveryStopRes
  9908. DESCRIPTION:
  9909. PRE-CONDITION:
  9910. INPUT:
  9911. OUTPUT:
  9912. GLOBAL VARIABLES:
  9913. =============================================================================*/
  9914. int Proc_din_PowerDeliveryStopRes(int AcceptFd)
  9915. {
  9916. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9917. //if it is not the same, the packet should be ignored.
  9918. //STEP 1: ============ Initialize ============
  9919. //int i = 0;
  9920. int errn = 0;
  9921. bitstream_t v2g_tx_stream;
  9922. struct dinPowerDeliveryResType *res;
  9923. struct ChargingInfoData *sys;
  9924. size_t pos = 0;
  9925. v2g_tx_stream.pos = &pos;
  9926. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  9927. v2g_tx_stream.data = V2GTP_Tx_buf;
  9928. res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
  9929. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  9930. res->ResponseCode = OK_DIN70121;
  9931. //[HEADER] Check Req SessionID
  9932. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  9933. {
  9934. res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  9935. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  9936. errn = -1;
  9937. }
  9938. //Check for SequenceError
  9939. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  9940. {
  9941. res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  9942. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  9943. errn = -1;
  9944. //Update_ShmStatusCode(); //[To-Do] to be implemented
  9945. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  9946. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  9947. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  9948. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  9949. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  9950. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  9951. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  9952. }
  9953. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  9954. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  9955. #if PARAMETER_NORMAL_MODE == ENABLE
  9956. ShmCcsData->V2GMessage_DIN70121.PowerDeliveryResponse.DC_EVSEStatus.EVSEStatusCode = EVSE_NotReady;
  9957. SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
  9958. #else
  9959. Sudo_Parameter_din_PreChargeRes();
  9960. #endif
  9961. //EVSE Status Code
  9962. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  9963. //Check for CSU command of "Stop by EVSE"
  9964. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  9965. {
  9966. //res->ResponseCode = FAILED_DIN70121;
  9967. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9968. }
  9969. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  9970. {
  9971. //res->ResponseCode = FAILED_DIN70121;
  9972. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  9973. }
  9974. else if (ShmInternalComm->ChargingPermission == FALSE)
  9975. {
  9976. //res->ResponseCode = FAILED_DIN70121;
  9977. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  9978. }
  9979. //STEP 4: ============ Encode and Send Response Message ===========
  9980. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  9981. {
  9982. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_PowerDeliveryStopRes][Error]Tx encoded msg error");
  9983. errn = -1;
  9984. }
  9985. //STEP 5: ============ Update Flags ===========
  9986. return errn;
  9987. }
  9988. /*===========================================================================
  9989. FUNCTION: Proc_iso1_PowerDeliveryStopRes
  9990. DESCRIPTION:
  9991. PRE-CONDITION:
  9992. INPUT:
  9993. OUTPUT:
  9994. GLOBAL VARIABLES:
  9995. =============================================================================*/
  9996. int Proc_iso1_PowerDeliveryStopRes(int AcceptFd)
  9997. {
  9998. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  9999. //if it is not the same, the packet should be ignored.
  10000. //STEP 1: ============ Initialize ============
  10001. //int i = 0;
  10002. int errn = 0;
  10003. bitstream_t v2g_tx_stream;
  10004. struct iso1PowerDeliveryResType *res;
  10005. struct ChargingInfoData *sys;
  10006. size_t pos = 0;
  10007. v2g_tx_stream.pos = &pos;
  10008. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10009. v2g_tx_stream.data = V2GTP_Tx_buf;
  10010. res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
  10011. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10012. res->ResponseCode = OK_ISO15118_2014;
  10013. //[HEADER] Check Req SessionID
  10014. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10015. {
  10016. res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10017. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10018. errn = -1;
  10019. }
  10020. //Check for SequenceError
  10021. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10022. {
  10023. res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10024. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10025. errn = -1;
  10026. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10027. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10028. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10029. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10030. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10031. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10032. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10033. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10034. }
  10035. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10036. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10037. #if PARAMETER_NORMAL_MODE == ENABLE
  10038. ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryResponse.DC_EVSEStatus.DC_EVSEStatusCode = EVSE_NotReady;
  10039. SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10040. #else
  10041. Sudo_Parameter_iso1_PreChargeRes();
  10042. #endif
  10043. //EVSE Status Code
  10044. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10045. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1 /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10046. //Check for CSU command of "Stop by EVSE"
  10047. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10048. {
  10049. //res->ResponseCode = FAILED_ISO15118_2014;
  10050. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10051. }
  10052. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10053. {
  10054. //res->ResponseCode = FAILED_ISO15118_2014;
  10055. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10056. }
  10057. else if (ShmInternalComm->ChargingPermission == FALSE)
  10058. {
  10059. //res->ResponseCode = FAILED_ISO15118_2014;
  10060. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
  10061. }
  10062. //STEP 4: ============ Encode and Send Response Message ===========
  10063. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10064. {
  10065. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_PowerDeliveryStopRes][Error]Tx encoded msg error");
  10066. errn = -1;
  10067. }
  10068. //STEP 5: ============ Update Flags ===========
  10069. return errn;
  10070. }
  10071. /*===========================================================================
  10072. FUNCTION: Proc_din_PowerDeliveryStopReq
  10073. DESCRIPTION:
  10074. PRE-CONDITION:
  10075. INPUT:
  10076. OUTPUT:
  10077. GLOBAL VARIABLES:
  10078. =============================================================================*/
  10079. int Proc_din_PowerDeliveryStopReq(int AcceptFd)
  10080. {
  10081. int errn = 0;
  10082. //Request CSU to STOP
  10083. //This should be reponsed as soon as possible once this message is received.
  10084. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10085. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  10086. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  10087. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryReq (2nd)\n");
  10088. //Print the decoded XML Document
  10089. PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
  10090. //Save into Share Memory
  10091. SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10092. //Check for EV Error Code
  10093. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  10094. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  10095. usleep(1500000); //1.5 seconds
  10096. //sleep(1); //1 second
  10097. errn = Proc_din_PowerDeliveryStopRes(AcceptFd);
  10098. if (errn == 0)
  10099. {
  10100. //send response successfully.
  10101. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]PowerDeliveryRes (2nd)\n");
  10102. }
  10103. else
  10104. {
  10105. sprintf((char*)buf_log_evcomm,
  10106. "[Error][SeccComm][Proc_din_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  10107. errn);
  10108. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10109. }
  10110. return errn;
  10111. }
  10112. /*===========================================================================
  10113. FUNCTION: Proc_iso1_PowerDeliveryStopReq
  10114. DESCRIPTION:
  10115. PRE-CONDITION:
  10116. INPUT:
  10117. OUTPUT:
  10118. GLOBAL VARIABLES:
  10119. =============================================================================*/
  10120. int Proc_iso1_PowerDeliveryStopReq(int AcceptFd)
  10121. {
  10122. int errn = 0;
  10123. //Request CSU to STOP
  10124. //This should be reponsed as soon as possible once this message is received.
  10125. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10126. EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
  10127. EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
  10128. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PowerDeliveryReq (2nd)\n");
  10129. //Print the decoded XML Document
  10130. PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
  10131. //Save into Share Memory
  10132. SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10133. //Check for EV Error Code
  10134. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
  10135. //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
  10136. usleep(1500000); //1.5 seconds
  10137. //sleep(1); //1 second
  10138. errn = Proc_iso1_PowerDeliveryStopRes(AcceptFd);
  10139. if (errn == 0)
  10140. {
  10141. //send response successfully.
  10142. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]PowerDeliveryRes (2nd)");
  10143. }
  10144. else
  10145. {
  10146. sprintf((char*)buf_log_evcomm,
  10147. "[Error][SeccComm][Proc_iso1_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
  10148. errn);
  10149. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10150. }
  10151. return errn;
  10152. }
  10153. /*===========================================================================
  10154. FUNCTION: SHM_Init_din_WeldingDetectionRes
  10155. DESCRIPTION:
  10156. PRE-CONDITION:
  10157. INPUT:
  10158. 1. shm_ccs
  10159. OUTPUT:
  10160. 1. shm_ccs
  10161. GLOBAL VARIABLES:
  10162. =============================================================================*/
  10163. void SHM_Init_din_WeldingDetectionRes(struct CcsData *shm_ccs)
  10164. {
  10165. struct WeldingDetectionResponse_DIN70121 *in;
  10166. in = &shm_ccs->V2GMessage_DIN70121.WeldingDetectionResponse;
  10167. //----- [BODY (1/3)] ResponseCode -----
  10168. in->ResponseCode = dinresponseCodeType_OK;
  10169. //----- [BODY (2/3)] EVSEPresentVoltage -----
  10170. short value = 0; int multiplier = 0; unsigned char unit = 0;
  10171. //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
  10172. value = 0; multiplier = 0; unit = V_DIN70121;
  10173. SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
  10174. //----- [BODY (3/3)] DC_EVSEStatus -----
  10175. SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
  10176. }
  10177. /*===========================================================================
  10178. FUNCTION: Sudo_Parameter_din_WeldingDetectionRes
  10179. DESCRIPTION:
  10180. PRE-CONDITION:
  10181. INPUT:
  10182. OUTPUT:
  10183. GLOBAL VARIABLES:
  10184. =============================================================================*/
  10185. void Sudo_Parameter_din_WeldingDetectionRes()
  10186. {
  10187. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  10188. init_dinWeldingDetectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes);
  10189. ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  10190. //----- [BODY (1/3)] ResponseCode -----
  10191. struct dinWeldingDetectionResType *res;
  10192. res = &ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes;
  10193. res->ResponseCode = dinresponseCodeType_OK;
  10194. //----- [BODY (2/3)] EVSEPresentVoltage -----
  10195. res->EVSEPresentVoltage.Value = 3820;
  10196. res->EVSEPresentVoltage.Multiplier = -1;
  10197. res->EVSEPresentVoltage.Unit_isUsed = 1u;
  10198. res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
  10199. // dinunitSymbolType_h = 0,
  10200. // dinunitSymbolType_m = 1,
  10201. // dinunitSymbolType_s = 2,
  10202. // dinunitSymbolType_A = 3,
  10203. // dinunitSymbolType_Ah = 4,
  10204. // dinunitSymbolType_V = 5,
  10205. // dinunitSymbolType_VA = 6,
  10206. // dinunitSymbolType_W = 7,
  10207. // dinunitSymbolType_W_s = 8,
  10208. // dinunitSymbolType_Wh = 9
  10209. //----- [BODY (3/3)] DC_EVSEStatus -----
  10210. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  10211. res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
  10212. // dinisolationLevelType_Invalid = 0,
  10213. // dinisolationLevelType_Valid = 1,
  10214. // dinisolationLevelType_Warning = 2,
  10215. // dinisolationLevelType_Fault = 3
  10216. res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10217. // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
  10218. // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
  10219. // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  10220. // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  10221. // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  10222. // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  10223. // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  10224. // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
  10225. // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
  10226. // dinDC_EVSEStatusCodeType_Reserved_A = 9,
  10227. // dinDC_EVSEStatusCodeType_Reserved_B = 10,
  10228. // dinDC_EVSEStatusCodeType_Reserved_C = 11
  10229. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  10230. res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
  10231. // dinEVSENotificationType_None = 0,
  10232. // dinEVSENotificationType_StopCharging = 1,
  10233. // dinEVSENotificationType_ReNegotiation = 2
  10234. }
  10235. /*===========================================================================
  10236. FUNCTION: Sudo_Parameter_iso1_WeldingDetectionRes
  10237. DESCRIPTION:
  10238. PRE-CONDITION:
  10239. INPUT:
  10240. OUTPUT:
  10241. GLOBAL VARIABLES:
  10242. =============================================================================*/
  10243. void Sudo_Parameter_iso1_WeldingDetectionRes()
  10244. {
  10245. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  10246. init_iso1WeldingDetectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes);
  10247. ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
  10248. //----- [BODY (1/3)] ResponseCode -----
  10249. struct iso1WeldingDetectionResType *res;
  10250. res = &ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes;
  10251. res->ResponseCode = iso1responseCodeType_OK;
  10252. //----- [BODY (2/3)] EVSEPresentVoltage -----
  10253. res->EVSEPresentVoltage.Value = 3820;
  10254. res->EVSEPresentVoltage.Multiplier = -1;
  10255. //res->EVSEPresentVoltage.Unit_isUsed = 1u;
  10256. res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
  10257. //iso1unitSymbolType_h = 0,
  10258. //iso1unitSymbolType_m = 1,
  10259. //iso1unitSymbolType_s = 2,
  10260. //iso1unitSymbolType_A = 3,
  10261. //iso1unitSymbolType_V = 4,
  10262. //iso1unitSymbolType_W = 5,
  10263. //iso1unitSymbolType_Wh = 6
  10264. //----- [BODY (3/3)] DC_EVSEStatus -----
  10265. res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
  10266. res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
  10267. //iso1isolationLevelType_Invalid = 0,
  10268. //iso1isolationLevelType_Valid = 1,
  10269. //iso1isolationLevelType_Warning = 2,
  10270. //iso1isolationLevelType_Fault = 3,
  10271. //iso1isolationLevelType_No_IMD = 4
  10272. res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10273. //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
  10274. //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
  10275. //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
  10276. //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
  10277. //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
  10278. //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
  10279. //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
  10280. //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
  10281. //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
  10282. //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
  10283. //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
  10284. //iso1DC_EVSEStatusCodeType_Reserved_C = 11
  10285. res->DC_EVSEStatus.NotificationMaxDelay = 0u;
  10286. res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
  10287. //iso1EVSENotificationType_None = 0,
  10288. //iso1EVSENotificationType_StopCharging = 1,
  10289. //iso1EVSENotificationType_ReNegotiation = 2
  10290. }
  10291. /*===========================================================================
  10292. FUNCTION: Proc_din_WeldingDetectionRes
  10293. DESCRIPTION:
  10294. PRE-CONDITION:
  10295. INPUT:
  10296. OUTPUT:
  10297. GLOBAL VARIABLES:
  10298. =============================================================================*/
  10299. int Proc_din_WeldingDetectionRes(int AcceptFd)
  10300. {
  10301. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10302. //if it is not the same, the packet should be ignored.
  10303. //STEP 1: ============ Initialize ============
  10304. //int i = 0;
  10305. int errn = 0;
  10306. bitstream_t v2g_tx_stream;
  10307. static struct WeldingDetectionResponse_DIN70121 *wel;
  10308. static struct ChargingInfoData *sys;
  10309. size_t pos = 0;
  10310. v2g_tx_stream.pos = &pos;
  10311. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10312. v2g_tx_stream.data = V2GTP_Tx_buf;
  10313. wel = &ShmCcsData->V2GMessage_DIN70121.WeldingDetectionResponse;
  10314. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10315. wel->ResponseCode = OK_DIN70121;
  10316. //[HEADER] Check Req SessionID
  10317. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10318. {
  10319. wel->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10320. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10321. errn = -1;
  10322. }
  10323. //Check for SequenceError
  10324. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10325. {
  10326. wel->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10327. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10328. errn = -1;
  10329. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10330. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10331. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10332. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10333. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10334. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10335. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10336. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10337. }
  10338. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10339. SAVE_PhysicalValueType_DIN70121(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
  10340. //EVSE Status Code
  10341. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
  10342. //Check for CSU command of "Stop by EVSE"
  10343. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10344. {
  10345. //wel->ResponseCode = FAILED_DIN70121;
  10346. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10347. }
  10348. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10349. {
  10350. //wel->ResponseCode = FAILED_DIN70121;
  10351. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10352. }
  10353. else if (ShmInternalComm->ChargingPermission == FALSE)
  10354. {
  10355. //wel->ResponseCode = FAILED_DIN70121;
  10356. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
  10357. }
  10358. //Isolation Status
  10359. if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
  10360. {
  10361. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
  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", 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. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10370. {
  10371. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
  10372. }
  10373. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10374. {
  10375. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10376. }
  10377. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10378. {
  10379. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10380. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10381. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10382. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_din_WeldingDetectionRes]GFD_Fault => Emergency Shutdown");
  10383. Update_V2G_Flow_Status(Other_Fault);
  10384. errn = -1;
  10385. }
  10386. else //GFD_No_IMD or other unexpected status
  10387. {
  10388. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
  10389. wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10390. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10391. sprintf((char*)buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10392. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10393. Update_V2G_Flow_Status(Other_Fault);
  10394. errn = -1;
  10395. }
  10396. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10397. #if PARAMETER_NORMAL_MODE == ENABLE
  10398. SHM_Read_din_WeldingDetectionRes(&ccs_exi_doc_DIN, ShmCcsData);
  10399. #else
  10400. Sudo_Parameter_din_WeldingDetectionRes();
  10401. #endif
  10402. //STEP 4: ============ Encode and Send Response Message ===========
  10403. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10404. {
  10405. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_WeldingDetectionRes][Error]Tx encoded msg error");
  10406. errn = -1;
  10407. }
  10408. //STEP 5: ============ Update Flags ===========
  10409. return errn;
  10410. }
  10411. /*===========================================================================
  10412. FUNCTION: Proc_iso1_WeldingDetectionRes
  10413. DESCRIPTION:
  10414. PRE-CONDITION:
  10415. INPUT:
  10416. OUTPUT:
  10417. GLOBAL VARIABLES:
  10418. =============================================================================*/
  10419. int Proc_iso1_WeldingDetectionRes(int AcceptFd)
  10420. {
  10421. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10422. //if it is not the same, the packet should be ignored.
  10423. //STEP 1: ============ Initialize ============
  10424. //int i = 0;
  10425. int errn = 0;
  10426. bitstream_t v2g_tx_stream;
  10427. static struct WeldingDetectionResponse_ISO15118_2014 *wel;
  10428. static struct ChargingInfoData *sys;
  10429. size_t pos = 0;
  10430. v2g_tx_stream.pos = &pos;
  10431. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10432. v2g_tx_stream.data = V2GTP_Tx_buf;
  10433. wel = &ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionResponse;
  10434. sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10435. wel->ResponseCode = OK_ISO15118_2014;
  10436. //[HEADER] Check Req SessionID
  10437. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10438. {
  10439. wel->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10440. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10441. errn = -1;
  10442. }
  10443. //Check for SequenceError
  10444. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10445. {
  10446. wel->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10447. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10448. errn = -1;
  10449. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10450. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10451. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10452. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10453. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10454. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10455. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10456. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10457. }
  10458. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10459. SAVE_PhysicalValueType_ISO15118_2014(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
  10460. //EVSE Status Code
  10461. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
  10462. //Check for CSU command of "Stop by EVSE"
  10463. if (sys->DC_EVSEStatus == EVSE_Shutdown)
  10464. {
  10465. //wel->ResponseCode = FAILED_ISO15118_2014;
  10466. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10467. }
  10468. else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
  10469. {
  10470. //wel->ResponseCode = FAILED_ISO15118_2014;
  10471. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10472. }
  10473. else if (ShmInternalComm->ChargingPermission == FALSE)
  10474. {
  10475. //wel->ResponseCode = FAILED_ISO15118_2014;
  10476. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
  10477. }
  10478. //Isolation Status
  10479. if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
  10480. {
  10481. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
  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", 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. else if (sys->IsolationStatus == GFD_Valid) //1: valid
  10490. {
  10491. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
  10492. }
  10493. else if (sys->IsolationStatus == GFD_Warning) //2: warning
  10494. {
  10495. wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
  10496. }
  10497. else if (sys->IsolationStatus == GFD_Fault) //3: fault
  10498. {
  10499. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10500. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10501. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10502. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error][Proc_iso1_WeldingDetectionRes]GFD_Fault => EmergencyShutdown");
  10503. Update_V2G_Flow_Status(Other_Fault);
  10504. errn = -1;
  10505. }
  10506. else
  10507. {
  10508. wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
  10509. wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
  10510. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  10511. sprintf((char*)buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
  10512. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10513. Update_V2G_Flow_Status(Other_Fault);
  10514. errn = -1;
  10515. }
  10516. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10517. #if PARAMETER_NORMAL_MODE == ENABLE
  10518. SHM_Read_iso1_WeldingDetectionRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10519. #else
  10520. Sudo_Parameter_iso1_WeldingDetectionRes();
  10521. #endif
  10522. //STEP 4: ============ Encode and Send Response Message ===========
  10523. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10524. {
  10525. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_WeldingDetectionRes][Error]Tx encoded msg error");
  10526. errn = -1;
  10527. }
  10528. //STEP 5: ============ Update Flags ===========
  10529. return errn;
  10530. }
  10531. /*===========================================================================
  10532. FUNCTION: Proc_din_WeldingDetectionReq
  10533. DESCRIPTION:
  10534. PRE-CONDITION:
  10535. INPUT:
  10536. OUTPUT:
  10537. GLOBAL VARIABLES:
  10538. =============================================================================*/
  10539. int Proc_din_WeldingDetectionReq(int AcceptFd)
  10540. {
  10541. int errn = 0;
  10542. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_din_WeldingDetectionReq] Got WeldingDetectionReq\n");
  10543. //Print the decoded XML Document
  10544. PRINT_XML_DOC_DIN_WeldingDetectionReq(&ccs_exi_doc_DIN);
  10545. //Save into Share Memory
  10546. SHM_Save_din_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10547. //Check for EV Error Code
  10548. Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  10549. errn = Proc_din_WeldingDetectionRes(AcceptFd);
  10550. if (errn == 0)
  10551. {
  10552. //send response successfully.
  10553. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[DIN][V2G][Tx]WeldingDetectionRes");
  10554. }
  10555. else
  10556. {
  10557. sprintf((char*)buf_log_evcomm,
  10558. "[Error][SeccComm][Proc_din_WeldingDetectionReq]Proc_din_WeldingDetectionRes(): %d (DEC)",
  10559. errn);
  10560. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10561. }
  10562. return errn;
  10563. }
  10564. /*===========================================================================
  10565. FUNCTION: Proc_iso1_WeldingDetectionReq
  10566. DESCRIPTION:
  10567. PRE-CONDITION:
  10568. INPUT:
  10569. OUTPUT:
  10570. GLOBAL VARIABLES:
  10571. =============================================================================*/
  10572. int Proc_iso1_WeldingDetectionReq(int AcceptFd)
  10573. {
  10574. int errn = 0;
  10575. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Proc_iso1_WeldingDetectionReq] Got WeldingDetectionReq\n");
  10576. //Print the decoded XML Document
  10577. PRINT_XML_DOC_ISO1_WeldingDetectionReq(&ccs_exi_doc_ISO1);
  10578. //Save into Share Memory
  10579. SHM_Save_iso1_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10580. //Check for EV Error Code
  10581. Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
  10582. errn = Proc_iso1_WeldingDetectionRes(AcceptFd);
  10583. if (errn == 0)
  10584. {
  10585. //send response successfully.
  10586. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ISO1][V2G][Tx]WeldingDetectionRes");
  10587. }
  10588. else
  10589. {
  10590. sprintf((char*)buf_log_evcomm,
  10591. "[Error][SeccComm][Proc_iso1_WeldingDetectionReq]Proc_iso1_WeldingDetectionRes(): %d (DEC)",
  10592. errn);
  10593. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10594. }
  10595. return errn;
  10596. }
  10597. /*===========================================================================
  10598. FUNCTION: SHM_Init_din_SessionStopRes
  10599. DESCRIPTION:
  10600. PRE-CONDITION:
  10601. INPUT:
  10602. 1. shm_ccs
  10603. OUTPUT:
  10604. 1. shm_ccs
  10605. GLOBAL VARIABLES:
  10606. =============================================================================*/
  10607. void SHM_Init_din_SessionStopRes(struct CcsData *shm_ccs)
  10608. {
  10609. struct SessionStopResponse_DIN70121 *in;
  10610. in = &shm_ccs->V2GMessage_DIN70121.SessionStopResponse;
  10611. //----- [BODY (1/3)] ResponseCode -----
  10612. in->ResponseCode = dinresponseCodeType_OK;
  10613. }
  10614. /*===========================================================================
  10615. FUNCTION: Sudo_Parameter_din_SessionStopRes
  10616. DESCRIPTION:
  10617. PRE-CONDITION:
  10618. INPUT:
  10619. OUTPUT:
  10620. GLOBAL VARIABLES:
  10621. =============================================================================*/
  10622. void Sudo_Parameter_din_SessionStopRes()
  10623. {
  10624. init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
  10625. init_dinSessionStopResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes);
  10626. ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  10627. //----- [BODY (1/3)] ResponseCode -----
  10628. struct dinSessionStopResType *res;
  10629. res = &ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes;
  10630. res->ResponseCode = dinresponseCodeType_OK;
  10631. }
  10632. /*===========================================================================
  10633. FUNCTION: Sudo_Parameter_iso1_SessionStopRes
  10634. DESCRIPTION:
  10635. PRE-CONDITION:
  10636. INPUT:
  10637. OUTPUT:
  10638. GLOBAL VARIABLES:
  10639. =============================================================================*/
  10640. void Sudo_Parameter_iso1_SessionStopRes()
  10641. {
  10642. init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
  10643. init_iso1SessionStopResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes);
  10644. ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes_isUsed = 1u;
  10645. //----- [BODY (1/3)] ResponseCode -----
  10646. struct iso1SessionStopResType *res;
  10647. res = &ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes;
  10648. res->ResponseCode = iso1responseCodeType_OK;
  10649. }
  10650. /*===========================================================================
  10651. FUNCTION: Proc_din_SessionStopRes
  10652. DESCRIPTION:
  10653. PRE-CONDITION:
  10654. INPUT:
  10655. OUTPUT:
  10656. GLOBAL VARIABLES:
  10657. =============================================================================*/
  10658. int Proc_din_SessionStopRes(int AcceptFd)
  10659. {
  10660. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10661. //if it is not the same, the packet should be ignored.
  10662. //STEP 1: ============ Initialize ============
  10663. //int i = 0;
  10664. int errn = 0;
  10665. bitstream_t v2g_tx_stream;
  10666. struct SessionStopResponse_DIN70121 *stp;
  10667. size_t pos = 0;
  10668. v2g_tx_stream.pos = &pos;
  10669. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10670. v2g_tx_stream.data = V2GTP_Tx_buf;
  10671. stp = &ShmCcsData->V2GMessage_DIN70121.SessionStopResponse;
  10672. stp->ResponseCode = OK_DIN70121;
  10673. //[HEADER] Check Req SessionID
  10674. if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
  10675. {
  10676. stp->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
  10677. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10678. errn = -1;
  10679. }
  10680. //Check for SequenceError
  10681. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10682. {
  10683. stp->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
  10684. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10685. errn = -1;
  10686. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10687. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10688. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10689. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10690. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10691. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10692. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10693. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10694. }
  10695. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10696. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10697. #if PARAMETER_NORMAL_MODE == ENABLE
  10698. SHM_Read_din_SessionStopRes(&ccs_exi_doc_DIN, ShmCcsData);
  10699. #else
  10700. Sudo_Parameter_din_SessionStopRes();
  10701. #endif
  10702. //STEP 4: ============ Encode and Send Response Message ===========
  10703. if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
  10704. {
  10705. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes: fail");
  10706. errn = -1;
  10707. }
  10708. else
  10709. {
  10710. //send response successfully.
  10711. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes");
  10712. }
  10713. //STEP 5: ============ Update Flags ===========
  10714. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  10715. //Once this is set, the CSU should
  10716. // =========== Annouce to CSU [To-Be Implemented]=============
  10717. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  10718. // =========== Re-initialized [To-Be Implemented]=============
  10719. //Keep 5% PWM for 2 seconds
  10720. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 2");
  10721. sleep(1);
  10722. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 1");
  10723. sleep(1);
  10724. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 0");
  10725. OutputCpPwmDuty(100);
  10726. //[To-Do] Reset All Share memory
  10727. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  10728. //system("reboot -f");
  10729. //sleep(5);
  10730. //system("reboot -f");
  10731. return errn;
  10732. }
  10733. /*===========================================================================
  10734. FUNCTION: Proc_iso1_SessionStopRes
  10735. DESCRIPTION:
  10736. PRE-CONDITION:
  10737. INPUT:
  10738. OUTPUT:
  10739. GLOBAL VARIABLES:
  10740. =============================================================================*/
  10741. int Proc_iso1_SessionStopRes(int AcceptFd)
  10742. {
  10743. //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
  10744. //if it is not the same, the packet should be ignored.
  10745. //STEP 1: ============ Initialize ============
  10746. //int i = 0;
  10747. int errn = 0;
  10748. bitstream_t v2g_tx_stream;
  10749. struct SessionStopResponse_ISO15118_2014 *stp;
  10750. //struct ChargingInfoData *sys;
  10751. size_t pos = 0;
  10752. v2g_tx_stream.pos = &pos;
  10753. v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
  10754. v2g_tx_stream.data = V2GTP_Tx_buf;
  10755. stp = &ShmCcsData->V2GMessage_ISO15118_2014.SessionStopResponse;
  10756. //sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  10757. stp->ResponseCode = OK_ISO15118_2014;
  10758. //[HEADER] Check Req SessionID
  10759. if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
  10760. {
  10761. stp->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
  10762. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]unmatched SessionID => End_Process");
  10763. errn = -1;
  10764. }
  10765. //Check for SequenceError
  10766. if (EVCOMM_SYS_INFO.SequenceError == TRUE)
  10767. {
  10768. stp->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
  10769. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[ERROR]SequenceError => End_Process");
  10770. errn = -1;
  10771. //Update_ShmStatusCode(); //[To-Do] to be implemented
  10772. //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
  10773. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  10774. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  10775. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  10776. ShmStatusCodeData->PresentStatusCode[0][3] = 7;
  10777. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  10778. ShmStatusCodeData->PresentStatusCode[0][5] = 8;
  10779. }
  10780. //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
  10781. //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
  10782. #if PARAMETER_NORMAL_MODE == ENABLE
  10783. SHM_Read_iso1_SessionStopRes(&ccs_exi_doc_ISO1, ShmCcsData);
  10784. #else
  10785. Sudo_Parameter_iso1_SessionStopRes();
  10786. #endif
  10787. //STEP 4: ============ Encode and Send Response Message ===========
  10788. if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
  10789. {
  10790. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes: fail");
  10791. errn = -1;
  10792. }
  10793. else
  10794. {
  10795. //send response successfully.
  10796. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Tx]SessionStopRes");
  10797. }
  10798. //STEP 5: ============ Update Flags ===========
  10799. EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
  10800. //Once this is set, the CSU should
  10801. // =========== Annouce to CSU [To-Be Implemented]=============
  10802. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
  10803. // =========== Re-initialized [To-Be Implemented]=============
  10804. //Keep 5% PWM for 2 seconds
  10805. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 2");
  10806. sleep(1);
  10807. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 1");
  10808. sleep(1);
  10809. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 5\% countdown: 0");
  10810. OutputCpPwmDuty(100);
  10811. //[To-Do] Reset All Share memory
  10812. //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
  10813. //system("reboot -f");
  10814. //sleep(5);
  10815. //system("reboot -f");
  10816. return errn;
  10817. }
  10818. /*===========================================================================
  10819. FUNCTION: Proc_din_SessionStopReq
  10820. DESCRIPTION:
  10821. PRE-CONDITION:
  10822. INPUT:
  10823. OUTPUT:
  10824. GLOBAL VARIABLES:
  10825. =============================================================================*/
  10826. int Proc_din_SessionStopReq(int AcceptFd)
  10827. {
  10828. int errn = 0;
  10829. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]SessionStopReq");
  10830. //Print the decoded XML Document
  10831. PRINT_XML_DOC_DIN_SessionStopReq(&ccs_exi_doc_DIN);
  10832. //Save into Share Memory
  10833. SHM_Save_din_SessionStopReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
  10834. errn = Proc_din_SessionStopRes(AcceptFd);
  10835. if (errn == 0)
  10836. {
  10837. //send response successfully.
  10838. }
  10839. else
  10840. {
  10841. sprintf((char*)buf_log_evcomm,
  10842. "[Error][SeccComm][Proc_din_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  10843. errn);
  10844. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10845. }
  10846. return errn;
  10847. }
  10848. /*===========================================================================
  10849. FUNCTION: Proc_iso1_SessionStopReq
  10850. DESCRIPTION:
  10851. PRE-CONDITION:
  10852. INPUT:
  10853. OUTPUT:
  10854. GLOBAL VARIABLES:
  10855. =============================================================================*/
  10856. int Proc_iso1_SessionStopReq(int AcceptFd)
  10857. {
  10858. int errn = 0;
  10859. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]SessionStopReq");
  10860. //Print the decoded XML Document
  10861. PRINT_XML_DOC_ISO1_SessionStopReq(&ccs_exi_doc_ISO1);
  10862. //Save into Share Memory
  10863. SHM_Save_iso1_SessionStopReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
  10864. errn = Proc_iso1_SessionStopRes(AcceptFd);
  10865. if (errn == 0)
  10866. {
  10867. //send response successfully.
  10868. }
  10869. else
  10870. {
  10871. sprintf((char*)buf_log_evcomm,
  10872. "[Error][SeccComm][Proc_iso1_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
  10873. errn);
  10874. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  10875. }
  10876. return errn;
  10877. }
  10878. /*===========================================================================
  10879. FUNCTION: V2gMsg_Process_din
  10880. DESCRIPTION:
  10881. PRE-CONDITION:
  10882. INPUT:
  10883. 1. V2gFlowStatus
  10884. OUTPUT:
  10885. GLOBAL VARIABLES:
  10886. 1. V2gFlowStatus
  10887. =============================================================================*/
  10888. int V2gMsg_Process_din(int AcceptFd)
  10889. {
  10890. unsigned char req_is_responsed = FALSE;
  10891. while (req_is_responsed == FALSE)
  10892. {
  10893. //Check if it is in End_Process
  10894. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  10895. {
  10896. break;
  10897. }
  10898. switch(V2gFlowStatus)
  10899. {
  10900. //-------------------------------------------
  10901. case SupportedAppProtocolRequest:
  10902. {
  10903. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  10904. {
  10905. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  10906. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  10907. {
  10908. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10909. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  10910. }
  10911. else
  10912. {
  10913. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  10914. Update_V2G_Flow_Status(Other_Fault);
  10915. }
  10916. }
  10917. req_is_responsed = TRUE;
  10918. break;
  10919. }
  10920. case SupportedAppProtocolResponse:
  10921. {
  10922. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  10923. {
  10924. Update_V2G_Flow_Status(SessionSetupRequest);
  10925. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10926. }
  10927. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10928. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10929. {
  10930. sprintf((char*)buf_log_evcomm,
  10931. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10932. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10933. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10934. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10935. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10936. }
  10937. else
  10938. {
  10939. }
  10940. break;
  10941. }
  10942. //-------------------------------------------
  10943. case SessionSetupRequest: //19
  10944. {
  10945. if (Proc_din_SessionSetupReq(AcceptFd) == 0)
  10946. {
  10947. Update_V2G_Flow_Status(SessionSetupResponse);
  10948. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10949. }
  10950. else
  10951. {
  10952. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  10953. Update_V2G_Flow_Status(Other_Fault);
  10954. }
  10955. req_is_responsed = TRUE;
  10956. break;
  10957. }
  10958. case SessionSetupResponse: //20
  10959. {
  10960. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  10961. {
  10962. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  10963. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10964. }
  10965. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  10966. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  10967. {
  10968. sprintf((char*)buf_log_evcomm,
  10969. "[ERROR]SequenceError(%d) => Tx Res MSG",
  10970. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10971. EVCOMM_SYS_INFO.SequenceError = TRUE;
  10972. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  10973. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  10974. }
  10975. else
  10976. {
  10977. }
  10978. break;
  10979. }
  10980. //-------------------------------------------
  10981. case ServiceDiscoveryRequest: //21
  10982. {
  10983. if (Proc_din_ServiceDiscoveryReq(AcceptFd) == 0)
  10984. {
  10985. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  10986. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  10987. }
  10988. else
  10989. {
  10990. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  10991. Update_V2G_Flow_Status(Other_Fault);
  10992. }
  10993. req_is_responsed = TRUE;
  10994. break;
  10995. }
  10996. case ServiceDiscoveryResponse: //22
  10997. {
  10998. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  10999. {
  11000. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  11001. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11002. }
  11003. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11004. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11005. {
  11006. sprintf((char*)buf_log_evcomm, "[ERROR]SequenceError(%d) => Tx Res MSG", EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11007. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11008. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11009. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11010. }
  11011. else
  11012. {
  11013. }
  11014. break;
  11015. }
  11016. //-------------------------------------------
  11017. case ServiceAndPaymentSelectionRequest: //25
  11018. {
  11019. if (Proc_din_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  11020. {
  11021. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  11022. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11023. }
  11024. else
  11025. {
  11026. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  11027. Update_V2G_Flow_Status(Other_Fault);
  11028. }
  11029. req_is_responsed = TRUE;
  11030. break;
  11031. }
  11032. case ServiceAndPaymentSelectionResponse: //26
  11033. {
  11034. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11035. {
  11036. Update_V2G_Flow_Status(AuthorizationRequest);
  11037. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11038. }
  11039. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11040. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11041. {
  11042. sprintf((char*)buf_log_evcomm,
  11043. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11044. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11045. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11046. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11047. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11048. }
  11049. else
  11050. {
  11051. }
  11052. break;
  11053. }
  11054. //-------------------------------------------
  11055. //case ContractAuthenticationReq:
  11056. case AuthorizationRequest: //29
  11057. {
  11058. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  11059. {
  11060. Update_V2G_Flow_Status(AuthorizationResponse);
  11061. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11062. }
  11063. else
  11064. {
  11065. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11066. Update_V2G_Flow_Status(Other_Fault);
  11067. }
  11068. req_is_responsed = TRUE;
  11069. break;
  11070. }
  11071. case AuthorizationResponse: //30
  11072. {
  11073. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11074. {
  11075. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11076. if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
  11077. {
  11078. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11079. }
  11080. else
  11081. {
  11082. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11083. Update_V2G_Flow_Status(Other_Fault);
  11084. }
  11085. req_is_responsed = TRUE;
  11086. }
  11087. //Check for ChargeParameterDiscoveryReq
  11088. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11089. {
  11090. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11091. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  11092. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  11093. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11094. ftime(&SeqStartTime);
  11095. #endif
  11096. }
  11097. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11098. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11099. {
  11100. sprintf((char*)buf_log_evcomm,
  11101. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11102. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11103. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11104. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11105. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11106. }
  11107. else
  11108. {
  11109. }
  11110. break;
  11111. }
  11112. //-------------------------------------------
  11113. case ChargeParameterDiscoveryRequest: //35
  11114. {
  11115. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11116. {
  11117. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  11118. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11119. }
  11120. else
  11121. {
  11122. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11123. Update_V2G_Flow_Status(Other_Fault);
  11124. }
  11125. req_is_responsed = TRUE;
  11126. break;
  11127. }
  11128. case ChargeParameterDiscoveryResponse:
  11129. {
  11130. //STEP 1: Check for Process Timeout
  11131. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11132. ftime(&SeqEndTime);
  11133. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  11134. {
  11135. sprintf((char*)buf_log_evcomm,
  11136. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  11137. DiffTimeb(SeqStartTime, SeqEndTime),
  11138. V2G_SECC_ChargingParameter_Performance_Time);
  11139. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11140. Update_V2G_Flow_Status(Sequence_Timeout);
  11141. break;
  11142. }
  11143. #endif
  11144. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11145. {
  11146. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11147. if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11148. {
  11149. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11150. }
  11151. else
  11152. {
  11153. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11154. Update_V2G_Flow_Status(Other_Fault);
  11155. }
  11156. req_is_responsed = TRUE;
  11157. break;
  11158. }
  11159. //STEP 2: Check for CableCheckReq message
  11160. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11161. {
  11162. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11163. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  11164. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  11165. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11166. Update_V2G_Flow_Status(CableCheckRequest);
  11167. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11168. ftime(&SeqStartTime);
  11169. #endif
  11170. }
  11171. //STEP 3: Wait for PowerDeliveryReq Message
  11172. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11173. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11174. {
  11175. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11176. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11177. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11178. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11179. ftime(&SeqStartTime);
  11180. #endif
  11181. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  11182. {
  11183. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11184. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11185. }
  11186. else
  11187. {
  11188. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11189. Update_V2G_Flow_Status(Other_Fault);
  11190. }
  11191. }
  11192. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11193. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11194. {
  11195. sprintf((char*)buf_log_evcomm,
  11196. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11197. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11198. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11199. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11200. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11201. }
  11202. else
  11203. {
  11204. }
  11205. break;
  11206. }
  11207. //-------------------------------------------
  11208. case CableCheckRequest: //37
  11209. {
  11210. //STEP 3: Execute Cable Check Process
  11211. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  11212. {
  11213. Update_V2G_Flow_Status(CableCheckResponse);
  11214. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11215. }
  11216. else
  11217. {
  11218. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  11219. Update_V2G_Flow_Status(Other_Fault);
  11220. }
  11221. req_is_responsed = TRUE;
  11222. break;
  11223. }
  11224. case CableCheckResponse: //38
  11225. {
  11226. //STEP 1: Check for Process Timeout
  11227. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11228. ftime(&SeqEndTime);
  11229. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  11230. {
  11231. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  11232. sprintf((char*)buf_log_evcomm,
  11233. "CableCheck Timeout - (%.02lf of %d ms)\n",
  11234. DiffTimeb(SeqStartTime, SeqEndTime),
  11235. V2G_SECC_CableCheck_Performance_Time);
  11236. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11237. Update_V2G_Flow_Status(Sequence_Timeout);
  11238. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11239. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  11240. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11241. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11242. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11243. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  11244. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  11245. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  11246. break;
  11247. }
  11248. #endif
  11249. //STEP 2: Check for CableCheckReq message
  11250. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11251. {
  11252. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11253. //STEP 3: Execute Cable Check Process
  11254. if (Proc_din_CableCheckReq(AcceptFd) == 0)
  11255. {
  11256. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11257. }
  11258. else
  11259. {
  11260. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  11261. Update_V2G_Flow_Status(Other_Fault);
  11262. }
  11263. req_is_responsed = TRUE;
  11264. }
  11265. //STEP 3: Check for PreChargeReq message
  11266. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  11267. {
  11268. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11269. Update_V2G_Flow_Status(PreChargeRequest);
  11270. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  11271. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11272. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  11273. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11274. ftime(&SeqStartTime);
  11275. #endif
  11276. }
  11277. //STEP 3: Wait for PowerDeliveryReq Message
  11278. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11279. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11280. {
  11281. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11282. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11283. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11284. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11285. ftime(&SeqStartTime);
  11286. #endif
  11287. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  11288. {
  11289. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11290. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11291. }
  11292. else
  11293. {
  11294. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11295. Update_V2G_Flow_Status(Other_Fault);
  11296. }
  11297. }
  11298. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11299. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11300. {
  11301. sprintf((char*)buf_log_evcomm,
  11302. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11303. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11304. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11305. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11306. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11307. }
  11308. else
  11309. {
  11310. }
  11311. break;
  11312. }
  11313. //-------------------------------------------
  11314. case PreChargeRequest: //39
  11315. {
  11316. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  11317. {
  11318. Update_V2G_Flow_Status(PreChargeResponse);
  11319. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11320. }
  11321. else
  11322. {
  11323. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  11324. Update_V2G_Flow_Status(Other_Fault);
  11325. }
  11326. req_is_responsed = TRUE;
  11327. break;
  11328. }
  11329. case PreChargeResponse: //40
  11330. {
  11331. //STEP 1: Check for Process Timeout
  11332. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11333. ftime(&SeqEndTime);
  11334. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  11335. {
  11336. sprintf((char*)buf_log_evcomm,
  11337. "Precharge Timeout - (%.02lf of %d ms)\n",
  11338. DiffTimeb(SeqStartTime, SeqEndTime),
  11339. V2G_SECC_PreCharge_Performance_Time);
  11340. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11341. Update_V2G_Flow_Status(Sequence_Timeout);
  11342. //Update_ShmStatusCode(); //[To-Do] to be implemented
  11343. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  11344. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  11345. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  11346. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  11347. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  11348. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  11349. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  11350. break;
  11351. }
  11352. #endif
  11353. //STEP 2: Check for PreChargeReq message
  11354. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  11355. {
  11356. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11357. if (Proc_din_PreChargeReq(AcceptFd) == 0)
  11358. {
  11359. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11360. }
  11361. else
  11362. {
  11363. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  11364. Update_V2G_Flow_Status(Other_Fault);
  11365. }
  11366. req_is_responsed = TRUE;
  11367. }
  11368. //STEP 3: Check for PowerDeliveryReq message
  11369. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11370. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11371. {
  11372. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11373. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  11374. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  11375. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11376. ftime(&SeqStartTime);
  11377. #endif
  11378. }
  11379. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11380. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11381. {
  11382. sprintf((char*)buf_log_evcomm,
  11383. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11384. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11385. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11386. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11387. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11388. }
  11389. else
  11390. {
  11391. }
  11392. break;
  11393. }
  11394. //-------------------------------------------
  11395. case PowerDeliveryRequestStart: //41
  11396. {
  11397. if (Proc_din_PowerDeliveryStartReq(AcceptFd) == 0)
  11398. {
  11399. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  11400. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11401. }
  11402. else
  11403. {
  11404. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  11405. Update_V2G_Flow_Status(Other_Fault);
  11406. }
  11407. req_is_responsed = TRUE;
  11408. break;
  11409. }
  11410. case PowerDeliveryResponsetStart: //42
  11411. {
  11412. //STEP 1: Check for Process Timeout
  11413. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11414. if (ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  11415. {
  11416. ftime(&SeqEndTime);
  11417. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  11418. {
  11419. sprintf((char*)buf_log_evcomm,
  11420. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  11421. DiffTimeb(SeqStartTime, SeqEndTime),
  11422. 2000);
  11423. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11424. Update_V2G_Flow_Status(Sequence_Timeout);
  11425. }
  11426. break;
  11427. }
  11428. #endif
  11429. //STEP 2: Wait for CurrentDemandReq Message
  11430. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  11431. {
  11432. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11433. Update_V2G_Flow_Status(CurrentDemandRequest);
  11434. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  11435. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  11436. }
  11437. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11438. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11439. {
  11440. sprintf((char*)buf_log_evcomm,
  11441. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11442. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11443. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11444. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11445. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11446. }
  11447. else
  11448. {
  11449. }
  11450. break;
  11451. }
  11452. //-------------------------------------------
  11453. case CurrentDemandRequest: //45,
  11454. {
  11455. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  11456. {
  11457. Update_V2G_Flow_Status(CurrentDemandResponse);
  11458. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11459. }
  11460. else
  11461. {
  11462. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  11463. Update_V2G_Flow_Status(Other_Fault);
  11464. }
  11465. req_is_responsed = TRUE;
  11466. break;
  11467. }
  11468. case CurrentDemandResponse: //46,
  11469. {
  11470. //STEP 1: Wait for CurrentDemandReq Message
  11471. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  11472. {
  11473. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11474. if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
  11475. {
  11476. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11477. }
  11478. else
  11479. {
  11480. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  11481. Update_V2G_Flow_Status(Other_Fault);
  11482. }
  11483. req_is_responsed = TRUE;
  11484. break;
  11485. }
  11486. //STEP 2: Wait for PowerDeliveryReq Message
  11487. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11488. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11489. {
  11490. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11491. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11492. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  11493. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11494. ftime(&SeqStartTime);
  11495. #endif
  11496. }
  11497. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11498. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11499. {
  11500. sprintf((char*)buf_log_evcomm,
  11501. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11502. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11503. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11504. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11505. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11506. }
  11507. else
  11508. {
  11509. }
  11510. break;
  11511. }
  11512. //-------------------------------------------
  11513. case PowerDeliveryRequestStop: //49,
  11514. {
  11515. if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
  11516. {
  11517. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11518. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11519. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11520. ftime(&SeqStartTime);
  11521. #endif
  11522. }
  11523. else
  11524. {
  11525. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11526. Update_V2G_Flow_Status(Other_Fault);
  11527. }
  11528. req_is_responsed = TRUE;
  11529. break;
  11530. }
  11531. case PowerDeliveryResponseStop: //50,
  11532. {
  11533. //STEP 1: Check for Process Timeout
  11534. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11535. ftime(&SeqEndTime);
  11536. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  11537. {
  11538. sprintf((char*)buf_log_evcomm,
  11539. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  11540. DiffTimeb(SeqStartTime, SeqEndTime),
  11541. 2000);
  11542. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11543. Update_V2G_Flow_Status(Sequence_Timeout);
  11544. break;
  11545. }
  11546. #endif
  11547. //STEP 2: Check for WeldingDetectionReq Message
  11548. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  11549. {
  11550. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11551. Update_V2G_Flow_Status(WeldingDetectionRequest);
  11552. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  11553. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  11554. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11555. ftime(&SeqStartTime);
  11556. #endif
  11557. }
  11558. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  11559. {
  11560. Update_V2G_Flow_Status(SessionStopRequest);
  11561. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11562. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  11563. {
  11564. Update_V2G_Flow_Status(SessionStopResponse);
  11565. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11566. }
  11567. else
  11568. {
  11569. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  11570. Update_V2G_Flow_Status(Other_Fault);
  11571. }
  11572. break;
  11573. }
  11574. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11575. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11576. {
  11577. sprintf((char*)buf_log_evcomm,
  11578. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11579. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11580. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11581. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11582. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11583. }
  11584. else
  11585. {
  11586. }
  11587. break;
  11588. }
  11589. //-------------------------------------------
  11590. case WeldingDetectionRequest: //51,
  11591. {
  11592. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  11593. {
  11594. Update_V2G_Flow_Status(WeldingDetectionResponse);
  11595. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11596. }
  11597. else
  11598. {
  11599. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  11600. Update_V2G_Flow_Status(Other_Fault);
  11601. }
  11602. req_is_responsed = TRUE;
  11603. break;
  11604. }
  11605. case WeldingDetectionResponse: //52,
  11606. {
  11607. //STEP 1: Check for Process Timeout
  11608. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11609. ftime(&SeqEndTime);
  11610. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  11611. {
  11612. sprintf((char*)buf_log_evcomm,
  11613. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  11614. DiffTimeb(SeqStartTime, SeqEndTime),
  11615. V2G_SECC_WeldingDetection_Performance_Time);
  11616. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11617. Update_V2G_Flow_Status(Sequence_Timeout);
  11618. break;
  11619. }
  11620. #endif
  11621. //STEP 2: Check for WeldingDetectionReq Message
  11622. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  11623. {
  11624. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11625. if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
  11626. {
  11627. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11628. }
  11629. else
  11630. {
  11631. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  11632. Update_V2G_Flow_Status(Other_Fault);
  11633. }
  11634. req_is_responsed = TRUE;
  11635. }
  11636. //STEP 3: Check for SessionStopReq Message
  11637. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  11638. {
  11639. Update_V2G_Flow_Status(SessionStopRequest);
  11640. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11641. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  11642. }
  11643. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11644. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11645. {
  11646. sprintf((char*)buf_log_evcomm,
  11647. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11648. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11649. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11650. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11651. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11652. }
  11653. else
  11654. {
  11655. }
  11656. break;
  11657. }
  11658. //-------------------------------------------
  11659. case SessionStopRequest: //53,
  11660. {
  11661. if (Proc_din_SessionStopReq(AcceptFd) == 0)
  11662. {
  11663. Update_V2G_Flow_Status(SessionStopResponse);
  11664. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11665. }
  11666. else
  11667. {
  11668. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  11669. Update_V2G_Flow_Status(Other_Fault);
  11670. }
  11671. req_is_responsed = TRUE;
  11672. break;
  11673. }
  11674. case SessionStopResponse: //54,
  11675. {
  11676. break;
  11677. }
  11678. //-------------------------------------------
  11679. default:
  11680. {
  11681. break;
  11682. }
  11683. }
  11684. }
  11685. return 0;
  11686. }
  11687. /*===========================================================================
  11688. FUNCTION: V2gMsg_Process_iso1_DC
  11689. DESCRIPTION:
  11690. PRE-CONDITION:
  11691. INPUT:
  11692. 1. V2gFlowStatus
  11693. OUTPUT:
  11694. GLOBAL VARIABLES:
  11695. 1. V2gFlowStatus
  11696. =============================================================================*/
  11697. int V2gMsg_Process_iso1_DC(int AcceptFd)
  11698. {
  11699. unsigned char req_is_responsed = FALSE;
  11700. while (req_is_responsed == FALSE)
  11701. {
  11702. //Check if it is in End_Process
  11703. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  11704. {
  11705. break;
  11706. }
  11707. switch(V2gFlowStatus)
  11708. {
  11709. //-------------------------------------------
  11710. case SupportedAppProtocolRequest:
  11711. {
  11712. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  11713. {
  11714. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  11715. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  11716. {
  11717. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11718. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  11719. }
  11720. else
  11721. {
  11722. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  11723. Update_V2G_Flow_Status(Other_Fault);
  11724. }
  11725. }
  11726. req_is_responsed = TRUE;
  11727. break;
  11728. }
  11729. case SupportedAppProtocolResponse:
  11730. {
  11731. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  11732. {
  11733. Update_V2G_Flow_Status(SessionSetupRequest);
  11734. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11735. }
  11736. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11737. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11738. {
  11739. sprintf((char*)buf_log_evcomm,
  11740. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11741. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11742. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11743. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11744. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11745. }
  11746. else
  11747. {
  11748. }
  11749. break;
  11750. }
  11751. //-------------------------------------------
  11752. case SessionSetupRequest: //19
  11753. {
  11754. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  11755. {
  11756. Update_V2G_Flow_Status(SessionSetupResponse);
  11757. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11758. }
  11759. else
  11760. {
  11761. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  11762. Update_V2G_Flow_Status(Other_Fault);
  11763. }
  11764. req_is_responsed = TRUE;
  11765. break;
  11766. }
  11767. case SessionSetupResponse: //20
  11768. {
  11769. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  11770. {
  11771. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  11772. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11773. }
  11774. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11775. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11776. {
  11777. sprintf((char*)buf_log_evcomm,
  11778. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11779. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11780. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11781. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11782. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11783. }
  11784. else
  11785. {
  11786. }
  11787. break;
  11788. }
  11789. //-------------------------------------------
  11790. case ServiceDiscoveryRequest: //21
  11791. {
  11792. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  11793. {
  11794. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  11795. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11796. }
  11797. else
  11798. {
  11799. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  11800. Update_V2G_Flow_Status(Other_Fault);
  11801. }
  11802. req_is_responsed = TRUE;
  11803. break;
  11804. }
  11805. case ServiceDiscoveryResponse: //22
  11806. {
  11807. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  11808. {
  11809. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  11810. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11811. }
  11812. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11813. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11814. {
  11815. sprintf((char*)buf_log_evcomm,
  11816. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11817. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11818. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11819. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11820. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11821. }
  11822. else
  11823. {
  11824. }
  11825. break;
  11826. }
  11827. //-------------------------------------------
  11828. case ServiceAndPaymentSelectionRequest: //25
  11829. {
  11830. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  11831. {
  11832. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  11833. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11834. }
  11835. else
  11836. {
  11837. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  11838. Update_V2G_Flow_Status(Other_Fault);
  11839. }
  11840. req_is_responsed = TRUE;
  11841. break;
  11842. }
  11843. case ServiceAndPaymentSelectionResponse: //26
  11844. {
  11845. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11846. {
  11847. Update_V2G_Flow_Status(AuthorizationRequest);
  11848. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11849. }
  11850. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11851. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11852. {
  11853. sprintf((char*)buf_log_evcomm,
  11854. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11855. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11856. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11857. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11858. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11859. }
  11860. else
  11861. {
  11862. }
  11863. break;
  11864. }
  11865. //-------------------------------------------
  11866. //case ContractAuthenticationReq:
  11867. case AuthorizationRequest: //29
  11868. {
  11869. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  11870. {
  11871. Update_V2G_Flow_Status(AuthorizationResponse);
  11872. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11873. }
  11874. else
  11875. {
  11876. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11877. Update_V2G_Flow_Status(Other_Fault);
  11878. }
  11879. req_is_responsed = TRUE;
  11880. break;
  11881. }
  11882. case AuthorizationResponse: //30
  11883. {
  11884. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  11885. {
  11886. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11887. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  11888. {
  11889. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11890. }
  11891. else
  11892. {
  11893. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  11894. Update_V2G_Flow_Status(Other_Fault);
  11895. }
  11896. req_is_responsed = TRUE;
  11897. }
  11898. //Check for ChargeParameterDiscoveryReq
  11899. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11900. {
  11901. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11902. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  11903. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  11904. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11905. ftime(&SeqStartTime);
  11906. #endif
  11907. }
  11908. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  11909. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  11910. {
  11911. sprintf((char*)buf_log_evcomm,
  11912. "[ERROR]SequenceError(%d) => Tx Res MSG",
  11913. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11914. EVCOMM_SYS_INFO.SequenceError = TRUE;
  11915. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  11916. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11917. }
  11918. else
  11919. {
  11920. }
  11921. break;
  11922. }
  11923. //-------------------------------------------
  11924. case ChargeParameterDiscoveryRequest: //35
  11925. {
  11926. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11927. {
  11928. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  11929. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11930. }
  11931. else
  11932. {
  11933. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11934. Update_V2G_Flow_Status(Other_Fault);
  11935. }
  11936. req_is_responsed = TRUE;
  11937. break;
  11938. }
  11939. case ChargeParameterDiscoveryResponse:
  11940. {
  11941. //STEP 1: Check for Process Timeout
  11942. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11943. ftime(&SeqEndTime);
  11944. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  11945. {
  11946. sprintf((char*)buf_log_evcomm,
  11947. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  11948. DiffTimeb(SeqStartTime, SeqEndTime),
  11949. V2G_SECC_ChargingParameter_Performance_Time);
  11950. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  11951. Update_V2G_Flow_Status(Sequence_Timeout);
  11952. break;
  11953. }
  11954. #endif
  11955. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  11956. {
  11957. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11958. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  11959. {
  11960. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11961. }
  11962. else
  11963. {
  11964. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  11965. Update_V2G_Flow_Status(Other_Fault);
  11966. }
  11967. req_is_responsed = TRUE;
  11968. }
  11969. //STEP 2: Check for CableCheckReq message
  11970. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  11971. {
  11972. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11973. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  11974. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  11975. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  11976. Update_V2G_Flow_Status(CableCheckRequest);
  11977. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11978. ftime(&SeqStartTime);
  11979. #endif
  11980. }
  11981. //STEP 3: Wait for PowerDeliveryReq Message
  11982. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  11983. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  11984. {
  11985. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  11986. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  11987. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  11988. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  11989. ftime(&SeqStartTime);
  11990. #endif
  11991. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  11992. {
  11993. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  11994. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  11995. }
  11996. else
  11997. {
  11998. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  11999. Update_V2G_Flow_Status(Other_Fault);
  12000. }
  12001. break;
  12002. }
  12003. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12004. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12005. {
  12006. sprintf((char*)buf_log_evcomm,
  12007. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12008. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12009. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12010. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12011. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12012. }
  12013. else
  12014. {
  12015. }
  12016. break;
  12017. }
  12018. //-------------------------------------------
  12019. case CableCheckRequest: //37
  12020. {
  12021. //STEP 3: Execute Cable Check Process
  12022. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  12023. {
  12024. Update_V2G_Flow_Status(CableCheckResponse);
  12025. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12026. }
  12027. else
  12028. {
  12029. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  12030. Update_V2G_Flow_Status(Other_Fault);
  12031. }
  12032. req_is_responsed = TRUE;
  12033. break;
  12034. }
  12035. case CableCheckResponse: //38
  12036. {
  12037. //STEP 1: Check for Process Timeout
  12038. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12039. ftime(&SeqEndTime);
  12040. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  12041. {
  12042. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  12043. sprintf((char*)buf_log_evcomm,
  12044. "CableCheck Timeout - (%.02lf of %d ms)\n",
  12045. DiffTimeb(SeqStartTime, SeqEndTime),
  12046. V2G_SECC_CableCheck_Performance_Time);
  12047. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12048. Update_V2G_Flow_Status(Sequence_Timeout);
  12049. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12050. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  12051. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12052. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12053. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12054. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12055. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  12056. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  12057. break;
  12058. }
  12059. #endif
  12060. //STEP 2: Check for CableCheckReq message
  12061. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  12062. {
  12063. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12064. //STEP 3: Execute Cable Check Process
  12065. if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
  12066. {
  12067. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12068. }
  12069. else
  12070. {
  12071. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  12072. Update_V2G_Flow_Status(Other_Fault);
  12073. }
  12074. req_is_responsed = TRUE;
  12075. }
  12076. //STEP 3: Check for PreChargeReq message
  12077. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12078. {
  12079. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12080. Update_V2G_Flow_Status(PreChargeRequest);
  12081. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  12082. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  12083. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  12084. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12085. ftime(&SeqStartTime);
  12086. #endif
  12087. }
  12088. //STEP 3: Wait for PowerDeliveryReq Message
  12089. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12090. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12091. {
  12092. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12093. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12094. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12095. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12096. ftime(&SeqStartTime);
  12097. #endif
  12098. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12099. {
  12100. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12101. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12102. }
  12103. else
  12104. {
  12105. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12106. Update_V2G_Flow_Status(Other_Fault);
  12107. }
  12108. }
  12109. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12110. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12111. {
  12112. sprintf((char*)buf_log_evcomm,
  12113. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12114. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12115. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12116. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12117. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12118. }
  12119. else
  12120. {
  12121. }
  12122. break;
  12123. }
  12124. //-------------------------------------------
  12125. case PreChargeRequest: //39
  12126. {
  12127. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  12128. {
  12129. Update_V2G_Flow_Status(PreChargeResponse);
  12130. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12131. }
  12132. else
  12133. {
  12134. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  12135. Update_V2G_Flow_Status(Other_Fault);
  12136. }
  12137. req_is_responsed = TRUE;
  12138. break;
  12139. }
  12140. case PreChargeResponse: //40
  12141. {
  12142. //STEP 1: Check for Process Timeout
  12143. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12144. ftime(&SeqEndTime);
  12145. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  12146. {
  12147. sprintf((char*)buf_log_evcomm,
  12148. "Precharge Timeout - (%.02lf of %d ms)\n",
  12149. DiffTimeb(SeqStartTime, SeqEndTime),
  12150. V2G_SECC_PreCharge_Performance_Time);
  12151. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12152. Update_V2G_Flow_Status(Sequence_Timeout);
  12153. //Update_ShmStatusCode(); //[To-Do] to be implemented
  12154. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  12155. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  12156. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  12157. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  12158. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  12159. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  12160. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  12161. break;
  12162. }
  12163. #endif
  12164. //STEP 2: Check for PreChargeReq message
  12165. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  12166. {
  12167. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12168. if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
  12169. {
  12170. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12171. }
  12172. else
  12173. {
  12174. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  12175. Update_V2G_Flow_Status(Other_Fault);
  12176. }
  12177. req_is_responsed = TRUE;
  12178. }
  12179. //STEP 3: Check for PowerDeliveryReq message
  12180. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12181. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12182. {
  12183. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12184. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  12185. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  12186. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12187. ftime(&SeqStartTime);
  12188. #endif
  12189. }
  12190. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12191. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12192. {
  12193. sprintf((char*)buf_log_evcomm,
  12194. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12195. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12196. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12197. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12198. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12199. }
  12200. else
  12201. {
  12202. }
  12203. break;
  12204. }
  12205. //-------------------------------------------
  12206. case PowerDeliveryRequestStart: //41
  12207. {
  12208. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  12209. {
  12210. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  12211. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12212. }
  12213. else
  12214. {
  12215. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  12216. Update_V2G_Flow_Status(Other_Fault);
  12217. }
  12218. req_is_responsed = TRUE;
  12219. break;
  12220. }
  12221. case PowerDeliveryResponsetStart: //42
  12222. {
  12223. //STEP 1: Check for Process Timeout
  12224. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12225. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12226. {
  12227. ftime(&SeqEndTime);
  12228. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12229. {
  12230. sprintf((char*)buf_log_evcomm,
  12231. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  12232. DiffTimeb(SeqStartTime, SeqEndTime),
  12233. 2000);
  12234. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12235. Update_V2G_Flow_Status(Sequence_Timeout);
  12236. }
  12237. break;
  12238. }
  12239. #endif
  12240. //STEP 2: Wait for CurrentDemandReq Message
  12241. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12242. {
  12243. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12244. Update_V2G_Flow_Status(CurrentDemandRequest);
  12245. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  12246. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  12247. }
  12248. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12249. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12250. {
  12251. sprintf((char*)buf_log_evcomm,
  12252. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12253. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12254. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12255. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12256. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12257. }
  12258. else
  12259. {
  12260. }
  12261. break;
  12262. }
  12263. //-------------------------------------------
  12264. case CurrentDemandRequest: //45,
  12265. {
  12266. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  12267. {
  12268. Update_V2G_Flow_Status(CurrentDemandResponse);
  12269. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12270. }
  12271. else
  12272. {
  12273. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  12274. Update_V2G_Flow_Status(Other_Fault);
  12275. }
  12276. req_is_responsed = TRUE;
  12277. break;
  12278. }
  12279. case CurrentDemandResponse: //46,
  12280. {
  12281. //STEP 1: Wait for CurrentDemandReq Message
  12282. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  12283. {
  12284. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12285. if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
  12286. {
  12287. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12288. }
  12289. else
  12290. {
  12291. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  12292. Update_V2G_Flow_Status(Other_Fault);
  12293. }
  12294. req_is_responsed = TRUE;
  12295. }
  12296. //STEP 2: Wait for PowerDeliveryReq Message
  12297. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12298. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12299. {
  12300. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12301. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12302. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  12303. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12304. ftime(&SeqStartTime);
  12305. #endif
  12306. }
  12307. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12308. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12309. {
  12310. sprintf((char*)buf_log_evcomm,
  12311. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12312. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12313. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12314. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12315. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12316. }
  12317. else
  12318. {
  12319. }
  12320. break;
  12321. }
  12322. //-------------------------------------------
  12323. case PowerDeliveryRequestStop: //49,
  12324. {
  12325. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12326. {
  12327. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12328. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12329. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12330. ftime(&SeqStartTime);
  12331. #endif
  12332. }
  12333. else
  12334. {
  12335. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12336. Update_V2G_Flow_Status(Other_Fault);
  12337. }
  12338. req_is_responsed = TRUE;
  12339. break;
  12340. }
  12341. case PowerDeliveryResponseStop: //50,
  12342. {
  12343. //STEP 1: Check for Process Timeout
  12344. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12345. ftime(&SeqEndTime);
  12346. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12347. {
  12348. sprintf((char*)buf_log_evcomm,
  12349. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12350. DiffTimeb(SeqStartTime, SeqEndTime),
  12351. 2000);
  12352. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12353. Update_V2G_Flow_Status(Sequence_Timeout);
  12354. break;
  12355. }
  12356. #endif
  12357. //STEP 2: Check for WeldingDetectionReq Message
  12358. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12359. {
  12360. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12361. Update_V2G_Flow_Status(WeldingDetectionRequest);
  12362. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  12363. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  12364. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12365. ftime(&SeqStartTime);
  12366. #endif
  12367. }
  12368. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12369. {
  12370. Update_V2G_Flow_Status(SessionStopRequest);
  12371. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12372. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12373. {
  12374. Update_V2G_Flow_Status(SessionStopResponse);
  12375. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12376. }
  12377. else
  12378. {
  12379. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12380. Update_V2G_Flow_Status(Other_Fault);
  12381. }
  12382. }
  12383. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12384. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12385. {
  12386. sprintf((char*)buf_log_evcomm,
  12387. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12388. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12389. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12390. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12391. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12392. }
  12393. else
  12394. {
  12395. }
  12396. break;
  12397. }
  12398. //-------------------------------------------
  12399. case WeldingDetectionRequest: //51,
  12400. {
  12401. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  12402. {
  12403. Update_V2G_Flow_Status(WeldingDetectionResponse);
  12404. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12405. }
  12406. else
  12407. {
  12408. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  12409. Update_V2G_Flow_Status(Other_Fault);
  12410. }
  12411. req_is_responsed = TRUE;
  12412. break;
  12413. }
  12414. case WeldingDetectionResponse: //52,
  12415. {
  12416. //STEP 1: Check for Process Timeout
  12417. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12418. ftime(&SeqEndTime);
  12419. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  12420. {
  12421. sprintf((char*)buf_log_evcomm,
  12422. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12423. DiffTimeb(SeqStartTime, SeqEndTime),
  12424. V2G_SECC_WeldingDetection_Performance_Time);
  12425. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12426. Update_V2G_Flow_Status(Sequence_Timeout);
  12427. break;
  12428. }
  12429. #endif
  12430. //STEP 2: Check for WeldingDetectionReq Message
  12431. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  12432. {
  12433. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12434. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  12435. {
  12436. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12437. }
  12438. else
  12439. {
  12440. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  12441. Update_V2G_Flow_Status(Other_Fault);
  12442. }
  12443. req_is_responsed = TRUE;
  12444. }
  12445. //STEP 3: Check for SessionStopReq Message
  12446. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12447. {
  12448. Update_V2G_Flow_Status(SessionStopRequest);
  12449. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12450. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  12451. }
  12452. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12453. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12454. {
  12455. sprintf((char*)buf_log_evcomm,
  12456. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12457. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12458. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12459. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12460. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12461. }
  12462. else
  12463. {
  12464. }
  12465. break;
  12466. }
  12467. //-------------------------------------------
  12468. case SessionStopRequest: //53,
  12469. {
  12470. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12471. {
  12472. Update_V2G_Flow_Status(SessionStopResponse);
  12473. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12474. }
  12475. else
  12476. {
  12477. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12478. Update_V2G_Flow_Status(Other_Fault);
  12479. }
  12480. req_is_responsed = TRUE;
  12481. break;
  12482. }
  12483. case SessionStopResponse: //54,
  12484. {
  12485. break;
  12486. }
  12487. //-------------------------------------------
  12488. default:
  12489. {
  12490. break;
  12491. }
  12492. }
  12493. }
  12494. return 0;
  12495. }
  12496. /*===========================================================================
  12497. FUNCTION: V2gMsg_Process_iso1_AC
  12498. DESCRIPTION:
  12499. PRE-CONDITION:
  12500. INPUT:
  12501. 1. V2gFlowStatus
  12502. OUTPUT:
  12503. GLOBAL VARIABLES:
  12504. 1. V2gFlowStatus
  12505. =============================================================================*/
  12506. int V2gMsg_Process_iso1_AC(int AcceptFd)
  12507. {
  12508. unsigned char req_is_responsed = FALSE;
  12509. while (req_is_responsed == FALSE)
  12510. {
  12511. //Check if it is in End_Process
  12512. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  12513. {
  12514. break;
  12515. }
  12516. switch(V2gFlowStatus)
  12517. {
  12518. //-------------------------------------------
  12519. case SupportedAppProtocolRequest: //17
  12520. {
  12521. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  12522. {
  12523. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  12524. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  12525. {
  12526. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12527. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  12528. }
  12529. else
  12530. {
  12531. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  12532. Update_V2G_Flow_Status(Other_Fault);
  12533. }
  12534. }
  12535. req_is_responsed = TRUE;
  12536. break;
  12537. }
  12538. case SupportedAppProtocolResponse: //18
  12539. {
  12540. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  12541. {
  12542. Update_V2G_Flow_Status(SessionSetupRequest);
  12543. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12544. }
  12545. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12546. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12547. {
  12548. sprintf((char*)buf_log_evcomm,
  12549. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12550. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12551. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12552. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12553. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12554. }
  12555. else
  12556. {
  12557. }
  12558. break;
  12559. }
  12560. //-------------------------------------------
  12561. case SessionSetupRequest: //19
  12562. {
  12563. if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
  12564. {
  12565. Update_V2G_Flow_Status(SessionSetupResponse);
  12566. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12567. }
  12568. else
  12569. {
  12570. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  12571. Update_V2G_Flow_Status(Other_Fault);
  12572. }
  12573. req_is_responsed = TRUE;
  12574. break;
  12575. }
  12576. case SessionSetupResponse: //20
  12577. {
  12578. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  12579. {
  12580. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  12581. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12582. }
  12583. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12584. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12585. {
  12586. sprintf((char*)buf_log_evcomm,
  12587. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12588. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12589. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12590. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12591. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12592. }
  12593. else
  12594. {
  12595. }
  12596. break;
  12597. }
  12598. //-------------------------------------------
  12599. case ServiceDiscoveryRequest: //21
  12600. {
  12601. if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
  12602. {
  12603. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  12604. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12605. }
  12606. else
  12607. {
  12608. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  12609. Update_V2G_Flow_Status(Other_Fault);
  12610. }
  12611. req_is_responsed = TRUE;
  12612. break;
  12613. }
  12614. case ServiceDiscoveryResponse: //22
  12615. {
  12616. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  12617. {
  12618. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  12619. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12620. }
  12621. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12622. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12623. {
  12624. sprintf((char*)buf_log_evcomm,
  12625. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12626. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12627. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12628. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12629. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12630. }
  12631. else
  12632. {
  12633. }
  12634. break;
  12635. }
  12636. //-------------------------------------------
  12637. case ServiceAndPaymentSelectionRequest: //25
  12638. {
  12639. if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  12640. {
  12641. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  12642. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12643. }
  12644. else
  12645. {
  12646. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  12647. Update_V2G_Flow_Status(Other_Fault);
  12648. }
  12649. req_is_responsed = TRUE;
  12650. break;
  12651. }
  12652. case ServiceAndPaymentSelectionResponse://26
  12653. {
  12654. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12655. {
  12656. Update_V2G_Flow_Status(AuthorizationRequest);
  12657. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12658. }
  12659. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12660. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12661. {
  12662. sprintf((char*)buf_log_evcomm,
  12663. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12664. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12665. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12666. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12667. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12668. }
  12669. else
  12670. {
  12671. }
  12672. break;
  12673. }
  12674. //-------------------------------------------
  12675. //case ContractAuthenticationReq:
  12676. case AuthorizationRequest: //29
  12677. {
  12678. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  12679. {
  12680. Update_V2G_Flow_Status(AuthorizationResponse);
  12681. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12682. }
  12683. else
  12684. {
  12685. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  12686. Update_V2G_Flow_Status(Other_Fault);
  12687. }
  12688. break;
  12689. }
  12690. case AuthorizationResponse: //30
  12691. {
  12692. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  12693. {
  12694. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12695. if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
  12696. {
  12697. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12698. }
  12699. else
  12700. {
  12701. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  12702. Update_V2G_Flow_Status(Other_Fault);
  12703. }
  12704. req_is_responsed = TRUE;
  12705. }
  12706. //Check for ChargeParameterDiscoveryReq
  12707. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12708. {
  12709. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12710. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  12711. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  12712. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12713. ftime(&SeqStartTime);
  12714. #endif
  12715. }
  12716. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12717. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12718. {
  12719. sprintf((char*)buf_log_evcomm,
  12720. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12721. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12722. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12723. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12724. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12725. }
  12726. else
  12727. {
  12728. }
  12729. break;
  12730. }
  12731. //-------------------------------------------
  12732. case ChargeParameterDiscoveryRequest: //35
  12733. {
  12734. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12735. {
  12736. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  12737. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12738. }
  12739. else
  12740. {
  12741. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  12742. Update_V2G_Flow_Status(Other_Fault);
  12743. }
  12744. req_is_responsed = TRUE;
  12745. break;
  12746. }
  12747. case ChargeParameterDiscoveryResponse: //36
  12748. {
  12749. //STEP 1: Check for Process Timeout
  12750. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12751. ftime(&SeqEndTime);
  12752. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  12753. {
  12754. sprintf((char*)buf_log_evcomm,
  12755. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  12756. DiffTimeb(SeqStartTime, SeqEndTime),
  12757. V2G_SECC_ChargingParameter_Performance_Time);
  12758. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12759. Update_V2G_Flow_Status(Sequence_Timeout);
  12760. break;
  12761. }
  12762. #endif
  12763. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  12764. {
  12765. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12766. if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  12767. {
  12768. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12769. }
  12770. else
  12771. {
  12772. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  12773. Update_V2G_Flow_Status(Other_Fault);
  12774. }
  12775. req_is_responsed = TRUE;
  12776. }
  12777. //STEP 3: Wait for PowerDeliveryReq Message
  12778. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12779. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12780. {
  12781. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  12782. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12783. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  12784. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12785. ftime(&SeqStartTime);
  12786. #endif
  12787. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12788. {
  12789. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12790. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12791. }
  12792. else
  12793. {
  12794. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12795. Update_V2G_Flow_Status(Other_Fault);
  12796. }
  12797. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12798. ftime(&SeqStartTime);
  12799. #endif
  12800. }
  12801. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12802. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12803. {
  12804. sprintf((char*)buf_log_evcomm,
  12805. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12806. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12807. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12808. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12809. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12810. }
  12811. else
  12812. {
  12813. }
  12814. break;
  12815. }
  12816. //-------------------------------------------
  12817. case PowerDeliveryRequestStart: //41
  12818. {
  12819. if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
  12820. {
  12821. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  12822. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12823. }
  12824. else
  12825. {
  12826. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  12827. Update_V2G_Flow_Status(Other_Fault);
  12828. }
  12829. req_is_responsed = TRUE;
  12830. break;
  12831. }
  12832. case PowerDeliveryResponsetStart: //42
  12833. {
  12834. //STEP 1: Check for Process Timeout
  12835. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12836. if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  12837. {
  12838. ftime(&SeqEndTime);
  12839. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  12840. {
  12841. sprintf((char*)buf_log_evcomm,
  12842. "Wait for ChargingStatusReq Timeout - (%.02lf of %d ms)\n",
  12843. DiffTimeb(SeqStartTime, SeqEndTime),
  12844. 2000);
  12845. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12846. Update_V2G_Flow_Status(Sequence_Timeout);
  12847. }
  12848. break;
  12849. }
  12850. #endif
  12851. //STEP 2: Wait for ChargingStatusReq Message
  12852. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  12853. {
  12854. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12855. Update_V2G_Flow_Status(ChargingStatusRequest);
  12856. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargingStatusReq: energy transfering...");
  12857. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_Start);
  12858. }
  12859. else
  12860. {
  12861. }
  12862. break;
  12863. }
  12864. //-------------------------------------------
  12865. case ChargingStatusRequest: //43
  12866. {
  12867. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  12868. {
  12869. Update_V2G_Flow_Status(ChargingStatusResponse);
  12870. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12871. }
  12872. else
  12873. {
  12874. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargingStatusRes: fail");
  12875. Update_V2G_Flow_Status(Other_Fault);
  12876. }
  12877. req_is_responsed = TRUE;
  12878. break;
  12879. }
  12880. case ChargingStatusResponse: //44
  12881. {
  12882. //STEP 1: Wait for ChargingStatusReq Message
  12883. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
  12884. {
  12885. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12886. if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
  12887. {
  12888. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12889. }
  12890. else
  12891. {
  12892. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargingStatusRes: fail");
  12893. Update_V2G_Flow_Status(Other_Fault);
  12894. }
  12895. req_is_responsed = TRUE;
  12896. }
  12897. //STEP 2: Wait for PowerDeliveryReq Message
  12898. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  12899. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  12900. {
  12901. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  12902. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12903. ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_End);
  12904. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12905. ftime(&SeqStartTime);
  12906. #endif
  12907. }
  12908. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12909. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12910. {
  12911. sprintf((char*)buf_log_evcomm,
  12912. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12913. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12914. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12915. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12916. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12917. }
  12918. else
  12919. {
  12920. }
  12921. break;
  12922. }
  12923. //-------------------------------------------
  12924. case PowerDeliveryRequestStop: //49
  12925. {
  12926. if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
  12927. {
  12928. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  12929. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12930. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12931. ftime(&SeqStartTime);
  12932. #endif
  12933. }
  12934. else
  12935. {
  12936. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  12937. Update_V2G_Flow_Status(Other_Fault);
  12938. }
  12939. req_is_responsed = TRUE;
  12940. break;
  12941. }
  12942. case PowerDeliveryResponseStop: //50
  12943. {
  12944. //STEP 1: Check for Process Timeout
  12945. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  12946. ftime(&SeqEndTime);
  12947. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  12948. {
  12949. sprintf((char*)buf_log_evcomm,
  12950. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  12951. DiffTimeb(SeqStartTime, SeqEndTime),
  12952. 2000);
  12953. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  12954. Update_V2G_Flow_Status(Sequence_Timeout);
  12955. break;
  12956. }
  12957. #endif
  12958. //STEP 3: Check for SessionStopReq Message
  12959. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  12960. {
  12961. Update_V2G_Flow_Status(SessionStopRequest);
  12962. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12963. }
  12964. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  12965. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  12966. {
  12967. sprintf((char*)buf_log_evcomm,
  12968. "[ERROR]SequenceError(%d) => Tx Res MSG",
  12969. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12970. EVCOMM_SYS_INFO.SequenceError = TRUE;
  12971. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  12972. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  12973. }
  12974. else
  12975. {
  12976. }
  12977. break;
  12978. }
  12979. //-------------------------------------------
  12980. case SessionStopRequest: //53
  12981. {
  12982. if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
  12983. {
  12984. Update_V2G_Flow_Status(SessionStopResponse);
  12985. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  12986. }
  12987. else
  12988. {
  12989. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  12990. Update_V2G_Flow_Status(Other_Fault);
  12991. }
  12992. req_is_responsed = TRUE;
  12993. break;
  12994. }
  12995. case SessionStopResponse: //54
  12996. {
  12997. break;
  12998. }
  12999. //-------------------------------------------
  13000. default:
  13001. {
  13002. break;
  13003. }
  13004. }
  13005. }
  13006. return 0;
  13007. }
  13008. /*===========================================================================
  13009. FUNCTION: V2gMsg_Process_iso1
  13010. DESCRIPTION:
  13011. 1. EnergyTransferMode:
  13012. AC_single_phase_core = 0,
  13013. AC_three_phase_core = 1,
  13014. DC_core = 2,
  13015. DC_extended = 3,
  13016. DC_combo_core = 4,
  13017. DC_unique = 5
  13018. iso1EnergyTransferModeType_AC_single_phase_core = 0,
  13019. iso1EnergyTransferModeType_AC_three_phase_core = 1,
  13020. iso1EnergyTransferModeType_DC_core = 2,
  13021. iso1EnergyTransferModeType_DC_extended = 3,
  13022. iso1EnergyTransferModeType_DC_combo_core = 4,
  13023. iso1EnergyTransferModeType_DC_unique = 5
  13024. PRE-CONDITION:
  13025. INPUT:
  13026. 1. V2gFlowStatus
  13027. OUTPUT:
  13028. GLOBAL VARIABLES:
  13029. 1. V2gFlowStatus
  13030. =============================================================================*/
  13031. int V2gMsg_Process_iso1(int AcceptFd, unsigned char EnergyTransferMode)
  13032. {
  13033. switch (EnergyTransferMode)
  13034. {
  13035. case DC_extended:
  13036. {
  13037. V2gMsg_Process_iso1_DC(AcceptFd);
  13038. break;
  13039. }
  13040. case AC_single_phase_core:
  13041. case AC_three_phase_core:
  13042. {
  13043. V2gMsg_Process_iso1_AC(AcceptFd);
  13044. break;
  13045. }
  13046. default:
  13047. {
  13048. sprintf((char*)buf_log_evcomm,
  13049. "[ISO1][Warning]Unexpected EnergyTransferMode(%d)",
  13050. EnergyTransferMode);
  13051. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13052. break;
  13053. }
  13054. }
  13055. return 0;
  13056. }
  13057. /*===========================================================================
  13058. FUNCTION: V2gMsg_Process_iso2_DC
  13059. DESCRIPTION:
  13060. PRE-CONDITION:
  13061. INPUT:
  13062. 1. V2gFlowStatus
  13063. OUTPUT:
  13064. GLOBAL VARIABLES:
  13065. 1. V2gFlowStatus
  13066. =============================================================================*/
  13067. int V2gMsg_Process_iso2_DC(int AcceptFd)
  13068. {
  13069. unsigned char req_is_responsed = FALSE;
  13070. while (req_is_responsed == FALSE)
  13071. {
  13072. //Check if it is in End_Process
  13073. if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  13074. {
  13075. break;
  13076. }
  13077. switch(V2gFlowStatus)
  13078. {
  13079. //-------------------------------------------
  13080. case SupportedAppProtocolRequest:
  13081. {
  13082. if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
  13083. {
  13084. ccs_handshake.supportedAppProtocolReq_isUsed = 0;
  13085. if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
  13086. {
  13087. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13088. Update_V2G_Flow_Status(SupportedAppProtocolResponse);
  13089. }
  13090. else
  13091. {
  13092. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]supportedAppProtocolResReq: fail");
  13093. Update_V2G_Flow_Status(Other_Fault);
  13094. }
  13095. }
  13096. req_is_responsed = TRUE;
  13097. break;
  13098. }
  13099. case SupportedAppProtocolResponse:
  13100. {
  13101. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
  13102. {
  13103. Update_V2G_Flow_Status(SessionSetupRequest);
  13104. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13105. }
  13106. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13107. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13108. {
  13109. sprintf((char*)buf_log_evcomm,
  13110. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13111. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13112. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13113. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13114. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13115. }
  13116. else
  13117. {
  13118. }
  13119. break;
  13120. }
  13121. //-------------------------------------------
  13122. case SessionSetupRequest: //19
  13123. {
  13124. if (Proc_iso2_SessionSetupReq(AcceptFd) == 0)
  13125. {
  13126. Update_V2G_Flow_Status(SessionSetupResponse);
  13127. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13128. }
  13129. else
  13130. {
  13131. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionSetupReqRes: fail");
  13132. Update_V2G_Flow_Status(Other_Fault);
  13133. }
  13134. req_is_responsed = TRUE;
  13135. break;
  13136. }
  13137. case SessionSetupResponse: //20
  13138. {
  13139. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
  13140. {
  13141. Update_V2G_Flow_Status(ServiceDiscoveryRequest);
  13142. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13143. }
  13144. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13145. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13146. {
  13147. sprintf((char*)buf_log_evcomm,
  13148. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13149. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13150. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13151. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13152. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13153. }
  13154. else
  13155. {
  13156. }
  13157. break;
  13158. }
  13159. #if 0
  13160. //-------------------------------------------
  13161. case ServiceDiscoveryRequest: //21
  13162. {
  13163. if (Proc_iso2_ServiceDiscoveryReq(AcceptFd) == 0)
  13164. {
  13165. Update_V2G_Flow_Status(ServiceDiscoveryResponse);
  13166. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13167. }
  13168. else
  13169. {
  13170. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceDiscoveryReqRes: fail");
  13171. Update_V2G_Flow_Status(Other_Fault);
  13172. }
  13173. req_is_responsed = TRUE;
  13174. break;
  13175. }
  13176. case ServiceDiscoveryResponse: //22
  13177. {
  13178. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
  13179. {
  13180. Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
  13181. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13182. }
  13183. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13184. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13185. {
  13186. sprintf((char*)buf_log_evcomm,
  13187. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13188. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13189. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13190. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13191. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13192. }
  13193. else
  13194. {
  13195. break;
  13196. }
  13197. }
  13198. //-------------------------------------------
  13199. case ServiceAndPaymentSelectionRequest: //25
  13200. {
  13201. if (Proc_iso2_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
  13202. {
  13203. Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
  13204. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13205. }
  13206. else
  13207. {
  13208. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ServiceAndPaymentSelectionReqRes: fail");
  13209. Update_V2G_Flow_Status(Other_Fault);
  13210. }
  13211. req_is_responsed = TRUE;
  13212. break;
  13213. }
  13214. case ServiceAndPaymentSelectionResponse: //26
  13215. {
  13216. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13217. {
  13218. Update_V2G_Flow_Status(AuthorizationRequest);
  13219. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13220. }
  13221. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13222. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13223. {
  13224. sprintf((char*)buf_log_evcomm,
  13225. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13226. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13227. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13228. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13229. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13230. }
  13231. else
  13232. {
  13233. break;
  13234. }
  13235. }
  13236. //-------------------------------------------
  13237. //case ContractAuthenticationReq:
  13238. case AuthorizationRequest: //29
  13239. {
  13240. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  13241. {
  13242. Update_V2G_Flow_Status(AuthorizationResponse);
  13243. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13244. }
  13245. else
  13246. {
  13247. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  13248. Update_V2G_Flow_Status(Other_Fault);
  13249. }
  13250. req_is_responsed = TRUE;
  13251. break;
  13252. }
  13253. case AuthorizationResponse: //30
  13254. {
  13255. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
  13256. {
  13257. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13258. if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
  13259. {
  13260. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13261. }
  13262. else
  13263. {
  13264. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]AuthorizationReqRes: fail");
  13265. Update_V2G_Flow_Status(Other_Fault);
  13266. }
  13267. req_is_responsed = TRUE;
  13268. break;
  13269. }
  13270. //Check for ChargeParameterDiscoveryReq
  13271. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13272. {
  13273. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13274. Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
  13275. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
  13276. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13277. ftime(&SeqStartTime);
  13278. #endif
  13279. }
  13280. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13281. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13282. {
  13283. sprintf((char*)buf_log_evcomm,
  13284. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13285. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13286. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13287. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13288. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13289. }
  13290. else
  13291. {
  13292. break;
  13293. }
  13294. }
  13295. //-------------------------------------------
  13296. case ChargeParameterDiscoveryRequest: //35
  13297. {
  13298. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13299. {
  13300. Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
  13301. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13302. }
  13303. else
  13304. {
  13305. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  13306. Update_V2G_Flow_Status(Other_Fault);
  13307. }
  13308. req_is_responsed = TRUE;
  13309. break;
  13310. }
  13311. case ChargeParameterDiscoveryResponse:
  13312. {
  13313. //STEP 1: Check for Process Timeout
  13314. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13315. ftime(&SeqEndTime);
  13316. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
  13317. {
  13318. sprintf((char*)buf_log_evcomm,
  13319. "ChargingParameter Timeout - (%.02lf of %d ms)\n",
  13320. DiffTimeb(SeqStartTime, SeqEndTime),
  13321. V2G_SECC_ChargingParameter_Performance_Time);
  13322. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13323. Update_V2G_Flow_Status(Sequence_Timeout);
  13324. break;
  13325. }
  13326. #endif
  13327. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
  13328. {
  13329. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13330. if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
  13331. {
  13332. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13333. }
  13334. else
  13335. {
  13336. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]ChargeParameterDiscoveryReqRes: fail");
  13337. Update_V2G_Flow_Status(Other_Fault);
  13338. }
  13339. req_is_responsed = TRUE;
  13340. break;
  13341. }
  13342. //STEP 2: Check for CableCheckReq message
  13343. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13344. {
  13345. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13346. Update_V2G_Flow_Status(CableCheckRequest);
  13347. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CableCheckReqReq: isolated?");
  13348. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
  13349. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13350. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13351. ftime(&SeqStartTime);
  13352. #endif
  13353. }
  13354. //STEP 3: Wait for PowerDeliveryReq Message
  13355. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13356. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13357. {
  13358. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13359. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13360. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13361. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13362. ftime(&SeqStartTime);
  13363. #endif
  13364. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13365. {
  13366. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13367. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13368. }
  13369. else
  13370. {
  13371. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13372. Update_V2G_Flow_Status(Other_Fault);
  13373. }
  13374. break;
  13375. }
  13376. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13377. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13378. {
  13379. sprintf((char*)buf_log_evcomm,
  13380. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13381. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13382. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13383. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13384. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13385. }
  13386. else
  13387. {
  13388. break;
  13389. }
  13390. }
  13391. //-------------------------------------------
  13392. case CableCheckRequest: //37
  13393. {
  13394. //STEP 3: Execute Cable Check Process
  13395. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  13396. {
  13397. Update_V2G_Flow_Status(CableCheckResponse);
  13398. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13399. }
  13400. else
  13401. {
  13402. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  13403. Update_V2G_Flow_Status(Other_Fault);
  13404. }
  13405. req_is_responsed = TRUE;
  13406. break;
  13407. }
  13408. case CableCheckResponse: //38
  13409. {
  13410. //STEP 1: Check for Process Timeout
  13411. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13412. ftime(&SeqEndTime);
  13413. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
  13414. {
  13415. //SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[CableCheck] end counting...");
  13416. sprintf((char*)buf_log_evcomm,
  13417. "CableCheck Timeout - (%.02lf of %d ms)\n",
  13418. DiffTimeb(SeqStartTime, SeqEndTime),
  13419. V2G_SECC_CableCheck_Performance_Time);
  13420. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13421. Update_V2G_Flow_Status(Sequence_Timeout);
  13422. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13423. //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
  13424. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13425. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13426. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13427. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13428. ShmStatusCodeData->PresentStatusCode[0][4] = 4;
  13429. ShmStatusCodeData->PresentStatusCode[0][5] = 7;
  13430. break;
  13431. }
  13432. #endif
  13433. //STEP 2: Check for CableCheckReq message
  13434. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
  13435. {
  13436. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13437. //STEP 3: Execute Cable Check Process
  13438. if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
  13439. {
  13440. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13441. }
  13442. else
  13443. {
  13444. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CableCheckReqRes: fail");
  13445. Update_V2G_Flow_Status(Other_Fault);
  13446. }
  13447. req_is_responsed = TRUE;
  13448. break;
  13449. }
  13450. //STEP 3: Check for PreChargeReq message
  13451. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13452. {
  13453. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13454. Update_V2G_Flow_Status(PreChargeRequest);
  13455. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
  13456. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
  13457. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
  13458. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13459. ftime(&SeqStartTime);
  13460. #endif
  13461. }
  13462. //STEP 3: Wait for PowerDeliveryReq Message
  13463. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13464. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13465. {
  13466. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13467. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13468. //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
  13469. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13470. ftime(&SeqStartTime);
  13471. #endif
  13472. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13473. {
  13474. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13475. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13476. }
  13477. else
  13478. {
  13479. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13480. Update_V2G_Flow_Status(Other_Fault);
  13481. }
  13482. break;
  13483. }
  13484. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13485. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13486. {
  13487. sprintf((char*)buf_log_evcomm,
  13488. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13489. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13490. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13491. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13492. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13493. }
  13494. else
  13495. {
  13496. break;
  13497. }
  13498. }
  13499. //-------------------------------------------
  13500. case PreChargeRequest: //39
  13501. {
  13502. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  13503. {
  13504. Update_V2G_Flow_Status(PreChargeResponse);
  13505. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13506. }
  13507. else
  13508. {
  13509. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  13510. Update_V2G_Flow_Status(Other_Fault);
  13511. }
  13512. req_is_responsed = TRUE;
  13513. break;
  13514. }
  13515. case PreChargeResponse: //40
  13516. {
  13517. //STEP 1: Check for Process Timeout
  13518. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13519. ftime(&SeqEndTime);
  13520. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
  13521. {
  13522. sprintf((char*)buf_log_evcomm,
  13523. "Precharge Timeout - (%.02lf of %d ms)\n",
  13524. DiffTimeb(SeqStartTime, SeqEndTime),
  13525. V2G_SECC_PreCharge_Performance_Time);
  13526. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13527. Update_V2G_Flow_Status(Sequence_Timeout);
  13528. //Update_ShmStatusCode(); //[To-Do] to be implemented
  13529. //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
  13530. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  13531. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  13532. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  13533. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  13534. ShmStatusCodeData->PresentStatusCode[0][4] = 5;
  13535. ShmStatusCodeData->PresentStatusCode[0][5] = 0;
  13536. break;
  13537. }
  13538. #endif
  13539. //STEP 2: Check for PreChargeReq message
  13540. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
  13541. {
  13542. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13543. if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
  13544. {
  13545. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13546. }
  13547. else
  13548. {
  13549. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PreChargeReqRes: fail");
  13550. Update_V2G_Flow_Status(Other_Fault);
  13551. }
  13552. req_is_responsed = TRUE;
  13553. break;
  13554. }
  13555. //STEP 3: Check for PowerDeliveryReq message
  13556. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13557. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13558. {
  13559. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13560. Update_V2G_Flow_Status(PowerDeliveryRequestStart);
  13561. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
  13562. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13563. ftime(&SeqStartTime);
  13564. #endif
  13565. }
  13566. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13567. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13568. {
  13569. sprintf((char*)buf_log_evcomm,
  13570. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13571. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13572. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13573. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13574. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13575. }
  13576. else
  13577. {
  13578. break;
  13579. }
  13580. }
  13581. //-------------------------------------------
  13582. case PowerDeliveryRequestStart: //41
  13583. {
  13584. if (Proc_iso2_PowerDeliveryStartReq(AcceptFd) == 0)
  13585. {
  13586. Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
  13587. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13588. }
  13589. else
  13590. {
  13591. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStartReqRes: fail");
  13592. Update_V2G_Flow_Status(Other_Fault);
  13593. }
  13594. req_is_responsed = TRUE;
  13595. break;
  13596. }
  13597. case PowerDeliveryResponsetStart: //42
  13598. {
  13599. //STEP 1: Check for Process Timeout
  13600. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13601. if (ccs_exi_doc_ISO2.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
  13602. {
  13603. ftime(&SeqEndTime);
  13604. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
  13605. {
  13606. sprintf((char*)buf_log_evcomm,
  13607. "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
  13608. DiffTimeb(SeqStartTime, SeqEndTime),
  13609. 2000);
  13610. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13611. Update_V2G_Flow_Status(Sequence_Timeout);
  13612. }
  13613. break;
  13614. }
  13615. #endif
  13616. //STEP 2: Wait for CurrentDemandReq Message
  13617. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13618. {
  13619. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13620. Update_V2G_Flow_Status(CurrentDemandRequest);
  13621. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]CurrentDemandReqReq: energy transfering...");
  13622. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
  13623. }
  13624. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13625. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13626. {
  13627. sprintf((char*)buf_log_evcomm,
  13628. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13629. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13630. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13631. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13632. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13633. }
  13634. else
  13635. {
  13636. break;
  13637. }
  13638. }
  13639. //-------------------------------------------
  13640. case CurrentDemandRequest: //45,
  13641. {
  13642. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  13643. {
  13644. Update_V2G_Flow_Status(CurrentDemandResponse);
  13645. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13646. }
  13647. else
  13648. {
  13649. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  13650. Update_V2G_Flow_Status(Other_Fault);
  13651. }
  13652. req_is_responsed = TRUE;
  13653. break;
  13654. }
  13655. case CurrentDemandResponse: //46,
  13656. {
  13657. //STEP 1: Wait for CurrentDemandReq Message
  13658. if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
  13659. {
  13660. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13661. if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
  13662. {
  13663. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13664. }
  13665. else
  13666. {
  13667. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]CurrentDemandReqRes: fail");
  13668. Update_V2G_Flow_Status(Other_Fault);
  13669. }
  13670. req_is_responsed = TRUE;
  13671. break;
  13672. }
  13673. //STEP 2: Wait for PowerDeliveryReq Message
  13674. else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
  13675. (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
  13676. {
  13677. Update_V2G_Flow_Status(PowerDeliveryRequestStop);
  13678. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13679. ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
  13680. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13681. ftime(&SeqStartTime);
  13682. #endif
  13683. }
  13684. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13685. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13686. {
  13687. sprintf((char*)buf_log_evcomm,
  13688. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13689. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13690. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13691. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13692. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13693. }
  13694. else
  13695. {
  13696. break;
  13697. }
  13698. }
  13699. //-------------------------------------------
  13700. case PowerDeliveryRequestStop: //49,
  13701. {
  13702. if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
  13703. {
  13704. Update_V2G_Flow_Status(PowerDeliveryResponseStop);
  13705. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13706. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13707. ftime(&SeqStartTime);
  13708. #endif
  13709. }
  13710. else
  13711. {
  13712. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]PowerDeliveryStopReqRes: fail");
  13713. Update_V2G_Flow_Status(Other_Fault);
  13714. }
  13715. req_is_responsed = TRUE;
  13716. break;
  13717. }
  13718. case PowerDeliveryResponseStop: //50,
  13719. {
  13720. //STEP 1: Check for Process Timeout
  13721. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13722. ftime(&SeqEndTime);
  13723. if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
  13724. {
  13725. sprintf((char*)buf_log_evcomm,
  13726. "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13727. DiffTimeb(SeqStartTime, SeqEndTime),
  13728. 2000);
  13729. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13730. Update_V2G_Flow_Status(Sequence_Timeout);
  13731. break;
  13732. }
  13733. #endif
  13734. //STEP 2: Check for WeldingDetectionReq Message
  13735. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13736. {
  13737. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13738. Update_V2G_Flow_Status(WeldingDetectionRequest);
  13739. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[V2G][Rx]WeldingDetectionReq: ongoing...");
  13740. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
  13741. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13742. ftime(&SeqStartTime);
  13743. #endif
  13744. }
  13745. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13746. {
  13747. Update_V2G_Flow_Status(SessionStopRequest);
  13748. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13749. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  13750. {
  13751. Update_V2G_Flow_Status(SessionStopResponse);
  13752. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13753. }
  13754. else
  13755. {
  13756. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  13757. Update_V2G_Flow_Status(Other_Fault);
  13758. }
  13759. break;
  13760. }
  13761. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13762. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13763. {
  13764. sprintf((char*)buf_log_evcomm,
  13765. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13766. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13767. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13768. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13769. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13770. }
  13771. else
  13772. {
  13773. break;
  13774. }
  13775. }
  13776. //-------------------------------------------
  13777. case WeldingDetectionRequest: //51,
  13778. {
  13779. if (Proc_iso2_WeldingDetectionReq(AcceptFd) == 0)
  13780. {
  13781. Update_V2G_Flow_Status(WeldingDetectionResponse);
  13782. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13783. }
  13784. else
  13785. {
  13786. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  13787. Update_V2G_Flow_Status(Other_Fault);
  13788. }
  13789. req_is_responsed = TRUE;
  13790. break;
  13791. }
  13792. case WeldingDetectionResponse: //52,
  13793. {
  13794. //STEP 1: Check for Process Timeout
  13795. #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
  13796. ftime(&SeqEndTime);
  13797. if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
  13798. {
  13799. sprintf((char*)buf_log_evcomm,
  13800. "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
  13801. DiffTimeb(SeqStartTime, SeqEndTime),
  13802. V2G_SECC_WeldingDetection_Performance_Time);
  13803. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13804. Update_V2G_Flow_Status(Sequence_Timeout);
  13805. break;
  13806. }
  13807. #endif
  13808. //STEP 2: Check for WeldingDetectionReq Message
  13809. if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
  13810. {
  13811. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13812. if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
  13813. {
  13814. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13815. }
  13816. else
  13817. {
  13818. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]WeldingDetectionReqRes: fail");
  13819. Update_V2G_Flow_Status(Other_Fault);
  13820. }
  13821. req_is_responsed = TRUE;
  13822. break;
  13823. }
  13824. //STEP 3: Check for SessionStopReq Message
  13825. else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
  13826. {
  13827. Update_V2G_Flow_Status(SessionStopRequest);
  13828. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13829. ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
  13830. }
  13831. else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
  13832. EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
  13833. {
  13834. sprintf((char*)buf_log_evcomm,
  13835. "[ERROR]SequenceError(%d) => Tx Res MSG",
  13836. EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13837. EVCOMM_SYS_INFO.SequenceError = TRUE;
  13838. Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
  13839. EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
  13840. }
  13841. else
  13842. {
  13843. break;
  13844. }
  13845. }
  13846. //-------------------------------------------
  13847. case SessionStopRequest: //53,
  13848. {
  13849. if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
  13850. {
  13851. Update_V2G_Flow_Status(SessionStopResponse);
  13852. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  13853. }
  13854. else
  13855. {
  13856. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Error]SessionStopReqRes: fail");
  13857. Update_V2G_Flow_Status(Other_Fault);
  13858. }
  13859. req_is_responsed = TRUE;
  13860. //break;
  13861. }
  13862. case SessionStopResponse: //54,
  13863. {
  13864. break;
  13865. }
  13866. #endif
  13867. //-------------------------------------------
  13868. default:
  13869. {
  13870. break;
  13871. }
  13872. }
  13873. }
  13874. return 0;
  13875. }
  13876. /*===========================================================================
  13877. FUNCTION: V2gMsg_Process_iso2_AC
  13878. DESCRIPTION:
  13879. PRE-CONDITION:
  13880. INPUT:
  13881. 1. V2gFlowStatus
  13882. OUTPUT:
  13883. GLOBAL VARIABLES:
  13884. 1. V2gFlowStatus
  13885. =============================================================================*/
  13886. int V2gMsg_Process_iso2_AC(int AcceptFd)
  13887. {
  13888. return 0;
  13889. }
  13890. /*===========================================================================
  13891. FUNCTION: V2gMsg_Process_iso2
  13892. DESCRIPTION:
  13893. PRE-CONDITION:
  13894. INPUT:
  13895. 1. V2gFlowStatus
  13896. OUTPUT:
  13897. GLOBAL VARIABLES:
  13898. 1. V2gFlowStatus
  13899. =============================================================================*/
  13900. int V2gMsg_Process_iso2(int AcceptFd, unsigned char EnergyTransferMode)
  13901. {
  13902. switch (EnergyTransferMode)
  13903. {
  13904. case DC_extended:
  13905. {
  13906. V2gMsg_Process_iso2_DC(AcceptFd);
  13907. break;
  13908. }
  13909. case AC_single_phase_core:
  13910. case AC_three_phase_core:
  13911. {
  13912. V2gMsg_Process_iso2_AC(AcceptFd);
  13913. break;
  13914. }
  13915. default:
  13916. {
  13917. sprintf((char*)buf_log_evcomm,
  13918. "[ISO2][Warning]Unexpected EnergyTransferMode(%d)",
  13919. EnergyTransferMode);
  13920. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13921. break;
  13922. }
  13923. }
  13924. return 0;
  13925. }
  13926. /*===========================================================================
  13927. FUNCTION: V2gMsg_Process
  13928. DESCRIPTION:
  13929. PRE-CONDITION:
  13930. INPUT:
  13931. OUTPUT:
  13932. GLOBAL VARIABLES:
  13933. =============================================================================*/
  13934. int V2gMsg_Process(int AcceptFd)
  13935. {
  13936. int errn = 0;
  13937. switch (ShmCcsData->CommProtocol)
  13938. {
  13939. case V2GT_MSG_PROTOCOL_DIN70121: //0
  13940. {
  13941. V2gMsg_Process_din(AcceptFd);
  13942. break;
  13943. }
  13944. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  13945. {
  13946. V2gMsg_Process_iso1(AcceptFd, ShmCcsData->EnergyTransferMode);
  13947. break;
  13948. }
  13949. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  13950. {
  13951. V2gMsg_Process_iso2(AcceptFd, ShmCcsData->EnergyTransferMode);
  13952. break;
  13953. }
  13954. default:
  13955. {
  13956. sprintf((char*)buf_log_evcomm,
  13957. "[Warning]Unexpected CommProtocol(%d)",
  13958. ShmCcsData->CommProtocol);
  13959. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13960. break;
  13961. }
  13962. }
  13963. return errn;
  13964. }
  13965. /*===========================================================================
  13966. FUNCTION: V2gMsg_Rx
  13967. DESCRIPTION:
  13968. PRE-CONDITION:
  13969. INPUT:
  13970. OUTPUT:
  13971. GLOBAL VARIABLES:
  13972. =============================================================================*/
  13973. int V2gMsg_Rx(int AcceptFd)
  13974. {
  13975. int errn = 0;
  13976. unsigned int packet_size = 0;
  13977. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  13978. packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
  13979. //[CAUTION] Everytime recv() is called, it will take a default time to wait for TCP packets.
  13980. //The more time you call recv(), the more time you will waste here.
  13981. //Here it is suggested that response immediatedly once you receive any packets.
  13982. //For configuring the Rx waiting time, please use setsockopt().
  13983. if(packet_size > 0) //[Joseph] If there is no data, ignore. (TBD)
  13984. {
  13985. //DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got TCP V2GTP Message: size = %d Bytes\n", packet_size);
  13986. errn = V2gMsgDecoder(V2gtpMsgRxBuf, packet_size, V2gFlowStatus);
  13987. if (errn < 0)
  13988. {
  13989. sprintf((char*)buf_log_evcomm, "[ERROR]V2gMsgDecoder (%d)", errn);
  13990. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  13991. }
  13992. }
  13993. return errn;
  13994. }
  13995. /*===========================================================================
  13996. FUNCTION: V2gComm
  13997. DESCRIPTION:
  13998. PRE-CONDITION:
  13999. 1. TCP socket is connected.
  14000. INPUT:
  14001. 1. AcceptFd //TCP Connection ID
  14002. 2. V2gtpMsgRxBuf[] //V2GTP Messages (Header + Payload)
  14003. 3. V2GTP_MSG_RX_BUFFER_SIZE //64*1024 = 65,536 = 65.5K (Bytes)
  14004. OUTPUT:
  14005. GLOBAL VARIABLES:
  14006. 1. V2gtpMsgRxBuf[]
  14007. =============================================================================*/
  14008. int V2gComm(int AcceptFd)
  14009. {
  14010. int errn = 0;
  14011. if (V2gMsg_Rx(AcceptFd) < 0)
  14012. {
  14013. Update_V2G_Flow_Status(Other_Fault);
  14014. errn = -1;
  14015. }
  14016. //following are the response message handling according to status flag
  14017. if (V2gMsg_Process(AcceptFd) < 0)
  14018. {
  14019. errn = -1;
  14020. }
  14021. //Error Check
  14022. //V2G_Error_Monitor();
  14023. return errn;
  14024. }
  14025. /*===========================================================================
  14026. FUNCTION: SdpUdpConnected
  14027. DESCRIPTION:
  14028. PRE-CONDITION:
  14029. INPUT:
  14030. OUTPUT:
  14031. GLOBAL VARIABLES:
  14032. =============================================================================*/
  14033. int SdpUdpConnected()
  14034. {
  14035. int packet_size,Rtn;
  14036. struct sockaddr_in6 ServerAddr,ClientAddr;
  14037. struct V2gtpHeader *header;
  14038. unsigned char *payload;
  14039. if(UdpSock <= 0)
  14040. {
  14041. if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
  14042. {
  14043. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "SdpUdpConnected: Fail to open UdpSock");
  14044. return 0;
  14045. }
  14046. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  14047. ServerAddr.sin6_family = AF_INET6;
  14048. ServerAddr.sin6_addr = in6addr_any;
  14049. ServerAddr.sin6_port = htons(SdpUdpServerPort);
  14050. if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  14051. {
  14052. sprintf((char*)buf_log_evcomm,
  14053. "SdpUdpConnected: Fail to bind UdpSock(%d)",
  14054. UdpSock);
  14055. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14056. close(UdpSock);
  14057. UdpSock = -1;
  14058. return 0;
  14059. }
  14060. sprintf((char*)buf_log_evcomm, "[UdpSock]opend:%d", UdpSock);
  14061. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14062. sprintf((char*)buf_log_evcomm, "[SDP]Req from EVCC: waiting...(%d)", UdpSock);
  14063. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14064. }
  14065. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  14066. memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
  14067. Rtn = sizeof(struct sockaddr_in6);
  14068. packet_size = recvfrom(UdpSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, (socklen_t *)&Rtn);
  14069. if(packet_size > 0)
  14070. {
  14071. header = (struct V2gtpHeader *) V2gtpMsgRxBuf;
  14072. payload = V2gtpMsgRxBuf+sizeof(struct V2gtpHeader);
  14073. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  14074. {
  14075. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got UDP packet_size = %d (Bytes)\n", packet_size);
  14076. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
  14077. DEBUG_PRINTF_EVCOMM_DETAIL("***** Received SDP Packet *****\n");
  14078. DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
  14079. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  14080. for(Rtn = 0; Rtn < 16; Rtn += 2)
  14081. {
  14082. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  14083. }
  14084. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14085. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n",ClientAddr.sin6_port);
  14086. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n",header->ProtocolVersion);
  14087. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n",header->InverseProtocolVersion);
  14088. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n",htons(header->PayloadType));
  14089. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n",htonl(header->PayloadLength));
  14090. DEBUG_PRINTF_EVCOMM_DETAIL("htons(header->PayloadType)=0x%x\n",htons(header->PayloadType));
  14091. }
  14092. #endif
  14093. if( (header->ProtocolVersion == 0x01) &&
  14094. (header->InverseProtocolVersion == 0xFE) &&
  14095. (htons(header->PayloadType) == V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
  14096. {
  14097. sprintf((char*)buf_log_evcomm, "[SDP][Rx]Req from EVCC: GOT(%d)", UdpSock);
  14098. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14099. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", *(payload + 0));
  14100. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", *(payload + 1));
  14101. header->PayloadType = htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
  14102. header->PayloadLength = htonl(20); //Fixed Length=20
  14103. memset(payload, 0, 20);
  14104. // MAC address[0:2] + FFFE + MAC address[3:5]
  14105. payload[0] = (IPV6_LINK_LOCAL_PREFIX>>8) & 0xFF;
  14106. payload[1] = IPV6_LINK_LOCAL_PREFIX & 0xFF;
  14107. payload[8 ]= CsuMac[0];
  14108. payload[8] ^= 0x02;// bit 1 should complemented.
  14109. payload[9] = CsuMac[1];
  14110. payload[10] = CsuMac[2];
  14111. payload[11] = 0xFF;
  14112. payload[12] = 0xFE;
  14113. payload[13] = CsuMac[3];
  14114. payload[14] = CsuMac[4];
  14115. payload[15] = CsuMac[5];
  14116. //TCP port
  14117. payload[16] = (EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active>>8) & 0xFF;
  14118. payload[17] = EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active & 0xFF;
  14119. payload[18] = SDP_PAYLOAD_SECURITY_NONE; //Security
  14120. payload[19] = SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
  14121. //[To-Do] Setup the TCP in advance to receive the coming TCP handshke messages after SDP response.
  14122. Rtn = sendto(UdpSock, V2gtpMsgRxBuf, sizeof(struct V2gtpHeader) + htonl(header->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
  14123. sprintf((char*)buf_log_evcomm, "[SDP][Tx]Res from SECC");
  14124. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14125. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  14126. {
  14127. DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response SDP Packet *****\n");
  14128. DEBUG_PRINTF_EVCOMM_DETAIL("Send size=%d\n",Rtn);
  14129. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Address=");
  14130. for(Rtn = 0; Rtn < 16; Rtn++)
  14131. {
  14132. DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ", ClientAddr.sin6_addr.s6_addr[Rtn]);
  14133. }
  14134. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14135. DEBUG_PRINTF_EVCOMM_DETAIL("Destination Port=%d\n", ClientAddr.sin6_port);
  14136. DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n", header->ProtocolVersion);
  14137. DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n", header->InverseProtocolVersion);
  14138. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n", htons(header->PayloadType));
  14139. DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n", htonl(header->PayloadLength));
  14140. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Ipv6 Address=");
  14141. for(Rtn = 0; Rtn < 16; Rtn++)
  14142. {
  14143. DEBUG_PRINTF_EVCOMM_DETAIL("%02x:",payload[Rtn]);
  14144. }
  14145. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14146. DEBUG_PRINTF_EVCOMM_DETAIL("SECC Port=%d\n", (payload[16]<<8 | payload[17]));
  14147. DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", payload[19]);
  14148. DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", payload[20]);
  14149. }
  14150. #endif
  14151. if(Rtn > 0)
  14152. {
  14153. return 1;
  14154. }
  14155. }
  14156. }
  14157. return 0;
  14158. }
  14159. /*===========================================================================
  14160. FUNCTION: V2gTcpConnected
  14161. DESCRIPTION:
  14162. PRE-CONDITION:
  14163. INPUT:
  14164. OUTPUT:
  14165. GLOBAL VARIABLES:
  14166. =============================================================================*/
  14167. int V2gTcpConnected()
  14168. {
  14169. int Rtn,AcceptFd;
  14170. struct sockaddr_in6 ServerAddr,ClientAddr;
  14171. if(TcpSock <= 0)
  14172. {
  14173. if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) < 0)
  14174. {
  14175. sprintf((char*)buf_log_evcomm,
  14176. "V2gTcpConnected: Fail to open TcpSock (%s)",
  14177. strerror(errno));
  14178. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14179. usleep(100000); //100ms
  14180. return 0;
  14181. }
  14182. fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
  14183. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]socket set: DONE");
  14184. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  14185. ServerAddr.sin6_family = PF_INET6;
  14186. ServerAddr.sin6_addr = in6addr_any;
  14187. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  14188. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 10) + 1);
  14189. //printf("SdpTcpServerPort = %d(DEC)\n", htons(ServerAddr.sin6_port));
  14190. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  14191. {
  14192. sprintf((char*)buf_log_evcomm,
  14193. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  14194. strerror(errno),
  14195. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  14196. );
  14197. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14198. //Change to another TCP port
  14199. /*
  14200. memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
  14201. ServerAddr.sin6_family = PF_INET6;
  14202. ServerAddr.sin6_addr = in6addr_any;
  14203. //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 1000) + 1);
  14204. ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  14205. */
  14206. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
  14207. {
  14208. sprintf((char*)buf_log_evcomm,
  14209. "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
  14210. strerror(errno),
  14211. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
  14212. );
  14213. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14214. usleep(100000); //100ms
  14215. close(TcpSock);
  14216. TcpSock = -1;
  14217. return 0;
  14218. }
  14219. }
  14220. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]blid: DONE");
  14221. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]listen: START");
  14222. if(listen(TcpSock, 1) == -1) //only accept one connection
  14223. {
  14224. sprintf((char*)buf_log_evcomm,
  14225. "V2gTcpConnected: Fail to listen TcpSock (%s)",
  14226. strerror(errno));
  14227. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14228. usleep(100000); //100ms
  14229. close(TcpSock);
  14230. TcpSock = -1;
  14231. return 0;
  14232. }
  14233. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]listen: DONE");
  14234. sprintf((char*)buf_log_evcomm, "[TCP]TcpSock: opened(%d), port=%d", TcpSock, htons(ServerAddr.sin6_port));
  14235. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14236. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]accept: START");
  14237. }
  14238. Rtn = sizeof(struct sockaddr_in6);
  14239. if((AcceptFd = accept(TcpSock, (struct sockaddr *)&ClientAddr, (socklen_t *)&Rtn)) == -1)
  14240. {
  14241. static BOOL tmp = 0;
  14242. if (tmp == 0)
  14243. {
  14244. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]Wait TCP connection...");
  14245. tmp = 1;
  14246. }
  14247. else
  14248. {
  14249. //DEBUG_PRINTF_EVCOMM_DETAIL(".");
  14250. }
  14251. return 0;
  14252. }
  14253. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[TCP]accept: DONE\n");
  14254. #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
  14255. {
  14256. DEBUG_PRINTF_EVCOMM_DETAIL("\n\nAccept one TCP connection:\n");
  14257. DEBUG_PRINTF_EVCOMM_DETAIL("AcceptFd=%d\n",AcceptFd);
  14258. DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
  14259. for(Rtn = 0; Rtn < 16; Rtn += 2)
  14260. {
  14261. DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:", ClientAddr.sin6_addr.s6_addr[Rtn], ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  14262. }
  14263. DEBUG_PRINTF_EVCOMM_DETAIL("\n");
  14264. DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n", ClientAddr.sin6_port);
  14265. }
  14266. #endif
  14267. return AcceptFd;
  14268. }
  14269. /*===========================================================================
  14270. FUNCTION: End_Process
  14271. DESCRIPTION:
  14272. PRE-CONDITION:
  14273. 1. <CAUTION> This function could only be used in SeccComm fork2.
  14274. INPUT:
  14275. OUTPUT:
  14276. GLOBAL VARIABLES:
  14277. =============================================================================*/
  14278. int End_Process()
  14279. {
  14280. if(EVCOMM_SYS_INFO.End_Process_inused == TRUE)
  14281. {
  14282. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "End_Process has been triggered by another event.");
  14283. return -1;
  14284. }
  14285. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Entering...");
  14286. //STEP 1: Ask CSU to Stop
  14287. EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  14288. CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
  14289. EVCOMM_SYS_INFO.ConnectorLocked = FALSE;
  14290. ShmInternalComm->ChargingPermission = FALSE;
  14291. //Step 2: Close sockets
  14292. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Close sockets...");
  14293. if(RawSock > 0)
  14294. {
  14295. close(RawSock);
  14296. }
  14297. if(UdpSock > 0)
  14298. {
  14299. close(UdpSock);
  14300. }
  14301. if(TcpSock > 0)
  14302. {
  14303. close(TcpSock);
  14304. close(TcpAcceptFd);
  14305. }
  14306. RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
  14307. //STEP 3: Switch to State E
  14308. //SwitchCpStateE(ENABLE);
  14309. //STEP 4: Close tcpdump
  14310. Sniffer_Tcpdump(DISABLE);
  14311. //STEP 5: Keep 100% PWM for 5 seconds
  14312. OutputCpPwmDuty(100);
  14313. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 5");
  14314. sleep(1);
  14315. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 4");
  14316. sleep(1);
  14317. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 3");
  14318. sleep(1);
  14319. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 2");
  14320. sleep(1);
  14321. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 1");
  14322. sleep(1);
  14323. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "PWM 100\% countdown: 0");
  14324. AttenProfileCnt = 0;
  14325. init_appHandEXIDocument(&ccs_handshake);
  14326. // Qca7kPowerReset(); //reset QCA7000 /* +++ 20200808, vern, should disconnected PLC connection after session stop ---*/
  14327. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  14328. {
  14329. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[End_Process]1st sync...");
  14330. system("sync");
  14331. }
  14332. #endif
  14333. //STEP 4: Switch to State E
  14334. //Keep State E for 5 seconds
  14335. #if 0
  14336. SwitchCpStateE(ENABLE); //Set PWM Duty as 0 and set State as E (0V)
  14337. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 5");
  14338. sleep(1);
  14339. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 4");
  14340. sleep(1);
  14341. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 3");
  14342. sleep(1);
  14343. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 2");
  14344. sleep(1);
  14345. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 1");
  14346. sleep(1);
  14347. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "State E countdown: 0");
  14348. #endif
  14349. //Reset Memory
  14350. unsigned char SlaveAddress_backup;
  14351. unsigned int matched_backup;
  14352. //unsigned char state_backup;
  14353. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "Soft reset (closing SeccComm)...");
  14354. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14355. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "-- EVCOMM: END --");
  14356. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------\n");
  14357. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  14358. {
  14359. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "2nd sync...");
  14360. system("sync");
  14361. }
  14362. #endif
  14363. system("sleep 1");
  14364. //Backup CsuComm flags
  14365. SlaveAddress_backup = ShmInternalComm->SlaveAddress;
  14366. matched_backup = CSUCOMMDC_TASK_FLAG.matched;
  14367. //state_backup = Check_V2G_Flow_Status();
  14368. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  14369. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14370. memset(&ccs_handshake, 0, sizeof(struct appHandEXIDocument));
  14371. memset(&ccs_exi_doc_DIN, 0, sizeof(struct dinEXIDocument));
  14372. memset(V2GTP_Tx_buf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14373. memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
  14374. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  14375. memset(ShmInternalComm, 0, sizeof(struct InternalComm));
  14376. memset(ShmCcsData, 0, sizeof(struct CcsData));
  14377. //Resume CsuComm flags
  14378. ShmInternalComm->SlaveAddress = SlaveAddress_backup;
  14379. CSUCOMMDC_TASK_FLAG.matched = matched_backup;
  14380. Sniffer_Candump(DISABLE);
  14381. Sniffer_Candump(ENABLE);
  14382. //memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo)); //EVCOMM_SYS_INFO.End_Process_inused = FALSE;
  14383. //EVCOMM_SYS_INFO.End_Process_inused = TRUE;
  14384. //Update_V2G_Flow_Status(state_backup);
  14385. //CP_Detection_Pid = 0;
  14386. //PP_Detection_Pid = 0;
  14387. //Error_Monitor_Pid = 0;
  14388. //system("cd /root;./reset_soft.sh");
  14389. system("pkill Module_CCS");
  14390. while(1)
  14391. {
  14392. //wait for CSU configrm
  14393. }
  14394. }
  14395. /*===========================================================================
  14396. FUNCTION: Parameters_Init
  14397. DESCRIPTION:
  14398. PRE-CONDITION:
  14399. INPUT:
  14400. OUTPUT:
  14401. GLOBAL VARIABLES:
  14402. =============================================================================*/
  14403. int Parameters_Init()
  14404. {
  14405. //Step 0: Generate random number
  14406. unsigned int value_random;
  14407. struct timeb time_seed;
  14408. ftime(&time_seed);
  14409. srand(time_seed.millitm);
  14410. //Step 1: Init SDP TCP Port
  14411. value_random = rand();
  14412. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active = (unsigned short)(SdpTcpServerPort + (value_random % 10000) + 1);
  14413. sprintf((char*)buf_log_evcomm,
  14414. "[Init]TCP Port:OK(%d)",
  14415. EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
  14416. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14417. //Step 2: Init SessionID
  14418. value_random = rand();
  14419. memcpy(&EVCOMM_SYS_INFO.SessionID[0], &value_random, 4);
  14420. value_random = rand();
  14421. memcpy(&EVCOMM_SYS_INFO.SessionID[4], &value_random, 4);
  14422. sprintf((char*)buf_log_evcomm,
  14423. "[Init]SessionID:OK(%02X%02X%02X%02X%02X%02X%02X%02X)",
  14424. EVCOMM_SYS_INFO.SessionID[0],
  14425. EVCOMM_SYS_INFO.SessionID[1],
  14426. EVCOMM_SYS_INFO.SessionID[2],
  14427. EVCOMM_SYS_INFO.SessionID[3],
  14428. EVCOMM_SYS_INFO.SessionID[4],
  14429. EVCOMM_SYS_INFO.SessionID[5],
  14430. EVCOMM_SYS_INFO.SessionID[6],
  14431. EVCOMM_SYS_INFO.SessionID[7]);
  14432. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14433. return 0;
  14434. }
  14435. /*===========================================================================
  14436. FUNCTION: AC share memory synchronize
  14437. DESCRIPTION:
  14438. PRE-CONDITION:
  14439. INPUT:
  14440. OUTPUT:
  14441. GLOBAL VARIABLES:
  14442. =============================================================================*/
  14443. int SyncAcShreaMemory()
  14444. {
  14445. #if (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE)
  14446. pid_t pid;
  14447. pid = fork();
  14448. if(pid == 0)
  14449. {
  14450. for(;;)
  14451. {
  14452. if(!EVCOMM_SYS_INFO.End_Process_inused)
  14453. {
  14454. for(uint8_t gun_index=0;gun_index<1;gun_index++)
  14455. {
  14456. //========================================
  14457. // CSU -> CCS setting
  14458. //========================================
  14459. // Permission
  14460. if(ShmInternalComm->ChargingPermission != ShmCharger->gun_info[gun_index].acCcsInfo.ChargingPermission)
  14461. {
  14462. DEBUG_INFO("AC permission: %d -> %d\n", ShmInternalComm->ChargingPermission, ShmCharger->gun_info[gun_index].acCcsInfo.ChargingPermission);
  14463. ShmInternalComm->ChargingPermission_new = ShmCharger->gun_info[gun_index].acCcsInfo.ChargingPermission;
  14464. ShmInternalComm->ChargingPermission_pre = ShmInternalComm->ChargingPermission;
  14465. ShmInternalComm->ChargingPermission = ShmInternalComm->ChargingPermission_new;
  14466. }
  14467. // CP
  14468. ShmInternalComm->AC_CpPositiveVoltage = ShmCharger->gun_info[gun_index].acCcsInfo.CpPositiveVoltage;
  14469. if(ShmInternalComm->AC_CpPresentState != ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState)
  14470. {
  14471. DEBUG_INFO("CP state: %d -> %d\n", ShmInternalComm->AC_CpPresentState, ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState);
  14472. ShmInternalComm->AC_CpPresentState = ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState;
  14473. }
  14474. //========================================
  14475. // CCS -> CSU check
  14476. //========================================
  14477. // V2G message flow status
  14478. if(ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus != Check_V2G_Flow_Status())
  14479. {
  14480. //DEBUG_INFO("PresentMsgFlowStatus: %d -> %d\n", ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus, Check_V2G_Flow_Status());
  14481. ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus = Check_V2G_Flow_Status();
  14482. switch(ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus)
  14483. {
  14484. case PowerDeliveryRequestStart ... ChargingStatusResponse:
  14485. ShmCharger->gun_info[gun_index].acCcsInfo.EVChargeProgress = HLC_START_MODE;
  14486. break;
  14487. case CM_SLAC_PARM_REQ ... PreChargeResponse:
  14488. ShmCharger->gun_info[gun_index].acCcsInfo.EVChargeProgress = HLC_STANDBY_MODE;
  14489. break;
  14490. default:
  14491. ShmCharger->gun_info[gun_index].acCcsInfo.EVChargeProgress = HLC_STOP_MODE;
  14492. break;
  14493. }
  14494. }
  14495. }
  14496. }
  14497. usleep(1000);
  14498. }
  14499. }
  14500. #endif
  14501. return 0;
  14502. }
  14503. /*===========================================================================
  14504. FUNCTION: main
  14505. DESCRIPTION:
  14506. PRE-CONDITION:
  14507. INPUT:
  14508. OUTPUT:
  14509. GLOBAL VARIABLES:
  14510. =============================================================================*/
  14511. int main(int argc, char *argv[])
  14512. {
  14513. //unsigned char Rtn;
  14514. //Initialization
  14515. ShareMemory_Init();
  14516. memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
  14517. if(RawSock > 0)
  14518. {
  14519. close(RawSock);
  14520. }
  14521. if(UdpSock > 0)
  14522. {
  14523. close(UdpSock);
  14524. }
  14525. if(TcpSock > 0)
  14526. {
  14527. close(TcpSock);
  14528. }
  14529. RawSock = UdpSock = TcpSock = -1;
  14530. Update_V2G_Flow_Status(IDLE);
  14531. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14532. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "-- EVCOMM: START --");
  14533. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "---------------------------------------------");
  14534. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "init...");
  14535. //Init V2G TCP/IPv6 packets buffer
  14536. memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
  14537. memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
  14538. //Release State E Control
  14539. SwitchCpStateE(DISABLE);
  14540. OutputCpPwmDuty(100);
  14541. //start to detect CP pilot state
  14542. CP_Detection_Pid = 0;
  14543. CP_Detection(); //fork1
  14544. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork1]CP Detection: ON");
  14545. //start to detect errors
  14546. Error_Monitor(); //fork2
  14547. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork2]Error Monitor: ON");
  14548. //start to detect PP
  14549. PP_Detection_Pid = 0;
  14550. #if (PP_PROTECTION_MECHANISM == ENABLE)
  14551. PP_Detection();
  14552. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork3]PP Detection: ON");
  14553. #else
  14554. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[fork3]PP Detection: OFF");
  14555. #endif
  14556. //Init communication parameters
  14557. GetEthMac((uint8_t*)QcaInterface, CsuMac);
  14558. AttenProfileCnt = 0;
  14559. init_appHandEXIDocument(&ccs_handshake);
  14560. //Init Energy transfer mode
  14561. //[To-Do] Parsing Model Name
  14562. ShmCcsData->EnergyTransferMode = CCS_ENERGY_TRANSFER_MODE;
  14563. //struct ChargingInfoData *ccs;
  14564. //ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
  14565. Parameters_Init();
  14566. Sniffer_Tcpdump(ENABLE);
  14567. #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
  14568. sleep(1); //wait for tcpdump getting ready
  14569. #endif
  14570. SyncAcShreaMemory();
  14571. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", "[Init]DONE");
  14572. while(1)
  14573. {
  14574. //DEBUG_PRINTF_EVCOMM_DETAIL("\nV2gFlowStatus = %d\n", V2gFlowStatus);
  14575. //if((ShmInternalComm->ChargingPermission == 0x01) && (CheckConnectorPlugIn() == 1))
  14576. //if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
  14577. //if(ShmInternalComm->ChargingPermission == 0x01)
  14578. //if(CheckConnectorPlugIn() == TRUE)
  14579. if (EVCOMM_SYS_INFO.End_Process_inused == FALSE)
  14580. {
  14581. if(V2gFlowStatus < SLACC_SDP_UDP_Connection)
  14582. {
  14583. SlacComm();
  14584. }
  14585. else if(V2gFlowStatus == SLACC_SDP_UDP_Connection)
  14586. {
  14587. if(SdpUdpConnected() == 1)
  14588. {
  14589. Update_V2G_Flow_Status(SLACC_SDP_TCP_Connection);
  14590. continue;
  14591. }
  14592. SlacComm(); //TC_SECC_VTB_CmSlacMatch_004
  14593. ftime(&SeqEndTime);
  14594. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  14595. {
  14596. sprintf((char*)buf_log_evcomm,
  14597. "Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join (%.02lf of %d ms)\n",
  14598. DiffTimeb(SeqStartTime, SeqEndTime),
  14599. TT_match_join);
  14600. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14601. Update_V2G_Flow_Status(Sequence_Timeout);
  14602. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14603. //CCS_SECC_TIMEOUT_SLACC_SDP_UDP_TT_match_join (023823)
  14604. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14605. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14606. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14607. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14608. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  14609. ShmStatusCodeData->PresentStatusCode[0][5] = 3;
  14610. //CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  14611. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  14612. }
  14613. }
  14614. else if(V2gFlowStatus == SLACC_SDP_TCP_Connection)
  14615. {
  14616. if((TcpAcceptFd = V2gTcpConnected()) > 0)
  14617. {
  14618. Update_V2G_Flow_Status(SupportedAppProtocolRequest);
  14619. ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
  14620. continue;
  14621. }
  14622. SlacComm();
  14623. ftime(&SeqEndTime);
  14624. if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
  14625. {
  14626. sprintf((char*)buf_log_evcomm,
  14627. "Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join (%.02lf / %d ms)",
  14628. DiffTimeb(SeqStartTime, SeqEndTime),
  14629. TT_match_join);
  14630. SAVE_SYS_LOG_MSG_EVCOMM("%s\n", buf_log_evcomm);
  14631. Update_V2G_Flow_Status(Sequence_Timeout);
  14632. //Update_ShmStatusCode(); //[To-Do] to be implemented
  14633. //CCS_SECC_TIMEOUT_SLACC_SDP_TCP_TT_match_join (023824)
  14634. ShmStatusCodeData->PresentStatusCode[0][0] = 0;
  14635. ShmStatusCodeData->PresentStatusCode[0][1] = 2;
  14636. ShmStatusCodeData->PresentStatusCode[0][2] = 3;
  14637. ShmStatusCodeData->PresentStatusCode[0][3] = 8;
  14638. ShmStatusCodeData->PresentStatusCode[0][4] = 2;
  14639. ShmStatusCodeData->PresentStatusCode[0][5] = 4;
  14640. //CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
  14641. Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
  14642. }
  14643. }
  14644. else if(V2gFlowStatus <= SessionStopResponse)
  14645. {
  14646. if (V2gComm(TcpAcceptFd) < 0)
  14647. {
  14648. //error occours
  14649. }
  14650. }
  14651. else if (V2gFlowStatus >= Performance_Timeout)
  14652. {
  14653. //End_Process
  14654. }
  14655. else
  14656. {
  14657. //null
  14658. }
  14659. }
  14660. usleep(1000);
  14661. } //while
  14662. }//main while