123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988 |
- /*===========================================================================
- Combined Charging System (CCS): SECC
- EVComm.c
- initiated by Vern, Joseph
- (since 2019/07/19)
- =============================================================================*/
- #include <netinet/ip.h>
- #include <arpa/inet.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <linux/termios.h>
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- #include <stdlib.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/mman.h>
- #include <linux/sockios.h>
- #include <linux/socket.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/time.h>
- #include <sys/timeb.h>
- #include <math.h>//for pow
- #include <unistd.h>
- #include <linux/if_packet.h>
- #include <netinet/if_ether.h>
- #include <net/if.h>
- #include <netinet/ether.h>
- #include <errno.h>
- #include <linux/can.h>
- #include <linux/can/raw.h>
- #include <openssl/ssl.h>
- #include <openssl/err.h>
- #include "define.h"
- #include "SeccComm.h"
- #include "NidNmk.h"
- #include "SeccComm.h"
- #include "CsuComm.h"
- #include "./exi_engine/api/api.h"
- #include "./exi_engine/appHandshake/appHandEXIDatatypes.h"
- #include "./exi_engine/transport/v2gtp.h"
- int MeterSMId[8];
- struct SysConfigAndInfo *ShmSysConfigAndInfo;
- struct StatusCodeData *ShmStatusCodeData;
- struct CcsData *ShmCcsData;
- struct InternalComm *ShmInternalComm;
- //struct InternalCommAC *ShmInternalCommAC;
- struct appHandEXIDocument ccs_handshake;
- struct dinEXIDocument ccs_exi_doc_DIN;
- struct iso1EXIDocument ccs_exi_doc_ISO1;
- struct iso2EXIDocument ccs_exi_doc_ISO2;
- unsigned char V2GTP_Tx_buf[V2GTP_MSG_TX_BUFFER_SIZE]; //64*1024 ﺿ65,536 = 65.5KB
- unsigned char buf_log_evcomm[SIZE_OF_LOG_BUFFER];
- unsigned char buf_log_evcomm_fork1[SIZE_OF_LOG_BUFFER];
- unsigned char buf_log_evcomm_fork2[SIZE_OF_LOG_BUFFER];
- unsigned char buf_log_evcomm_fork3[SIZE_OF_LOG_BUFFER];
- pid_t CP_Detection_Pid = 0;
- pid_t PP_Detection_Pid = 0;
- pid_t Error_Monitor_Pid = 0;
- int TcpAcceptFd;
- #ifdef SUPPORT_TLS_CONNECTION
- SSL_CTX *ctx;
- SSL *ssl;
- unsigned char EvSecurity;
- #endif
- enum MsgFlowStatus V2gFlowStatus;
- int RawSock,UdpSock,TcpSock;
- unsigned char *V2gtpMsgRxBuf, *V2gtpMsgTxBuf;
- unsigned short Aag[64];
- struct MmeHeader SendMmePacket;
- int SendMmePacketSize;
- unsigned char CsuMac[6],QcaMac[6],EvMac[6],SlacRunId[8];
- struct sockaddr_ll DestSocketAddress;
- struct ifreq Req;
- unsigned int PwmStartTime;
- struct timeb SeqStartTime, SeqEndTime;
- unsigned char AagGroupsNum, MnbcSoundNum, AttenProfileCnt;
- unsigned char NewNmkKey[16], Nid[7];
- int writeStringToEXIString(unsigned char* string, exi_string_character_t* exiString)
- {
- int pos = 0;
- while(string[pos]!='\0')
- {
- exiString[pos] = string[pos];
- pos++;
- }
- return pos;
- }
- /*===========================================================================
- FUNCTION: Check_V2G_Flow_Status
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- unsigned char Check_V2G_Flow_Status()
- {
- unsigned char result = 0;
- switch (ShmCcsData->CommProtocol)
- {
- case V2GT_MSG_PROTOCOL_DIN70121: //0
- {
- result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
- {
- result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
- {
- result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
- break;
- }
- default:
- break;
- }
- return result;
- }
- /*===========================================================================
- FUNCTION: StoreLogMsg
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- #if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
- int StoreLogMsg2(unsigned char *DataString)
- {
- static unsigned char Buf[1024];
- static time_t CurrentTime;
- static struct tm *tm;
- static struct timeval tv;
- memset(Buf, 0, sizeof(Buf));
- CurrentTime = time(NULL);
- tm = localtime(&CurrentTime);
- gettimeofday(&tv, NULL); // get microseconds, 10^-6
- #ifdef AWCCS
- sprintf(Buf, "echo \"[%04d%02d%02d: %02d:%02d:%02d.%06d][SECC][%d][%02d]%s\" >> /Storage/SystemLog/[%04d.%02d]CCS-SystemLog",
- tm->tm_year + 1900,
- tm->tm_mon + 1,
- tm->tm_mday,
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec,
- tv.tv_usec,
- EVCOMM_SYS_INFO.CpState,
- Check_V2G_Flow_Status(),
- DataString,
- tm->tm_year + 1900,
- tm->tm_mon + 1);
- #else
- sprintf(Buf, "echo \"[%04d%02d%02d: %02d:%02d:%02d.%06d][SECC][%d][%02d]%s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
- tm->tm_year + 1900,
- tm->tm_mon + 1,
- tm->tm_mday,
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec,
- tv.tv_usec,
- EVCOMM_SYS_INFO.CpState,
- Check_V2G_Flow_Status(),
- DataString,
- tm->tm_year + 1900,
- tm->tm_mon + 1);
- #endif
- system(Buf);
- DEBUG_PRINTF_EVCOMM_SYSTEM_LOG("[%02d:%02d:%02d.%06d][SECC][%d][%02d]%s \n",
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec,
- tv.tv_usec,
- EVCOMM_SYS_INFO.CpState,
- Check_V2G_Flow_Status(),
- DataString);
- //Reset the buf_log_evcomm Buffer, i.e. DataString
- memset(buf_log_evcomm, 0, SIZE_OF_LOG_BUFFER);
- }
- #endif
- /*===========================================================================
- FUNCTION: CAN_Tx_MSG
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int CAN_Tx_MSG(int Fd, unsigned int MsgId, unsigned char SlaveAddress, unsigned char DataLength, unsigned char *SendData)
- {
- struct can_frame frame;
- struct timeb StartTime, EndTime;
- unsigned int tmp = 0;
- int nbytes = 0;
- int i = 0;
- //Protection: To avoid unexpected length for CAN bus payload.
- if (DataLength > 8)
- {
- DataLength = 8;
- }
- memset(&frame, 0, sizeof(struct can_frame));
- frame.can_id = 0x80000000 | CAN_SEND_DIRECTION | MsgId | SlaveAddress; //0x80000000: extension ID format
- frame.can_dlc = DataLength;
- memcpy(frame.data, SendData, DataLength);
- nbytes = write(Fd, &frame, sizeof(struct can_frame));
- #if 0
- DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][CAN_Tx_MSG] <%X> ", frame.can_id);
- for (i = 0; i < frame.can_dlc; i++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02X ", frame.data[i]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("(%d Bytes)\n", frame.can_dlc);
- #endif
- return nbytes;
- }
- /*===========================================================================
- FUNCTION: Proc_EVStopRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_EVStopRes(int Fd)
- {
- int nbytes;
- unsigned char Buffer[8];
- memset(Buffer, 0, sizeof(Buffer));
- if (CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency == TRUE)
- {
- Buffer[0] = EV_EMERGENCY_STOP; //2
- }
- else
- {
- Buffer[0] = EV_NORMAL_STOP; //1
- }
- /*
- if(strlen(ShmStatusCodeData->PresentStatusCode[0]) > 0)
- {
- memcpy(Buffer + 2, ShmStatusCodeData->PresentStatusCode[0], 6);
- }
- */
- Buffer[1] = ShmStatusCodeData->PresentStatusCode[0][0];
- Buffer[2] = ShmStatusCodeData->PresentStatusCode[0][1];
- Buffer[3] = ShmStatusCodeData->PresentStatusCode[0][2];
- Buffer[4] = ShmStatusCodeData->PresentStatusCode[0][3];
- Buffer[5] = ShmStatusCodeData->PresentStatusCode[0][4];
- Buffer[6] = ShmStatusCodeData->PresentStatusCode[0][5];
- nbytes = CAN_Tx_MSG(Fd, CAN_CMD_EV_STOP_EVENT, ShmInternalComm->SlaveAddress, 7, Buffer);
- //system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); //for test only
- //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_EVStopRes] Sending STOP Command to CSU");
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = FALSE;
- return nbytes;
- }
- /*===========================================================================
- FUNCTION: Sniffer_Candump
- DESCRIPTION:
- 1. Only used in End_Process(), which is in fork2 of SeccComm task.
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- 0: accept
- -1: invalid
- GLOBAL VARIABLES:
- =============================================================================*/
- int Sniffer_Candump(char cmd)
- {
- #if (CANDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
- if (cmd == ENABLE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[candump]init");
- system("cd /mnt/;rm -rf candump/");
- system("cd /mnt/;mkdir candump");
- SAVE_SYS_LOG_MSG_EVCOMM("[candump]on");
- system("cd /mnt/candump;candump -l can0 &");
- return 0;
- }
- else if (cmd == DISABLE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[candump]off");
- system("killall candump");
- SAVE_SYS_LOG_MSG_EVCOMM("[candump]save");
- system("cd /;cp -rfv /mnt/candump /Storage/SystemLog/");
- return 0;
- }
- else
- {
- sprintf(buf_log_evcomm_fork2, "[candump]unexpected cmd(%d)", cmd);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- return -1;
- }
- #endif
- }
- /*===========================================================================
- FUNCTION: Sniffer_Tcpdump
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Sniffer_Tcpdump(char cmd)
- {
- #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
- if (cmd == ENABLE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]init...");
- system("cd /mnt/;rm -rf tcpdump/");
- system("cd /mnt/;mkdir tcpdump");
- unsigned char buf[256];
- time_t CurrentTime;
- struct tm *tm;
- struct timeval tv;
- memset(buf, 0, sizeof(buf));
- CurrentTime = time(NULL);
- tm = localtime(&CurrentTime);
- gettimeofday(&tv, NULL); // get microseconds, 10^-6
- sprintf(buf,
- "tcpdump -i eth1 -w /mnt/tcpdump/[%s][%04d%02d%02d-%02d:%02d:%02d.%06d]packets.pcap&",
- FIRMWARE_VERSION,
- tm->tm_year + 1900,
- tm->tm_mon + 1,
- tm->tm_mday,
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec,
- tv.tv_usec
- );
- SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]on");
- system(buf);
- return 0;
- }
- else if (cmd == DISABLE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]off");
- system("killall tcpdump");
- SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]wait: 2s");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]wait: 1s");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("[tcpdump]save");
- system("cd /;cp -rfv /mnt/tcpdump /Storage/SystemLog/");
- return 0;
- }
- else
- {
- sprintf(buf_log_evcomm, "[tcpdump]unexpected cmd(%d)", cmd);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- return -1;
- }
- #endif
- }
- /*===========================================================================
- FUNCTION: Check_V2G_Flow_Status_pre
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- unsigned char Check_V2G_Flow_Status_pre()
- {
- unsigned char result = 0;
- switch (ShmCcsData->CommProtocol)
- {
- case V2GT_MSG_PROTOCOL_DIN70121: //0
- {
- result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre;
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
- {
- result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre;
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
- {
- result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre;
- break;
- }
- default:
- break;
- }
- return result;
- }
- /*===========================================================================
- FUNCTION: Update_V2G_Flow_Status
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- 1. V2gFlowStatus
- GLOBAL VARIABLES:
- 1. V2gFlowStatus
- =============================================================================*/
- int Update_V2G_Flow_Status(unsigned int state_new)
- {
- unsigned char state_now;
- state_now = Check_V2G_Flow_Status();
- if (EVCOMM_SYS_INFO.End_Process_inused == TRUE ||
- CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused == TRUE)
- {
- if (state_now != Performance_Timeout && //253
- state_now != Sequence_Timeout && //254
- state_now != Other_Fault) //255
- {
- sprintf(buf_log_evcomm,
- "[Warning]state(%d) change: ignored (End_Process_inused:%d, FW_Update_Task_inused:%d)",
- state_new,
- EVCOMM_SYS_INFO.End_Process_inused,
- CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- return -1;
- }
- }
- if (state_now != state_new)
- {
- //Step 1: Check if Error Occours
- if (state_now == Performance_Timeout || //253
- state_now == Sequence_Timeout || //254
- state_now == Other_Fault) //255
- {
- if (state_new != IDLE)
- {
- if (EVCOMM_SYS_INFO.State_Change_Ignored_Notice == FALSE)
- {
- EVCOMM_SYS_INFO.State_Change_Ignored_Notice = TRUE;
- sprintf(buf_log_evcomm,
- "[Warning]state(%d) change: ignored(now in error state)",
- state_new,
- state_now);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return -1;
- }
- }
- //Updating the state formally.
- sprintf(buf_log_evcomm,
- "[stt]%02d >> %02d",
- state_now,
- state_new
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- V2gFlowStatus = state_new;
- state_now = state_new;
- switch (ShmCcsData->CommProtocol)
- {
- case V2GT_MSG_PROTOCOL_DIN70121: //0
- {
- ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
- ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus = V2gFlowStatus;
- //break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
- {
- ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
- ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus = V2gFlowStatus;
- //break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
- {
- ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus_pre = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
- ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus = V2gFlowStatus;
- //break;
- }
- default:
- break;
- }
- }
- }
- double DiffTimeb(struct timeb ST, struct timeb ET)
- {
- //return milli-second
- double StartTime, EndTime;
- double t_diff;
- StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
- EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
- t_diff = EndTime - StartTime;
- if (t_diff < 0)
- {
- #if 0
- if (t_diff < -1000) //1000ms
- {
- sprintf(buf_log_evcomm,
- "[Warning]StartTime(%.02lf) > EndTime(%.02lf), d(%.02lf)",
- StartTime,
- EndTime,
- t_diff);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #endif
- return -1;
- }
- return t_diff;
- }
- double DiffTimeb_fork1_Error_Monitor(struct timeb ST, struct timeb ET)
- {
- //return milli-second
- static double StartTime, EndTime;
- static double t_diff;
- StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
- EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
- t_diff = EndTime - StartTime;
- if (t_diff < 0)
- {
- #if 0
- if (t_diff < -1000) //1000ms
- {
- sprintf(buf_log_evcomm_fork2,
- "[fork1][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
- StartTime,
- EndTime,
- t_diff);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- }
- #endif
- return -1;
- }
- return t_diff;
- }
- double DiffTimeb_fork2_Error_Monitor(struct timeb ST, struct timeb ET)
- {
- //return milli-second
- static double StartTime, EndTime;
- static double t_diff;
- StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
- EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
- t_diff = EndTime - StartTime;
- if (t_diff < 0)
- {
- #if 0
- if (t_diff < -1000) //1000ms
- {
- sprintf(buf_log_evcomm_fork2,
- "[fork2][Warning]S(%.02lf) > E(%.02lf), d(%.02lf)",
- StartTime,
- EndTime,
- t_diff);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- }
- #endif
- return -1;
- }
- return t_diff;
- }
- int CreateShareMemory()
- {
- int MeterSMId;
- //create ShmSysConfigAndInfo
- if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmget ShmSysConfigAndInfo NG");
- return 0;
- }
- else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmat ShmSysConfigAndInfo NG");
- return 0;
- }
- memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
- //create ShmStatusCodeData
- if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmget ShmStatusCodeData NG");
- return 0;
- }
- else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmat ShmStatusCodeData NG");
- return 0;
- }
- memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData));
- //create ShmCcsData
- if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmget ShmCcsData NG");
- return 0;
- }
- else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[main]CreateShareMemory:shmat ShmCcsData NG");
- return 0;
- }
- memset(ShmCcsData,0,sizeof(struct CcsData));
- return 1;
- }
- void DetachShareMemory()
- {
- if(MeterSMId[0]>0)
- {
- shmdt(ShmSysConfigAndInfo);
- shmctl(MeterSMId[0], IPC_RMID, 0);
- }
- if(MeterSMId[1]>0)
- {
- shmdt(ShmStatusCodeData);
- shmctl(MeterSMId[1], IPC_RMID, 0);
- }
- if(MeterSMId[2]>0)
- {
- shmdt(ShmCcsData);
- shmctl(MeterSMId[2], IPC_RMID, 0);
- }
- if(MeterSMId[3]>0)
- {
- shmdt(ShmInternalComm);
- shmctl(MeterSMId[3], IPC_RMID, 0);
- }
- /*if(MeterSMId[4]>0)
- {
- shmdt(ShmInternalCommAC);
- shmctl(MeterSMId[4], IPC_RMID, 0);
- }*/
- }
- /*===========================================================================
- FUNCTION: ShareMemory_Init
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int ShareMemory_Init()
- {
- memset(MeterSMId,0,sizeof(MeterSMId));
- //create ShmSysConfigAndInfo
- if ((MeterSMId[0] = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmSysConfigAndInfo NG");
- return 0;
- }
- else if ((ShmSysConfigAndInfo = shmat(MeterSMId[0], NULL, 0)) == (void *) -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmSysConfigAndInfo NG");
- return 0;
- }
- //create ShmStatusCodeData
- if ((MeterSMId[1] = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmStatusCodeData NG");
- return 0;
- }
- else if ((ShmStatusCodeData = shmat(MeterSMId[1], NULL, 0)) == (void *) -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmStatusCodeData NG");
- return 0;
- }
- //create ShmCcsData
- if ((MeterSMId[2] = shmget(ShmCcsCommKey, sizeof(struct CcsData), 0777)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmCcsData NG");
- return 0;
- }
- else if ((ShmCcsData = shmat(MeterSMId[2], NULL, 0)) == (void *) -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmCcsData NG");
- return 0;
- }
- //create ShmInternalComm
- if ((MeterSMId[3] = shmget(ShmInternalCommKey, sizeof(struct InternalComm), 0777)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmInternalComm NG");
- return 0;
- }
- else if ((ShmInternalComm = shmat(MeterSMId[3], NULL, 0)) == (void *) -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmInternalComm NG");
- return 0;
- }
- #if 0
- //create ShmInternalCommAC
- if ((MeterSMId[4] = shmget(ShmInternalCommACKey, sizeof(struct InternalCommAC), 0777)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmget ShmInternalCommAC NG");
- return 0;
- }
- else if ((ShmInternalCommAC = shmat(MeterSMId[4], NULL, 0)) == (void *) -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("ShareMemory_Init:shmat ShmInternalCommAC NG");
- return 0;
- }
- #endif
- //[To-Do] The initialization here is reduntant and should be removed partially.
- //SHM_Init_supportedAppProtocolRes(ShmCcsData);
- //SHM_Init_din_SessionSetupRes(ShmCcsData);
- //SHM_Init_din_ServiceDiscoveryRes(ShmCcsData);
- //SHM_Init_din_ServiceAndPaymentSelectionRes(ShmCcsData);
- //SHM_Init_din_ContractAuthenticationRes(ShmCcsData);
- SHM_Init_din_ChargeParameterDiscoveryRes(ShmCcsData);
- SHM_Init_din_CableCheckRes(ShmCcsData);
- SHM_Init_din_PreChargeRes(ShmCcsData);
- SHM_Init_din_PowerDeliveryRes(ShmCcsData);
- SHM_Init_din_CurrentDemandRes(ShmCcsData);
- SHM_Init_din_WeldingDetectionRes(ShmCcsData);
- SHM_Init_din_SessionStopRes(ShmCcsData);
- return 1;
- }
- /*===========================================================================
- FUNCTION: GetEthMac
- DESCRIPTION:
- 1. Accessing current CsuMac address, if Eth = eth1
- 2. The address of eth1(for QCA7000) is a random number, which will be modified
- after each time of booting up system.
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int GetEthMac(unsigned char *Eth, unsigned char *mac)
- {
- //Parameters:MAC,IP,Mask,Gateway
- int fd, rd = 0;
- unsigned char addr[18], Buffer[128];
- memset(Buffer, 0, sizeof(Buffer));
- sprintf(Buffer, "cat /sys/class/net/%s/address > /mnt/GetEthInfo", Eth); //CsuMac (Eth = eth1)
- system(Buffer);
- fd = open("/mnt/GetEthInfo", O_RDONLY);
- if(fd < 0)
- {
- system("rm -f /mnt/GetEthInfo");
- SAVE_SYS_LOG_MSG_EVCOMM("GetEthMac: MAC Address open error");
- return 0;
- }
- memset(mac, 0, 6);
- memset(addr, 0, sizeof(addr));
- rd = read(fd, addr, 17);
- close(fd);
- system("rm -f /mnt/GetEthInfo");
- sscanf(addr, "%02x:%02x:%02x:%02x:%02x:%02x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]); //CsuMac (Eth = eth1)
- sprintf(buf_log_evcomm,
- "[GetEthMac]EVSE MACAddr(CsuMac): %02x:%02x:%02x:%02x:%02x:%02x",
- mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); //CsuMac (Eth = eth1)
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- return 1;
- }
- /*===========================================================================
- FUNCTION: ReadAdcVolt
- DESCRIPTION:
- 1. fork1
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- float ReadAdcVolt(unsigned char AdcChannel)
- {
- //AIN0=CCS GUN Temp 1
- //AIN1=CCS GUN Temp 2
- //AIN2=CCS_Proximity/2
- //AIN3=pilot voltage
- if(AdcChannel == 3)
- {
- int fd,count,AvgTimes;
- unsigned char SampleBuf[4];
- float TmpVolt, MinSample, AvgSample = 0;
- fd = open("/sys/bus/iio/devices/iio\:device0/in_voltage3_raw", O_RDONLY);
- if(fd > 0)
- {
- //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
- for(AvgTimes = 0; AvgTimes < 3; AvgTimes++) //period = 60~91 ms(renice -10, , CurrentDemand()) /*+++ 20200909, vern, extend detection time for interference ---*/
- {
- count = 0;
- MinSample = 2306;
- //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
- while(count < 30) //period = 21~42ms (renice -10, CurrentDemand())/*+++ 20200909, vern, extend detection time for interference ---*/
- {
- //re-sampling period = 3~13ms (renice -10, SLAC())
- //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
- read(fd, SampleBuf, 4); //period = 3.2~10ms (renice -10, SLAC())
- //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
- TmpVolt = atoi(SampleBuf);
-
- if((TmpVolt < 2306) && (TmpVolt > 0))//positive voltage
- {
- if(TmpVolt < MinSample)
- {
- MinSample = TmpVolt;
- }
- count++;
- }
- lseek(fd, 0, SEEK_SET);
- }
- //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
- AvgSample += MinSample;
- }
- AvgSample /= AvgTimes;
- close(fd);
- //system("echo 0 > /sys/class/gpio/gpio89/value"); //for test
- return ((0.954-(1.8*AvgSample/4095))/0.06);
- }
- else
- {
- return -1;
- }
- }
- else
- {
- FILE *fp;
- unsigned char str[64];
- unsigned char AdcValue[8];
- if(AdcChannel > 7)
- {
- return -1;
- }
- memset(str,0,sizeof(str));
- memset(AdcValue,0,sizeof(AdcValue));
- sprintf(str, "cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw", AdcChannel);
- fp=popen(str, "r");
- if(fgets(AdcValue,sizeof(AdcValue),fp) == NULL)
- {
- pclose(fp);
- return -1;
- }
- pclose(fp);
- //Vin = Vref *D / (2^n - 1)
- return ((float)1.8*(float)atoi(AdcValue))/4095;
- }
- }
- /*===========================================================================
- FUNCTION: ReadAdcVolt
- DESCRIPTION:
- //AIN0=CCS GUN Temp 1
- //AIN1=CCS GUN Temp 2
- //AIN2=CCS_Proximity/2
- //AIN3=pilot voltage
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- float ReadAdcVolt_PP_fork3()
- {
- int fd, AvgTimes;
- unsigned char SampleBuf[4];
- float TmpVolt = 0;
- float AvgSample = 0;
- float V_pp = 0;
- fd = open("/sys/bus/iio/devices/iio\:device0/in_voltage2_raw", O_RDONLY); //PP
- if(fd > 0)
- {
- for(AvgTimes = 0; AvgTimes < 5; AvgTimes++) //get 5 samples
- {
- read(fd, SampleBuf, 4);
- TmpVolt = atoi(SampleBuf);
- lseek(fd, 0, SEEK_SET);
- AvgSample += TmpVolt;
- }
- close(fd);
- AvgSample /= AvgTimes;
- V_pp = (1.8*AvgSample)/4095; //PP
- //CCS1: plug : 0.61<=V_pp<=1.18
- //CCS2:plug : 1.2<=V_pp<=2.4
- #if 0
- printf("PP_adc = %.02f, PP_v = %.02f\n", AvgSample, V_pp);
- usleep(3000000); //300ms
- #endif
- usleep(20000); //20ms
- return V_pp;
- }
- else
- {
- return -1;
- }
- }
- /*===========================================================================
- FUNCTION: Qca7kPowerReset
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Qca7kPowerReset()
- {
- //printf("\n[CCS Board]Reset QCA7000...\n");
- system("echo 1 > /sys/class/gpio/gpio88/value");
- usleep(500000);
- system("echo 0 > /sys/class/gpio/gpio88/value");
- }
- /*===========================================================================
- FUNCTION: SwitchCpStateE
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int SwitchCpStateE(unsigned char OnOff)
- {
- if((OnOff != ENABLE) && (OnOff != DISABLE))
- {
- return -1;
- }
- struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- ccs->SwitchCpStateE_status = OnOff;
- //OnOff = 1 => switch State to E
- //OnOff = 0 => return noraml
- #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
- {
- if(OnOff == DISABLE)
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("SwitchCpStateE: released\n");
- // CSUCOMMAC_SHM.CpSetStateE = DISABLE;
- }
- else
- {
- OutputCpPwmDuty(100); //set CP duty as 100, firstly.
- //CSUCOMMAC_SHM.CpSetStateE = ENABLE;
- //SAVE_SYS_LOG_MSG_EVCOMM("SwitchCpStateE: enabled!\n");
- }
- }
- #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
- {
- if(OnOff == DISABLE)
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("SwitchCpStateE: released\n");
- system("echo 0 > /sys/class/gpio/gpio86/value");
- }
- else
- {
- OutputCpPwmDuty(100); //set CP duty as 100, firstly.
- system("echo 1 > /sys/class/gpio/gpio86/value");
- //SAVE_SYS_LOG_MSG_EVCOMM("SwitchCpStateE: enabled!\n");
- }
- }
- #endif
- if (ccs->SwitchCpStateE_status_pre != ccs->SwitchCpStateE_status)
- {
- sprintf(buf_log_evcomm,
- "SwitchCpStateE: %d >> %d",
- ccs->SwitchCpStateE_status_pre,
- ccs->SwitchCpStateE_status
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- ccs->SwitchCpStateE_status_pre = ccs->SwitchCpStateE_status;
- }
- }
- /*===========================================================================
- FUNCTION: OutputCpPwmDuty
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int OutputCpPwmDuty(unsigned char Duty)
- {
- int DutyInNanoSec;
- struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- if((Duty < 0)||(Duty > 100))
- {
- return -1;
- }
- #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
- {
- //CSUCOMMAC_SHM.CpSetPWMDuty = Duty;
- }
- #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
- {
- DutyInNanoSec = 10000 * Duty;
- sprintf(buf_log_evcomm, "echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle", DutyInNanoSec);//nanoseconds
- system(buf_log_evcomm);
- }
- #endif
- ccs->CpDuty = Duty;
- //CP Duty
- if (ccs->CpDuty != ccs->CpDuty_pre)
- {
- //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
- sprintf(buf_log_evcomm, "CP Duty: %d\% >> %d\%", ccs->CpDuty_pre, ccs->CpDuty);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- ccs->CpDuty_pre = ccs->CpDuty;
- }
- return 0;
- }
- /*===========================================================================
- FUNCTION: Check_Plugin_Status_Update_fork1
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
- void Check_Plugin_Status_Update_fork1(struct ChargingInfoData *ccs)
- {
- if (ccs->ConnectorPlugIn != ccs->ConnectorPlugIn_new)
- {
- sprintf(buf_log_evcomm_fork1, "[fork1]Plugin: %d >> %d (CP=%.2fV, PP=%.2fV)",
- ccs->ConnectorPlugIn,
- ccs->ConnectorPlugIn_new,
- ccs->CpVoltage,
- ccs->PpVoltage
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork1);
- ccs->ConnectorPlugIn_pre = ccs->ConnectorPlugIn;
- ccs->ConnectorPlugIn = ccs->ConnectorPlugIn_new;
- //ccs->CpVoltage_pre = ccs->CpVoltage;
- }
- }
- //#endif
- /*===========================================================================
- FUNCTION: ConnectorPlugIn
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int CheckConnectorPlugIn()
- {
- //return 0 => unplug
- //return 1 => plug-in
- //float TmpProximity;
- //unsigned char Rtn = 0;
- static struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- #if (CP_PROTECTION_MECHANISM == ENABLE)
- return (int)ccs->ConnectorPlugIn;
- #else
- return TRUE;
- #endif
- /*
- // PP Detection
- TmpProximity = ReadAdcVolt(ADC_CHANNEL_AIN2_PP);
- //[CAUTION] This function takes a period of time to deal with.
- //Designers should avoid to call it in main function, repeatly.
- if(((FIRMWARE_VERSION & 0x0000FF00) >> 8) == 0x01)
- {
- //UL version: judge with CP and proximity
- //TmpProximity = ReadAdcVolt(ADC_CHANNEL_AIN2_PP);
- //SAVE_SYS_LOG_MSG_EVCOMM("Connector: UL");
- if((ccs->CpState >= 2) &&
- (ccs->CpState <= 5) &&
- (TmpProximity >= 0.4) &&
- (TmpProximity <= 0.9))
- {
- Rtn = 1;
- }
- }
- else
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("Connector: CE");
- //CE version: judge with CP only
- if((ccs->CpState >=2 ) &&
- (ccs->CpState <=5 ))
- {
- Rtn = 1;
- }
- }
- */
- //CE version: judge with CP only
- /*
- if((ccs->CpState >= 2 ) &&
- (ccs->CpState <= 5 ))
- {
- Rtn = TRUE;
- }
- ccs->ConnectorPlugIn = Rtn;
- //ccs->PpVoltage = TmpProximity;
- return Rtn;
- */
- }
- /*===========================================================================
- FUNCTION: Check_CP_State_Error_fork1
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Check_CP_State_Error_fork1(struct ChargingInfoData *ccs)
- {
- #if (CP_PROTECTION_MECHANISM == DISABLE)
- {
- return -1;
- }
- #endif
- unsigned char state = 0;
- double time_diff = 0;
- state = Check_V2G_Flow_Status();
- //SLAC, SLAAC, SDP, ..., ChargeParameterDiscovery
- if (state >= CM_SLAC_PARM_CONF && //by considering 15118(SLAC first)
- state < ChargeParameterDiscoveryRequest &&
- state != IDLE &&
- state != CM_SET_KEY_REQ &&
- state != CM_SET_KEY_CNF &&
- state != CM_VALIDATE_REQ &&
- state != CM_VALIDATE_CNF)
- {
- #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
- {
- if((ccs->CpState != 2) && (ccs->CpState != 3))
- {
- if (ccs->CpState_err == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
- //CPD: ChargeParameterDiscovery
- }
- ccs->CpState_err = TRUE;
- }
- }
- #else
- {
- #ifdef AWCCS
- if((ccs->CpState != 2) && (ccs->CpState != 3))
- {
- if (ccs->CpState_err == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
- //CPD: ChargeParameterDiscovery
- }
- ccs->CpState_err = TRUE;
- }
- #else
- if(ccs->CpState != 3)
- {
- if (ccs->CpState_err == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[fork1][CP][Error]before CPD"); //CPD: ChargeParameterDiscoveryRequest
- //CPD: ChargeParameterDiscovery
- }
- ccs->CpState_err = TRUE;
- }
- #endif
- }
- #endif
- }
- #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
- {
- //ChargeParameterDiscovery
- if(state >= ChargeParameterDiscoveryRequest && //35
- state <= ChargeParameterDiscoveryResponse) //36
- {
- if(ccs->CpState != 3)
- {
- if (ccs->CpState_err == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]CPD");
- //PRC: Precharge
- //CUD: CurrentDemand
- }
- ccs->CpState_err = TRUE;
- }
- }
- //ChargingStatus
- if(state >= ChargingStatusRequest && //43
- state <= ChargingStatusResponse) //44
- {
- if(ccs->CpState != 4 && ccs->CpState != 5)
- {
- if (ccs->CpState_err == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]CGS");
- //PRC: Precharge
- //CUD: CurrentDemand
- }
- ccs->CpState_err = TRUE;
- }
- }
- }
- #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
- {
- //ChargeParameterDiscovery, CableCheck
- if (state >= ChargeParameterDiscoveryRequest && //35
- state <= CableCheckResponse) //38
- {
- if(ccs->CableCheckPreCountDownDone == FALSE &&
- state >= CableCheckRequest)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- time_diff = DiffTimeb_fork1_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- if(time_diff >= V2G_SECC_CP_Timeout_CableCheck) //2 sec
- {
- sprintf(buf_log_evcomm_fork1,
- "[fork1][CP]check C(4),D(5): ON (%.02lf of %dms)",
- time_diff,
- V2G_SECC_CP_Timeout_CableCheck);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork1);
- ccs->CableCheckPreCountDownDone = TRUE;
- }
- }
- if(ccs->CableCheckPreCountDownDone == TRUE)
- {
- if(ccs->CpState != 4 && ccs->CpState != 5)
- {
- if (ccs->CpState_err == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]CPD and CCK (after CNT)");
- //CPD: ChargeParameterDiscovery
- //CCK: CableCheck
- //CNT: count down
- }
- ccs->CpState_err = TRUE;
- }
- }
- else
- {
- if(ccs->CpState != 3 && ccs->CpState != 4 && ccs->CpState != 5)
- {
- if (ccs->CpState_err == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]CPD and CCK (before CNT)");
- //CPD: ChargeParameterDiscovery
- //CCK: CableCheck
- //CNT: count down
- }
- ccs->CpState_err = TRUE;
- }
- }
- }
- //Precharge, CurrentDemand
- if(state >= PreChargeRequest && //39
- state <= CurrentDemandResponse) //46
- {
- //if(ccs->CpState != 4 && ccs->CpState != 5)
- if( ccs->CpState <=1)
- {
- if (ccs->CpState_err == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[CP][Error]PRC and CUD");
- //PRC: Precharge
- //CUD: CurrentDemand
- }
- ccs->CpState_err = TRUE;
- }
- }
- }
- #endif
- if(ccs->CpState_err == TRUE && ccs->CpState_err_logged == FALSE)
- {
- OutputCpPwmDuty(100);
- //system("echo 1 > /sys/class/gpio/gpio89/value"); //for test
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
- sprintf(buf_log_evcomm_fork1, "[fork1][Erorr]CP(%d) Error in state %d(%d)",
- ccs->CpState,
- state,
- ccs->CableCheckPreCountDownDone
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork1);
- ccs->CpState_err_logged = TRUE;
- }
- return 0;
- }
- /*===========================================================================
- FUNCTION: Check_CP_State_Update_fork1
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- //#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
- void Check_CP_State_Update_fork1(struct ChargingInfoData *ccs)
- {
- //CP Voltage
- /*
- //Issues waiting to debug
- //[CAUTION] This function shall not be used in charging state.
- if (((int)(ccs->CpVoltage * 10)) != ((int)(ccs->CpVoltage_pre * 10)))
- {
- memset(buf, 0, sizeof(buf));
- sprintf(buf, "CP Voltage: %.2lf >> %.2lf (%d >> %d)",
- ccs->CpVoltage_pre,
- ccs->CpVoltage,
- (int)(ccs->CpVoltage_pre * 10),
- (int)(ccs->CpVoltage * 10)
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf);
- ccs->CpVoltage_pre = ccs->CpVoltage;
- }
- */
- //CP State
- if (ccs->CpState != ccs->CpState_pre)
- {
- sprintf(buf_log_evcomm_fork1, "[fork1]CP State: %d >> %d (%.2fV)",
- ccs->CpState_pre,
- ccs->CpState,
- ccs->CpVoltage
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork1);
- ccs->CpState_pre = ccs->CpState;
- }
- }
- //#endif
- /*===========================================================================
- FUNCTION: CP_Detection
- DESCRIPTION:
- 1. In order to detect CP in efficient response time, we creat an independent
- thead for this procedure.
- 2. The priority of this thread is set as the same as other tasks.
- 3. fork1
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void CP_Detection()
- {
- pid_t tmp = 0;
- // struct timeb StartTime, EndTime;
- unsigned char Statetmp;
- float TotalTmpVolt;
- struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- if(CP_Detection_Pid == 0)
- {
- tmp = fork();
- if(tmp > 0)
- {
- CP_Detection_Pid = tmp;
- #if 1
- unsigned char buf[64];
- memset(buf, 0, sizeof(buf));
- //sprintf(buf, "renice -20 -p %d", tmp);
- sprintf(buf, "renice -10 -p %d", tmp);
- system(buf);
- #endif
- return;
- }
- }
- while(1)
- {
- //ADC_Voltage = (1+RE62/RE63)*0.9 - (RE62/RE63)*Pilot_Voltage, RE62/RE63=0.06
- //=>Pilot_Voltage=(0.954-ADC_Voltage)/0.06
- #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
- {
- usleep(100000);
- ccs->CpVoltage = ShmInternalComm->AC_CpPositiveVoltage;
- ccs->CpState = ShmInternalComm->AC_CpPresentState;
- }
- #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
- {
- usleep(1000);
- TotalTmpVolt = ReadAdcVolt(3);
- ccs->CpVoltage = TotalTmpVolt;
- if (ccs->CpVoltage_pre != ccs->CpVoltage)
- {
- ccs->CpVoltage_pre = ccs->CpVoltage;
- }
- //printf("TotalTmpVolt = %.02f\n", TotalTmpVolt);
- //If CP voltage is higer than 13.5V
- if(TotalTmpVolt >= 13.5)
- {
- //Pilot Error
- if((ccs->CpState == 1) &&
- (TotalTmpVolt < 13.75))
- {
- //V_cp = 13.5 ~ 13.75
- Statetmp = 1;
- }
- else
- {
- //V_cp = 13.5 ~
- Statetmp = 8;
- }
- }
- else if((TotalTmpVolt >= 10.5) && (TotalTmpVolt < 13.5)) //V_cp = 10.5 ~ 13.5
- {
- //State A (12V)
- if((ccs->CpState >= 2) &&
- (ccs->CpState <= 3) &&
- (TotalTmpVolt < 10.75))
- {
- if((ccs->CpDuty >= 5) &&
- (ccs->CpDuty < 100))
- {
- Statetmp = 3;
- }
- else
- {
- Statetmp = 2;
- }
- }
- else if((ccs->CpState == 8) &&
- (TotalTmpVolt >= 13.25))
- {
- Statetmp = 8;
- }
- else
- {
- Statetmp = 1;
- }
- }
- else if((TotalTmpVolt >= 7.5) && (TotalTmpVolt < 10.5))
- {
- //State B (9V)
- if((ccs->CpState == 4) && (TotalTmpVolt < 7.75))
- {
- Statetmp = 4;
- }
- else if((ccs->CpState == 1) && (TotalTmpVolt >= 10.25))
- {
- Statetmp = 1;
- }
- else
- {
- if((ccs->CpDuty >= 5) && (ccs->CpDuty < 100))
- {
- Statetmp = 3;
- }
- else
- {
- Statetmp = 2;
- }
- }
- }
- else if((TotalTmpVolt >= 4.5) && (TotalTmpVolt < 7.5))
- {
- //State C (6V)
- if((ccs->CpState == 5) && (TotalTmpVolt < 4.75))
- {
- Statetmp = 5;
- }
- else if((ccs->CpState >= 2) && (ccs->CpState <= 3) && (TotalTmpVolt >= 7.25))
- {
- if((ccs->CpDuty >= 5)&&(ccs->CpDuty < 100))
- {
- Statetmp = 3;
- }
- else
- {
- Statetmp = 2;
- }
- }
- else
- {
- Statetmp = 4;
- }
- }
- else if((TotalTmpVolt >= 1.5) && (TotalTmpVolt < 4.5))
- {
- //State D (3V)
- if((ccs->CpState == 6)&&(TotalTmpVolt < 1.75))
- {
- Statetmp = 6;
- }
- else if((ccs->CpState == 4)&&(TotalTmpVolt >= 4.25))
- {
- Statetmp = 4;
- }
- else
- {
- Statetmp = 5;
- }
- }
- else if((TotalTmpVolt >= -1.5) && (TotalTmpVolt < 1.5)) //V_cp = -1.5V ~ 1.5V
- {
- //State E (0V)
- if((ccs->CpState == 8) &&
- (TotalTmpVolt < -1.25))
- {
- Statetmp = 8;
- }
- else if((ccs->CpState == 5) &&
- (TotalTmpVolt >= 1.25))
- {
- Statetmp = 5;
- }
- else
- {
- Statetmp = 6;
- }
- }
- else if((TotalTmpVolt >= -13.5) && (TotalTmpVolt < -10.5)) //V_cp = -10.5V ~ -13.5V
- {
- //State F (-12V)
- if((ccs->CpState == 8) &&
- (TotalTmpVolt >= -10.75))
- {
- Statetmp = 8;
- }
- else
- {
- Statetmp = 7;
- }
- }
- else
- {
- //null
- }
- ccs->CpState = Statetmp;
- }
- #endif
- Check_CP_State_Update_fork1(ccs);
- #ifndef AWCCS
- Check_CP_State_Error_fork1(ccs);
- #endif
- //Updating Plugin status
- #if (PP_PROTECTION_MECHANISM == ENABLE)
- if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ) &&
- (ShmInternalComm->CCSConnectorType>0?((EVCOMM_SYS_INFO.PpVoltage > 1.2)&&(EVCOMM_SYS_INFO.PpVoltage <= 2.4)):((EVCOMM_SYS_INFO.PpVoltage > 0.61)&&(EVCOMM_SYS_INFO.PpVoltage <= 1.185)))
- )
- #else
- if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ))
- #endif
- {
- ccs->ConnectorPlugIn_new = TRUE;
- }
- else
- {
- ccs->ConnectorPlugIn_new = FALSE;
- OutputCpPwmDuty(100);
- }
- Check_Plugin_Status_Update_fork1(ccs);
- //ftime(&EndTime);
- //DEBUG_PRINTF_EVCOMM_DETAIL("duration:%.02lf\n", DiffTimeb(StartTime, EndTime));
- }//while
- }
- /*===========================================================================
- FUNCTION: PP_Detection
- DESCRIPTION:
- 0. SeccComm fork3
- 1. In order to detect CP in efficient response time, we creat an independent
- thead for this procedure.
- 2. The priority of this thread is set as the same as other tasks.
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void PP_Detection()
- {
- pid_t tmp = 0;
- // struct timeb StartTime, EndTime;
- unsigned char Statetmp;
- float TotalTmpVolt;
- if(PP_Detection_Pid == 0)
- {
- tmp = fork();
- if(tmp > 0)
- {
- PP_Detection_Pid = tmp;
- #if 0
- unsigned char buf[64];
- memset(buf, 0, sizeof(buf));
- sprintf(buf, "renice -10 -p %d", tmp);
- system(buf);
- #endif
- return;
- }
- }
- TotalTmpVolt = ReadAdcVolt_PP_fork3();
- while(1)
- {
- TotalTmpVolt = ReadAdcVolt_PP_fork3();
-
- EVCOMM_SYS_INFO.PpVoltage = TotalTmpVolt;
- if (EVCOMM_SYS_INFO.PpVoltage_pre != EVCOMM_SYS_INFO.PpVoltage)
- {
- if((( (ShmInternalComm->CCSConnectorType>0?((EVCOMM_SYS_INFO.PpVoltage > 1.2)&&(EVCOMM_SYS_INFO.PpVoltage <= 2.4)):((EVCOMM_SYS_INFO.PpVoltage > 0.61)&&(EVCOMM_SYS_INFO.PpVoltage <= 1.185))))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].ConnectorPlugIn==FALSE))
- ||(( (ShmInternalComm->CCSConnectorType>0?((EVCOMM_SYS_INFO.PpVoltage <= 1.2)||(EVCOMM_SYS_INFO.PpVoltage > 2.4)):((EVCOMM_SYS_INFO.PpVoltage <= 0.61)||(EVCOMM_SYS_INFO.PpVoltage > 1.185))))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].ConnectorPlugIn==TRUE)))
- {
- // plug-in : CCS1 (0.61 < V <1.185), CCS2 (1.2 < V <2.4)
- sprintf(buf_log_evcomm_fork3,
- "[fork3]PP(%.2f >> %.2fV)",
- EVCOMM_SYS_INFO.PpVoltage_pre,
- EVCOMM_SYS_INFO.PpVoltage
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork3);
- EVCOMM_SYS_INFO.PpVoltage_pre = EVCOMM_SYS_INFO.PpVoltage;
- }
- }
- #if 0
- sleep(5);
- printf("V_pp = %.02f\n", TotalTmpVolt);
- #endif
- }//while
- }
- /*===========================================================================
- FUNCTION: Error_Monitor
- DESCRIPTION:
- 1. This function only works in SeccComm fork2.
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Error_Monitor()
- {
- pid_t tmp = 0;
- double time_diff = 0;
- unsigned char status = 0;
- struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- if(Error_Monitor_Pid == 0)
- {
- tmp = fork(); //SeccComm fork2
- if(tmp > 0)
- {
- Error_Monitor_Pid = tmp;
- #if 0
- unsigned char buf[64];
- memset(buf, 0, sizeof(buf));
- sprintf(buf, "renice -20 -p %d", tmp);
- system(buf);
- #endif
- return;
- }
- }
- while(1)
- {
- //Step 0
- if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
- {
- //If the End_Process is in processing, disable Error_Monitor.
- continue;
- }
- //Step1 1: Check and Response to Plugin Status
- if(CheckConnectorPlugIn() == FALSE)
- {
- status = Check_V2G_Flow_Status();
- if (status > IDLE &&
- status < Performance_Timeout &&
- status != CM_SET_KEY_REQ &&
- status != CM_SET_KEY_CNF &&
- EVCOMM_SYS_INFO.End_Process_inused == FALSE)
- {
- #if (CP_PROTECTION_MECHANISM == ENABLE)
- //SAVE_SYS_LOG_MSG_EVCOMM("[fork2] Emergency Stop (due to Connector is plugged out during communication.)");
- SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Plug out Error => End_Process");
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- End_Process();
- #else
- //SAVE_SYS_LOG_MSG_EVCOMM("CP_PROTECTION_MECHANISM is disabled. Emergency Stop: skipped" );
- #endif
- }
- }
- //Step 2: Check for V2G_SECC_Sequence_Timeout
- //#if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- #if 1
- status = Check_V2G_Flow_Status();
- if (status >= SupportedAppProtocolRequest &&
- status < SessionStopRequest)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
- time_diff = DiffTimeb_fork2_Error_Monitor(EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start, EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_End);
- if(time_diff > V2G_SECC_Sequence_Timeout) //60s
- {
- sprintf(buf_log_evcomm_fork2,
- "[fork2]V2G_SECC_Sequence_Timeout in state %d - (%.02lf of %d ms)\n",
- status,
- time_diff,
- V2G_SECC_Sequence_Timeout);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_V2G_Sequence_Time (023844)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 4;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- End_Process();
- break;
- }
- else if (time_diff > 4000) //4s
- {
- //Check for CSU command of "Stop by EVSE"
- if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]EVSE_Shutdown");
- Update_V2G_Flow_Status(Other_Fault);
- }
- else if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]EVSE_EmergencyShutdown");
- Update_V2G_Flow_Status(Other_Fault);
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- if (status >= ChargeParameterDiscoveryRequest) //&& status < SessionStopRequest
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error_Monitor]ChargingPermission = FALSE");
- Update_V2G_Flow_Status(Other_Fault);
- }
- }
- else
- {
- //null
- }
- }
- else
- {
- //null
- }
- }
- #endif
- //Step 3: Check and Response to Error V2gFlowStatus
- status = Check_V2G_Flow_Status();
- if (status == Performance_Timeout ||
- status == Sequence_Timeout ||
- status == Other_Fault)
- {
- sprintf(buf_log_evcomm_fork2,
- "[fork2]Timeout or Fault State(%d) => End_Process",
- status);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- //Normal Stop
- //alarm and duty to 100%
- //OutputCpPwmDuty(100);
- //SwitchCpStateE(ENABLE); //Set CP duty as 100% and set CP state as E (0V).
- //[Joseph/ To-Do] Set State E (0V) via GPIO setting
- End_Process();
- }
- //Step 4: Check and Response to CP State Error
- if(ccs->CpState_err == TRUE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[fork2]CP Error => End_Process");
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- End_Process();
- }
- //Step 5: Check and Response to Shutdown Commnad from CSU
- if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_Shutdown ||
- EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- if (Check_V2G_Flow_Status() <= SLACC_SDP_TCP_Connection)
- {
- sprintf(buf_log_evcomm_fork2,
- "[fork2]EVSE Shutdown(%d) => End_Process",
- EVCOMM_SYS_INFO.DC_EVSEStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- Update_V2G_Flow_Status(Other_Fault);
- End_Process();
- }
- }
- //Step 6: Check and Response to SessionStop
- status = Check_V2G_Flow_Status();
- if (status == SessionStopResponse)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[fork2]SessionStopResponse => End_Process");
- End_Process();
- }
- //Step 7: Check for ChargingPermission from TRUE to FALSE before V2G Messages
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if ((ShmInternalComm->ChargingPermission == FALSE) &&
- (ShmInternalComm->ChargingPermission_pre >=1) &&
- (ccs->CpState >= 3) && (ccs->CpState <=5))
- {
- if (status >= CM_SLAC_PARM_REQ &&
- status != CM_SET_KEY_REQ &&
- status != CM_SET_KEY_CNF &&
- status <= SLACC_SDP_TCP_Connection)
- {
- sprintf(buf_log_evcomm_fork2,
- "[fork2]Permission OFF before V2G msg(%d) => End_Process",
- ShmInternalComm->ChargingPermission);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- Update_V2G_Flow_Status(Other_Fault);
- End_Process();
- }
- }
- #if 0
- //Step 8: DC OVP Protection
- if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
- status > CableCheckResponse &&
- status <= SessionStopRequest &&
- status != ChargingStatusRequest &&
- status != ChargingStatusResponse &&
- EVCOMM_SYS_INFO.EvBatteryMaxVoltage != 0)
- {
- //Part A: OVP Protection
- if (EVCOMM_SYS_INFO.PresentChargingVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)) // 2%
- {
- sprintf(buf_log_evcomm_fork2,
- "[fork2][Error]OVP => End_Process (%.02f > %.02f)",
- EVCOMM_SYS_INFO.PresentChargingVoltage,
- (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //System CCS output OVP (012219)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 1;
- ShmStatusCodeData->PresentStatusCode[0][2] = 2;
- ShmStatusCodeData->PresentStatusCode[0][3] = 2;
- ShmStatusCodeData->PresentStatusCode[0][4] = 1;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
- End_Process();
- }
-
- //Part B: Over Voltage Request Protection
- if (EVCOMM_SYS_INFO.EvBatterytargetVoltage >= (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02))
- {
- sprintf(buf_log_evcomm_fork2,
- "[fork2]Over V Req => End_Process (%.02f > %.02f)",
- EVCOMM_SYS_INFO.EvBatterytargetVoltage,
- (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02)
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm_fork2);
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //System CCS output OVP (012219)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 1;
- ShmStatusCodeData->PresentStatusCode[0][2] = 2;
- ShmStatusCodeData->PresentStatusCode[0][3] = 2;
- ShmStatusCodeData->PresentStatusCode[0][4] = 1;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
- End_Process();
- }
-
- }
- #endif
-
- #if 1
- //Step 9: Check 60V
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED &&
- ShmInternalComm->ChargingPermission >=1 &&
- status < CableCheckRequest)
- {
- if (EVCOMM_SYS_INFO.PresentChargingVoltage >= 60) //60V
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[fork2]DC Output Voltage is over 60V => End_Process");
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_Unexpected_60V_Before_Charing_Error (023890)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 9;
- ShmStatusCodeData->PresentStatusCode[0][5] = 0;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- //Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
- End_Process();
- }
- }
- #endif
- //Step 10: Check if the connector is unplug from plugin
- if (EVCOMM_SYS_INFO.ConnectorPlugIn_pre == TRUE && EVCOMM_SYS_INFO.ConnectorPlugIn == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Unplug Reset => End_Process");
- Update_V2G_Flow_Status(Other_Fault);
- End_Process();
- }
- usleep(100000);
- }//while
- }
- /*===========================================================================
- FUNCTION: SendSetKey
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int SendSetKey()
- {
- int i = 0;
- unsigned char nRandValue = 0x0;
- unsigned char ConstString[16] = "PhihongKey000000";
- memset(&SendMmePacket,0,sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA,QcaMac,6);
- memcpy(SendMmePacket.OSA,CsuMac,6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = 0x01;
- SendMmePacket.MMTYPE = MMTYPE_CM_SET_KEY_REQ;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate ��NMK��
- memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
- SendMmePacketSize+=4;
- memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
- SendMmePacketSize+=4;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
- memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
- SendMmePacketSize+=2;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00;//PMN, Fixed value(0x00) encrypted payload not used
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x01;//CCo Capablility
- srand(time(NULL));
- for (i = 10; i < 16; i++)
- {
- nRandValue = (rand()%62) + 1;
- if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
- {
- ConstString[i]= nRandValue + 0x30;
- }
- else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
- {
- ConstString[i]= nRandValue -10 + 0x41;
- }
- else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
- {
- ConstString[i]= nRandValue -37 + 0x61;
- }
- else
- {
- ConstString[i]= 0x30;
- }
- }
- memset(NewNmkKey,0,sizeof(NewNmkKey));
- memset(Nid,0,sizeof(Nid));
- HPAVKeyNMK(NewNmkKey, ConstString);
- HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
- memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid)); //NID, 54 LSBs contain the NID 2 MSBs = 0b00
- SendMmePacketSize+=sizeof(Nid);
- SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
- memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
- SendMmePacketSize += sizeof(NewNmkKey);
- SendMmePacketSize += 19; //the size before MMENTRY
- SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Tx]CM_SET_KEY_REQ");
- i = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
- Update_V2G_Flow_Status(CM_SET_KEY_REQ);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendSetKey: send size =%d\n",i);
- }
- /*===========================================================================
- FUNCTION: GetQca7kMac
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int GetQca7kMac()
- {
- int i = 0;
- struct QcaVendorMmeHeader SendPacket;
- memset(&SendPacket, 0, sizeof(struct QcaVendorMmeHeader));
- memset(SendPacket.ODA, 0xFF, 6); //broadcast
- memcpy(SendPacket.OSA, CsuMac, 6);
- SendPacket.MTYPE = htons(EtherType_HomePlug);
- SendPacket.MMV = 0x00;
- SendPacket.MMTYPE = MMTYPE_VENDOR_VS_NW_INFO;
- SendPacket.OUI[0] = 0x00;
- SendPacket.OUI[1] = 0xB0;
- SendPacket.OUI[2] = 0x52;
- i = sendto(RawSock, &SendPacket, 20, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
- DEBUG_PRINTF_EVCOMM_DETAIL("GetQca7kMac: send size =%d\n", i);
- SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Tx][VENDOR_VS_NW_INFO]Req for QCA7K MacAddr");
- }
- /*===========================================================================
- FUNCTION: Array_Check_All_Zero
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- result:
- (1) TRUE: all zero
- (2) FALSE: not all zero
- GLOBAL VARIABLES:
- =============================================================================*/
- int Array_Check_All_Zero(unsigned char *ptr, int size)
- {
- int result = TRUE;
- int i = 0;
- for (i = 0; i < size; i++)
- {
- if (ptr[i] != 0)
- {
- result = FALSE;
- break;
- }
- }
- return result;
- }
- /*===========================================================================
- FUNCTION: Array_Compare_Identity
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- result = FALSE (not identical)
- result = TRUE (identical)
- GLOBAL VARIABLES:
- =============================================================================*/
- int Array_Compare_Identity(unsigned char *ptrA, unsigned char *ptrB, int size)
- {
- int result = TRUE;
- int i = 0;
- for (i = 0; i < size; i++)
- {
- if (ptrA[i] != ptrB[i])
- {
- result = FALSE;
- #if 0
- sprintf(buf_log_evcomm,
- "[Array_Compare_Identity]%02X%02X%02X%02X%02X%02X,%02X%02X%02X%02X%02X%02X(%d)\n",
- ptrA[0], ptrA[1], ptrA[2], ptrA[3], ptrA[4], ptrA[5],
- ptrB[0], ptrB[1], ptrB[2], ptrB[3], ptrB[4], ptrB[5],
- result);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- break;
- }
- }
- return result;
- }
- /*===========================================================================
- FUNCTION: SLAC_DB_Search_EvMac_idx
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- idx = -1 (not found)
- GLOBAL VARIABLES:
- =============================================================================*/
- int SLAC_DB_Search_EvMac_idx(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in)
- {
- int idx = -1;
- int i = 0;
- if (evcc->arrayLen == 0)
- {
- //printf("[SLAC_DB_Search_EvMac_idx]arrayLen is empty (%d)\n", evcc->arrayLen);
- //no need to search
- }
- else if (evcc->arrayLen > EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE)
- {
- //error
- sprintf(buf_log_evcomm,
- "[ERROR][SLAC_DB_Search_EvMac_idx]DB length(%d) > %d",
- evcc->arrayLen,
- EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- evcc->arrayLen = 0; //reset
- }
- else
- {
- //start searching
- for (i = 0; i < evcc->arrayLen; i++)
- {
- //printf("[SLAC_DB_Search_EvMac_idx]checking DB[%d]...\n", i);
- if (Array_Compare_Identity(evcc->array[i].EvMac, EvMac_in, SLAC_EVMAC_LENGTH) == TRUE)
- {
- //printf("[SLAC_DB_Search_EvMac_idx]identical at DB[%d]...\n", i);
- idx = i;
- break;
- }
- }
- }
- //printf("[SLAC_DB_Search_EvMac_idx]return = %d\n", idx);
- return idx;
- }
- /*===========================================================================
- FUNCTION: SLAC_DB_Check_EvMac_RunID_Matching
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- res = FALSE (unmatched)
- res = TRUE (matched)
- GLOBAL VARIABLES:
- =============================================================================*/
- int SLAC_DB_Check_EvMac_RunID_Matching(struct EVCC_SLAC_DATA_TYPE *evcc, unsigned char *EvMac_in, unsigned char *RunID_in)
- {
- int res = FALSE;
- int idx = -1;
- idx = SLAC_DB_Search_EvMac_idx(evcc, EvMac_in);
- if (idx >= 0)
- {
- res = Array_Compare_Identity(evcc->array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
- }
- else
- {
- //not found the EvMac data in DB
- res = FALSE;
- }
- return res;
- }
- /*===========================================================================
- FUNCTION: SLAC_DB_Add
- DESCRIPTION:
- 1. Saving each CM_SLAC_PARM_REQ data into EVCC database if its
- EvMac and RunID data are different, respectively.
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- idx = saved index (must be a positive value)
- GLOBAL VARIABLES:
- =============================================================================*/
- int SLAC_DB_Add(unsigned char *EvMac_in, unsigned char *RunID_in)
- {
- int idx = -1;
- //Search if this EvMac and RunID already exists
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
- if (idx < 0) //not exist, yet.
- {
- if (SLAC_INFO.arrayLen < EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE) //20
- {
- sprintf(buf_log_evcomm,
- "[SLAC_DB_Add]data does not exist => added to %d-th",
- SLAC_INFO.arrayLen);
- DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
- if (SLAC_INFO.arrayLen >= 0)
- {
- memset(&SLAC_INFO.array[SLAC_INFO.arrayLen], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
- memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
- memcpy(SLAC_INFO.array[SLAC_INFO.arrayLen].RunID, RunID_in, SLAC_RUNID_LENGTH);
- idx = SLAC_INFO.arrayLen;
- SLAC_INFO.arrayLen++;
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[ERROR][SLAC_DB_Add]arrayLen: unexpected(%d)",
- SLAC_INFO.arrayLen);
- DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
- SLAC_INFO.arrayLen = 0;
- }
- }
- else
- {
- //DB is full
- sprintf(buf_log_evcomm,
- "[SLAC_DB_Add]DB is full(%d) => bypass",
- SLAC_INFO.arrayLen);
- DEBUG_PRINTF_EVCOMM_DETAIL(buf_log_evcomm);
- }
- }
- else
- {
- #if 0
- sprintf(buf_log_evcomm,
- "[SLAC_DB_Add]EvMac: existed (%d)",
- idx);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- //Check RunID
- if (Array_Compare_Identity(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH) == TRUE)
- {
- //RunID is the same
- //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Add]RunID: same");
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Add]RunID: diff");
- }
- //Reset all corresponding parameters
- #if 0
- sprintf(buf_log_evcomm,
- "[SLAC_DB_Add]EvMac: reset para(%d)",
- idx);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- memset(&SLAC_INFO.array[idx], 0, sizeof(struct EVCC_SLAC_DATA_ARRAY_TYPE));
- memcpy(SLAC_INFO.array[idx].EvMac, EvMac_in, SLAC_EVMAC_LENGTH);
- memcpy(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH);
- }
- return idx;
- }
- /*===========================================================================
- FUNCTION: SLAC_DB_Reset
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int SLAC_DB_Reset()
- {
- memset(&SLAC_INFO, 0, sizeof(struct EVCC_SLAC_DATA_TYPE));
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC_DB_Reset]DONE");
- }
- /*===========================================================================
- FUNCTION: MmeProcess
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int MmeProcess(unsigned char *Buffer, int DataLength)
- {
- //struct ethhdr *EthPacket;
- struct MmeHeader *MmePacket;
- static unsigned char counter;
- unsigned char state = 0;
- unsigned char *EvMac_in;
- unsigned char *RunID_in;
- int Rtn = 0;
- int idx = 0;
- MmePacket = (struct MmeHeader *)Buffer;
- state = Check_V2G_Flow_Status();
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("***** Received MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("DataLength=%d\n",DataLength);
- DEBUG_PRINTF_EVCOMM_DETAIL("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Destination MAC Address
- MmePacket->ODA[0], MmePacket->ODA[1],
- MmePacket->ODA[2], MmePacket->ODA[3],
- MmePacket->ODA[4], MmePacket->ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n", //Source MAC Address (EV MAC)
- MmePacket->OSA[0], MmePacket->OSA[1],
- MmePacket->OSA[2], MmePacket->OSA[3],
- MmePacket->OSA[4], MmePacket->OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", MmePacket->MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n",
- MmePacket->FMI[0],MmePacket->FMI[1]);
- }
- #endif
- #if (SLAC_FIRST_RESPONSE_METHOD == SET_NO_PWM_IF_NOT_GET_PERMISSION)
- {
- //Check CP as 5%
- if (EVCOMM_SYS_INFO.CpState != 3 &&
- EVCOMM_SYS_INFO.CpState != 4 &&
- MmePacket->MMTYPE != MMTYPE_CM_SET_KEY_CNF &&
- MmePacket->MMTYPE != MMTYPE_VENDOR_VS_HOST_ACTION &&
- MmePacket->MMTYPE != MMTYPE_VENDOR_ATTEN_CHAR &&
- MmePacket->MMTYPE != MMTYPE_VENDOR_VS_NW_INFO_CNF
- )
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC]ignored(wrong CP state)");
- return 0;
- }
- }
- #endif
- //[To-Do] Adding a pre-check filter mechanism for Source and Destination MAC Address
- //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
- switch(MmePacket->MMTYPE)
- {
- case MMTYPE_CM_SET_KEY_CNF:
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SET_KEY_CNF ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[0]);
-
- SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Rx]CM_SET_KEY_CNF (SetKey: DONE)");
- Update_V2G_Flow_Status(CM_SET_KEY_CNF);
- break;
- }
- case MMTYPE_CM_SLAC_PARM_REQ:
- {
- //Check QCA7000 status
- if (EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(QCA7K init...)");
- break;
- }
-
- //Check error state
- state = Check_V2G_Flow_Status();
- if (state == Performance_Timeout || //253
- state == Sequence_Timeout || //254
- state == Other_Fault) //255
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ: ignored(in error state)");
- break;
- }
-
- //Printing EV MAC Address
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_PARM_REQ");
-
- //Avoid Coupled SLAC_PARM_REQ
- if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
- {
- #if 0
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(coupled SLAC,%d)",
- CheckConnectorPlugIn());
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- break;
- }
-
- //[TC_SECC_VTB_CmSlacParm_003] SECURITY_TYPE needs to be 0x00 (no security)
- if (MmePacket->MMENTRY[1] != 0)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx]CM_SLAC_PARM_REQ: ignored(invalid SECURITY_TYPE,%d)", //Source MAC Address (EV MAC)
- MmePacket->MMENTRY[1]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //=================== Legal CM_SLAC_PARM_REQ Zone =================
-
- Update_V2G_Flow_Status(CM_SLAC_PARM_REQ);
-
- #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_RX_CM_SLAC_PARM_REQ)
- {
- //Once receiving CM_SLAC_PARM_REQ, set PWM as 5%
- SwitchCpStateE(DISABLE);
- OutputCpPwmDuty(5);
- }
- #endif
-
- //Checking if this SLAC Req comes before 5% PWM (for 15118)
- if(ShmInternalComm->ChargingPermission == FALSE)
- {
- //Sniffer_Tcpdump(ENABLE);
- sprintf(buf_log_evcomm, "Check Permission: %d (SLAC first => START)", ShmInternalComm->ChargingPermission);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
-
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
- MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
- MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
- MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
- DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
- DEBUG_PRINTF_EVCOMM_DETAIL("CipherSuite [1]: 0x%x,0x%x\n",
- MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
- }
- #endif
-
- #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
- {
- //Saving each CM_SLAC_PARM_REQ data into EVCC database
- EvMac_in = &MmePacket->OSA[0];
- RunID_in = &MmePacket->MMENTRY[2];
- idx = SLAC_DB_Add(EvMac_in, RunID_in); //(EvMac, RunID)
-
- if (idx < 0)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][CM_SLAC_PARM_REQ]DB is full or errors occour(%d) => ignore",
- idx);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //Select the 1st EV MAC address
- if (SLAC_INFO.arrayLen == 1) //1st Req
- {
- #if 1
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):selected",
- (idx + 1),
- MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
- MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
- MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- /*
- sprintf(buf_log_evcomm,
- "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (selected)", //Source MAC Address (EV MAC)
- SLAC_INFO.arrayLen,
- MmePacket->OSA[0], MmePacket->OSA[1],
- MmePacket->OSA[2], MmePacket->OSA[3],
- MmePacket->OSA[4], MmePacket->OSA[5]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- sprintf(buf_log_evcomm,
- "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (selected)", //RunID (from EVCC)
- SLAC_INFO.arrayLen,
- MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
- MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
- MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
- MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- */
- }
- else //2nd Req
- {
- #if 1
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X,%02X%02X%02X%02X%02X%02X%02X%02X):not selected",
- (idx + 1),
- MmePacket->OSA[0], MmePacket->OSA[1], MmePacket->OSA[2], MmePacket->OSA[3], MmePacket->OSA[4], MmePacket->OSA[5],
- MmePacket->MMENTRY[2], MmePacket->MMENTRY[3], MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
- MmePacket->MMENTRY[6], MmePacket->MMENTRY[7], MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- /*
- sprintf(buf_log_evcomm,
- "[SLAC][EVMAC][%d-th]%02X:%02X:%02X:%02X:%02X:%02X (not selected)", //Source MAC Address (EV MAC)
- SLAC_INFO.arrayLen,
- MmePacket->OSA[0], MmePacket->OSA[1],
- MmePacket->OSA[2], MmePacket->OSA[3],
- MmePacket->OSA[4], MmePacket->OSA[5]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- sprintf(buf_log_evcomm,
- "[SLAC][RunID][%d-th]%02X%02X%02X%02X%02X%02X%02X%02X (not selected)", //RunID (from EVCC)
- SLAC_INFO.arrayLen,
- MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
- MmePacket->MMENTRY[4], MmePacket->MMENTRY[5],
- MmePacket->MMENTRY[6], MmePacket->MMENTRY[7],
- MmePacket->MMENTRY[8], MmePacket->MMENTRY[9]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- */
- }
- memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
- memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, SLAC_EVMAC_LENGTH);
- memcpy(SlacRunId, MmePacket->MMENTRY + 2, SLAC_RUNID_LENGTH);
- memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
- memcpy(SendMmePacket.OSA, CsuMac, 6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = MmePacket->MMV;
- SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
- memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
- SendMmePacketSize += 6;
- 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
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
- 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
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SLAC_INFO.array[idx].EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
- SendMmePacketSize += 6;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, SLAC_RUNID_LENGTH); //RunID (8-byte)
- SendMmePacketSize += SLAC_RUNID_LENGTH;
- SendMmePacketSize += 19; //the size before MMENTRY
-
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
- SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
- SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
- DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
- DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
- SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
- SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
- }
- #endif
-
- Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
- Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
-
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
-
- ftime(&SeqStartTime);
- break;
- }
- #else
- {
- memcpy(EvMac, MmePacket->OSA, sizeof(EvMac));
- memcpy(DestSocketAddress.sll_addr, MmePacket->OSA, sizeof(EvMac));
- memcpy(SlacRunId,MmePacket->MMENTRY + 2, sizeof(SlacRunId));
- memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
- memcpy(SendMmePacket.OSA, CsuMac, 6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = MmePacket->MMV;
- SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
- memset(SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
- SendMmePacketSize += 6;
- 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
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
- 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
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
- SendMmePacketSize += 6;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, SlacRunId, sizeof(SlacRunId)); //RunID (8-byte)
- SendMmePacketSize += sizeof(SlacRunId);
- SendMmePacketSize += 19; //the size before MMENTRY
-
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_PARM_CNF ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
- SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
- SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
- DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
- DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
- SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
- SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
- }
- #endif
-
- Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
- Update_V2G_Flow_Status(CM_SLAC_PARM_CONF);
-
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
-
- ftime(&SeqStartTime);
- counter = 0;
- break;
- }
- #endif
- }
- case MMTYPE_CM_START_ATTEN_CHAR_IND:
- {
- if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(timeup)");
- break;
- }
-
- //Avoid Coupled CM_START_ATTEN_CHAR_IND
- if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx]CM_START_ATTEN_CHAR_IND: ignored(coupled SLAC,%d)",
- CheckConnectorPlugIn());
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n",counter + 1);
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
- DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]); //Fixed value (0x01) indicating other Green PHY station
- DEBUG_PRINTF_EVCOMM_DETAIL("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
- MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
- MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
- MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
- }
- #endif
-
- //New SLAC architecture designed by Joseph
- #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
- {
- EvMac_in = &MmePacket->OSA[0];
- RunID_in = &MmePacket->MMENTRY[11];
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
-
- if (idx >= 0)
- {
- Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
-
- //[TC_SECC_VTB_AttenuationCharacterization_013]
- if (MmePacket->MMENTRY[0] != 0) //APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]APPLICATION_TYPE(%d): invalid => ignore Req",
- MmePacket->MMENTRY[0]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_AttenuationCharacterization_014]
- if (MmePacket->MMENTRY[1] != 0) //SECURITY_TYPE must be 0x00(No Security)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]SECURITY_TYPE(%d): invalid => ignore Req",
- MmePacket->MMENTRY[1]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
- //[TC_SECC_VTB_AttenuationCharacterization_016]
- if (MmePacket->MMENTRY[3] != 0x06) //Time_Out must be 0x06 , (600ms)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]Time_Out(%d): invalid => ignore Req",
- MmePacket->MMENTRY[3]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_AttenuationCharacterization_017]
- if (MmePacket->MMENTRY[4] != 0x01) //RESP_TYPE must be 0x01(Send to another GP STA(EV))
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]RESP_TYPE(%d): invalid => ignore Req",
- MmePacket->MMENTRY[4]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_AttenuationCharacterization_021]
- //FORWARDING_STA: MAC Address of the EV HLE (station which the measurement results shall be sent to)
- if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[5], SLAC_EVMAC_LENGTH) == FALSE)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]FORWARDING_STA(%02X:%02X:%02X:%02X:%02X:%02X): invalid => ignore Req",
- MmePacket->MMENTRY[5], MmePacket->MMENTRY[6],
- MmePacket->MMENTRY[7], MmePacket->MMENTRY[8],
- MmePacket->MMENTRY[9], MmePacket->MMENTRY[10]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- SLAC_INFO.array[idx].StartAttenCharErr = TRUE;
- break;
- }
-
- //Check RunID
- if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
- {
- SLAC_INFO.array[idx].MnbcSoundNum = MmePacket->MMENTRY[2];
- SLAC_INFO.array[idx].StartAttenCharCnt++;
-
- #if 0
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_START_ATTEN_CHAR_IND[%d]:%d-th",
- (idx + 1),
- SLAC_INFO.array[idx].StartAttenCharCnt);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
-
- if (SLAC_INFO.array[idx].StartAttenCharCnt == 1)
- {
- memset(SLAC_INFO.array[idx].AAG, 0, sizeof(SLAC_INFO.array[idx].AAG));
- SLAC_INFO.array[idx].AttenProfileCnt = 0;
- ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
- }
- else if (SLAC_INFO.array[idx].StartAttenCharCnt >= 3)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]counter(%d): unexpected",
- SLAC_INFO.array[idx].StartAttenCharCnt);
- }
- else
- {
- //null
- }
- }
- else
- {
- //This RunID is not matched with this EvMac,
- //or this RunID is not found in DB.
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx][CM_START_ATTEN_CHAR_IND]EvMac-RunID: unmatched => ignore Req");
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- //Response: ignore
- }
- }
- else
- {
- //this msg source is not in database
- //ignore
- }
- break;
- }
- #else //Old SLAC architecture designed by Vern
- {
- MnbcSoundNum = MmePacket->MMENTRY[2];
- Update_V2G_Flow_Status(CM_START_ATTEN_CHAR_IND);
- counter++;
- if(counter == 1)
- {
- memset(Aag, 0, sizeof(Aag));
- AttenProfileCnt = 0;
- ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
- }
- else if(counter >= 3)
- {
- counter = 0;
- }
- break;
- }
- #endif
- }
-
- case MMTYPE_CM_MNBC_SOUND_IND:
- {
- if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(timeup)");
- break;
- }
-
- //Avoid Coupled CM_MNBC_SOUND_IND
- if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND: ignored(coupled SLAC,%d)",
- CheckConnectorPlugIn());
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n",counter + 1 , MnbcSoundNum);
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
- MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
- MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
- MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
- MmePacket->MMENTRY[18]);
- DEBUG_PRINTF_EVCOMM_DETAIL("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
- MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
- MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
- DEBUG_PRINTF_EVCOMM_DETAIL("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
- MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
- MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
- MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
- }
- #endif
-
-
- //New SLAC architecture designed by Joseph
- #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
- {
- EvMac_in = &MmePacket->OSA[0];
- RunID_in = &MmePacket->MMENTRY[20];
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
-
- if (idx >= 0)
- {
- Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
-
- //Check for RunID
- if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
- {
- SLAC_INFO.array[idx].MnbcSoundCnt++;
-
- /*
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_MNBC_SOUND_IND[%d]:%d-th",
- (idx + 1),
- SLAC_INFO.array[idx].MnbcSoundCnt);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- */
- }
- else
- {
- //RunID is not matched or does not exist.
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac-RunID: unmatched");
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- }
- else
- {
- //ignore
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx]CM_MNBC_SOUND_IND]EvMac does not exist");
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- break;
- }
- #else //Old SLAC architecture designed by Vern
- {
- Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
- counter++;
- break;
- }
- #endif
- }
-
- case MMTYPE_CM_ATTEN_PROFILE_IND:
- {
- if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[WARNING][SLAC][Rx]CM_ATTEN_PROFILE_IND: ignore(timeup)");
- break;
- }
-
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n", counter, MnbcSoundNum);
- DEBUG_PRINTF_EVCOMM_DETAIL("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
- MmePacket->MMENTRY[0], MmePacket->MMENTRY[1], MmePacket->MMENTRY[2], MmePacket->MMENTRY[3],
- MmePacket->MMENTRY[4], MmePacket->MMENTRY[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]); //NumGroups, Number of AAG Groups (ex: 0x3A = 58)
- //NumGroups: Number of OFDM carrier groups used for the SLAC signal characterization.
- //AAG[i]: Average Attenuation of Group i (i = 1 ~ 58)
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
- DEBUG_PRINTF_EVCOMM_DETAIL("AAG: \n");
-
- for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[8 + Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- }
- #endif
-
- //New SLAC architecture designed by Joseph
- #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
- {
- EvMac_in = &MmePacket->MMENTRY[0]; //[CAUTION] The EvMac address is not &MmePacket->OSA[0]
- //[CAUTION] There is no RunID information of CM_ATTEN_PROFILE_IND
- // packet, which means SECC cannot use the RunID to
- // distinguish those SLAC request with identical EvMac
- // but with different RunID.
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
-
- /*
- printf("%d, %d, %d, %d\n",
- idx,
- SLAC_INFO.array[idx].AagGroupsNum,
- MmePacket->MMENTRY[6],
- SLAC_INFO.array[idx].AttenProfileCnt);
- */
-
- if (idx >= 0)
- {
- SLAC_INFO.array[idx].AttenProfileCnt++;
-
- /*
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_ATTEN_PROFILE_IND[%d]:%d-th",
- (idx + 1),
- SLAC_INFO.array[idx].AttenProfileCnt);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- */
-
- //printf("%d, %d\n", SLAC_INFO.array[idx].AagGroupsNum, MmePacket->MMENTRY[6]);
-
- SLAC_INFO.array[idx].AagGroupsNum = MmePacket->MMENTRY[6];
- ////NumGroups, Number of AAG Groups (ex: 0x3A = 58)
-
- for(Rtn = 0; Rtn < SLAC_INFO.array[idx].AagGroupsNum; Rtn++) //ex:58
- {
- SLAC_INFO.array[idx].AAG[Rtn] += MmePacket->MMENTRY[8 + Rtn];
- }
-
- Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
- break;
- }
- else
- {
- //The EvMac is not in the database
- //ignore
- sprintf(buf_log_evcomm,
- "[SLAC][Rx][CM_ATTEN_PROFILE_IND]EvMac(%02X%02X%02X%02X%02X%02X): not exist => ignore",
- EvMac_in[0], EvMac_in[1], EvMac_in[2], EvMac_in[3], EvMac_in[4], EvMac_in[5]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
- }
- #else //Old SLAC architecture designed by Vern
- {
- AagGroupsNum = MmePacket->MMENTRY[6];
- for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
- {
- Aag[Rtn] += MmePacket->MMENTRY[8 + Rtn];
- }
- AttenProfileCnt++;
- Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
- break;
- }
- #endif
- }
-
- case MMTYPE_CM_ATTEN_CHAR_RSP:
- {
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_CHAR_RSP ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
- MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
- MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
- MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
- for(Rtn = 0; Rtn < 17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[16 + Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
- for(Rtn = 0; Rtn < 17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[33 + Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[50]); //Fixed value of 0x00 indicates a successful SLAC process
- }
- #endif
-
- #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
- {
- //Check ODA (Destination Address)
- if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_ATTEN_CHAR_RSP]wrong ODA: ignore");
- break;
- }
-
- EvMac_in = &MmePacket->OSA[0];
- RunID_in = &MmePacket->MMENTRY[8];
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
-
- //Check Parameters
- if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
- (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
- (SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in) < 0) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
- (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
- (Array_Check_All_Zero(&MmePacket->MMENTRY[16], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] SourceID(17 bytes) must be all zero.
- (Array_Check_All_Zero(&MmePacket->MMENTRY[33], 17) == FALSE) || //[TC_SECC_VTB_AttenuationCharacterization_009] RESP_ID (17 bytes) must be all zero.
- (MmePacket->MMENTRY[50] != 0) //Result: must be 0x00(Success)
- )
- {
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
-
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para(%d,%d,%d,%d,%d) => %d-th retry",
- MmePacket->MMENTRY[0], //applicationType must be 0x00
- MmePacket->MMENTRY[1], //securityType must be 0x00
- SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in),
- SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in),
- MmePacket->MMENTRY[50],
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
- {
- Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
- ftime(&SeqStartTime);
- break;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR][SLAC][Rx]CM_ATTEN_CHAR_RSP:invalid para => 2-retry fail => End_Process");
- Update_V2G_Flow_Status(Other_Fault);
- break;
- }
- }
- else
- {
- //The CM_ATTEN_CHAR_IND is legal
- SLAC_INFO.array[idx].AttenCharRspCnt++;
-
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_ATTEN_CHAR_RSP[%d]:%d-th",
- (idx + 1),
- SLAC_INFO.array[idx].AttenCharRspCnt);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
- Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
- ftime(&SeqStartTime);
- break;
- }
- }
- #else
- {
- //Check Parameters
- if ((MmePacket->MMENTRY[0] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_005] applicationType must be 0x00
- (MmePacket->MMENTRY[1] != 0) || //[TC_SECC_VTB_AttenuationCharacterization_006] securityType must be 0x00
- (Array_Compare_Identity(SLAC_INFO.array[0].EvMac, &MmePacket->MMENTRY[2], 6) == TRUE) || //[TC_SECC_VTB_AttenuationCharacterization_007] sourceAddress cannot not be all zero
- (Array_Compare_Identity(SLAC_INFO.array[0].RunID, &MmePacket->MMENTRY[8], 8) == TRUE) //[TC_SECC_VTB_AttenuationCharacterization_008] check for invalid runID
- )
- {
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry++;
-
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Rx]CM_ATTEN_CHAR_RSP: invalid parameters(%d-th)",
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
- {
- Update_V2G_Flow_Status(CM_MNBC_SOUND_IND);
- ftime(&SeqStartTime);
- break;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]CM_ATTEN_CHAR_RSP: invalid parameters => End_Process");
- Update_V2G_Flow_Status(Other_Fault);
- ftime(&SeqStartTime);
- break;
- }
- }
- else
- {
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
- Update_V2G_Flow_Status(CM_ATTEN_CHAR_RSP);
- ftime(&SeqStartTime);
- break;
- }
- }
- #endif
- }
-
- case MMTYPE_CM_VALIDATE_REQ: //BCB Toggle
- {
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_VALIDATE_REQ ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]); //Fixed value (0x00) to indicate ��PEV S2 toggles on control pilot line��
- 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.
- 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��.
- }
- #endif
-
- #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
- {
- counter = 0;
-
- EvMac_in = &MmePacket->OSA[0];
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
-
- if (idx >= 0)
- {
- Update_V2G_Flow_Status(CM_VALIDATE_CNF);
- SLAC_INFO.array[idx].ValidateReqCnt++;
-
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_VALIDATE_REQ[%d]:%d-th",
- (idx + 1),
- SLAC_INFO.array[idx].ValidateReqCnt);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
-
- //[To-Do] Protection
-
-
- memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
- memcpy(SendMmePacket.OSA, CsuMac, 6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = 0x01;
- SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
-
- if(counter == 0)
- {
- //The First MMTYPE_CM_VALIDATE_REQ because Unicast
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SignalType(0x00): Fixed value to indicate "EV S2 toggles on control pilot line"
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //ToggleNum(0x00): Fixed value. In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
-
- #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
- #else
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
- #endif
- }
- else
- {
- //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
- unsigned char PreStatus = 3;
- unsigned char ToggleNum = 0;
- ftime(&SeqStartTime);
- while(1)
- {
- if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
- {
- ToggleNum++;
- PreStatus = 4;
- }
- else
- {
- PreStatus = 3;
- }
-
- ftime(&SeqEndTime);
- if((DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))||(EVCOMM_SYS_INFO.CpState == 1))
- {
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate "PEV S2 toggles on control pilot line"
- SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
-
- #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
- if(ToggleNum==0)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 3; //0x02 = Failure
- else
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
- #else
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
- #endif
-
- break;
- }
- }
- }
- SendMmePacketSize += 19; //the size before MMENTRY
- Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
- ftime(&SeqStartTime);
- }
- else
- {
- //EvMac does not exist.
- //ignore
- }
- break;
- }
- #else
- {
- counter = 0;
-
- for(Rtn = 0; Rtn < 6; Rtn++)
- {
- if(MmePacket->ODA[Rtn] != CsuMac[Rtn])
- {
- counter = 1;
- break;
- }
- }
-
- memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA, EvMac,6);
- memcpy(SendMmePacket.OSA, CsuMac,6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = 0x01;
- SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
- if(counter == 0)
- {
- //The First MMTYPE_CM_VALIDATE_REQ because Unicast
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate PEV S2 toggles on control pilot line
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
- #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 1; //0x01 = Ready
- #else
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
- #endif
- }
- else
- {
- //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
- unsigned char PreStatus = 3, ToggleNum = 0;
- ftime(&SeqStartTime);
- while(1)
- {
- ftime(&SeqEndTime);
- if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
- {
- ToggleNum++;
- PreStatus = 4;
- }
- else
- {
- PreStatus = 3;
- }
- if(DiffTimeb(SeqStartTime, SeqEndTime) >= (SendMmePacket.MMENTRY[1]*100 + 100))
- {
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //Fixed value to indicate ��PEV S2 toggles on control pilot line��
- SendMmePacket.MMENTRY[SendMmePacketSize++] = ToggleNum;
- #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 2; //0x02 = Success
- #else
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 4; //0x04 = Not Required
- #endif
- break;
- }
- }
- }
- SendMmePacketSize += 19; //the size before MMENTRY
- Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
- Update_V2G_Flow_Status(CM_VALIDATE_CNF);
- ftime(&SeqStartTime);
- break;
- }
- #endif
- }
-
- case MMTYPE_CM_SLAC_MATCH_REQ:
- {
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
- for(Rtn=0; Rtn<17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
- for(Rtn=0; Rtn<6; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
- for(Rtn=0; Rtn<17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
- for(Rtn=0; Rtn<6; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
- for(Rtn=0; Rtn<8; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
- for(Rtn=0; Rtn<8; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- }
- #endif
-
- #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_MATCH_REQ");
-
- //Check ODA (Destination Address)
- if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_SLAC_MATCH_REQ]wrong ODA: ignore");
- //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
- }
-
- EvMac_in = &MmePacket->OSA[0];
- RunID_in = &MmePacket->MMENTRY[50];
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
-
- if (idx >= 0)
- {
- Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
-
- SLAC_INFO.array[idx].MatchReqNum++;
-
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:%d-th",
- (idx + 1),
- SLAC_INFO.array[idx].MatchReqNum);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
- //[TC_SECC_VTB_CmSlacMatch_008]
- if (MmePacket->MMENTRY[0] != 0)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong APPLICATION_TYPE(%d)",
- (idx + 1),
- MmePacket->MMENTRY[0]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_CmSlacMatch_009] SECURITY_TYPE must be 0x00(No Security)
- //[TC_SECC_VTB_CmSlacMatch_010]
- if (MmePacket->MMENTRY[1] != 0)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong SECURITY_TYPE(%d)",
- (idx + 1),
- MmePacket->MMENTRY[1]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_CmSlacMatch_011] MVFLength must be 0x3E(MatchVarField Length)
- //[TC_SECC_VTB_CmSlacMatch_012]
- if (MmePacket->MMENTRY[2] != 0x3E || MmePacket->MMENTRY[3] != 0x00)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]:wrong MVFLength(%d,%d)",
- (idx + 1),
- MmePacket->MMENTRY[2],
- MmePacket->MMENTRY[3]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_CmSlacMatch_013] EV ID (muxt be all zero)
- //[TC_SECC_VTB_CmSlacMatch_014]
- if (Array_Check_All_Zero(&MmePacket->MMENTRY[4], 17) == FALSE)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV ID",
- (idx + 1));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_CmSlacMatch_015] EV MAC
- //[TC_SECC_VTB_CmSlacMatch_016]
- if (Array_Compare_Identity(EvMac_in, &MmePacket->MMENTRY[21], SLAC_EVMAC_LENGTH) == FALSE)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EV MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
- (idx + 1),
- MmePacket->MMENTRY[21], MmePacket->MMENTRY[22], MmePacket->MMENTRY[23],
- MmePacket->MMENTRY[24], MmePacket->MMENTRY[25], MmePacket->MMENTRY[26]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_CmSlacMatch_017] EVSE ID should be all zero
- //[TC_SECC_VTB_CmSlacMatch_018]
- if (Array_Check_All_Zero(&MmePacket->MMENTRY[27], 17) == FALSE)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE ID",
- (idx + 1));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_CmSlacMatch_019] EVSE MAC
- //[TC_SECC_VTB_CmSlacMatch_020]
- if (Array_Compare_Identity(CsuMac, &MmePacket->MMENTRY[44], SLAC_EVSE_MAC_LENGTH) == FALSE)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_SLAC_MATCH_REQ[%d]: wrong EVSE MAC(%02X:%02X:%02X:%02X:%02X:%02X)",
- (idx + 1),
- MmePacket->MMENTRY[44], MmePacket->MMENTRY[45], MmePacket->MMENTRY[46],
- MmePacket->MMENTRY[47], MmePacket->MMENTRY[48], MmePacket->MMENTRY[49]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
- //[TC_SECC_VTB_CmSlacMatch_022]
- if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
- (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
- {
- memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
- memcpy(SendMmePacket.OSA, CsuMac, 6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = MmePacket->MMV;
- SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_MATCH_CNF;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //APPLICATION_TYPE: Fixed value (0x00: EV-EVSE matching)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //SECURITY_TYPE: Fixed value (0x00: No Security)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x56; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
- memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EV ID
- SendMmePacketSize += 17;
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //EV MAC
- SendMmePacketSize += 6;
- memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //EVSE ID
- SendMmePacketSize += 17;
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, CsuMac, 6); //EVSE MAC
- SendMmePacketSize += 6;
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
- SendMmePacketSize += SLAC_RUNID_LENGTH;
- memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 8); //RSVD
- SendMmePacketSize += 8;
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, Nid, sizeof(Nid)); //NID: Network ID given by the CCo(EVSE)
- SendMmePacketSize += sizeof(Nid); //NID caculated from the random NMK that will be set.
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //RSVD
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, NewNmkKey, sizeof(NewNmkKey)); //NMK: Random value
- SendMmePacketSize += sizeof(NewNmkKey); //NMK: Private NMK of the EVSE (random value)
- SendMmePacketSize += 19; //the size before MMENTRY
-
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
- for(Rtn=0; Rtn<17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
- for(Rtn=0; Rtn<6; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
- for(Rtn=0; Rtn<17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
- for(Rtn=0; Rtn<6; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
- for(Rtn=0; Rtn<8; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
- for(Rtn=0; Rtn<8; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
- for(Rtn=0; Rtn<7; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
- DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
- for(Rtn=0; Rtn<16; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- }
- #endif
-
- Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
- Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
-
-
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
- sprintf(buf_log_evcomm,
- "[SLAC][Tx]CM_SLAC_MATCH_CNF[%d]",
- (idx + 1));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- ftime(&SeqStartTime);
- }
- else
- {
- //RunID does not match and it's not the first SLAC request
- //Reset the SLAC database to embrace SLAC retry
- SAVE_SYS_LOG_MSG_EVCOMM("[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
- SLAC_DB_Reset();
- }
- }
- else
- {
- //OSA(EvMac) does not exist
- }
- break;
- }
- #else
- {
- Update_V2G_Flow_Status(CM_SLAC_MATCH_REQ);
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx]CM_SLAC_MATCH_REQ");
-
- memset(&SendMmePacket,0,sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
- memcpy(SendMmePacket.OSA,CsuMac,6);
- SendMmePacket.MTYPE=htons(EtherType_HomePlug);
- SendMmePacket.MMV=MmePacket->MMV;
- SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_MATCH_CNF;
- SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
- SendMmePacketSize=0;
- SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating PEV-EVSE matching
- SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x00) indicating No Security
- SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56; //Fixed value (0x0056) for matching
- SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //Fixed value (0x0056) for matching
- memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //PEV ID
- SendMmePacketSize+=17;
- memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
- SendMmePacketSize+=6;
- memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17); //EVSE ID
- SendMmePacketSize+=17;
- memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
- SendMmePacketSize+=6;
- memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
- SendMmePacketSize+=sizeof(SlacRunId);
- memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8); //RSVD
- SendMmePacketSize+=8;
- memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
- SendMmePacketSize+=sizeof(Nid);
- SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00; //RSVD
- memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
- SendMmePacketSize+=sizeof(NewNmkKey);
- SendMmePacketSize+=19; //the size before MMENTRY
-
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
- for(Rtn=0; Rtn<17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
- for(Rtn=0; Rtn<6; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
- for(Rtn=0; Rtn<17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
- for(Rtn=0; Rtn<6; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
- for(Rtn=0; Rtn<8; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
- for(Rtn=0; Rtn<8; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("NID: \n");
- for(Rtn=0; Rtn<7; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
- DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
- for(Rtn=0; Rtn<16; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- #endif
-
- Update_V2G_Flow_Status(CM_SLAC_MATCH_CNF);
- Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
-
-
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Tx]CM_SLAC_MATCH_CNF");
-
- ftime(&SeqStartTime);
- break;
- }
- #endif
- }
- case MMTYPE_CM_AMP_MAP_REQ:
- {
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]); //Fixed value (0x3E) for matching
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: \n");
- for(Rtn=0; Rtn<17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[4+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: \n");
- for(Rtn=0; Rtn<6; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[21+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: \n");
- for(Rtn=0; Rtn<17; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[27+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: \n");
- for(Rtn=0; Rtn<6; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[44+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: \n");
- for(Rtn=0; Rtn<8; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[50+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: \n");
- for(Rtn=0; Rtn<8; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",MmePacket->MMENTRY[58+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- }
- #endif
-
- //Check ODA (Destination Address)
- if (Array_Compare_Identity(CsuMac, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[SLAC][Rx][CM_AMP_MAP_REQ]wrong ODA: ignore");
- //break; //patch for DEKRA I2SE EVCC (another EVSE MAC Address protection comes as below.)
- }
-
- EvMac_in = &MmePacket->OSA[0];
- RunID_in = &MmePacket->MMENTRY[50];
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
-
- if (idx >= 0)
- {
- Update_V2G_Flow_Status(CM_AMP_MAP_REQ);
-
- SLAC_INFO.array[idx].MatchReqNum++;
-
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_AMP_MAP_REQ[%d]:%d-th",
- (idx + 1),
- SLAC_INFO.array[idx].MatchReqNum);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
- //[TC_SECC_VTB_CmSlacMatch_008]
- if ((MmePacket->MMENTRY[0] != 0x3A)||(MmePacket->MMENTRY[1] != 0))
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Rx]CM_AMP_MAP_REQ[%d]:wrong AMLEN(%d)",
- (idx + 1),
- MmePacket->MMENTRY[0]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
-
- //[TC_SECC_VTB_CmSlacMatch_021]runID: Check RunID
- //[TC_SECC_VTB_CmSlacMatch_022]
- if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE &&
- (idx == 0)) //only setup a successful link establishment with the first SLAC Req instance
- {
- memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA, MmePacket->OSA, 6);
- memcpy(SendMmePacket.OSA, CsuMac, 6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = MmePacket->MMV;
- SendMmePacket.MMTYPE = MMTYPE_CM_AMP_MAP_CNF;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0x00; //success
-
- Update_V2G_Flow_Status(CM_AMP_MAP_CNF);
- Rtn = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
-
-
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
- sprintf(buf_log_evcomm,
- "[SLAC][Tx]CM_AMP_MAP_CNF[%d]",
- (idx + 1));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- ftime(&SeqStartTime);
- }
- else
- {
- //RunID does not match and it's not the first SLAC request
- //Reset the SLAC database to embrace SLAC retry
- SAVE_SYS_LOG_MSG_EVCOMM("[CM_SLAC_MATCH_REQ]No Real MATCH_REQ");
- SLAC_DB_Reset();
- }
- }
- else
- {
- //OSA(EvMac) does not exist
- }
- break;
- }
-
- case MMTYPE_VENDOR_VS_HOST_ACTION:
- {
- struct QcaVendorMmeHeader *RecvPacket;
- RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
-
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_HOST_ACTION ---\n");
-
- switch (RecvPacket->MBODY[0])
- {
- case 0x00:
- //Loader (Device Softloader or Bootloader) ready
- DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader Ready\n");
- break;
-
- case 0x01:
- //Firmware Upgrade Ready
- DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade Ready\n");
- break;
-
- case 0x02:
- //PIB Update Ready
- DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: PIB Update Ready\n");
- break;
-
- case 0x03:
- //Firmware Upgrade and PIB Update ready
- DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Firmware Upgrade and PIB Update ready\n");
- break;
-
- case 0x04:
- //Loader (Bootloader) ready to receive SDRAM configuration.
- DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Loader ready to receive SDRAM configuration\n");
- break;
-
- case 0x05:
- //Reset to Factory Defaults.
- DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reset to Factory Defaults\n");
- break;
-
- default:
- //Reserved
- DEBUG_PRINTF_EVCOMM_DETAIL("QCA7K: Reserved\n");
- break;
- }
- break;
- }
-
- case MMTYPE_VENDOR_ATTEN_CHAR:
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_ATTEN_CHAR ---\n");
- break;
- }
-
- case MMTYPE_VENDOR_VS_NW_INFO_CNF:
- {
- struct QcaVendorMmeHeader *RecvPacket;
- RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
- memcpy(QcaMac, RecvPacket->OSA, 6);
- sprintf(buf_log_evcomm,
- "[QCA7K][Rx][VENDOR_VS_NW_INFO_CNF]Got QCA7K MacAddr:%02X:%02X:%02X:%02X:%02X:%02X (comm:OK)",
- QcaMac[0], QcaMac[1], QcaMac[2], QcaMac[3], QcaMac[4], QcaMac[5]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("QcaMac: %02x:%02x:%02x:%02x:%02x:%02x\n",
- QcaMac[0],
- QcaMac[1],
- QcaMac[2],
- QcaMac[3],
- QcaMac[4],
- QcaMac[5]);
-
- Update_V2G_Flow_Status(CM_SET_KEY_REQ);
- ftime(&SeqStartTime);
- break;
- }
- case MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF:
- {
- struct QcaVendorMmeHeader *RecvPacket;
- RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
-
- if(RecvPacket->MBODY[1]==0)
- {
- //PLC disconnected
- sprintf(buf_log_evcomm,
- "[QCA7K][Rx][MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF]Got PLC Link Status:%d",
- RecvPacket->MBODY[1]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Other_Fault);
- }
- else
- Update_V2G_Flow_Status(CM_SET_KEY_REQ);
- ftime(&SeqStartTime);
- break;
- }
-
- default:
- {
- break;
- }
- }
- }
- /*===========================================================================
- FUNCTION: SlacComm
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int SlacComm()
- {
- static unsigned char qca7k_comm_retry = 0;
- unsigned char *EvMac_in;
- unsigned char *RunID_in;
- double t_diff = 0;
- int packet_size = 0;
- int count = 0;
- int idx = 0;
- int i = 0;
- if(RawSock >= 0)
- {
- memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- packet_size = recvfrom(RawSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0, NULL, NULL);
- if(packet_size > 0)
- {
- /*#ifdef Debug
- DEBUG_PRINTF_EVCOMM_DETAIL("Raw Data: ");
- for(count=0;count<packet_size;count++)
- DEBUG_PRINTF_EVCOMM_DETAIL("0x%x, ",V2gtpMsgRxBuf[count]);
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- #endif*/
- MmeProcess(V2gtpMsgRxBuf, packet_size);
- }
- }
- switch(Check_V2G_Flow_Status())
- {
- case IDLE:
- {
- if(RawSock < 0)
- {
- RawSock = socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
- sprintf(buf_log_evcomm, "[RawSock]opened(%d)", RawSock);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- if(RawSock == -1)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Failed to create socket");
- Update_V2G_Flow_Status(Other_Fault);
- return -1;
- }
- ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp=RawSock;
- if (setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE, QcaInterface, 4) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_BINDTODEVICE NG");
- Update_V2G_Flow_Status(Other_Fault);
- return -1;
- }
- struct timeval tv;
- tv.tv_sec = 0;
- tv.tv_usec = 100000; //100ms (Rx timeout)
- if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_RCVTIMEO NG");
- Update_V2G_Flow_Status(Other_Fault);
- return -1;
- }
- tv.tv_usec = 100000; //100ms (Tx timeout)
- if (setsockopt(RawSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("SlacComm:Set SO_SNDTIMEO NG");
- Update_V2G_Flow_Status(Other_Fault);
- return -1;
- }
- memset(&Req, 0, sizeof(struct ifreq));
- strcpy( (char*)Req.ifr_name, QcaInterface);
- if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("SlacComm: ioctl NG");
- Update_V2G_Flow_Status(Other_Fault);
- return -1;
- }
- memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll));
- DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
- DestSocketAddress.sll_halen = ETH_ALEN;
- PwmStartTime = 0;
- EVCOMM_SYS_INFO.QCA7K_SetKeyDone = FALSE;
- SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K]connecting...");
- //Get QCA7K MAC address
- GetQca7kMac();
- ftime(&SeqStartTime);
- break;
- }
- else //RawSock: opened
- {
- if(EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
- {
- ftime(&SeqEndTime);
- t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
- if (t_diff > V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD) //3 secs
- {
- qca7k_comm_retry++;
- sprintf(buf_log_evcomm,
- "[QCA7K]re-try connecting...(%.02lf/%dms)",
- t_diff,
- V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- GetQca7kMac(); //re-send req
- ftime(&SeqStartTime);
- break;
- }
- else
- {
- //null
- }
- //Retry by 3 times
- if (qca7k_comm_retry >= 3)
- {
- sprintf(buf_log_evcomm,
- "[QCA7K][Error]comm: fail (retry by %d times)",
- qca7k_comm_retry);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 9;
- ShmStatusCodeData->PresentStatusCode[0][5] = 2;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
- Update_V2G_Flow_Status(Sequence_Timeout);
- qca7k_comm_retry = 0;
- break;
- }
- }
- else //RawSock: opened; Set Key: DONE
- {
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission >=1))
- {
- if(PwmStartTime <= 0)
- {
- //Sniffer_Tcpdump(ENABLE);
- //#if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
- //sleep(1); //wait for tcpdump to be ready.
- //#endif
- SwitchCpStateE(DISABLE);
- OutputCpPwmDuty(5);
- PwmStartTime = time(NULL);
- }
- else
- {
- if((time(NULL) - PwmStartTime) > ((CCS_ENERGY_TRANSFER_MODE<=1)?20:TT_EVSE_SLAC_init))
- {
- sprintf(buf_log_evcomm,
- "SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init, NowTime(%d)-PwmStartTime(%d)>%d (sec)",
- time(NULL),
- PwmStartTime,
- TT_EVSE_SLAC_init);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_SLAC_TT_EVSE_SLAC_init (023809)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 0;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- Update_V2G_Flow_Status(Sequence_Timeout);
- PwmStartTime = 0;
- return -1;
- }
- else
- {
- //waiting for CM_SLAC_PARM_REQ
- }
- }
- }
- else
- {
- PwmStartTime = 0;
- }
- }
- }
- break;
- }
- case CM_SET_KEY_REQ: //13
- {
- //CM_SET_KEY_REQ
- //SAVE_SYS_LOG_MSG_EVCOMM("[QCA7K][Rx]CM_SET_KEY_REQ");
- ftime(&SeqEndTime);
- t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
- if (t_diff > V2G_SECC_QCA7000_COMM_TIMEOUT) //10 seconds
- {
- sprintf(buf_log_evcomm,
- "[QCA7K]Failed on SetKey => End_Process (%.02lf/%dms)",
- t_diff,
- V2G_SECC_QCA7000_COMM_TIMEOUT);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECCC_TIMEOUT_QCA7000_COMM (023892): The firmware code of QCA7000 may not be installed, yet
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 9;
- ShmStatusCodeData->PresentStatusCode[0][5] = 2;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Sequence_Timeout);
- }
- else if (t_diff > V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD) //2 seconds
- {
- sprintf(buf_log_evcomm,
- "[QCA7K]SetKey: proceed (%.02lf/%dms)",
- t_diff,
- V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- SendSetKey();
- ftime(&SeqStartTime);
- }
- else
- {
- //null
- }
- break;
- }
- case CM_SET_KEY_CNF: //14
- {
- sprintf(buf_log_evcomm,
- "[SECCReady]Wait: plugin(%d), matached(%d), permission(%d)...",
- CheckConnectorPlugIn(),
- CSUCOMMDC_TASK_FLAG.matched,
- ShmInternalComm->ChargingPermission
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- EVCOMM_SYS_INFO.QCA7K_SetKeyDone = TRUE;
- PwmStartTime = 0;
- Update_V2G_Flow_Status(IDLE);
- break;
- }
- case CM_SLAC_PARM_CONF:
- {
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
- {
- sprintf(buf_log_evcomm,
- "SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence (%.02lf of %dms)",
- DiffTimeb(SeqStartTime, SeqEndTime),
- TT_match_sequence);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_CM_START_ATTEN_CHAR_IND (023811):
- //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
- //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 1;
- ShmStatusCodeData->PresentStatusCode[0][5] = 1;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_START_ATTEN_CHAR_IND:
- {
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > (TP_EV_batch_msg_interval)) //one more time interval for tolerance
- {
- sprintf(buf_log_evcomm,
- "SlacComm: Wait CM_MNBC_SOUND_IND Timeout - TP_EV_batch_msg_interval (%.02lf of %dms)",
- DiffTimeb(SeqStartTime, SeqEndTime),
- TP_EV_batch_msg_interval);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_SLAC_CM_MNBC_SOUND_IND (023818):
- //[Possible Reason] CCS Board image might not be updated properly. The 2nd reboot process is not finished.
- //[Verification Method] By tying reboot command to the terminal and see if it could be executed immediately.
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 1;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_MNBC_SOUND_IND:
- {
- #if (NEW_SLAC_ARCHITECTURE_SWITCH == ENABLE)
- {
- ftime(&SeqEndTime);
- t_diff = DiffTimeb(SeqStartTime, SeqEndTime);
- //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
- if(t_diff > TT_EVSE_match_MNBC ||
- (SLAC_INFO.array[0].AttenProfileCnt >= SLAC_INFO.array[0].MnbcSoundNum) ||
- (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)) //TC_SECC_VTB_AttenuationCharacterization_003
- {
- //Wait for other SLAC Req sets
- if ((SLAC_INFO.arrayLen >= 2) &&
- (t_diff < TT_EVSE_match_MNBC) &&
- (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)) //not a retry
- {
- break;
- }
- //Check if it is a timeup response
- if (t_diff > TT_EVSE_match_MNBC)
- {
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: timeup(%.2f/%dms) => send",
- (i + 1),
- t_diff,
- TT_EVSE_match_MNBC);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- //Sending all CM_ATTEN_CHAR_IND according to all corresponding SLAC Req sets
- for (i = 0; i < SLAC_INFO.arrayLen; i++)
- {
- if ((SLAC_INFO.array[i].AttenProfileCnt == 0) ||
- (SLAC_INFO.array[i].AagGroupsNum == 0) ||
- (SLAC_INFO.array[i].StartAttenCharCnt == 0) ||
- (SLAC_INFO.array[i].MnbcSoundNum != 10) || //received in CM_START_ATTEN_CHAR_IND
- (SLAC_INFO.array[i].StartAttenCharErr == TRUE)
- )
- {
- //Ignoring those SLAC request sets without sending CM_MNBC_SOUND_IND(CM_ATTEN_PROFILE_IND)
- sprintf(buf_log_evcomm,
- "[WARNING][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: para err(%d,%d,%d,%d,%d) => canceled",
- (i + 1),
- SLAC_INFO.array[i].AttenProfileCnt,
- SLAC_INFO.array[i].AagGroupsNum,
- SLAC_INFO.array[i].StartAttenCharCnt,
- SLAC_INFO.array[i].MnbcSoundNum,
- SLAC_INFO.array[i].StartAttenCharErr);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- continue;
- }
- //In CM_ATTEN_CHAR_IND retry process, here only re-send this message according to the 1st coming SLAC request
- if ((EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0) && (i != 0))
- {
- sprintf(buf_log_evcomm,
- "[NOTE][SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: canceled",
- (i + 1));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
- EvMac_in = SLAC_INFO.array[i].EvMac;
- RunID_in = SLAC_INFO.array[i].RunID;
- memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
- memcpy(SendMmePacket.OSA, CsuMac, 6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = 0x01;
- SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //SOURCE_ADDRESS, MAC address of the EV Host
- SendMmePacketSize += SLAC_EVMAC_LENGTH;
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
- SendMmePacketSize += SLAC_RUNID_LENGTH;
- memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //SOURCE_ID(0x00)
- SendMmePacketSize += 17;
- memset(SendMmePacket.MMENTRY + SendMmePacketSize, 0, 17); //RESP_ID(0x00)
- SendMmePacketSize += 17;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AttenProfileCnt; //NumSounds: Number of M-Sounds used for generation of the ATTEN_PROFILE
- SendMmePacket.MMENTRY[SendMmePacketSize++] = SLAC_INFO.array[i].AagGroupsNum; //NumGroups
- for(count = 0; count < SLAC_INFO.array[i].AagGroupsNum; count++)
- {
- unsigned char TmpAag;
- TmpAag = ((SLAC_INFO.array[i].AAG[count] / SLAC_INFO.array[i].AttenProfileCnt) & 0xFF);
- SLAC_INFO.array[i].AAG_quality_ori += (float) TmpAag; //original signal quality
- #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
- #if 1
- //TC_SECC_VTB_AttenuationCharacterization_019
- TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
- #else
- if(TmpAag >= 39) //original method proposed by Vern
- {
- TmpAag = 37;
- }
- #endif
- #endif
- SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
- SLAC_INFO.array[i].AAG_quality_refined += (float) TmpAag; //refined signal quality
- }
- SendMmePacketSize += 19; //the size before MMENTRY
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
- SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
- SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
- SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
- for(count=0; count<17; count++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
- for(count=0; count<17; count++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
- DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
- for(count=0; count<AagGroupsNum; count++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- }
- #endif
- count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
- SLAC_INFO.array[i].AAG_quality_ori /= SLAC_INFO.array[i].AagGroupsNum;
- SLAC_INFO.array[i].AAG_quality_refined /= SLAC_INFO.array[i].AagGroupsNum;
- //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
- if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: %d-th resend (Q=%.2f/%.2f)(%d/%d)",
- (i + 1),
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry,
- SLAC_INFO.array[i].AAG_quality_refined,
- SLAC_INFO.array[i].AAG_quality_ori,
- SLAC_INFO.array[i].AttenProfileCnt,
- SLAC_INFO.array[i].MnbcSoundNum);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- else if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: Q=%.2f/%.2f(%d/%d)",
- (i + 1),
- SLAC_INFO.array[i].AAG_quality_refined,
- SLAC_INFO.array[i].AAG_quality_ori,
- SLAC_INFO.array[i].AttenProfileCnt,
- SLAC_INFO.array[i].MnbcSoundNum);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Tx]CM_ATTEN_CHAR_IND[%d]: unexpected CM_ATTEN_CHAR_IND_retry(%d))",
- i,
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
- } //end of for loop
- Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
- ftime(&SeqStartTime);
- }
- break;
- }
- #else
- {
- ftime(&SeqEndTime);
- //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(SeqStartTime, SeqEndTime),AttenProfileCnt); //added by Vern
- if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_MNBC || (AttenProfileCnt >= MnbcSoundNum) || (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0))
- {
- memset(&SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(SendMmePacket.ODA, EvMac, 6);
- memcpy(SendMmePacket.OSA, CsuMac, 6);
- SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- SendMmePacket.MMV = 0x01;
- SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
- SendMmePacket.FMI[0] = SendMmePacket.FMI[1] = 0;
- SendMmePacketSize = 0;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
- SendMmePacket.MMENTRY[SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
- memcpy(SendMmePacket.MMENTRY + SendMmePacketSize, EvMac, 6); //SOURCE_ADDRESS, MAC address of the EV Host
- SendMmePacketSize += 6;
- memcpy(SendMmePacket.MMENTRY+SendMmePacketSize, SlacRunId, sizeof(SlacRunId));
- SendMmePacketSize += sizeof(SlacRunId);
- memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //SOURCE_ID
- SendMmePacketSize += 17;
- memset(SendMmePacket.MMENTRY+SendMmePacketSize, 0, 17); //RESP_ID
- SendMmePacketSize += 17;
- SendMmePacket.MMENTRY[SendMmePacketSize++] = AttenProfileCnt; //NumSounds
- SendMmePacket.MMENTRY[SendMmePacketSize++] = AagGroupsNum; //NumGroups
- for(count=0; count < AagGroupsNum; count++)
- {
- unsigned char TmpAag;
- TmpAag = ((Aag[count] / AttenProfileCnt) & 0xFF);
- #if (SUDO_PSD_PARAMETER_MECHANISM == ENABLE) //default: ENABLE
- #if 1
- //TC_SECC_VTB_AttenuationCharacterization_019
- TmpAag = TmpAag >> 1; //new method proposed by Joseph (divided by 2)
- #else
- if(TmpAag >= 39) //original method proposed by Vern
- {
- /*
- // [To-do] If this statement is enabled, SLAC will fail due to timeout.
- {
- unsigned char TmpBuf[64];
- memset(TmpBuf,0,sizeof(TmpBuf));
- sprintf(TmpBuf,"SlacComm: bad Aag[%d]=%d",count,TmpAag);
- SAVE_SYS_LOG_MSG_EVCOMM(TmpBuf);
- }
- */
- printf("%d,", TmpAag);
- TmpAag = 37;
- }
- #endif
- #endif
- SendMmePacket.MMENTRY[SendMmePacketSize++] = TmpAag;
- }
- SendMmePacketSize += 19; //the size before MMENTRY
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == TRUE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Send MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
- SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
- SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
- SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: \n");
- for(count=0; count<17; count++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[16+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: \n");
- for(count=0; count<17; count++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[33+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
- DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: \n");
- for(count=0; count<AagGroupsNum; count++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ",SendMmePacket.MMENTRY[51+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- }
- #endif
- Update_V2G_Flow_Status(CM_ATTEN_CHAR_IND);
- count = sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
- //Print log if this CM_ATTEN_CHAR_IND belongs to RETRY Tx message.
- if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry > 0)
- {
- sprintf(buf_log_evcomm,
- "[SLAC][Tx]CM_ATTEN_CHAR_IND: resend(%d-th)",
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", SendMmePacketSize,count);
- ftime(&SeqStartTime);
- }
- break;
- }
- #endif
- }
- case CM_ATTEN_CHAR_IND:
- {
- ftime(&SeqEndTime);
- //if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
- 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.
- {
- sprintf(buf_log_evcomm,
- "SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response (%.02lf of %dms)",
- DiffTimeb(SeqStartTime, SeqEndTime),
- TT_match_response);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_SLAC_CM_ATTEN_CHAR_RSP (023814):
- //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 1;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_ATTEN_CHAR_RSP:
- {
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_EVSE_match_session)
- {
- sprintf(buf_log_evcomm,
- "SlacComm: Wait CM_VALIDATE_REQ_1ST or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session (%.02lf of %dms)",
- DiffTimeb(SeqStartTime, SeqEndTime),
- TT_EVSE_match_session);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_1ST__CM_SLAC_MATCH_REQ (023815):
- //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 1;
- ShmStatusCodeData->PresentStatusCode[0][5] = 5;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
-
- Update_V2G_Flow_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_VALIDATE_CNF:
- {
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_sequence)
- {
- sprintf(buf_log_evcomm,
- "SlacComm: Wait CM_VALIDATE_REQ_2ND or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence (%.02lf of %dms)",
- DiffTimeb(SeqStartTime, SeqEndTime),
- TT_match_sequence);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_SLAC_CM_VALIDATE_REQ_2ND__CM_SLAC_MATCH_REQ (023819):
- //[Possible Reason] Frequent on BMW i3, need to drive the EV a bit.
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 1;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
-
- Update_V2G_Flow_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_AMP_MAP_CNF:
- case CM_SLAC_MATCH_CNF:
- {
- if(UdpSock > 0)
- {
- close(UdpSock);
- UdpSock = -1;
- }
- if(TcpSock > 0)
- {
- close(TcpSock);
- TcpSock = -1;
- }
- ftime(&SeqStartTime);
- V2gTcpConnected();
- Update_V2G_Flow_Status(SLACC_SDP_UDP_Connection);
- SAVE_SYS_LOG_MSG_EVCOMM("SLAAC,SDP,UDP: connecting...");
- break;
- }
- default:
- {
- break;
- }
- }
- return 0;
- }
- /*===========================================================================
- FUNCTION: V2gMsgDecoder
- DESCRIPTION:
- 1. Decode the V2GTP messages inside "msg" and save the decoded
- messages in ccs_exi_doc_DIN, ccs_exi_doc_ISO1, and ccs_exi_doc_ISO2,
- respectively.
- 2. After decoding, V2gMsg_Process() could then use
- ccs_exi_doc_DIN, ccs_exi_doc_ISO1, or ccs_exi_doc_ISO2
- to deal with the corresponding Response messages, respectively.
- PRE-CONDITION:
- 1. msg_length > 0
- INPUT:
- 1. msg
- 2. msg_length
- OUTPUT:
- 1. ccs_exi_doc_DIN //global variable
- ccs_exi_doc_ISO1
- ccs_exi_doc_ISO2
- 2. v2g_state //Status Flag
- //indicating the V2gMsg_Process_din to proceed
- the next process.
- 3. return value // < 0: ERROR
- // > 0: Message Type
- GLOBAL VARIABLES:
- =============================================================================*/
- int V2gMsgDecoder(unsigned char *msg, unsigned int msg_length, unsigned int v2g_state)
- {
- int errn = 0;
- //Checking the minimum Header size requirement
- if(msg_length < V2GTP_MSG_HEADER_LENGTH) //The minimum requirement should be 8-byte header.
- {
- errn = -1;
- return errn;
- }
- //Decode the 1st V2GMSG: AppProtocol
- if(v2g_state == SupportedAppProtocolRequest) //17
- {
- if (errn = API_V2GMSG_EXI_Decoder_AppProtocol(msg, msg_length, &ccs_handshake) < 0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: SupportedAppProtocolRequest()\n", errn);
- }
- else //decoded successfully.
- {
- //PRINT_XML_DOC_supportedAppProtocolReq(&ccs_handshake);
- }
- }
- //Decode the subsequent V2GMSG (DIN 70121, ISO 15118-2, ISO 15118-20)
- else if(v2g_state > SupportedAppProtocolRequest && v2g_state <= SessionStopResponse)
- {
- //Decoding according to its own protocol
- switch (ShmCcsData->CommProtocol)
- {
- case V2GT_MSG_PROTOCOL_DIN70121: //0
- {
- //DIN
- if(errn = API_V2GMSG_EXI_Decoder_DIN(msg, msg_length, &ccs_exi_doc_DIN) < 0)
- {
- sprintf(buf_log_evcomm,
- "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_DIN()",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
- {
- //ISO1
- if(errn = API_V2GMSG_EXI_Decoder_ISO1(msg, msg_length, &ccs_exi_doc_ISO1) < 0)
- {
- sprintf(buf_log_evcomm,
- "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO1()",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
- {
- //ISO2
- if(errn = API_V2GMSG_EXI_Decoder_ISO2(msg, msg_length, &ccs_exi_doc_ISO2) < 0)
- {
- sprintf(buf_log_evcomm,
- "[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO2()",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- break;
- }
- default:
- break;
- }
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: Unexpected v2g_state\n", errn);
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: encode_din_V2GTP_stream
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int encode_din_V2GTP_stream(bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
- {
- int errn = 0;
- *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
- errn = encode_dinExiDocument(v2g_tx_stream, ccs_exi_doc_DIN);
- if (errn == 0)
- {
- //successfully encoded
- errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
- v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
- if (errn != 0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
- }
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_din_V2GTP_stream]encode_dinExiDocument(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: encode_iso1_V2GTP_stream
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int encode_iso1_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
- {
- int errn = 0;
- *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
- errn = encode_iso1ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO1);
- if (errn == 0)
- {
- //successfully encoded
- errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
- v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
- if (errn != 0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
- }
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso1_V2GTP_stream]encode_iso1ExiDocument(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: encode_iso2_V2GTP_stream
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int encode_iso2_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
- {
- int errn = 0;
- *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
- errn = encode_iso2ExiDocument(v2g_tx_stream, ccs_exi_doc_ISO2);
- if (errn == 0)
- {
- //successfully encoded
- errn = write_v2gtpHeader(v2g_tx_stream->data, (*v2g_tx_stream->pos) - V2GTP_HEADER_LENGTH, V2GTP_EXI_TYPE);
- v2g_tx_stream->size = *v2g_tx_stream->pos; //total length of the encoded V2GMSG.
- if (errn != 0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]write_v2gtpHeader(): %d (DEC)\n", errn);
- }
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][encode_iso2_V2GTP_stream]encode_iso2ExiDocument(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: send_encoded_din_V2GTP_Stream
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int send_encoded_din_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct dinEXIDocument *ccs_exi_doc_DIN)
- {
- int errn = 0;
- // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
- errn = encode_din_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_DIN);
- // STEP 2: =========== Send Response Packet ===========
- int rtn = 0;
- #ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- {
- rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
- }
- else
- {
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- }
- #else
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- #endif
- if (rtn == v2g_tx_stream->size)
- {
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_din_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
- rtn, v2g_tx_stream->size);
- */
- //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
- }
- else if (rtn >= 0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_din_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
- rtn, v2g_tx_stream->size);
- }
- else
- {
- errn = rtn;
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_din_V2GTP_Stream]send(): %d (DEC)\n", errn);
- }
- //STEP 3: ========= Reset V2G MSG Flags ==========
- init_dinBodyType(&ccs_exi_doc_DIN->V2G_Message.Body);
- return errn;
- }
- /*===========================================================================
- FUNCTION: send_encoded_iso1_V2GTP_Stream
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int send_encoded_iso1_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso1EXIDocument *ccs_exi_doc_ISO1)
- {
- int errn = 0;
- // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
- errn = encode_iso1_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO1);
- // STEP 2: =========== Send Response Packet ===========
- int rtn = 0;
- #ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- {
- rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
- }
- else
- {
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- }
- #else
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- #endif
- if (rtn == v2g_tx_stream->size)
- {
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso1_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
- rtn, v2g_tx_stream->size);
- */
- //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
- }
- else if (rtn >= 0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso1_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
- rtn, v2g_tx_stream->size);
- }
- else
- {
- errn = rtn;
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso1_V2GTP_Stream]send(): %d (DEC)\n", errn);
- }
- //STEP 3: ========= Reset V2G MSG Flags ==========
- init_iso1BodyType(&ccs_exi_doc_ISO1->V2G_Message.Body);
- return errn;
- }
- /*===========================================================================
- FUNCTION: send_encoded_iso2_V2GTP_Stream
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int send_encoded_iso2_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso2EXIDocument *ccs_exi_doc_ISO2)
- {
- int errn = 0;
- // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
- errn = encode_iso2_V2GTP_stream(v2g_tx_stream, ccs_exi_doc_ISO2);
- // STEP 2: =========== Send Response Packet ===========
- int rtn = 0;
- #ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- {
- rtn = SSL_write(ssl, v2g_tx_stream->data, v2g_tx_stream->size);
- }
- else
- {
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- }
- #else
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- #endif
- if (rtn == v2g_tx_stream->size)
- {
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][send_encoded_iso2_V2GTP_Stream] Response Message is sent ( %d / %d ). (Bytes, DEC): OK\n",
- rtn, v2g_tx_stream->size);
- */
- //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
- }
- else if (rtn >= 0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm][send_encoded_iso2_V2GTP_Stream]Imcomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
- rtn, v2g_tx_stream->size);
- }
- else
- {
- errn = rtn;
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][send_encoded_iso2_V2GTP_Stream]send(): %d (DEC)\n", errn);
- }
- //STEP 3: ========= Reset V2G MSG Flags ==========
- init_iso2BodyType(&ccs_exi_doc_ISO2->V2G_Message.Body);
- return errn;
- }
- /*===========================================================================
- FUNCTION: Check_din_V2G_Rx_MSG_SessionID
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Check_din_V2G_Rx_MSG_SessionID(struct dinEXIDocument *exi_doc_DIN)
- {
- int i = 0;
- int leng = 0;
- int errn = 0;
- leng = exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen;
- //Step 1: Check SessionID Length
- if (leng != 8) //8-byte
- {
- sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- }
- else
- {
- //Step 2-1: Check SessionID content
- for (i = 0; i < leng; i++)
- {
- if (exi_doc_DIN->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
- {
- errn = -2;
- break;
- }
- }
- }
- //Step 2-2: Print Incorrect ID
- if (errn == -2) //incorrect ID
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
- exi_doc_DIN->V2G_Message.Header.SessionID.bytes[0],
- exi_doc_DIN->V2G_Message.Header.SessionID.bytes[1],
- exi_doc_DIN->V2G_Message.Header.SessionID.bytes[2],
- exi_doc_DIN->V2G_Message.Header.SessionID.bytes[3],
- exi_doc_DIN->V2G_Message.Header.SessionID.bytes[4],
- exi_doc_DIN->V2G_Message.Header.SessionID.bytes[5],
- exi_doc_DIN->V2G_Message.Header.SessionID.bytes[6],
- exi_doc_DIN->V2G_Message.Header.SessionID.bytes[7],
- EVCOMM_SYS_INFO.SessionID[0],
- EVCOMM_SYS_INFO.SessionID[1],
- EVCOMM_SYS_INFO.SessionID[2],
- EVCOMM_SYS_INFO.SessionID[3],
- EVCOMM_SYS_INFO.SessionID[4],
- EVCOMM_SYS_INFO.SessionID[5],
- EVCOMM_SYS_INFO.SessionID[6],
- EVCOMM_SYS_INFO.SessionID[7]
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- //Step 3: Correct SessionID for Res Message
- if (errn != 0)
- {
- exi_doc_DIN->V2G_Message.Header.SessionID.bytesLen = 8;
- memset(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(exi_doc_DIN->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Check_iso1_V2G_Rx_MSG_SessionID
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Check_iso1_V2G_Rx_MSG_SessionID(struct iso1EXIDocument *exi_doc_ISO1)
- {
- int i = 0;
- int leng = 0;
- int errn = 0;
- leng = exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen;
- //Step 1: Check SessionID Length
- if (leng != 8) //8-byte
- {
- sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- }
- else
- {
- //Step 2-1: Check SessionID content
- for (i = 0; i < leng; i++)
- {
- if (exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
- {
- errn = -2;
- break;
- }
- }
- }
- //Step 2-2: Print Incorrect ID
- if (errn == -2) //incorrect ID
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[0],
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[1],
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[2],
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[3],
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[4],
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[5],
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[6],
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytes[7],
- EVCOMM_SYS_INFO.SessionID[0],
- EVCOMM_SYS_INFO.SessionID[1],
- EVCOMM_SYS_INFO.SessionID[2],
- EVCOMM_SYS_INFO.SessionID[3],
- EVCOMM_SYS_INFO.SessionID[4],
- EVCOMM_SYS_INFO.SessionID[5],
- EVCOMM_SYS_INFO.SessionID[6],
- EVCOMM_SYS_INFO.SessionID[7]
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- //Step 3: Correct SessionID for Res Message
- if (errn != 0)
- {
- exi_doc_ISO1->V2G_Message.Header.SessionID.bytesLen = 8;
- memset(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(exi_doc_ISO1->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Check_iso2_V2G_Rx_MSG_SessionID
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Check_iso2_V2G_Rx_MSG_SessionID(struct iso2EXIDocument *exi_doc_ISO2)
- {
- int i = 0;
- int leng = 0;
- int errn = 0;
- leng = exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen;
- //Step 1: Check SessionID Length
- if (leng != 8) //8-byte
- {
- sprintf(buf_log_evcomm, "[ERROR]SessionID: incorrect length(%d)", leng);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- }
- else
- {
- //Step 2-1: Check SessionID content
- for (i = 0; i < leng; i++)
- {
- if (exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[i] != EVCOMM_SYS_INFO.SessionID[i])
- {
- errn = -2;
- break;
- }
- }
- }
- //Step 2-2: Print Incorrect ID
- if (errn == -2) //incorrect ID
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)",
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[0],
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[1],
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[2],
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[3],
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[4],
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[5],
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[6],
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytes[7],
- EVCOMM_SYS_INFO.SessionID[0],
- EVCOMM_SYS_INFO.SessionID[1],
- EVCOMM_SYS_INFO.SessionID[2],
- EVCOMM_SYS_INFO.SessionID[3],
- EVCOMM_SYS_INFO.SessionID[4],
- EVCOMM_SYS_INFO.SessionID[5],
- EVCOMM_SYS_INFO.SessionID[6],
- EVCOMM_SYS_INFO.SessionID[7]
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- //Step 3: Correct SessionID for Res Message
- if (errn != 0)
- {
- exi_doc_ISO2->V2G_Message.Header.SessionID.bytesLen = 8;
- memset(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(exi_doc_ISO2->V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: GetSchemaID_of_Protocol
- DESCRIPTION:
- 1. Get the SchemaID accroding to the input target
- *V2GT_MSG_PROTOCOL_DIN70121: choose DIN 70121
- *V2GT_MSG_PROTOCOL_ISO15118_2014: choose ISO 15118-2 (ed1)
- *V2GT_MSG_PROTOCOL_ISO15118_2018: choose ISO 15118-20 (ed2)
- *V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY: choose the one with the highest priority
- 2. [To-do] Checking Major and Minor version
- 3. The parsing method will not support those private protocols,
- such as "usr:tesla...," since "tesla" is 5 bytes but "din" and "iso" are 3 bytes.
- 4. [To-do] If the target is selected as DIN," but there is no DIN.
- However, if EV and EVSE all support ISO, how to use ISO instead?
- PRE-CONDITION:
- INPUT:
- 1. target: target protocol
- OUTPUT:
- 1. id: SchemaID of selected protocol by EVSE
- 2. ShmCcsData->CommProtocol (selected protocol)
- 3. SupportedAppProtocol_result
- (1) appHandresponseCodeType_OK_SuccessfulNegotiation = 0,
- (2) appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation = 1,
- (3) appHandresponseCodeType_Failed_NoNegotiation = 2
- GLOBAL VARIABLES:
- 1. ccs_handshake
- 2. ShmCcsData
- =============================================================================*/
- int GetSchemaID_of_Protocol(unsigned char target)
- {
- int i = 0;
- int ii = 0;
- int id = 0;
- unsigned char tmp = 0;
- unsigned char pri = 20; //priority = 1(highest)~20(lowerest)
- char num[10];
- //struct CCS_ProtocolNamespacestructCharacters pro;
- //Choose the 1st protocol as default.
- //id = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
- id = -1;
- ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
- for(i = 0; i < CCS_HANDSHAKE_PROTOCOLS.arrayLen; i++)
- {
- //Checking for <ProtocolNamespace>urn:din:70121:2012:MsgDef</ProtocolNamespace>
- //[To-Do] Ignoring the priority from EV and force DIN 70121 as our only option. (for temp)
- //[CAUTION] The parsing method will not support those private protocols, such as "usr:tesla..."
- num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[8];
- num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[9];
- num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[10];
- num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[11];
- num[4] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[12];
- num[5] = '\0';
- if (atoi(num) == 70121)
- {
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]supported(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
- (i+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- atoi(num),
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
- CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #ifdef AWCCS
- continue;
- #endif
- if (target == V2GT_MSG_PROTOCOL_DIN70121)
- {
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]selected(%d-th/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)",
- (i+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- atoi(num),
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
- CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == DIN_SPEC_70121_2012_VersionNumberMajor)
- {
- if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == DIN_SPEC_70121_2012_VersionNumberMinor)
- {
- EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
- }
- else
- { //[TC_SECC_VTB_SupportedAppProtocol_005]
- EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
- }
- id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
- ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
- return id;
- }
- else
- {
- //keep looking for the suitable protocol
- }
- }
- else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
- {
- if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
- {
- ii = i;
- id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
- pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
- ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_DIN70121;
- }
- else
- {
- //not using this SchemaID, and keep looking for that SchemaID with higer priority
- }
- }
- else
- {
- //null
- }
- }
- else if (atoi(num) == 15118)
- {
- //urn:din:70121:2012:MsgDef
- //urn:iso:15118:2:2013:MsgDef
- memset(num, 0, sizeof(num));
- num[0] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[16];
- num[1] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[17];
- num[2] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[18];
- num[3] = CCS_HANDSHAKE_PROTOCOLS.array[i].ProtocolNamespace.characters[19];
- num[4] = '\0';
- if (atoi(num) < 2018 && atoi(num) >= 2010)
- {
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-2(ed1,%d:v%d.%d;id=%d,pri=%d)",
- (i+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- atoi(num),
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
- CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- if (target == V2GT_MSG_PROTOCOL_ISO15118_2014)
- {
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-2,ed1(%d:v%d.%d;id=%d,pri=%d)",
- (i+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- atoi(num),
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
- CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO1_15118_2013_VersionNumberMajor)
- {
- if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO1_15118_2013_VersionNumberMinor)
- {
- EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
- }
- else
- {
- EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
- }
- id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
- ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
- return id;
- }
- else
- {
- //keep looking for the suitable protocol
- }
- }
- else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
- {
- if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
- {
- ii = i;
- id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
- pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
- ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2014;
- }
- else
- {
- //not using this SchemaID, and keep looking for that SchemaID with higer priority
- }
- }
- else
- {
- //null
- }
- }
- else if (atoi(num) >= 2018 && atoi(num) <= 2100) // >= 2018
- {
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]supported(%d-th/%d): ISO 15118-20(ed2,%d:v%d.%d;id=%d,pri=%d)",
- (i+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- atoi(num),
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
- CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- if (target == V2GT_MSG_PROTOCOL_ISO15118_2018)
- {
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]selected(%d-th/%d): ISO 15118-20,ed2(%d:v%d.%d;id=%d,pri=%d)",
- (i+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- atoi(num),
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
- CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor == ISO2_15118_2018_VersionNumberMajor)
- {
- if (CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor == ISO2_15118_2018_VersionNumberMinor)
- {
- EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiation;
- }
- else
- {
- EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_OK_SuccessfulNegotiationWithMinorDeviation;
- }
- id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
- ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
- return id;
- }
- else
- {
- //keep looking for the suitable protocol
- }
- }
- else if (target == V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY)
- {
- if (pri > CCS_HANDSHAKE_PROTOCOLS.array[i].Priority)
- {
- ii = i;
- id = CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID;
- pri = CCS_HANDSHAKE_PROTOCOLS.array[i].Priority;
- ShmCcsData->CommProtocol = V2GT_MSG_PROTOCOL_ISO15118_2018;
- }
- else
- {
- //not using this SchemaID, and keep looking for that SchemaID with higer priority
- }
- }
- else
- {
- //null
- }
- }
- else
- {
- //Unexpected Year
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]unsupported(%d-th/%d): ISO 15118-X(unexpected year:%d,v%d.%d),id=%d,pri=%d",
- (i+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- atoi(num),
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
- CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //return -1;
- }
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]unsupported protocol(%d-th/%d)(%d:v%d.%d;id=%d,pri=%d)",
- (i+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- atoi(num),
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMajor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].VersionNumberMinor,
- CCS_HANDSHAKE_PROTOCOLS.array[i].SchemaID,
- CCS_HANDSHAKE_PROTOCOLS.array[i].Priority);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //return -1;
- }
- }
- //The final result of highest priority protocol
- sprintf(buf_log_evcomm,
- "[GetSchemaID_of_Protocol]selected(%d-th/%d): pro=%d(0:DIN,1:ISO1,2:ISO2);id=%d,pri=%d",
- (ii+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- ShmCcsData->CommProtocol,
- id,
- pri);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- if (id < 0)
- {
- EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_Failed_NoNegotiation;
- }
- return id;
- }
- /*===========================================================================
- FUNCTION: Proc_supportedAppProtocolRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_supportedAppProtocolRes(int AcceptFd)
- {
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct ChargingInfoData *sys;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- //STEP 1: =========== Setting the Response Message ===========
- init_appHandEXIDocument(&ccs_handshake);
- ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
- ccs_handshake.supportedAppProtocolRes_isUsed = 1u;
- //select the 1st one as the default
- ccs_handshake.supportedAppProtocolRes.SchemaID = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
- ccs_handshake.supportedAppProtocolRes.SchemaID_isUsed = 1u;
- int id = 0;
- /*+++ 20200808, vern, support both DIN and ISO +++*/
- id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_PREFERENCE); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
- //id = GetSchemaID_of_Protocol(V2GT_MSG_PROTOCOL_HIGHEST_PRIORITY); //output: EVCOMM_SYS_INFO.SupportedAppProtocol_result
- /*--- 20200808, vern, support both DIN and ISO ---*/
- ccs_handshake.supportedAppProtocolRes.ResponseCode = EVCOMM_SYS_INFO.SupportedAppProtocol_result; //updating the response code
- if (id < 0)
- {
- sprintf(buf_log_evcomm,
- "[Error]No avalible CCS protocol (id = %d, preference = %d)",
- id,
- V2GT_MSG_PROTOCOL_PREFERENCE);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- else
- {
- //selected SchemaID
- ccs_handshake.supportedAppProtocolRes.SchemaID = (unsigned char) id;
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_supportedAppProtocolRes]EVSE_Shutdown => End_Process");
- ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_supportedAppProtocolRes]EVSE_EmergencyShutdown => End_Process");
- ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
- errn = -1;
- }
- else
- {
- //null
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][supportedAppProtocolRes]Permission OFF");
- ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
- //errn = -1;
- }
- #if (CP_PROTECTION_MECHANISM == ENABLE)
- {
- #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
- {
- //Detect for CP State should be 9V with 5% PWM or 100%PWM (State B1, B2)
- if (sys->CpState != 2 && sys->CpState != 3) //State B1, B2
- {
- ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- sprintf(buf_log_evcomm,
- "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
- sys->CpState,
- sys->CpVoltage);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- }
- #else
- {
- //Detect for CP State should be 9V (State B)
- if (sys->CpState != 3) //B2
- {
- ccs_handshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- sprintf(buf_log_evcomm,
- "[Proc_supportedAppProtocolRes]Emergency Stop by CP Error (%d, %.02f V)\n",
- sys->CpState,
- sys->CpVoltage);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- }
- #endif
- }
- #endif
- //STEP 2: =========== Encode into EXI ===========
- if (errn = API_V2GMSG_EXI_Encoder_AppProtocol(&ccs_handshake, &v2g_tx_stream) !=0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n[Error]API_V2GMSG_EXI_Encoder_AppProtocol\n");
- return errn;
- }
- //STEP 3: =========== Send Response Packet ===========
- int Rtn = 0;
- #ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- {
- Rtn = SSL_write(ssl, v2g_tx_stream.data, v2g_tx_stream.size);
- }
- else
- {
- Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
- }
- #else
- Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
- #endif
- //Rtn = send(6, v2g_tx_stream.data, v2g_tx_stream.size, 0);
- DEBUG_PRINTF_EVCOMM_DETAIL("Send V2GTP Packet Size = %d, Rtn = %d (Bytes, DEC)\n", v2g_tx_stream.size, Rtn);
- if (Rtn < 0)
- {
- return Rtn;
- }
- //STEP 4: =========== Save into Share Memory =========
- //[Joseph, To-Do] Adding a mechanism to choose DIN 70121 as our 1st priority. (for multiple protocols)
- //STEP 5: =========== Updating the Flow State Flag =========
- if (id < 0)
- {
- errn = -1;
- }
- //STEP 6: =========== Reset Flags ============
- //Reset all EXI doc Req/Res _isUsed Flags after each Res Tx
- init_appHandEXIDocument(&ccs_handshake);
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_supportedAppProtocolReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_supportedAppProtocolReq(int AcceptFd)
- {
- //[Joseph, To-Do] analysis on Req message and choose the prefered protocol
- //Default: DIN 70121 (find SchemaID)
- int errn = 0;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]supportedAppProtocolReq");
- SHM_Save_din_supportedAppProtocolReq(ShmCcsData, &ccs_handshake, ShmSysConfigAndInfo);
- errn = Proc_supportedAppProtocolRes(AcceptFd);
- if (errn == 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]supportedAppProtocolRes");
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[Error]Proc_supportedAppProtocolRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_SessionSetupRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_SessionSetupRes(int AcceptFd)
- {
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct ChargingInfoData *sys;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinSessionSetupResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes);
- // ====== [BODY (1/2) ResponseCode ======
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_OK_NewSessionEstablished;
- //[HEADER] Assign Res SessionID
- ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytesLen = 8;
- memset(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(ccs_exi_doc_DIN.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError;
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //#if PARAMETER_NORMAL_MODE == ENABLE
- //SHM_Read_din_V2GMSG_Header(&ccs_exi_doc_DIN, ShmCcsData);
- //#endif
- //Detect for CP State should be 9V (State B)
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- #if CP_PROTECTION_MECHANISM == ENABLE
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- sprintf(buf_log_evcomm,
- "[Proc_din_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- }
- //Check for shutdown commands from EVSE(DC Main Board)
- if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
- sprintf(buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
- EVSE_Shutdown,
- EVSE_EmergencyShutdown,
- sys->DC_EVSEStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_Shutdown/* ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
- sprintf(buf_log_evcomm, "[Proc_din_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
- EVSE_Shutdown,
- EVSE_EmergencyShutdown,
- sys->DC_EVSEStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][SessionSetupRes]Permission OFF");
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
- errn = -1;
- }
- // ====== [BODY (2/3) EVSEID ======
- //EVSEID = all zero
- memset(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes, 0, sizeof(ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes));
- //vern, should be encode by SN
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytesLen = 1; //max: DIN = 32, ISO1/ISO2 = 37 bytes
- // ====== [BODY (3/3) DateTimeNow ======
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow_isUsed = 1u;
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
- #if PARAMETER_NORMAL_MODE == ENABLE
- ///////////SHM_Read_din_SessionSetupRes(&ccs_exi_doc_DIN, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_SessionSetupRes][Error]Tx encoded msg error");
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_SessionSetupRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_SessionSetupRes(int AcceptFd)
- {
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct ChargingInfoData *sys;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1SessionSetupResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes);
- // ====== [BODY (1/2) ResponseCode ======
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_OK_NewSessionEstablished;
- //[HEADER] Assign Res SessionID
- ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytesLen = 8;
- memset(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(ccs_exi_doc_ISO1.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //#if PARAMETER_NORMAL_MODE == ENABLE
- //SHM_Read_iso1_V2GMSG_Header(&ccs_exi_doc_ISO1, ShmCcsData);
- //#endif
- //Detect for CP State should be 9V (State B)
- //if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2 //Benz already CP=4
- if ((sys->CpState < 2) ||(sys->CpState > 5)) //State B1, B2 //Benz already CP=4
- {
- #if CP_PROTECTION_MECHANISM == ENABLE
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d)\n",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- sprintf(buf_log_evcomm,
- "[Proc_iso1_SessionSetupRes]Emergency Stop by CP Error (%d): ignored\n",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- }
- //Check for shutdown commands from EVSE(DC Main Board)
- if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
- sprintf(buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
- EVSE_Shutdown,
- EVSE_EmergencyShutdown,
- sys->DC_EVSEStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
- sprintf(buf_log_evcomm, "[Proc_iso1_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
- EVSE_Shutdown,
- EVSE_EmergencyShutdown,
- sys->DC_EVSEStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- // errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][SessionSetupRes]Permission OFF");
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
- //errn = -1;
- }
- // ====== [BODY (2/3) EVSEID ======
- //EVSEID = all zero
- memset(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
- /*+++ 20200808, vern, set default EVSEID +++*/
- //vern, should be encoded by SN
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[0]='Z';
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[1]='Z';
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[2]='0';
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[3]='0';
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[4]='0';
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[5]='0';
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[6]='0';
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 7; //max: DIN = 32, ISO1/ISO2 = 37 bytes
- /*--- 20200808, vern, set default EVSEID ---*/
- // ====== [BODY (3/3) DateTimeNow ======
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
- #if PARAMETER_NORMAL_MODE == ENABLE
- ///////////SHM_Read_iso1_SessionSetupRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_SessionSetupRes][Error]Tx encoded msg error");
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso2_SessionSetupRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso2_SessionSetupRes(int AcceptFd)
- {
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct ChargingInfoData *sys;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- init_iso2BodyType(&ccs_exi_doc_ISO2.V2G_Message.Body);
- init_iso2SessionSetupResType(&ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes);
- // ====== [BODY (1/2) ResponseCode ======
- ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
- ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_OK_NewSessionEstablished;
- //[HEADER] Assign Res SessionID
- ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytesLen = 8;
- memset(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(ccs_exi_doc_ISO2.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //#if PARAMETER_NORMAL_MODE == ENABLE
- //SHM_Read_iso2_V2GMSG_Header(&ccs_exi_doc_ISO2, ShmCcsData);
- //#endif
- //Detect for CP State should be 9V (State B)
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- #if CP_PROTECTION_MECHANISM == ENABLE
- ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d)",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- sprintf(buf_log_evcomm,
- "[Proc_iso2_SessionSetupRes]Emergency Stop by CP Error (%d): ignored",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- }
- //Check for shutdown commands from EVSE(DC Main Board)
- if (sys->DC_EVSEStatus == EVSE_Shutdown ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
- sprintf(buf_log_evcomm, "[Proc_iso2_SessionSetupRes]Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
- EVSE_Shutdown,
- EVSE_EmergencyShutdown,
- sys->DC_EVSEStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO2][SessionSetupRes]Permission OFF");
- ccs_exi_doc_DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
- errn = -1;
- }
- // ====== [BODY (2/3) EVSEID ======
- //EVSEID = all zero
- memset(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
- ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
- // ====== [BODY (3/3) DateTimeNow ======
- ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
- ccs_exi_doc_ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
- #if PARAMETER_NORMAL_MODE == ENABLE
- ///////////SHM_Read_iso2_SessionSetupRes(&ccs_exi_doc_ISO2, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso2_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO2) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso2_SessionSetupRes][Error]Tx encoded msg error");
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_SessionSetupReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- 2. ccs_exi_doc_DIN
- =============================================================================*/
- int Proc_din_SessionSetupReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_din_SessionSetupReq]Got SessionSetupReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_SessionSetupReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_SessionSetupReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- errn = Proc_din_SessionSetupRes(AcceptFd);
- if (errn == 0)
- {
- //successfully send response.
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]SessionSetupRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error]Proc_din_SessionSetupRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_SessionSetupReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- 2. ccs_exi_doc_ISO1
- =============================================================================*/
- int Proc_iso1_SessionSetupReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso1_SessionSetupReq]Got SessionSetupReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_SessionSetupReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_SessionSetupRes(AcceptFd);
- if (errn == 0)
- {
- //successfully send response.
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]SessionSetupRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error]Proc_iso1_SessionSetupRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso2_SessionSetupReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- 2. ccs_exi_doc_ISO2
- =============================================================================*/
- int Proc_iso2_SessionSetupReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("\n[Proc_iso2_SessionSetupReq]Got SessionSetupReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO2_SessionSetupReq(&ccs_exi_doc_ISO2);
- //Save into Share Memory
- SHM_Save_iso2_SessionSetupReq(ShmCcsData, &ccs_exi_doc_ISO2, ShmSysConfigAndInfo);
- errn = Proc_iso2_SessionSetupRes(AcceptFd);
- if (errn == 0)
- {
- //successfully send response.
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO2][V2G][Tx]SessionSetupRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error]Proc_iso2_SessionSetupRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_ServiceDiscoveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_ServiceDiscoveryRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct ChargingInfoData *sys;
- struct ServiceDiscoveryRequest_DIN70121 *req;
- struct ServiceDiscoveryResponse_DIN70121 *res;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- req = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryRequest;
- res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinServiceDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes);
- //[1/4] Response Code
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //Detect for CP State should be 9V (State B)
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- #if CP_PROTECTION_MECHANISM == ENABLE
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- sprintf(buf_log_evcomm,
- "[Proc_din_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
- // errn = -1;
- }
- else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceDiscoveryRes]shutdown by EVSE");
- errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ServiceDiscoveryRes]Permission OFF");
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
- // errn = -1;
- }
- //[2/4] PaymentOptions
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.arrayLen = 1u;
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.array[0] = dinpaymentOptionType_ExternalPayment; //1
- //[3/4] Charge Service
- res->ChargeService_DIN70121.Services.ServiceTag.ServiceID = 1;
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceID = (unsigned short) res->ChargeService_DIN70121.Services.ServiceTag.ServiceID;
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceCategory = dinserviceCategoryType_EVCharging;
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.EnergyTransferType = dinEVSESupportedEnergyTransferType_DC_extended;
- //[4/4] Service List (null, not be uesed for now.)
- //#if PARAMETER_NORMAL_MODE == ENABLE
- ///////////////SHM_Read_din_ServiceDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
- //#endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ServiceDiscoveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ServiceDiscoveryRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct ChargingInfoData *sys;
- struct ServiceDiscoveryRequest_ISO15118_2014 *req;
- struct ServiceDiscoveryResponse_ISO15118_2014 *res;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryRequest;
- res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1ServiceDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes);
- //[1/4] Response Code
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //Detect for CP State should be 9V (State B)
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- #if CP_PROTECTION_MECHANISM == ENABLE
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d)",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- sprintf(buf_log_evcomm,
- "[Proc_iso1_ServiceDiscoveryRes]Emergency Stop by CP Error (%d): ignored",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- }
- if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceDiscoveryRes]shutdown by EVSE");
- // errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ServiceDiscoveryRes]Permission OFF");
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
- // errn = -1;
- }
- //[2/4] PaymentOptionList
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 1u;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = iso1paymentOptionType_ExternalPayment; //1
- #ifdef SUPPORT_ISO15118_PnC
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 2u;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[1] = iso1paymentOptionType_Contract; //0
- #endif
- //[3/4] Charge Service
- res->ChargeService.Services.ServiceID = 1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = (unsigned short) res->ChargeService.Services.ServiceID;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = strlen("AC_DC_Charging");//AC_Charging
- writeStringToEXIString("AC_DC_Charging", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = iso1serviceCategoryType_EVCharging;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 1u; //[ISO1] max = 6
- switch (ShmCcsData->EnergyTransferMode)
- {
- case DC_extended:
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
- break;
- }
- case AC_single_phase_core:
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_single_phase_core;
- break;
- }
- case AC_three_phase_core:
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_three_phase_core;
- break;
- }
- default:
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
- sprintf(buf_log_evcomm,
- "[ISO1][ServiceDiscoveryRes][Warning]unexpected EnergyTransferMode(%d)",
- ShmCcsData->EnergyTransferMode);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
- }
- //[4/4] Service List
- i=0;
- #ifdef SUPPORT_ISO15118_PnC
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen=i;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceID = 2;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName_isUsed = 1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen = strlen("Certificate");
- writeStringToEXIString("Certificate", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory = iso1serviceCategoryType_ContractCertificate;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].FreeService = 0;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen++;
- i++;
- #endif
- #ifdef SUPPORT_ISO15118_VAS
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList_isUsed = 1u;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen=i;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceID = 3;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName_isUsed = 1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.charactersLen = strlen("InternetAccess");
- writeStringToEXIString("InternetAccess", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceName.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].ServiceCategory = iso1serviceCategoryType_Internet;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.array[i].FreeService = 0;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDiscoveryRes.ServiceList.Service.arrayLen++;
- i++;
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ServiceDetailReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ServiceDetailReq(int AcceptFd)
- {
- int errn = 0;
- //Save into Share Memory
- SHM_Save_iso1_ServiceDetailReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_ServiceDetailRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceDetailRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_iso1_ServiceDetailReq]Proc_iso1_ServiceDetailRes(): %d (DEC)",
- errn
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ServiceDetailRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ServiceDetailRes(int AcceptFd)
- {
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct ChargingInfoData *sys;
- struct ServiceDetailRequest_ISO15118_2014 *req;
- struct ServiceDetailResponse_ISO15118_2014 *res;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDetailRequest;
- res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDetailResponse;
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1ServiceDetailResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes);
-
- //[1/4] Response Code
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes_isUsed = 1u;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //Detect for CP State should be 9V (State B)
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- #if CP_PROTECTION_MECHANISM == ENABLE
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[ServiceDetailRes]Emergency Stop by CP Error (%d)",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- sprintf(buf_log_evcomm,
- "[ServiceDetailRes]Emergency Stop by CP Error (%d): ignored",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- }
- if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
- SAVE_SYS_LOG_MSG_EVCOMM("[ServiceDetailRes]shutdown by EVSE");
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
- SAVE_SYS_LOG_MSG_EVCOMM("[ServiceDetailRes]shutdown by EVSE");
- // errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ServiceDetailRes]Permission OFF");
- ccs_exi_doc_DIN.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED;
- // errn = -1;
- }
- switch (req->ServiceID)
- {
- #ifdef SUPPORT_ISO15118_PnC
- case 2:
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 2;//Installation(1), Update(2)
- //=============Set ParameterSet===================
- {
- unsigned char ServiceName[16];
- for(int j=0;j<ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen;j++)
- {
- memset(ServiceName,0,sizeof(ServiceName));
- switch (j)
- {
- case 0://ftp with port 20
- strcpy(ServiceName,"Installation");
- break;
- case 1://ftp with port 21
- strcpy(ServiceName,"Update");
- break;
- default:
- break;
- }
- if(strlen(ServiceName)>0)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].ParameterSetID=j+1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.arrayLen=1;//Service
- //Name= Protocol
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.charactersLen= strlen("Service");
- writeStringToEXIString("Service", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue_isUsed=1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.charactersLen=strlen(ServiceName);
- writeStringToEXIString(ServiceName, ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.characters);
- }
- else
- break;
- }//for
- }
- break;
- #endif
- #ifdef SUPPORT_ISO15118_VAS
- case 3:
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen = 4;//ftp(1), ftp(2), http(3), https(4)
- //=============Set ParameterSet===================
- {
- unsigned char ProtocolName[16];
- int ProtocolPort;
- for(int j=0;j<ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.arrayLen;j++)
- {
- memset(ProtocolName,0,sizeof(ProtocolName));
- switch (j)
- {
- case 0://ftp with port 20
- strcpy(ProtocolName,"ftp");
- ProtocolPort=20;
- break;
- case 1://ftp with port 21
- strcpy(ProtocolName,"ftp");
- ProtocolPort=21;
- break;
- case 2://http with port 80
- strcpy(ProtocolName,"http");
- ProtocolPort=80;
- break;
- case 3://https with port 443
- strcpy(ProtocolName,"https");
- ProtocolPort=443;
- break;
- default:
- break;
- }
- if(strlen(ProtocolName)>0)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].ParameterSetID=j+1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.arrayLen=2;//protocol and port
- //Name= Protocol
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.charactersLen= strlen("Protocol");
- writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].Name.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue_isUsed=1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.charactersLen=strlen(ProtocolName);
- writeStringToEXIString(ProtocolName, ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[0].stringValue.characters);
- //Name= Port
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].Name.charactersLen= strlen("Port");
- writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].Name.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].intValue_isUsed=1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[j].Parameter.array[1].intValue=ProtocolPort;
- }
- else
- break;
- }//for
- }
- /*
- //=============http,ParameterSetID=3===================
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].ParameterSetID=3;//http
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.arrayLen=2;//protocol and port
- //Name= Protocol, value= "HTTP"
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.charactersLen= strlen("Protocol");
- writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].Name.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue_isUsed=1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue.charactersLen=strlen("http");
- writeStringToEXIString("http", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[0].stringValue.characters);
- //Name= Port, value= 80
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.charactersLen= strlen("Port");
- writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].Name.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].intValue_isUsed=1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[0].Parameter.array[1].intValue=80;
-
- //==================https,ParameterSetID=4=====================
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].ParameterSetID=4;//https
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.arrayLen=2;//protocol and port
- //Name= Protocol, value= "HTTP"
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.charactersLen= strlen("Protocol");
- writeStringToEXIString("Protocol", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].Name.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue_isUsed=1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue.charactersLen=strlen("https");
- writeStringToEXIString("https", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[0].stringValue.characters);
- //Name= Port, value= 443
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].Name.charactersLen= strlen("Port");
- writeStringToEXIString("Port", ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].Name.characters);
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].intValue_isUsed=1;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList.ParameterSet.array[1].Parameter.array[1].intValue=443;
- */
- break;
- #endif
- default:
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceID = req->ServiceID;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ServiceParameterList_isUsed = 0;
- ccs_exi_doc_ISO1.V2G_Message.Body.ServiceDetailRes.ResponseCode = iso1responseCodeType_FAILED_ServiceIDInvalid;
- break;
- }
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_ServiceDiscoveryReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_ServiceDiscoveryReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_ServiceDiscoveryReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- errn = Proc_din_ServiceDiscoveryRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ServiceDiscoveryRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_din_ServiceDiscoveryReq]Proc_din_ServiceDiscoveryRes(): %d (DEC)",
- errn
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ServiceDiscoveryReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ServiceDiscoveryReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_ServiceDiscoveryReq]Got ServiceDiscoveryReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_ServiceDiscoveryReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_ServiceDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_ServiceDiscoveryRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceDiscoveryRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_iso1_ServiceDiscoveryReq]Proc_iso1_ServiceDiscoveryRes(): %d (DEC)",
- errn
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_ServiceAndPaymentSelectionRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_ServiceAndPaymentSelectionRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct ServiceAndPaymentSelectionRequest_DIN70121 *req;
- struct ServiceAndPaymentSelectionResponse_DIN70121 *res;
- struct ServiceDiscoveryResponse_DIN70121 *sd_res;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- req = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionRequest;
- res = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionResponse;
- sd_res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinServicePaymentSelectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes);
- //[1/1] Response Code
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes_isUsed = 1u;
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
- if (req->SelectedPaymentOption != dinpaymentOptionType_ExternalPayment) //1
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_PaymentSelectionInvalid;
- sprintf(buf_log_evcomm,
- "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
- req->SelectedPaymentOption);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 6;
- ShmStatusCodeData->PresentStatusCode[0][5] = 2;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- //Check for ServiceID (TC_SECC_VTB_ServicePaymentSelection_004)
- if (req->SelectedServiceList.SelectedService[0].ServiceID != sd_res->ChargeService_DIN70121.Services.ServiceTag.ServiceID)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_ServiceSelectionInvalid; //8
- sprintf(buf_log_evcomm,
- "[ERROR]Wrong selected ServiceID(%d) => End_Process",
- req->SelectedServiceList.SelectedService[0].ServiceID);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 6;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- //Detect for CP State should be 9V (State B)
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- #if CP_PROTECTION_MECHANISM == ENABLE
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- sprintf(buf_log_evcomm,
- "[Proc_din_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
- // errn = -1;
- }
- else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]shutdown by EVSE");
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
- errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ServicePaymentSelectionRes]Permission OFF");
- ccs_exi_doc_DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
- //errn = -1;
- }
- // ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ServiceAndPaymentSelectionRes]Tx encoded msg error");
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ServiceAndPaymentSelectionRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ServiceAndPaymentSelectionRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct ServiceAndPaymentSelectionRequest_ISO15118_2014 *req;
- struct ServiceAndPaymentSelectionResponse_ISO15118_2014 *res;
- struct ServiceDiscoveryResponse_ISO15118_2014 *sd_res;
- static struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionRequest;
- res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceAndPaymentSelectionResponse;
- sd_res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1PaymentServiceSelectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes);
- //[1/1] Response Code
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes_isUsed = 1u;
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- #ifdef SUPPORT_ISO15118_PnC
- if (req->SelectedPaymentOption > iso1paymentOptionType_ExternalPayment) //1
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
- sprintf(buf_log_evcomm,
- "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
- req->SelectedPaymentOption);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 6;
- ShmStatusCodeData->PresentStatusCode[0][5] = 2;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- #else
- //Check for SelectedPaymentOption (TC_SECC_VTB_ServicePaymentSelection_007)
- if (req->SelectedPaymentOption != iso1paymentOptionType_ExternalPayment) //1
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
- sprintf(buf_log_evcomm,
- "[ERROR]unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)",
- req->SelectedPaymentOption);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_Payment SelectionInvalid (023762)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 6;
- ShmStatusCodeData->PresentStatusCode[0][5] = 2;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- #endif
-
- for(i=0;i<req->SelectedServiceList.SelectedServiceLen;i++)
- {
- switch(req->SelectedServiceList.SelectedService[i].ServiceID)
- {
- case 1:
- break;
- case 2:
- #ifndef SUPPORT_ISO15118_PnC
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
- sprintf(buf_log_evcomm,
- "[ERROR]Wrong selected ServiceID(%d) => End_Process",
- req->SelectedServiceList.SelectedService[0].ServiceID);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
-
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 6;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- #endif
- break;
- case 3:
- #ifndef SUPPORT_ISO15118_VAS
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
- sprintf(buf_log_evcomm,
- "[ERROR]Wrong selected ServiceID(%d) => End_Process",
- req->SelectedServiceList.SelectedService[0].ServiceID);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
-
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 6;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- #endif
- break;
- default:
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
- sprintf(buf_log_evcomm,
- "[ERROR]Wrong selected ServiceID(%d) => End_Process",
- req->SelectedServiceList.SelectedService[0].ServiceID);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- errn = -1;
-
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_ServiceSelectionInvalid (023764)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 6;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- break;
- }
- }
- //Detect for CP State should be 9V (State B)
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- #if CP_PROTECTION_MECHANISM == ENABLE
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d)",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- sprintf(buf_log_evcomm,
- "[Proc_iso1_ServiceAndPaymentSelectionRes]Emergency Stop by CP Error (%d): ignored due to function is disabled",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #endif
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown /*||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown*/)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
- //errn = -1;
- }
- else if (/*sys->DC_EVSEStatus == EVSE_Shutdown ||*/
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]shutdown by EVSE");
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
- errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][PaymentServiceSelectionRes]Permission OFF");
- ccs_exi_doc_ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
- // errn = -1;
- }
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ServiceAndPaymentSelectionRes]Tx encoded msg error");
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_ServiceAndPaymentSelectionReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_ServiceAndPaymentSelectionReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_din_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_ServiceAndPaymentSelectionReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- errn = Proc_din_ServiceAndPaymentSelectionRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ServiceAndPaymentSelectionRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ServiceAndPaymentSelectionReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ServiceAndPaymentSelectionReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("[SeccComm][Proc_iso1_ServiceAndPaymentSelectionReq]Got ServiceAndPaymentSelectionReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_ServiceAndPaymentSelectionReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_ServiceAndPaymentSelectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_ServiceAndPaymentSelectionRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ServiceAndPaymentSelectionRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][Proc_iso1_ServiceAndPaymentSelectionReq]Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_ContractAuthenticationRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_ContractAuthenticationRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct ChargingInfoData *sys;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinContractAuthenticationResType(&ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes);
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes_isUsed = 1u;
- //[BODY (1/2)] ResponseCode
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_OK;
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //Detect for CP State should be 9V (State B)
- #if CP_PROTECTION_MECHANISM == ENABLE
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_din_ContractAuthenticationRes]Emergency Stop by CP Error (%d)",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #endif
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
- // errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
- errn = -1;
- }
- //[BODY (2/2)] EVSEProcessing
- if(ShmInternalComm->ChargingPermission == TRUE)
- {
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished; //0
- SAVE_SYS_LOG_MSG_EVCOMM("CSU Permission: OK");
- #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
- {
- //Set PWM as 5% (for SLAC first case)
- SAVE_SYS_LOG_MSG_EVCOMM("Set PWM as 5%%");
- SwitchCpStateE(DISABLE);
- OutputCpPwmDuty(5);
- }
- #endif
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ContractAuthenticationRes]Permission OFF");
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
- ccs_exi_doc_DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
- // errn = -1;
- }
- #if PARAMETER_NORMAL_MODE == ENABLE
- ////////////SHM_Read_din_ContractAuthenticationRes(&ccs_exi_doc_DIN, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_AuthorizationRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_AuthorizationRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct ChargingInfoData *sys;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1AuthorizationResType(&ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes);
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes_isUsed = 1u;
- //[BODY (1/2)] ResponseCode
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_OK;
- /*+++ 20200808, vern, EVSEProcessing should be waiting for Customer during authrization +++*/
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction; //0
- /*--- 20200808, vern, should be waiting for Customer during authrization ---*/
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //Detect for CP State should be 9V (State B)
- #if CP_PROTECTION_MECHANISM == ENABLE
- if ((sys->CpState != 2) && (sys->CpState != 3)) //State B1, B2
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED;
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_iso1_AuthorizationRes]Emergency Stop by CP Error (%d)",
- sys->CpState);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #endif
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
- //errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
- errn = -1;
- }
- //[BODY (2/2)] EVSEProcessing
- //Check for Permission from CSU
- if(ShmInternalComm->ChargingPermission == TRUE)
- {
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished; //0
- SAVE_SYS_LOG_MSG_EVCOMM("CSU Permission: OK");
- #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
- {
- //Set PWM as 5% (for SLAC first case)
- SAVE_SYS_LOG_MSG_EVCOMM("Set PWM as 5%%");
- SwitchCpStateE(DISABLE);
- OutputCpPwmDuty(5);
- }
- #endif
- }
- //Check for Permission Changing from TRUE to FALSE
- /*+++ 20200808, vern, sync with Tesla CHAdeMO adaptor, 2 for start communication(not yet auth), 1 for star charging (authorized) ---*/
- if (ShmInternalComm->ChargingPermission_pre >=1 &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][AuthorizationRes]Permission OFF");
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
- ccs_exi_doc_ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
- // errn = -1;
- }
- #if PARAMETER_NORMAL_MODE == ENABLE
- ////////////SHM_Read_iso1_AuthorizationRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
- errn = -1;
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_ContractAuthenticationReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_ContractAuthenticationReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_din_ContractAuthenticationReq]Got Proc_din_ContractAuthenticationReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_ContractAuthenticationReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_ContractAuthenticationReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- errn = Proc_din_ContractAuthenticationRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ContractAuthenticationRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_din_ContractAuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_AuthenticationReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_AuthenticationReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_PRINTF_EVCOMM_DETAIL("\n[SeccComm][Proc_iso1_AuthenticationReq]Got AuthorizationReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_AuthorizationReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_AuthorizationReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_AuthorizationRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]AuthorizationRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_iso1_AuthenticationReq]Proc_iso1_AuthenticationRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: SHM_Init_dinDC_EVSEStatusType
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. in
- OUTPUT:
- 2. out
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Init_dinDC_EVSEStatusType(struct DC_EVSEStatusType_DIN70121 *in)
- {
- in->EVSEIsolationStatus = dinisolationLevelType_Valid;
- // dinisolationLevelType_Invalid = 0,
- // dinisolationLevelType_Valid = 1, (default)
- // dinisolationLevelType_Warning = 2,
- // dinisolationLevelType_Fault = 3
- in->EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
- // dinDC_EVSEStatusCodeType_EVSE_Ready = 1, (default)
- // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
- // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
- // dinDC_EVSEStatusCodeType_Reserved_A = 9,
- // dinDC_EVSEStatusCodeType_Reserved_B = 10,
- // dinDC_EVSEStatusCodeType_Reserved_C = 11
- in->EVSENotification = dinEVSENotificationType_None;
- // dinEVSENotificationType_None = 0, (default)
- // dinEVSENotificationType_StopCharging = 1,
- // dinEVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: SHM_Save_dinPhysicalValueType
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Save_dinPhysicalValueType(struct PhysicalValueType_DIN70121 *obj, short value, int multiplier, unsigned char unit)
- {
- obj->Value = value;
- obj->Multiplier = multiplier;
- obj->Unit =unit;
- }
- /*===========================================================================
- FUNCTION: SHM_Init_din_ChargeParameterDiscoveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. shm_ccs
- OUTPUT:
- 2. shm_ccs
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Init_din_ChargeParameterDiscoveryRes(struct CcsData *shm_ccs)
- {
- struct ChargeParameterDiscoveryResponse_DIN70121 *in;
- in = &shm_ccs->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
- //----- [BODY (1/5)] ResponseCode -----
- in->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/5)] EVSEProcessing -----
- in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
- // dinEVSEProcessingType_Finished = 0,
- // dinEVSEProcessingType_Ongoing = 1
- //----- [BODY (3/5)] SAScheduleList of SASchedules -----
- //be fixed in another function.
- //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
- //ignore, since DIN doesn't support AC
- //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
- struct DC_EVSEChargeParameterType_DIN70121 *in_para;
- in_para = &in->DC_EVSEChargeParameter;
- //DC_EVSEStatus
- SHM_Init_dinDC_EVSEStatusType(&in_para->DC_EVSEStatus);
- in_para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
- short value = 0; int multiplier = 0; unsigned char unit = 0;
- //EVSEMaximumCurrentLimit
- value = 600; multiplier = -1; unit = A_DIN70121; //60A
- SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumCurrentLimit, value, multiplier, unit);
- //EVSEMaximumPowerLimit
- value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
- SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumPowerLimit, value, multiplier, unit);
- //EVSEMaximumVoltageLimit
- value = 7500; multiplier = -1; unit = V_DIN70121; //750V
- SHM_Save_dinPhysicalValueType(&in_para->EVSEMaximumVoltageLimit, value, multiplier, unit);
- //EVSEMinimumVoltageLimit
- value = 1500; multiplier = -1; unit = V_DIN70121; //150V
- SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumVoltageLimit, value, multiplier, unit);
- //EVSEMinimumCurrentLimit
- value = 10; multiplier = -1; unit = A_DIN70121; //1A
- SHM_Save_dinPhysicalValueType(&in_para->EVSEMinimumCurrentLimit, value, multiplier, unit);
- //EVSECurrentRegulationTolerance
- value = 10; multiplier = -1; unit = A_DIN70121; //1A
- SHM_Save_dinPhysicalValueType(&in_para->EVSECurrentRegulationTolerance, value, multiplier, unit);
- //EVSEPeakCurrentRipple
- value = 2; multiplier = -1; unit = A_DIN70121; //0.2A
- SHM_Save_dinPhysicalValueType(&in_para->EVSEPeakCurrentRipple, value, multiplier, unit);
- //EVSEEnergyToBeDelivered (optional)
- //SHM_Save_dinPhysicalValueType(&out_para->EVSEEnergyToBeDelivered, &in_para->EVSEEnergyToBeDelivered);
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_din_ChargeParameterDiscoveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_din_ChargeParameterDiscoveryRes()
- {
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinChargeParameterDiscoveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes);
- ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
- //----- [BODY (1/5)] ResponseCode -----
- struct dinChargeParameterDiscoveryResType *res;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.ChargeParameterDiscoveryRes;
- res->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/5)] EVSEProcessing -----
- res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
- // dinEVSEProcessingType_Finished = 0,
- // dinEVSEProcessingType_Ongoing = 1
- //----- [BODY (3/5)] SAScheduleList of SASchedules -----
- res->SAScheduleList_isUsed = 1u;
- struct dinSAScheduleListType *list;
- list = &res->SAScheduleList;
- //
- list->SAScheduleTuple.arrayLen = 1;
- list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
- list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleID = 0;
- list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
- list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
- list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
- //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
- //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
- //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
- //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
- //list->SAScheduleTuple.array[0].SalesTariff.xxx
- //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
- //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
- //ignore, since DIN doesn't support AC
- //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
- res->DC_EVSEChargeParameter_isUsed = 1u;
- struct dinDC_EVSEChargeParameterType *para;
- para = &res->DC_EVSEChargeParameter;
- //DC_EVSEStatus
- para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- para->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
- // dinisolationLevelType_Invalid = 0,
- // dinisolationLevelType_Valid = 1,
- // dinisolationLevelType_Warning = 2,
- // dinisolationLevelType_Fault = 3
- para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
- // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
- // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
- // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
- // dinDC_EVSEStatusCodeType_Reserved_A = 9,
- // dinDC_EVSEStatusCodeType_Reserved_B = 10,
- // dinDC_EVSEStatusCodeType_Reserved_C = 11
- para->DC_EVSEStatus.NotificationMaxDelay = 0u;
- para->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
- // dinEVSENotificationType_None = 0,
- // dinEVSENotificationType_StopCharging = 1,
- // dinEVSENotificationType_ReNegotiation = 2
- //EVSEMaximumCurrentLimit
- para->EVSEMaximumCurrentLimit.Value = 2400;
- para->EVSEMaximumCurrentLimit.Multiplier = -1;
- para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
- para->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
- // dinunitSymbolType_h = 0,
- // dinunitSymbolType_m = 1,
- // dinunitSymbolType_s = 2,
- // dinunitSymbolType_A = 3,
- // dinunitSymbolType_Ah = 4,
- // dinunitSymbolType_V = 5,
- // dinunitSymbolType_VA = 6,
- // dinunitSymbolType_W = 7,
- // dinunitSymbolType_W_s = 8,
- // dinunitSymbolType_Wh = 9
- //EVSEMaximumPowerLimit
- para->EVSEMaximumPowerLimit.Value = 6000;
- para->EVSEMaximumPowerLimit.Multiplier = 1;
- para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
- para->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
- //EVSEMaximumVoltageLimit
- para->EVSEMaximumVoltageLimit.Value = 7500;
- para->EVSEMaximumVoltageLimit.Multiplier = -1;
- para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
- para->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
- //EVSEMinimumVoltageLimit
- para->EVSEMinimumVoltageLimit.Value = 1500;
- para->EVSEMinimumVoltageLimit.Multiplier = -1;
- para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
- para->EVSEMinimumVoltageLimit.Unit = dinunitSymbolType_V;
- //EVSEMinimumCurrentLimit
- para->EVSEMinimumCurrentLimit.Value = 20;
- para->EVSEMinimumCurrentLimit.Multiplier = -1;
- para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
- para->EVSEMinimumCurrentLimit.Unit = dinunitSymbolType_A;
- //EVSECurrentRegulationTolerance_isUsed
- para->EVSECurrentRegulationTolerance_isUsed = 1u;
- //EVSECurrentRegulationTolerance
- para->EVSECurrentRegulationTolerance.Value = 10;
- para->EVSECurrentRegulationTolerance.Multiplier = -1;
- para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
- para->EVSECurrentRegulationTolerance.Unit = dinunitSymbolType_A;
- //EVSEEnergyToBeDelivered_isUsed
- para->EVSEEnergyToBeDelivered_isUsed = 1u;
- //EVSEPeakCurrentRipple
- para->EVSEPeakCurrentRipple.Value = 2;
- para->EVSEPeakCurrentRipple.Multiplier = -1;
- para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
- para->EVSEPeakCurrentRipple.Unit = dinunitSymbolType_A;
- //EVSEEnergyToBeDelivered (optional)
- /*
- para->EVSEEnergyToBeDelivered.Value = 360;
- para->EVSEEnergyToBeDelivered.Multiplier = 3;
- para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
- para->EVSEEnergyToBeDelivered.Unit = dinunitSymbolType_Wh;
- */
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_iso1_ChargeParameterDiscoveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_iso1_ChargeParameterDiscoveryRes()
- {
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1ChargeParameterDiscoveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes);
- ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
- //----- [BODY (1/5)] ResponseCode -----
- struct iso1ChargeParameterDiscoveryResType *res;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes;
- res->ResponseCode = iso1responseCodeType_OK;
- //----- [BODY (2/5)] EVSEProcessing -----
- res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
- // iso1EVSEProcessingType_Finished = 0,
- // iso1EVSEProcessingType_Ongoing = 1
- //----- [BODY (3/5)] SAScheduleList of SASchedules -----
- res->SAScheduleList_isUsed = 1u;
- struct iso1SAScheduleListType *list;
- list = &res->SAScheduleList;
- //
- list->SAScheduleTuple.arrayLen = 1;
- list->SAScheduleTuple.array[0].SAScheduleTupleID = 0;
- list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.arrayLen = 1;
- list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval_isUsed = 1u;
- list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.start = 0;
- //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration = xxx
- //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].RelativeTimeInterval.duration_isUsed = 1u;
- //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval_isUsed = 0u;
- //list->SAScheduleTuple.array[0].PMaxSchedule.PMaxScheduleEntry.array[0].TimeInterval.xxx
- //list->SAScheduleTuple.array[0].SalesTariff.xxx
- //list->SAScheduleTuple.array[0].SalesTariff_isUsed = 0u;
- //----- [BODY (4/5)] AC_EVSEChargeParameter of EVSEChargeParameter -----
- //ignore, since our ISO1 doesn't support AC, yet
- //----- [BODY (5/5)] DC_EVSEChargeParameter of EVSEChargeParameter -----
- res->DC_EVSEChargeParameter_isUsed = 1u;
- struct iso1DC_EVSEChargeParameterType *para;
- para = &res->DC_EVSEChargeParameter;
- //DC_EVSEStatus
- para->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- para->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
- // iso1isolationLevelType_Invalid = 0,
- // iso1isolationLevelType_Valid = 1,
- // iso1isolationLevelType_Warning = 2,
- // iso1isolationLevelType_Fault = 3
- para->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- // iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
- // iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
- // iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- // iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- // iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- // iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- // iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- // iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
- // iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
- // iso1DC_EVSEStatusCodeType_Reserved_A = 9,
- // iso1DC_EVSEStatusCodeType_Reserved_B = 10,
- // iso1DC_EVSEStatusCodeType_Reserved_C = 11
- para->DC_EVSEStatus.NotificationMaxDelay = 0u;
- para->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- // iso1EVSENotificationType_None = 0,
- // iso1EVSENotificationType_StopCharging = 1,
- // iso1EVSENotificationType_ReNegotiation = 2
- //EVSEMaximumCurrentLimit
- para->EVSEMaximumCurrentLimit.Value = 2400;
- para->EVSEMaximumCurrentLimit.Multiplier = -1;
- //para->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
- para->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
- //iso1unitSymbolType_h = 0,
- //iso1unitSymbolType_m = 1,
- //iso1unitSymbolType_s = 2,
- //iso1unitSymbolType_A = 3,
- //iso1unitSymbolType_V = 4,
- //iso1unitSymbolType_W = 5,
- //iso1unitSymbolType_Wh = 6
- //EVSEMaximumPowerLimit
- para->EVSEMaximumPowerLimit.Value = 6000;
- para->EVSEMaximumPowerLimit.Multiplier = 1;
- //para->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
- para->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
- //EVSEMaximumVoltageLimit
- para->EVSEMaximumVoltageLimit.Value = 7500;
- para->EVSEMaximumVoltageLimit.Multiplier = -1;
- //para->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
- para->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
- //EVSEMinimumVoltageLimit
- para->EVSEMinimumVoltageLimit.Value = 1500;
- para->EVSEMinimumVoltageLimit.Multiplier = -1;
- //para->EVSEMinimumVoltageLimit.Unit_isUsed = 1u;
- para->EVSEMinimumVoltageLimit.Unit = iso1unitSymbolType_V;
- //EVSEMinimumCurrentLimit
- para->EVSEMinimumCurrentLimit.Value = 20;
- para->EVSEMinimumCurrentLimit.Multiplier = -1;
- //para->EVSEMinimumCurrentLimit.Unit_isUsed = 1u;
- para->EVSEMinimumCurrentLimit.Unit = iso1unitSymbolType_A;
- //EVSECurrentRegulationTolerance_isUsed
- para->EVSECurrentRegulationTolerance_isUsed = 1u;
- //EVSECurrentRegulationTolerance
- para->EVSECurrentRegulationTolerance.Value = 10;
- para->EVSECurrentRegulationTolerance.Multiplier = -1;
- //para->EVSECurrentRegulationTolerance.Unit_isUsed = 1u;
- para->EVSECurrentRegulationTolerance.Unit = iso1unitSymbolType_A;
- //EVSEEnergyToBeDelivered_isUsed
- para->EVSEEnergyToBeDelivered_isUsed = 1u;
- //EVSEPeakCurrentRipple
- para->EVSEPeakCurrentRipple.Value = 2;
- para->EVSEPeakCurrentRipple.Multiplier = -1;
- //para->EVSEPeakCurrentRipple.Unit_isUsed = 1u;
- para->EVSEPeakCurrentRipple.Unit = iso1unitSymbolType_A;
- //EVSEEnergyToBeDelivered (optional)
- /*
- para->EVSEEnergyToBeDelivered.Value = 360;
- para->EVSEEnergyToBeDelivered.Multiplier = 3;
- para->EVSEEnergyToBeDelivered.Unit_isUsed = 1u;
- para->EVSEEnergyToBeDelivered.Unit = iso1unitSymbolType_Wh;
- */
- }
- /*===========================================================================
- FUNCTION: Proc_din_ChargeParameterDiscoveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_ChargeParameterDiscoveryRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct ChargeParameterDiscoveryResponse_DIN70121 *res;
- struct ChargeParameterDiscoveryRequest_DIN70121 *req;
- struct DC_EVSEChargeParameterType_DIN70121 *dc_para;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- res = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse;
- req = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest;
- dc_para = &ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- res->ResponseCode = OK_DIN70121;
- res->EVSEProcessing = Ongoing_DIN70121;
- dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready; //1
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //[TC_SECC_VTB_ChargeParameterDiscovery_005]
- if ( (sys->EvBatteryMaxCurrent < 0) ||
- (sys->EvBatteryMaxVoltage<150)
- )
- {
- sprintf(buf_log_evcomm,
- "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
- sys->EvBatteryMaxCurrent);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- res->ResponseCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
- res->EVSEProcessing = Finished_DIN70121;
- dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 7;
- ShmStatusCodeData->PresentStatusCode[0][5] = 5;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- //STEP 2: ============ Modify Parameters of ShmCcsData ============
- SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
- SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
- SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
- SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumVoltageLimit, 1500, V_DIN70121); //150V
- SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMinimumCurrentLimit, MIN_SUPPORTED_CURRENT*10, A_DIN70121); //1A
- SAVE_PhysicalValueType_DIN70121(&dc_para->EVSECurrentRegulationTolerance, 10, A_DIN70121); //1A
- SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEPeakCurrentRipple, 2, A_DIN70121); //0.2A
- //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEEnergyToBeDelivered, 0, WH_DIN70121); //optional
- #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
- if (sys->EvBatteryMaxVoltage <= 500)
- {
- SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
- }
- #endif
- //for test with Tesla Model 3, 10A
- //SAVE_PhysicalValueType_DIN70121(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_DIN70121); //10A, for testing with Tesla Model 3
- //Check for EnergyTransferMode [TC_SECC_VTB_ChargeParameterDiscovery_004]
- if (req->EVRequestedEnergyTransferType != dinEVSESupportedEnergyTransferType_DC_extended)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Wrong EVRequestedEnergyTransferType(%d,%d)",
- req->EVRequestedEnergyTransferType,
- dinEVSESupportedEnergyTransferType_DC_extended);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- res->ResponseCode = FAILED_WrongEnergyTransferType_DIN70121;
- res->EVSEProcessing = Finished_DIN70121;
- dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- errn = -1;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 7;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- }
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes]EVSE_Shutdown");
- res->ResponseCode = FAILED_DIN70121;
- res->EVSEProcessing = Finished_DIN70121;
- dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- // errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
- res->ResponseCode = FAILED_DIN70121;
- res->EVSEProcessing = Finished_DIN70121;
- dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- //Detect for CP State should be 9V (State B)
- #if CP_PROTECTION_MECHANISM == ENABLE
- if (sys->CpState != 3) //State B1, B2
- {
- res->ResponseCode = FAILED_DIN70121;
- dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- res->EVSEProcessing = Finished_DIN70121;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Proc_din_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
- sys->CpState,
- sys->CpVoltage);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #endif
- //Check for Permission from CSU
- if (ShmInternalComm->ChargingPermission == TRUE)
- {
- res->EVSEProcessing = Finished_DIN70121;
- }
- //Check for Permission Off
- if (ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][DIN][ChargeParameterDiscoveryRes]Permission OFF");
- res->ResponseCode = FAILED_DIN70121;
- res->EVSEProcessing = Finished_DIN70121;
- dc_para->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- // errn = -1;
- }
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_ChargeParameterDiscoveryRes(&ccs_exi_doc_DIN, ShmCcsData);
- #else
- Sudo_Parameter_din_ChargeParameterDiscoveryRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
- errn = -1;
- }
- //STPE 5: ============ Update Flags ============
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ChargeParameterDiscoveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ChargeParameterDiscoveryRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct ChargeParameterDiscoveryResponse_ISO15118_2014 *res;
- struct ChargeParameterDiscoveryRequest_ISO15118_2014 *req;
- struct DC_EVSEChargeParameterType_ISO15118_2014 *dc_para;
- struct AC_EVSEChargeParameterType_ISO15118_2014 *ac_para;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse;
- req = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest;
- dc_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.DC_EVSEChargeParameter;
- ac_para = &ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryResponse.AC_EVSEChargeParameter;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- res->ResponseCode = OK_ISO15118_2014;
- /*+++ 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery +++*/
- res->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
- /*--- 20200808, vern, EVSEProcessing should be on-going during ChargeParameterDiscovery ---*/
- dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; //1
- ac_para->AC_EVSEStatus.RCD = ShmInternalComm->AC_RcdStatus; //0:no error, 1:error
- ac_para->AC_EVSEStatus.NotificationMaxDelay = 0; //unit: 1s
- ac_para->AC_EVSEStatus.EVSENotification = ShmInternalComm->AC_EVSENotification; //0:none, 1:StopCharging, 2:RenNgotiation
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- /* printf("req->RequestedEnergyTransferMode=%d\n",req->RequestedEnergyTransferMode);
- printf("req->AC_EVChargeParameter.DepartureTime=%d\n",req->AC_EVChargeParameter.DepartureTime);
-
- printf("req->AC_EVChargeParameter.EAmount.Multiplier=%d\n",req->AC_EVChargeParameter.EAmount.Multiplier);
- printf("req->AC_EVChargeParameter.EAmount.Unit=%d\n",req->AC_EVChargeParameter.EAmount.Unit);
- printf("req->AC_EVChargeParameter.EAmount.Value=%d\n",req->AC_EVChargeParameter.EAmount.Value);
-
- printf("req->AC_EVChargeParameter.EVMaxVoltage.Multiplier=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Multiplier);
- printf("req->AC_EVChargeParameter.EVMaxVoltage.Unit=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Unit);
- printf("req->AC_EVChargeParameter.EVMaxVoltage.Value=%d\n",req->AC_EVChargeParameter.EVMaxVoltage.Value);
-
- printf("req->AC_EVChargeParameter.EVMaxCurrent.Multiplier=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Multiplier);
- printf("req->AC_EVChargeParameter.EVMaxCurrent.Unit=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Unit);
- printf("req->AC_EVChargeParameter.EVMaxCurrent.Value=%d\n",req->AC_EVChargeParameter.EVMaxCurrent.Value);
-
- printf("req->AC_EVChargeParameter.EVMinCurrent.Multiplier=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Multiplier);
- printf("req->AC_EVChargeParameter.EVMinCurrent.Unit=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Unit);
- printf("req->AC_EVChargeParameter.EVMinCurrent.Value=%d\n",req->AC_EVChargeParameter.EVMinCurrent.Value);*/
- if(req->RequestedEnergyTransferMode <= 1)//0 for 1P, 1 for 3P
- {
- //AC parameters
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]AC charging");
- //AC
- SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSENominalVoltage, (int) (sys->AC_EVSENominalVoltage * 10), V_ISO15118_2014);
- //SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
- SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) (ShmInternalComm->AC_EVSEMaxCurrent * 10), A_ISO15118_2014);
- }
- else
- {
- //DC parameters
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]DC charging");
- //[TC_SECC_VTB_ChargeParameterDiscovery_005]
- /*+++ 20200808, vern, should check the voltage and current to see if the range of battery parameter is accepted by charger ---*/
- if ((sys->EvBatteryMaxCurrent < 0) ||(sys->EvBatteryMaxVoltage<150))
- {
- sprintf(buf_log_evcomm,
- "[ERROR]EvBatteryMaxCurrent/MaxVolatge is mismatch(current=%.02f, voltage=%.02f) => End_Process",
- sys->EvBatteryMaxCurrent,sys->EvBatteryMaxVoltage);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- res->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
- res->EVSEProcessing = Finished_ISO15118_2014;
- dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 7;
- ShmStatusCodeData->PresentStatusCode[0][5] = 5;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- //STEP 2: ============ Modify Parameters of ShmCcsData ============
- //DC
- SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
- SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
- SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
-
- SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumVoltageLimit, 1500, V_ISO15118_2014); //150V
- SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMinimumCurrentLimit, MIN_SUPPORTED_CURRENT*10, A_ISO15118_2014); //1A
- SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSECurrentRegulationTolerance, 10, A_ISO15118_2014); //1A
- SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEPeakCurrentRipple, 2, A_ISO15118_2014); //0.2A
- //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEEnergyToBeDelivered, 0, Wh_ISO15118_2014); //optional
-
- #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
- if (sys->EvBatteryMaxVoltage <= 500)
- {
- SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
- }
- #endif
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_Shutdown");
- res->ResponseCode = FAILED_ISO15118_2014;
- res->EVSEProcessing = iso1EVSEProcessingType_Finished;
- dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- // errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes]EVSE_EmergencyShutdown");
- res->ResponseCode = FAILED_ISO15118_2014;
- res->EVSEProcessing = iso1EVSEProcessingType_Finished;
- dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- errn = -1;
- }
- //Detect for CP State should be 9V (State B)
- #if CP_PROTECTION_MECHANISM == ENABLE
- if (sys->CpState != 3) //State B1, B2
- {
- res->ResponseCode = FAILED_ISO15118_2014;
- dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- res->EVSEProcessing = iso1EVSEProcessingType_Finished;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
-
- sprintf(buf_log_evcomm,
- "[Proc_iso1_ChargeParameterDiscoveryRes]Emergency Stop by CP Error (%d, %.02f V)\n",
- sys->CpState,
- sys->CpVoltage);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #endif
- }
- //for test with Tesla Model 3, 10A
- //SAVE_PhysicalValueType_ISO15118_2014(&dc_para->EVSEMaximumCurrentLimit, (int) (10 * 10), A_ISO15118_2014); //10A, for testing with Tesla Model 3
- //Check for EnergyTransferMode
- if (req->RequestedEnergyTransferMode != ShmCcsData->EnergyTransferMode) //[CAUTION] Their table should be kept as the same.
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Unmatched RequestedEnergyTransferMode(%d,%d)",
- req->RequestedEnergyTransferMode,
- ShmCcsData->EnergyTransferMode);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- res->ResponseCode = FAILED_WrongEnergyTransferMode_ISO15118_2014;
- res->EVSEProcessing = iso1EVSEProcessingType_Finished;
- dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- errn = -1;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_WrongEnergyTransferMode (023774)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 7;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- }
- //Check for Permission from CSU
- if(ShmInternalComm->ChargingPermission == TRUE)
- {
- res->EVSEProcessing = iso1EVSEProcessingType_Finished;
- }
- //Check for Permission Off
- if (ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][ISO1][ChargeParameterDiscoveryRes]Permission OFF");
- res->ResponseCode = FAILED_ISO15118_2014;
- res->EVSEProcessing = iso1EVSEProcessingType_Finished;
- dc_para->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- ac_para->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- // errn = -1;
- }
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_ChargeParameterDiscoveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_ChargeParameterDiscoveryRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryRes][Error]Tx encoded msg error");
- errn = -1;
- }
- //STPE 5: ============ Update Flags ============
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_ChargeParameterDiscoveryReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_ChargeParameterDiscoveryReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
- //ftime(&SeqStartTime);
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_ChargeParameterDiscoveryReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
- errn = Proc_din_ChargeParameterDiscoveryRes(AcceptFd);
- //ftime(&SeqEndTime);
- //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
- if ( errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]ChargeParameterDiscoveryRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][DIN][ChargeParameterDiscoveryRes]%d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ChargeParameterDiscoveryReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ChargeParameterDiscoveryReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargeParameterDiscoveryReq] Got ChargeParameterDiscoveryReq");
- //ftime(&SeqStartTime);
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_ChargeParameterDiscoveryReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_ChargeParameterDiscoveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
- errn = Proc_iso1_ChargeParameterDiscoveryRes(AcceptFd);
- //ftime(&SeqEndTime);
- //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(SeqStartTime, SeqEndTime));
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ChargeParameterDiscoveryRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][ISO1][ChargeParameterDiscoveryRes]%d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: SHM_Init_din_CableCheckRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. shm_ccs
- OUTPUT:
- 1. shm_ccs
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Init_din_CableCheckRes(struct CcsData *shm_ccs)
- {
- struct CableCheckResponse_DIN70121 *in;
- in = &shm_ccs->V2GMessage_DIN70121.CableCheckResponse;
- //----- [BODY (1/3)] ResponseCode -----
- in->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/3)] EVSEProcessing -----
- //in->EVSEProcessing = dinEVSEProcessingType_Finished; //for test
- in->EVSEProcessing = dinEVSEProcessingType_Ongoing; //default
- // dinEVSEProcessingType_Finished = 0,
- // dinEVSEProcessingType_Ongoing = 1
- //----- [BODY (3/3)] DC_EVSEStatus -----
- SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
- in->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0 (default)
- // dinisolationLevelType_Invalid = 0,
- // dinisolationLevelType_Valid = 1, (default)
- // dinisolationLevelType_Warning = 2,
- // dinisolationLevelType_Fault = 3
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_din_CableCheckRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_din_CableCheckRes()
- {
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinCableCheckResType(&ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes);
- ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinCableCheckResType *res;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.CableCheckRes;
- res->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/3)] EVSEProcessing -----
- res->EVSEProcessing = dinEVSEProcessingType_Finished; //0
- // dinEVSEProcessingType_Finished = 0,
- // dinEVSEProcessingType_Ongoing = 1
- //----- [BODY (3/3)] DC_EVSEStatus -----
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
- // dinisolationLevelType_Invalid = 0,
- // dinisolationLevelType_Valid = 1,
- // dinisolationLevelType_Warning = 2,
- // dinisolationLevelType_Fault = 3
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
- // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
- // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
- // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
- // dinDC_EVSEStatusCodeType_Reserved_A = 9,
- // dinDC_EVSEStatusCodeType_Reserved_B = 10,
- // dinDC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
- // dinEVSENotificationType_None = 0,
- // dinEVSENotificationType_StopCharging = 1,
- // dinEVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_iso1_CableCheckRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_iso1_CableCheckRes()
- {
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1CableCheckResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes);
- ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1CableCheckResType *res;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.CableCheckRes;
- res->ResponseCode = iso1responseCodeType_OK;
- //----- [BODY (2/3)] EVSEProcessing -----
- res->EVSEProcessing = iso1EVSEProcessingType_Finished; //0
- //iso1EVSEProcessingType_Finished = 0,
- //iso1EVSEProcessingType_Ongoing = 1,
- //iso1EVSEProcessingType_Ongoing_WaitingForCustomerInteraction = 2
- //----- [BODY (3/3)] DC_EVSEStatus -----
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
- //iso1isolationLevelType_Invalid = 0,
- //iso1isolationLevelType_Valid = 1,
- //iso1isolationLevelType_Warning = 2,
- //iso1isolationLevelType_Fault = 3,
- //iso1isolationLevelType_No_IMD = 4
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
- //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
- //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
- //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
- //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
- //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
- //iso1DC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- //iso1EVSENotificationType_None = 0,
- //iso1EVSENotificationType_StopCharging = 1,
- //iso1EVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: Proc_din_CableCheckRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_CableCheckRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct CableCheckResponse_DIN70121 *cab;
- static struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- cab = &ShmCcsData->V2GMessage_DIN70121.CableCheckResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- cab->ResponseCode = OK_DIN70121;
- cab->cnt++;
- DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
- sys->CpState,
- sys->CpVoltage,
- sys->PresentChargingVoltage,
- sys->IsolationStatus,
- cab->EVSEProcessing);
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- cab->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- cab->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- if (sys->IsolationStatus == GFD_Invalid) //0: on going
- {
- //For PSU
- sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
- sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive; //4
- cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
- }
- else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2: warning
- {
- //For PSU
- sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
- sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
- if (sys->PresentChargingVoltage < 60) // < 60V
- {
- //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
- sprintf(buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
- sys->PresentChargingVoltage,
- sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //IsolationStatus
- if (sys->IsolationStatus == GFD_Valid)
- {
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
- }
- else if (sys->IsolationStatus == GFD_Warning)
- {
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning;
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[WARNING]unexpected IsolationStatus(%d)",
- sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- cab->EVSEProcessing = dinEVSEProcessingType_Finished;
- }
- else
- {
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
- cab->EVSEProcessing = dinEVSEProcessingType_Ongoing;
- }
- }
- else if (sys->IsolationStatus == GFD_Fault) //3: fault
- {
- //For PSU
- sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
- sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
- cab->ResponseCode = FAILED_DIN70121;
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
- cab->EVSEProcessing = dinEVSEProcessingType_Finished;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]IsolationStatus = 3 (fault)");
- errn = -1;
- }
- else
- {
- //For PSU
- sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
- sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
- cab->ResponseCode = FAILED_DIN70121;
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_NotReady;
- cab->EVSEProcessing = dinEVSEProcessingType_Finished;
- sprintf(buf_log_evcomm,
- "[Proc_din_CableCheckRes]Undefined Isolation Status(%d)",
- sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- cab->ResponseCode = FAILED_DIN70121;
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- cab->EVSEProcessing = dinEVSEProcessingType_Finished;
- // errn = -1;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]EVSE_Shutdown");
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- cab->ResponseCode = FAILED_DIN70121;
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- cab->EVSEProcessing = dinEVSEProcessingType_Finished;
- errn = -1;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckRes]EVSE_EmergencyShutdown");
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- cab->ResponseCode = FAILED_DIN70121;
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- cab->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- cab->EVSEProcessing = dinEVSEProcessingType_Finished;
- // errn = -1;
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_CableCheckRes]ChargingPermission = FALSE");
- }
- else
- {
- //null
- }
- //Response to CP Error
- #if CP_PROTECTION_MECHANISM == ENABLE
- //#if 1
- if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
- {
- if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
- {
- cab->ResponseCode = FAILED_DIN70121;
- cab->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- sprintf(buf_log_evcomm,
- "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
- sys->CpState,
- sys->CpVoltage,
- cab->cnt
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //cab->cnt = 0;
- }
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_CableCheckRes(&ccs_exi_doc_DIN, ShmCcsData);
- #else
- Sudo_Parameter_din_CableCheckRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_CableCheckRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_CableCheckRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct CableCheckResponse_ISO15118_2014 *cab;
- static struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- cab = &ShmCcsData->V2GMessage_ISO15118_2014.CableCheckResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- cab->ResponseCode = OK_ISO15118_2014;
- cab->cnt++;
- DEBUG_PRINTF_EVCOMM_DETAIL("CP_State = %d (%.02f V), V_now = %.02f, Isolation Status = %d, EVSEProcessing = %d\n",
- sys->CpState,
- sys->CpVoltage,
- sys->PresentChargingVoltage,
- sys->IsolationStatus,
- cab->EVSEProcessing);
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- cab->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- cab->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
- {
- //For PSU
- sys->EvBatterytargetVoltage = CABLECHECK_TARGET_VOLTAGE; //500V //[To-Do] this should be modified to auto decision.
- sys->EvBatterytargetCurrent = CABLECHECK_TARGET_CURRENT; //2A(default), unit: 1A
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
- cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
- }
- else if ((sys->IsolationStatus == GFD_Valid) || (sys->IsolationStatus == GFD_Warning)) //1: valid, 2:waring
- {
- //For PSU
- sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
- sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
- if (sys->PresentChargingVoltage < 60) // < 60V
- {
- //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
- sprintf(buf_log_evcomm, "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)",
- sys->PresentChargingVoltage,
- sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //IsolationStatus
- if (sys->IsolationStatus == GFD_Valid)
- {
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
- }
- else if (sys->IsolationStatus == GFD_Warning)
- {
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning;
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[WARNING]unexpected IsolationStatus(%d)",
- sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
- }
- else
- {
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive;
- cab->EVSEProcessing = iso1EVSEProcessingType_Ongoing;
- }
- }
- else if (sys->IsolationStatus == GFD_Fault) //3: fault
- {
- //For PSU
- sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
- sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
- cab->ResponseCode = FAILED_ISO15118_2014;
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
- cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]IsolationStatus = 3 (fault)");
- errn = -1;
- }
- //else if (sys->IsolationStatus == GFD_No_IMD){} //only for ISO15118
- else
- {
- //For PSU
- sys->EvBatterytargetVoltage = 0; //0V, asking PSU to discharge to 0V
- sys->EvBatterytargetCurrent = 0; //0A, unit: 1A
- cab->ResponseCode = FAILED_ISO15118_2014;
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_NotReady;
- cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]Undefined Isolation Status.");
- }
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- cab->ResponseCode = FAILED_ISO15118_2014;
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
- // errn = -1;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]EVSE_Shutdown");
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- cab->ResponseCode = FAILED_ISO15118_2014;
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
- errn = -1;
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckRes]EVSE_EmergencyShutdown");
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- cab->ResponseCode = FAILED_ISO15118_2014;
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- cab->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- cab->EVSEProcessing = iso1EVSEProcessingType_Finished;
- // errn = -1;
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_CableCheckRes]ChargingPermission = FALSE");
- }
- else
- {
- //null
- }
- //Response to CP Error
- #if CP_PROTECTION_MECHANISM == ENABLE
- if (sys->CableCheckPreCountDownDone == TRUE) //[To-Do] Here should be modified to 2 seconds
- {
- if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
- {
- cab->ResponseCode = FAILED_ISO15118_2014;
- cab->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- sprintf(buf_log_evcomm,
- "[CableCheck]Emergency Stop by CP Error (%d, %.02f V, %d)\n",
- sys->CpState,
- sys->CpVoltage,
- cab->cnt
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //cab->cnt = 0;
- }
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_CableCheckRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_CableCheckRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_CableCheckReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_CableCheckReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CableCheckReq] Got CableCheckReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_CableCheckReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_CableCheckReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CableCheckRequest.DC_EVStatus.EVErrorCode);
- errn = Proc_din_CableCheckRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]CableCheckRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_din_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_CableCheckReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_CableCheckReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CableCheckReq] Got CableCheckReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_CableCheckReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_CableCheckReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CableCheckRequest.DC_EVStatus.EVErrorCode);
- errn = Proc_iso1_CableCheckRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]CableCheckRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_iso1_CableCheckReq]Proc_iso1_CableCheckRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: SHM_Init_din_PreChargeRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. shm_ccs
- OUTPUT:
- 1. shm_ccs
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Init_din_PreChargeRes(struct CcsData *shm_ccs)
- {
- struct PreChargeResponse_DIN70121 *in;
- in = &shm_ccs->V2GMessage_DIN70121.PreChargeResponse;
- //----- [BODY (1/3)] ResponseCode -----
- in->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/3)] EVSEPresentVoltage -----
- short value = 0; int multiplier = 0; unsigned char unit = 0;
- //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for Test
- value = 0; multiplier = 0; unit = V_DIN70121; //waiting for CsuComm to update V to fit EV Target
- SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
- //----- [BODY (3/3)] DC_EVSEStatus -----
- SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_din_PreChargeRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_din_PreChargeRes()
- {
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinPreChargeResType(&ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes);
- ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinPreChargeResType *res;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.PreChargeRes;
- res->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/3)] EVSEPresentVoltage -----
- res->EVSEPresentVoltage.Value = 3820;
- res->EVSEPresentVoltage.Multiplier = -1;
- res->EVSEPresentVoltage.Unit_isUsed = 1u;
- res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
- // dinunitSymbolType_h = 0,
- // dinunitSymbolType_m = 1,
- // dinunitSymbolType_s = 2,
- // dinunitSymbolType_A = 3,
- // dinunitSymbolType_Ah = 4,
- // dinunitSymbolType_V = 5,
- // dinunitSymbolType_VA = 6,
- // dinunitSymbolType_W = 7,
- // dinunitSymbolType_W_s = 8,
- // dinunitSymbolType_Wh = 9
- //----- [BODY (3/3)] DC_EVSEStatus -----
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
- // dinisolationLevelType_Invalid = 0,
- // dinisolationLevelType_Valid = 1,
- // dinisolationLevelType_Warning = 2,
- // dinisolationLevelType_Fault = 3
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
- // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
- // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
- // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
- // dinDC_EVSEStatusCodeType_Reserved_A = 9,
- // dinDC_EVSEStatusCodeType_Reserved_B = 10,
- // dinDC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
- // dinEVSENotificationType_None = 0,
- // dinEVSENotificationType_StopCharging = 1,
- // dinEVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_iso1_PreChargeRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_iso1_PreChargeRes()
- {
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1PreChargeResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes);
- ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1PreChargeResType *res;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.PreChargeRes;
- res->ResponseCode = iso1responseCodeType_OK;
- //----- [BODY (2/3)] EVSEPresentVoltage -----
- res->EVSEPresentVoltage.Value = 3820;
- res->EVSEPresentVoltage.Multiplier = -1;
- //res->EVSEPresentVoltage.Unit_isUsed = 1u;
- res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
- //iso1unitSymbolType_h = 0,
- //iso1unitSymbolType_m = 1,
- //iso1unitSymbolType_s = 2,
- //iso1unitSymbolType_A = 3,
- //iso1unitSymbolType_V = 4,
- //iso1unitSymbolType_W = 5,
- //iso1unitSymbolType_Wh = 6
- //----- [BODY (3/3)] DC_EVSEStatus -----
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
- //iso1isolationLevelType_Invalid = 0,
- //iso1isolationLevelType_Valid = 1,
- //iso1isolationLevelType_Warning = 2,
- //iso1isolationLevelType_Fault = 3,
- //iso1isolationLevelType_No_IMD = 4
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
- //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
- //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
- //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
- //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
- //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
- //iso1DC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- //iso1EVSENotificationType_None = 0,
- //iso1EVSENotificationType_StopCharging = 1,
- //iso1EVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: Proc_din_PreChargeRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_PreChargeRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct PreChargeResponse_DIN70121 *pre;
- static struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- pre = &ShmCcsData->V2GMessage_DIN70121.PreChargeResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- pre->ResponseCode = OK_DIN70121;
- //EVSE Status Code
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- pre->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- pre->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- SAVE_PhysicalValueType_DIN70121(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
- //Isolation Status
- if (sys->IsolationStatus == GFD_Invalid) //0: invalid
- {
- #if 0
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm, "[Error][Proc_din_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
- #endif
- }
- else if (sys->IsolationStatus == GFD_Valid) //1: valid
- {
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
- }
- else if (sys->IsolationStatus == GFD_Warning) //2: warning
- {
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
- }
- else if (sys->IsolationStatus == GFD_Fault) //3: fault
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]GFD_Fault => Emergency Shutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
- pre->ResponseCode = FAILED_DIN70121;
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else //GFD_No_IMD or other unexpected status
- {
- pre->ResponseCode = FAILED_DIN70121;
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Error][Proc_din_PreChargeRes]IsolationStatus = %d (undefined)",
- sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //Check for Alarm Code: CCS GFD trip (012235)
- if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]EVSE_Shutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- }
- pre->ResponseCode = FAILED_DIN70121;
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //Check for Alarm Code: CCS GFD trip (012235)
- if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]EVSE_EmergencyShutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- }
- pre->ResponseCode = FAILED_DIN70121;
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_PreChargeRes]ChargingPermission = FALSE");
- pre->ResponseCode = FAILED_DIN70121;
- pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- errn = -1;
- }
- else
- {
- //null
- }
- //Response to CP Error
- #if CP_PROTECTION_MECHANISM == ENABLE
- if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
- {
- pre->ResponseCode = FAILED_DIN70121;
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- sprintf(buf_log_evcomm,
- "[Error][Proc_din_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
- sys->CpState,
- sys->CpVoltage
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_PreChargeRes(&ccs_exi_doc_DIN, ShmCcsData);
- #else
- Sudo_Parameter_din_PreChargeRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][send_encoded_din_V2GTP_Stream]:Tx encoded msg error");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_PreChargeRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_PreChargeRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct PreChargeResponse_ISO15118_2014 *pre;
- static struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- pre = &ShmCcsData->V2GMessage_ISO15118_2014.PreChargeResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- pre->ResponseCode = OK_ISO15118_2014;
- //EVSE Status Code
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- pre->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- pre->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- SAVE_PhysicalValueType_ISO15118_2014(&pre->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
- //Isolation Status
- if (sys->IsolationStatus == GFD_Invalid) //0: invalid(on going)
- {
- #if 0
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- // Update_V2G_Flow_Status(Other_Fault);
- // errn = -1;
- sprintf(buf_log_evcomm, "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #else
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
- #endif
- }
- else if (sys->IsolationStatus == GFD_Valid) //1: valid
- {
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
- }
- else if (sys->IsolationStatus == GFD_Warning) //2: waring
- {
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //1
- }
- else if (sys->IsolationStatus == GFD_Fault) //3: fault
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]GFD_Fault => Emergency Shutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
- pre->ResponseCode = FAILED_ISO15118_2014;
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else
- {
- pre->ResponseCode = FAILED_ISO15118_2014;
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- sprintf(buf_log_evcomm,
- "[Error][Proc_iso1_PreChargeRes]IsolationStatus = %d (undefined)",
- sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //Check for Alarm Code: CCS GFD trip (012235)
- if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_Shutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]EVSE_Shutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- }
- pre->ResponseCode = FAILED_ISO15118_2014;
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- // errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //Check for Alarm Code: CCS GFD trip (012235)
- if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]CCS GFD trip => EVSE_EmergencyShutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]EVSE_EmergencyShutdown");
- pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- }
- pre->ResponseCode = FAILED_ISO15118_2014;
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_PreChargeRes]ChargingPermission = FALSE");
- pre->ResponseCode = FAILED_ISO15118_2014;
- pre->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- // errn = -1;
- }
- else
- {
- //null
- }
- //Response to CP Error
- #if CP_PROTECTION_MECHANISM == ENABLE
- if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
- {
- pre->ResponseCode = FAILED_ISO15118_2014;
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- sprintf(buf_log_evcomm,
- "[Error][Proc_iso1_PreChargeRes]Emergency Stop by CP Error (%d, %.02f V)\n",
- sys->CpState,
- sys->CpVoltage
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_PreChargeRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_PreChargeRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][send_encoded_iso1_V2GTP_Stream]:Tx encoded msg error");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_PreChargeReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_PreChargeReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PreChargeReq] Got PreChargeReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_PreChargeReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_PreChargeReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PreChargeRequest.DC_EVStatus.EVErrorCode);
- errn = Proc_din_PreChargeRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PreChargeRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_din_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_PreChargeReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_PreChargeReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PreChargeReq] Got PreChargeReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_PreChargeReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_PreChargeReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PreChargeRequest.DC_EVStatus.EVErrorCode);
- errn = Proc_iso1_PreChargeRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PreChargeRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_iso1_PreChargeReq]Proc_iso1_PreChargeRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: SHM_Init_din_PowerDeliveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. shm_ccs
- OUTPUT:
- 1. shm_ccs
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Init_din_PowerDeliveryRes(struct CcsData *shm_ccs)
- {
- struct PowerDeliveryResponse_DIN70121 *in;
- in = &shm_ccs->V2GMessage_DIN70121.PowerDeliveryResponse;
- //----- [BODY (1/3)] ResponseCode -----
- in->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/3)] AC_EVSEStatus -----
- //ignore, since DIN 70121 doesn't support AC, yet.
- //----- [BODY (2/3)] DC_EVSEStatus -----
- SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_din_PowerDeliveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_din_PowerDeliveryRes()
- {
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinPowerDeliveryResType(&ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes);
- ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinPowerDeliveryResType *res;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
- res->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/3)] AC_EVSEStatus -----
- //ignore, since DIN 70121 doesn't support AC, yet.
- //----- [BODY (2/3)] DC_EVSEStatus -----
- res->DC_EVSEStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
- // dinisolationLevelType_Invalid = 0,
- // dinisolationLevelType_Valid = 1,
- // dinisolationLevelType_Warning = 2,
- // dinisolationLevelType_Fault = 3
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
- // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
- // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
- // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
- // dinDC_EVSEStatusCodeType_Reserved_A = 9,
- // dinDC_EVSEStatusCodeType_Reserved_B = 10,
- // dinDC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
- // dinEVSENotificationType_None = 0,
- // dinEVSENotificationType_StopCharging = 1,
- // dinEVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_iso1_PowerDeliveryRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_iso1_PowerDeliveryRes()
- {
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1PowerDeliveryResType(&ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes);
- ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1PowerDeliveryResType *res;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
- res->ResponseCode = iso1responseCodeType_OK;
- //----- [BODY (2/3)] AC_EVSEStatus -----
- //ignore, since our ISO1 70121 doesn't support AC, yet.
- //----- [BODY (2/3)] DC_EVSEStatus -----
- res->DC_EVSEStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
- //iso1isolationLevelType_Invalid = 0,
- //iso1isolationLevelType_Valid = 1,
- //iso1isolationLevelType_Warning = 2,
- //iso1isolationLevelType_Fault = 3,
- //iso1isolationLevelType_No_IMD = 4
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
- //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
- //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
- //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
- //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
- //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
- //iso1DC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- //iso1EVSENotificationType_None = 0,
- //iso1EVSENotificationType_StopCharging = 1,
- //iso1EVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: Proc_din_PowerDeliveryStartRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_PowerDeliveryStartRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct dinPowerDeliveryResType *res;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- res->ResponseCode = OK_DIN70121;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
- #else
- Sudo_Parameter_din_PowerDeliveryRes();
- #endif
- //EVSE Status Code
- res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //res->ResponseCode = FAILED_DIN70121;
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //res->ResponseCode = FAILED_DIN70121;
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //res->ResponseCode = FAILED_DIN70121;
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PowerDeliveryStartRes][Error]Tx encoded msg error");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_PowerDeliveryStartRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_PowerDeliveryStartRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct iso1PowerDeliveryResType *res;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- res->ResponseCode = OK_ISO15118_2014;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_PowerDeliveryRes();
- #endif
- //EVSE Status Code
- res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PowerDeliveryStartRes][Error]Tx encoded msg error");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_PowerDeliveryStartReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_PowerDeliveryStartReq(int AcceptFd)
- {
- int errn = 0;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryStartReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
- errn = Proc_din_PowerDeliveryStartRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PowerDeliveryStartRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][Proc_din_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_PowerDeliveryStartReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_PowerDeliveryStartReq(int AcceptFd)
- {
- int errn = 0;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryStartReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
- errn = Proc_iso1_PowerDeliveryStartRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PowerDeliveryStartRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][Proc_iso1_PowerDeliveryStartReq]Proc_iso1_PowerDeliveryStartRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: SHM_Init_din_CurrentDemandRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. shm_ccs
- OUTPUT:
- 1. shm_ccs
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Init_din_CurrentDemandRes(struct CcsData *shm_ccs)
- {
- struct CurrentDemandResponse_DIN70121 *in;
- in = &shm_ccs->V2GMessage_DIN70121.CurrentDemandResponse;
- //----- [BODY (1/10)] ResponseCode -----
- in->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/10)] DC_EVSEStatus -----
- SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
- //----- [BODY (3/10)] EVSEPresentVoltage -----
- short value = 0; int multiplier = 0; unsigned char unit = 0;
- //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
- value = 0; multiplier = 0; unit = V_DIN70121;
- SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
- //----- [BODY (4/10)] EVSEPresentCurrent -----
- //value = 600; multiplier = -1; unit = A_DIN70121; //60A, for test only.
- value = 0; multiplier = 0; unit = A_DIN70121;
- SHM_Save_dinPhysicalValueType(&in->EVSEPresentCurrent, value, multiplier, unit);
- //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
- in->EVSECurrentLimitAchieved = FALSE;
- //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
- in->EVSEVoltageLimitAchieved = FALSE;
- //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
- in->EVSEPowerLimitAchieved = FALSE;
- //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
- //value = 7500; multiplier = -1; unit = V_DIN70121; //750V
- value = 5000; multiplier = -1; unit = V_DIN70121; //500V
- SHM_Save_dinPhysicalValueType(&in->EVSEMaximumVoltageLimit, value, multiplier, unit);
- //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
- value = 600; multiplier = -1; unit = A_DIN70121; //60A
- SHM_Save_dinPhysicalValueType(&in->EVSEMaximumCurrentLimit, value, multiplier, unit);
- //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
- value = 3000; multiplier = 1; unit = W_DIN70121; //30KW
- SHM_Save_dinPhysicalValueType(&in->EVSEMaximumPowerLimit, value, multiplier, unit);
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_din_CurrentDemandRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_din_CurrentDemandRes()
- {
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinCurrentDemandResType(&ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes);
- ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
- //----- [BODY (1/10)] ResponseCode -----
- struct dinCurrentDemandResType *res;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.CurrentDemandRes;
- res->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/10)] DC_EVSEStatus -----
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid;
- // dinisolationLevelType_Invalid = 0,
- // dinisolationLevelType_Valid = 1,
- // dinisolationLevelType_Warning = 2,
- // dinisolationLevelType_Fault = 3
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
- // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
- // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
- // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
- // dinDC_EVSEStatusCodeType_Reserved_A = 9,
- // dinDC_EVSEStatusCodeType_Reserved_B = 10,
- // dinDC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
- // dinEVSENotificationType_None = 0,
- // dinEVSENotificationType_StopCharging = 1,
- // dinEVSENotificationType_ReNegotiation = 2
- //----- [BODY (3/10)] EVSEPresentVoltage -----
- res->EVSEPresentVoltage.Value = 3820;
- res->EVSEPresentVoltage.Multiplier = -1;
- res->EVSEPresentVoltage.Unit_isUsed = 1u;
- res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
- //----- [BODY (4/10)] EVSEPresentCurrent -----
- res->EVSEPresentCurrent.Value = 1200;
- res->EVSEPresentCurrent.Multiplier = -1;
- res->EVSEPresentCurrent.Unit_isUsed = 1u;
- res->EVSEPresentCurrent.Unit = dinunitSymbolType_A;
- //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
- res->EVSECurrentLimitAchieved = 0;
- //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
- res->EVSEVoltageLimitAchieved = 0;
- //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
- res->EVSEPowerLimitAchieved = 0;
- //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
- res->EVSEMaximumVoltageLimit_isUsed = 1u;
- res->EVSEMaximumVoltageLimit.Value = 7500;
- res->EVSEMaximumVoltageLimit.Multiplier = -1;
- res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
- res->EVSEMaximumVoltageLimit.Unit = dinunitSymbolType_V;
- //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
- res->EVSEMaximumCurrentLimit_isUsed = 1u;
- res->EVSEMaximumCurrentLimit.Value = 1200;
- res->EVSEMaximumCurrentLimit.Multiplier = -1;
- res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
- res->EVSEMaximumCurrentLimit.Unit = dinunitSymbolType_A;
- //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
- res->EVSEMaximumPowerLimit_isUsed = 1u;
- res->EVSEMaximumPowerLimit.Value = 6000;
- res->EVSEMaximumPowerLimit.Multiplier = 1;
- res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
- res->EVSEMaximumPowerLimit.Unit = dinunitSymbolType_W;
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_iso1_CurrentDemandRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_iso1_CurrentDemandRes()
- {
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1CurrentDemandResType(&ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes);
- ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
- //----- [BODY (1/10)] ResponseCode -----
- struct iso1CurrentDemandResType *res;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.CurrentDemandRes;
- res->ResponseCode = iso1responseCodeType_OK;
- //----- [BODY (2/10)] DC_EVSEStatus -----
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid;
- //iso1isolationLevelType_Invalid = 0,
- //iso1isolationLevelType_Valid = 1,
- //iso1isolationLevelType_Warning = 2,
- //iso1isolationLevelType_Fault = 3,
- //iso1isolationLevelType_No_IMD = 4
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
- //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
- //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
- //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
- //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
- //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
- //iso1DC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- //iso1EVSENotificationType_None = 0,
- //iso1EVSENotificationType_StopCharging = 1,
- //iso1EVSENotificationType_ReNegotiation = 2
- //----- [BODY (3/10)] EVSEPresentVoltage -----
- res->EVSEPresentVoltage.Value = 3820;
- res->EVSEPresentVoltage.Multiplier = -1;
- //res->EVSEPresentVoltage.Unit_isUsed = 1u;
- res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
- //----- [BODY (4/10)] EVSEPresentCurrent -----
- res->EVSEPresentCurrent.Value = 1200;
- res->EVSEPresentCurrent.Multiplier = -1;
- //res->EVSEPresentCurrent.Unit_isUsed = 1u;
- res->EVSEPresentCurrent.Unit = iso1unitSymbolType_A;
- //----- [BODY (5/10)] EVSECurrentLimitAchieved -----
- res->EVSECurrentLimitAchieved = 0;
- //----- [BODY (6/10)] EVSEVoltageLimitAchieved -----
- res->EVSEVoltageLimitAchieved = 0;
- //----- [BODY (7/10)] EVSEPowerLimitAchieved -----
- res->EVSEPowerLimitAchieved = 0;
- //----- [BODY (8/10)] EVSEMaximumVoltageLimit -----
- res->EVSEMaximumVoltageLimit_isUsed = 1u;
- res->EVSEMaximumVoltageLimit.Value = 7500;
- res->EVSEMaximumVoltageLimit.Multiplier = -1;
- //res->EVSEMaximumVoltageLimit.Unit_isUsed = 1u;
- res->EVSEMaximumVoltageLimit.Unit = iso1unitSymbolType_V;
- //----- [BODY (9/10)] EVSEMaximumCurrentLimit -----
- res->EVSEMaximumCurrentLimit_isUsed = 1u;
- res->EVSEMaximumCurrentLimit.Value = 1200;
- res->EVSEMaximumCurrentLimit.Multiplier = -1;
- //res->EVSEMaximumCurrentLimit.Unit_isUsed = 1u;
- res->EVSEMaximumCurrentLimit.Unit = iso1unitSymbolType_A;
- //----- [BODY (10/10)] EVSEMaximumPowerLimit -----
- res->EVSEMaximumPowerLimit_isUsed = 1u;
- res->EVSEMaximumPowerLimit.Value = 6000;
- res->EVSEMaximumPowerLimit.Multiplier = 1;
- //res->EVSEMaximumPowerLimit.Unit_isUsed = 1u;
- res->EVSEMaximumPowerLimit.Unit = iso1unitSymbolType_W;
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_iso1_ChargingStatusRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_iso1_ChargingStatusRes()
- {
- int i = 0;
- struct iso1ChargingStatusResType *res;
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1ChargingStatusResType(&ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes);
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes;
- ccs_exi_doc_ISO1.V2G_Message.Body.ChargingStatusRes_isUsed = 1u;
- //----- [BODY (1/10)] ResponseCode -----
- res->ResponseCode = OK_ISO15118_2014;
- //----- [BODY (2/10)] AC_EVSEStatus -----
- res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
- res->AC_EVSEStatus.NotificationMaxDelay = 0;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- // iso1EVSENotificationType_None = 0,
- // iso1EVSENotificationType_StopCharging = 1,
- // iso1EVSENotificationType_ReNegotiation = 2
- //----- [BODY (3/10)] EVSEMaxCurrent -----
- res->EVSEMaxCurrent_isUsed = 1u;
- res->EVSEMaxCurrent.Value = 32;
- res->EVSEMaxCurrent.Multiplier = 0;
- res->EVSEMaxCurrent.Unit = iso1unitSymbolType_A;
- //----- [BODY (4/10)] SAScheduleTupleID -----
- res->SAScheduleTupleID = 0;
- //----- [BODY (5/10)] EVSEID -----
- res->EVSEID.charactersLen = 37;
- memset(res->EVSEID.characters, 0, sizeof(res->EVSEID.characters));
- //sprintf(res->EVSEID.characters, CCS_AC_EVSEID);
- //----- [BODY (6/10)] MeterInfo -----
- res->MeterInfo_isUsed = 1u;
- memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
- memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
- //[MeterInfo][1/5] MeterID
- //sprintf(res->MeterInfo.MeterID , CCS_AC_METER_ID);
- //[MeterInfo][2/5] SigMeterReading (optional)
- //sprintf(res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
- //[MeterInfo][3/5] MeterStatus (optional)
- res->MeterInfo.MeterStatus = 0;
- //[MeterInfo][4/5] MeterReading (optional)
- res->MeterInfo.MeterReading = 12345;
- //[MeterInfo][5/5] TMeter (optional)
- res->MeterInfo.TMeter = 1586243587; //Unix Time Stamp format
- //----- [BODY (7/10)] ReceiptRequired -----
- res->ReceiptRequired_isUsed = 1u;
- res->ReceiptRequired = FALSE; //optional
- }
- /*===========================================================================
- FUNCTION: Check_EVErrorCode
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Check_EVErrorCode(int code)
- {
- struct ChargingInfoData *sys;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
-
-
- if (code != NO_ERROR) //NO_ERROR = 0
- {
- //Asking CSU to Stop
- switch (code)
- {
- /*case dinDC_EVErrorCodeType_NO_ERROR: // = 0,
- {
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(NO_ERROR)");
- break;
- }*/
- case dinDC_EVErrorCodeType_FAILED_RESSTemperatureInhibit: // = 1,
- { //023737
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 3;
- ShmStatusCodeData->PresentStatusCode[0][5] = 7;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_RESSTemperatureInhibit)");
- break;
- }
- case dinDC_EVErrorCodeType_FAILED_EVShiftPosition: // = 2,
- {//023738
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 3;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_EVShiftPosition)");
- break;
- }
- case dinDC_EVErrorCodeType_FAILED_ChargerConnectorLockFault: // = 3,
- {
- //023739
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 3;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(ChargerConnectorLockFault)");
- break;
- }
- case dinDC_EVErrorCodeType_FAILED_EVRESSMalfunction: // = 4,
- {
- //023740
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 4;
- ShmStatusCodeData->PresentStatusCode[0][5] = 0;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_EVRESSMalfunction)");
- break;
- }
- case dinDC_EVErrorCodeType_FAILED_ChargingCurrentdifferential: // = 5,
- {
- //023741
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 4;
- ShmStatusCodeData->PresentStatusCode[0][5] = 1;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingCurrentdifferential)");
- break;
- }
- case dinDC_EVErrorCodeType_FAILED_ChargingVoltageOutOfRange: // = 6,
- {
- //023742
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 4;
- ShmStatusCodeData->PresentStatusCode[0][5] = 2;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingVoltageOutOfRange)");
- break;
- }
- case dinDC_EVErrorCodeType_Reserved_A: // = 7,
- {
- //023983
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_A)");
- break;
- }
- case dinDC_EVErrorCodeType_Reserved_B: // = 8,
- {
- //023983
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_B)");
- break;
- }
- case dinDC_EVErrorCodeType_Reserved_C: // = 9,
- {
- //023983
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(Reserved_C)");
- break;
- }
- case dinDC_EVErrorCodeType_FAILED_ChargingSystemIncompatibility:// = 10,
- {
- //023743
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 4;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(FAILED_ChargingSystemIncompatibility)");
- break;
- }
- case dinDC_EVErrorCodeType_NoData: // = 11
- {
- //023746
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 4;
- ShmStatusCodeData->PresentStatusCode[0][5] = 6;
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("(NoData)");
- break;
- }
- default:
- {
- if(sys->EvBatterySoc==100)
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 7;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- }
- else
- {
- //023983
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- }
- DEBUG_PRINTF_EXI_ENGINE_DETAIL("([WARNING] Unexpected din EVErrorCode)");
- break;
- }
- }
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- //Update_V2G_Flow_Status(Other_Fault);
- //memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
- sprintf(buf_log_evcomm,
- "Stop by EV (EVErrorCode = %d (DEC))",
- code);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- else
- {
- if(Check_V2G_Flow_Status()>=49)
- {
- if((sys->EvBatterySoc==100)||(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.ChargingComplete))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 7;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = FALSE;
- sprintf(buf_log_evcomm,
- "Check_EVErrorCode => Stop by EV (EVErrorCode = %d (023979))",
- code);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- else if(ShmStatusCodeData->PresentStatusCode[0][1] ==0)
- {
- if(!( (ShmInternalComm->ChargingPermission == FALSE)||
- (sys->DC_EVSEStatus == EVSE_Shutdown)||
- (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)))
- {
- //023983
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- sprintf(buf_log_evcomm,
- "Check_EVErrorCode => Stop by EV (EVErrorCode = %d (023983))",
- code);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- }
- }
- }
- }
- /*===========================================================================
- FUNCTION: Proc_din_CurrentDemandRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_CurrentDemandRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct CurrentDemandResponse_DIN70121 *cur;
- static struct ChargingInfoData *sys;
- static int EVSE_max_current;
- int tmp = 0;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- cur = &ShmCcsData->V2GMessage_DIN70121.CurrentDemandResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- cur->ResponseCode = OK_DIN70121;
- //EVSE Status Code
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- cur->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- cur->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //Check for negative EvBatteryMaxCurrent
- if (sys->EvBatteryMaxCurrent < 0)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
- sys->EvBatteryMaxCurrent);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- cur->DC_EVSEStatus.EVSEStatusCode = dinresponseCodeType_FAILED_WrongChargeParameter; //16
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 7;
- ShmStatusCodeData->PresentStatusCode[0][5] = 5;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_DIN70121);
- SAVE_PhysicalValueType_DIN70121(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
- #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
- SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_DIN70121);
- #endif
- SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_DIN70121);
- SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_DIN70121);
- #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
- if (sys->EvBatteryMaxVoltage <= 500)
- {
- SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_DIN70121); //500V
- }
- #endif
- //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
- if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
- {
- sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
- //[To-Do] Limit is achieved flag
- }
- //Isolation Status
- if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
- {
- #if 0
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Update_V2G_Flow_Status(Other_Fault);
- //errn = -1;
- #else
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
- #endif
- }
- else if (sys->IsolationStatus == GFD_Valid) //1: valid
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
- }
- else if (sys->IsolationStatus == GFD_Warning) //2: warning
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
- }
- else if (sys->IsolationStatus == GFD_Fault) //3: fault
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_CurrentDemandRes]GFD_Fault => Emergency Shutdown");
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- else //GFD_No_IMD or other unexpected status
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[Error][Proc_din_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- //For testing with Tesla Model 3
- #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
- //[CAUTION][To-Do] Decresement of Current is not implemented.
- //SAVE_PhysicalValueType_DIN70121(&cur->EVSEMaximumCurrentLimit, 10, A_DIN70121);
- if (sys->EvBatterytargetCurrent <= 0)
- {
- EVSE_max_current = 50; //10A
- cur->EVSEMaximumCurrentLimit.Value = 50; //10A
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
- sys->PresentChargingCurrent,
- sys->EvBatterytargetCurrent,
- EVSE_max_current,
- cur->EVSEMaximumCurrentLimit.Value
- );
- */
- }
- else //1A
- {
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
- sys->PresentChargingCurrent,
- sys->EvBatterytargetCurrent,
- EVSE_max_current,
- cur->EVSEMaximumCurrentLimit.Value
- );
- */
- if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
- {
- tmp = EVSE_max_current + 50; //10A
- if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
- {
- cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
- EVSE_max_current = tmp;
- }
- else
- {
- cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
- EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
- }
- }
- }
- #endif
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //Check for Alarm Code: CCS GFD trip (012235)
- if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE_Shutdown");
- cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- }
- //cur->ResponseCode = FAILED_DIN70121;
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- //errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //Check for Alarm Code: CCS GFD trip (012235)
- if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
- cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- }
- //cur->ResponseCode = FAILED_DIN70121;
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]Permission OFF");
- //cur->ResponseCode = FAILED_DIN70121;
- cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- //errn = -1;
- }
- else
- {
- //null
- }
- //Response to CP Error
- #if CP_PROTECTION_MECHANISM == ENABLE
- if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
- {
- if(sys->CpState <= 1)
- {
- cur->ResponseCode = FAILED_DIN70121;
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
-
- sprintf(buf_log_evcomm,
- "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
- sys->CpState,
- sys->CpVoltage);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][Error][CurrentDemandRes]EVSE Normal Stop");
- //cur->ResponseCode = FAILED_DIN70121;
- cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- //errn = -1;
- }
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_CurrentDemandRes(&ccs_exi_doc_DIN, ShmCcsData);
- #else
- Sudo_Parameter_din_CurrentDemandRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_CurrentDemandRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_CurrentDemandRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct CurrentDemandResponse_ISO15118_2014 *cur;
- static struct ChargingInfoData *sys;
- static int EVSE_max_current;
- int tmp = 0;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- cur = &ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- cur->ResponseCode = OK_ISO15118_2014;
- //EVSE Status Code
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- cur->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- cur->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //Check for negative EvBatteryMaxCurrent
- if (sys->EvBatteryMaxCurrent < 0)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]EvBatteryMaxCurrent is negative(%.02f) => End_Process",
- sys->EvBatteryMaxCurrent);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- cur->ResponseCode = iso1responseCodeType_FAILED_WrongChargeParameter; //16
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_WrongChargeParameter (023775)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 7;
- ShmStatusCodeData->PresentStatusCode[0][5] = 5;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentCurrent, (int) (sys->PresentChargingCurrent * 10), A_ISO15118_2014);
- SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
- #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == DISABLE
- SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, (int) (sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
- #endif
- SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumPowerLimit, (int) (sys->AvailableChargingPower * 10), W_ISO15118_2014);
- SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (sys->MaximumChargingVoltage * 10), V_ISO15118_2014);
- #if PATCH_FOR_BMW_I3_BUG_EVSEMAXIMUMVOLTAGELIMIT_599V == ENABLE
- if (sys->EvBatteryMaxVoltage <= 500)
- {
- SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumVoltageLimit, (int) (500 * 10), V_ISO15118_2014); //500V
- }
- #endif
- //Limit the EVTargetCurrent should be under EVSEMaximumCurrentLimit
- if (sys->EvBatterytargetCurrent > sys->AvailableChargingCurrent)
- {
- sys->EvBatterytargetCurrent = sys->AvailableChargingCurrent;
- //[To-Do] Limit is achieved flag
- }
- //Isolation Status
- if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
- {
- #if 0
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- // Update_V2G_Flow_Status(Other_Fault);
- //errn = -1;
- #else
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
- #endif
- }
- else if (sys->IsolationStatus == GFD_Valid) //1: valid
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
- }
- else if (sys->IsolationStatus == GFD_Warning) //2: warning
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Warning; //2
- }
- else if (sys->IsolationStatus == GFD_Fault) //3: fault
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_CurrentDemandRes]GFD_Fault => EmergencyShutdown");
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- else
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[Error][Proc_iso1_CurrentDemandRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- //For testing with Tesla Model 3
- #if TESLA_SLOW_INCREASE_CURRENT_FUNCTION == ENABLE
- //[CAUTION][To-Do] Decresement of Current is not implemented.
- //SAVE_PhysicalValueType_ISO15118_2014(&cur->EVSEMaximumCurrentLimit, 10, A_ISO15118_2014);
- if (sys->EvBatterytargetCurrent <= 0)
- {
- EVSE_max_current = 50; //10A
- cur->EVSEMaximumCurrentLimit.Value = 50; //10A
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("1PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
- sys->PresentChargingCurrent,
- sys->EvBatterytargetCurrent,
- EVSE_max_current,
- cur->EVSEMaximumCurrentLimit.Value
- );
- */
- }
- else //1A
- {
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("2PresentChargingCurrent = %.02f, EvBatterytargetCurrent = %.02f, EVSE_max_current = %d, EVSEMaximumCurrentLimit = %d\n",
- sys->PresentChargingCurrent,
- sys->EvBatterytargetCurrent,
- EVSE_max_current,
- cur->EVSEMaximumCurrentLimit.Value
- );
- */
- if ((abs((int)sys->PresentChargingCurrent - (int)sys->EvBatterytargetCurrent) < 3)&&(abs((int)(EVSE_max_current/10) - (int)sys->EvBatterytargetCurrent) < 3))
- {
- tmp = EVSE_max_current + 50; //10A
- if (tmp <= (int)(sys->AvailableChargingCurrent * 10))
- {
- cur->EVSEMaximumCurrentLimit.Value = (int)tmp;
- EVSE_max_current = tmp;
- }
- else
- {
- cur->EVSEMaximumCurrentLimit.Value = (int) (sys->AvailableChargingCurrent * 10); //max is set to 40A
- EVSE_max_current = (int) (sys->AvailableChargingCurrent * 10);
- }
- }
- }
- #endif
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //Check for Alarm Code: CCS GFD trip (012235)
- if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_Shutdown");
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE_Shutdown");
- cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- }
- //cur->ResponseCode = FAILED_ISO15118_2014;
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- //errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //Check for Alarm Code: CCS GFD trip (012235)
- if (ShmInternalComm->EVSEStopChargingReq.alarmcode[0] == 0 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[1] == 1 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[2] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[3] == 2 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[4] == 3 &&
- ShmInternalComm->EVSEStopChargingReq.alarmcode[5] == 5)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]CCS GFD trip => EVSE_EmergencyShutdown");
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE_EmergencyShutdown");
- cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- }
- //cur->ResponseCode = FAILED_ISO15118_2014;
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]Permission OFF");
- //cur->ResponseCode = FAILED_ISO15118_2014;
- cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- //errn = -1;
- }
- else
- {
- //null
- }
- //Response to CP Error
- #if CP_PROTECTION_MECHANISM == ENABLE
- if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
- {
- if(sys->CpState <= 1)
- {
- cur->ResponseCode = FAILED_ISO15118_2014;
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- sprintf(buf_log_evcomm,
- "[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)",
- sys->CpState,
- sys->CpVoltage);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][Error][CurrentDemandRes]EVSE Normal Stop");
- //cur->ResponseCode = FAILED_ISO15118_2014;
- cur->DC_EVSEStatus.EVSEIsolationStatus = (unsigned char)sys->IsolationStatus;
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_CurrentDemandRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_CurrentDemandRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ChargingStatusRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ChargingStatusRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct ChargingStatusResponse_ISO15118_2014 *res;
- static struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargingStatusResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- //Init
- res->ResponseCode = OK_ISO15118_2014;
- res->ReceiptRequired = FALSE; //optional
- res->SAScheduleTupleID = 1;
- res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
- res->AC_EVSEStatus.NotificationMaxDelay = 0;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- // iso1EVSENotificationType_None = 0,
- // iso1EVSENotificationType_StopCharging = 1,
- // iso1EVSENotificationType_ReNegotiation = 2
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //EVSE ID
- memset(res->EVSEID, 0, sizeof(res->EVSEID));
- res->EVSEID[0]='Z';
- res->EVSEID[1]='Z';
- res->EVSEID[2]='0';
- res->EVSEID[3]='0';
- res->EVSEID[4]='0';
- res->EVSEID[5]='0';
- res->EVSEID[6]='0';
-
- //sprintf(res->EVSEID, CCS_AC_EVSEID);
- //[MeterInfo][0/5] init
- //memset(res->MeterInfo.MeterID.characters, 0, sizeof(res->MeterInfo.MeterID.characters));
- //memset(res->MeterInfo.SigMeterReading.bytes, 0, sizeof(res->MeterInfo.SigMeterReading.bytes));
- //[MeterInfo][1/5] MeterID
- strcpy(res->MeterInfo.MeterID , ShmSysConfigAndInfo->SysConfig.SerialNumber);
-
- //[MeterInfo][2/5] SigMeterReading (optional)
- //sprintf(res->MeterInfo.SigMeterReading , CCS_AC_SIG_METER_READING);
- //[MeterInfo][3/5] MeterStatus (optional)
- res->MeterInfo.MeterStatus = 1;
- //[MeterInfo][4/5] MeterReading (optional)
- res->MeterInfo.MeterReading = ShmInternalComm->AC_MeterReadingValue;//Wh
- //[MeterInfo][5/5] TMeter (optional)
- res->MeterInfo.TMeter = time(NULL); //Unix Time Stamp format
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
- //Isolation Status (RCD)
- if (ShmInternalComm->AC_RcdStatus == 1) //RCD tripped,Isolation is invalid
- {
- res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[ISO1][Error][ChargingStatusRes]IsolationStatus = %d", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- sprintf(buf_log_evcomm, "[ISO1][ChargingStatusRes]ChargingPermission = FALSE");
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //errn = -1;
- }
- //Response to CP Error
- //#if CP_PROTECTION_MECHANISM == ENABLE
- #if 1
- // if ((sys->CpState != 4) && (sys->CpState != 5)) //State C (6V), D (3V)
- if ((sys->CpState < 3) || (sys->CpState > 5)) //State C (6V), D (3V)
- {
- res->ResponseCode = FAILED_ISO15118_2014;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Flow_Status(Other_Fault);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_CP_State_Error (023889)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 9;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- sprintf(buf_log_evcomm,
- "[ChargingStatus]Emergency Stop by CP Error (%d, %.02f V)",
- sys->CpState,
- sys->CpVoltage);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_ChargingStatusRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_ChargingStatusRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_CurrentDemandReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_CurrentDemandReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_CurrentDemandReq] Got CurrentDemandReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_CurrentDemandReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
- errn = Proc_din_CurrentDemandRes(AcceptFd);
- if (errn == 0)
- {
- //Response is sent successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]CurrentDemandRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[DIN][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_CurrentDemandReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_CurrentDemandReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_CurrentDemandReq] Got CurrentDemandReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_CurrentDemandReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_CurrentDemandReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.CurrentDemandRequest.DC_EVStatus.EVErrorCode);
- errn = Proc_iso1_CurrentDemandRes(AcceptFd);
- if (errn == 0)
- {
- //Response is sent successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]CurrentDemandRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[ISO1][Error][CurrentDemandReq]CurrentDemandRes: fail(%d,DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_ChargingStatusReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_ChargingStatusReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_ChargingStatusReq] Got ChargingStatusReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_ChargingStatusReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_ChargingStatusReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- //no content in ISO1
- errn = Proc_iso1_ChargingStatusRes(AcceptFd);
- if (errn == 0)
- {
- //Response is sent successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]ChargingStatusRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[ISO1][Error][ChargingStatusReq]ChargingStatusRes: fail(%d,DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_PowerDeliveryStopRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_PowerDeliveryStopRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct dinPowerDeliveryResType *res;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryRes;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- res->ResponseCode = OK_DIN70121;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- ShmCcsData->V2GMessage_DIN70121.PowerDeliveryResponse.DC_EVSEStatus.EVSEStatusCode = EVSE_NotReady;
- SHM_Read_din_PowerDeliveryRes(&ccs_exi_doc_DIN, ShmCcsData);
- #else
- Sudo_Parameter_din_PreChargeRes();
- #endif
- //EVSE Status Code
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //res->ResponseCode = FAILED_DIN70121;
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //res->ResponseCode = FAILED_DIN70121;
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //res->ResponseCode = FAILED_DIN70121;
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_PowerDeliveryStopRes][Error]Tx encoded msg error");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_PowerDeliveryStopRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_PowerDeliveryStopRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct iso1PowerDeliveryResType *res;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryRes;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- res->ResponseCode = OK_ISO15118_2014;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
-
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
- ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryResponse.DC_EVSEStatus.DC_EVSEStatusCode = EVSE_NotReady;
- SHM_Read_iso1_PowerDeliveryRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_PreChargeRes();
- #endif
- //EVSE Status Code
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1 /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready; /*+++ 20200808, vern, Isolation Status should be valid during 2nd PowerDelivert ---*/
- }
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_PowerDeliveryStopRes][Error]Tx encoded msg error");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_PowerDeliveryStopReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_PowerDeliveryStopReq(int AcceptFd)
- {
- int errn = 0;
- struct ChargingInfoData *sys;
- //Request CSU to STOP
- //This should be reponsed as soon as possible once this message is received.
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
-
- EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
- EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd)\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_PowerDeliveryReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
-
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
- usleep(1500000); //1.5 seconds
- //sleep(1); //1 second
- errn = Proc_din_PowerDeliveryStopRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]PowerDeliveryRes (2nd)\n");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_din_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_PowerDeliveryStopReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_PowerDeliveryStopReq(int AcceptFd)
- {
- int errn = 0;
- struct ChargingInfoData *sys;
- //Request CSU to STOP
- //This should be reponsed as soon as possible once this message is received.
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_PowerDeliveryReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
- {
- //CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
- EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd-Stop)\n");
- //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
- usleep(1500000); //1.5 seconds
- //sleep(1); //1 second
- }
- else
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PowerDeliveryReq (2nd-Renegotiation)\n");
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
-
- errn = Proc_iso1_PowerDeliveryStopRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]PowerDeliveryRes (2nd-stop)");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_iso1_PowerDeliveryStopReq]Proc_iso1_PowerDeliveryStopRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: SHM_Init_din_WeldingDetectionRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. shm_ccs
- OUTPUT:
- 1. shm_ccs
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Init_din_WeldingDetectionRes(struct CcsData *shm_ccs)
- {
- struct WeldingDetectionResponse_DIN70121 *in;
- in = &shm_ccs->V2GMessage_DIN70121.WeldingDetectionResponse;
- //----- [BODY (1/3)] ResponseCode -----
- in->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/3)] EVSEPresentVoltage -----
- short value = 0; int multiplier = 0; unsigned char unit = 0;
- //value = 3820; multiplier = -1; unit = V_DIN70121; //382V, for test only.
- value = 0; multiplier = 0; unit = V_DIN70121;
- SHM_Save_dinPhysicalValueType(&in->EVSEPresentVoltage, value, multiplier, unit);
- //----- [BODY (3/3)] DC_EVSEStatus -----
- SHM_Init_dinDC_EVSEStatusType(&in->DC_EVSEStatus);
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_din_WeldingDetectionRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_din_WeldingDetectionRes()
- {
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinWeldingDetectionResType(&ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes);
- ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinWeldingDetectionResType *res;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.WeldingDetectionRes;
- res->ResponseCode = dinresponseCodeType_OK;
- //----- [BODY (2/3)] EVSEPresentVoltage -----
- res->EVSEPresentVoltage.Value = 3820;
- res->EVSEPresentVoltage.Multiplier = -1;
- res->EVSEPresentVoltage.Unit_isUsed = 1u;
- res->EVSEPresentVoltage.Unit = dinunitSymbolType_V;
- // dinunitSymbolType_h = 0,
- // dinunitSymbolType_m = 1,
- // dinunitSymbolType_s = 2,
- // dinunitSymbolType_A = 3,
- // dinunitSymbolType_Ah = 4,
- // dinunitSymbolType_V = 5,
- // dinunitSymbolType_VA = 6,
- // dinunitSymbolType_W = 7,
- // dinunitSymbolType_W_s = 8,
- // dinunitSymbolType_Wh = 9
- //----- [BODY (3/3)] DC_EVSEStatus -----
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid;
- // dinisolationLevelType_Invalid = 0,
- // dinisolationLevelType_Valid = 1,
- // dinisolationLevelType_Warning = 2,
- // dinisolationLevelType_Fault = 3
- res->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- // dinDC_EVSEStatusCodeType_EVSE_NotReady = 0,
- // dinDC_EVSEStatusCodeType_EVSE_Ready = 1,
- // dinDC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- // dinDC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- // dinDC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- // dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- // dinDC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- // dinDC_EVSEStatusCodeType_Reserved_8 = 7,
- // dinDC_EVSEStatusCodeType_Reserved_9 = 8,
- // dinDC_EVSEStatusCodeType_Reserved_A = 9,
- // dinDC_EVSEStatusCodeType_Reserved_B = 10,
- // dinDC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = dinEVSENotificationType_None;
- // dinEVSENotificationType_None = 0,
- // dinEVSENotificationType_StopCharging = 1,
- // dinEVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_iso1_WeldingDetectionRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_iso1_WeldingDetectionRes()
- {
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1WeldingDetectionResType(&ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes);
- ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1WeldingDetectionResType *res;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.WeldingDetectionRes;
- res->ResponseCode = iso1responseCodeType_OK;
- //----- [BODY (2/3)] EVSEPresentVoltage -----
- res->EVSEPresentVoltage.Value = 3820;
- res->EVSEPresentVoltage.Multiplier = -1;
- //res->EVSEPresentVoltage.Unit_isUsed = 1u;
- res->EVSEPresentVoltage.Unit = iso1unitSymbolType_V;
- //iso1unitSymbolType_h = 0,
- //iso1unitSymbolType_m = 1,
- //iso1unitSymbolType_s = 2,
- //iso1unitSymbolType_A = 3,
- //iso1unitSymbolType_V = 4,
- //iso1unitSymbolType_W = 5,
- //iso1unitSymbolType_Wh = 6
- //----- [BODY (3/3)] DC_EVSEStatus -----
- res->DC_EVSEStatus.EVSEIsolationStatus_isUsed = 1u;
- res->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid;
- //iso1isolationLevelType_Invalid = 0,
- //iso1isolationLevelType_Valid = 1,
- //iso1isolationLevelType_Warning = 2,
- //iso1isolationLevelType_Fault = 3,
- //iso1isolationLevelType_No_IMD = 4
- res->DC_EVSEStatus.EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //iso1DC_EVSEStatusCodeType_EVSE_NotReady = 0,
- //iso1DC_EVSEStatusCodeType_EVSE_Ready = 1,
- //iso1DC_EVSEStatusCodeType_EVSE_Shutdown = 2,
- //iso1DC_EVSEStatusCodeType_EVSE_UtilityInterruptEvent = 3,
- //iso1DC_EVSEStatusCodeType_EVSE_IsolationMonitoringActive = 4,
- //iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown = 5,
- //iso1DC_EVSEStatusCodeType_EVSE_Malfunction = 6,
- //iso1DC_EVSEStatusCodeType_Reserved_8 = 7,
- //iso1DC_EVSEStatusCodeType_Reserved_9 = 8,
- //iso1DC_EVSEStatusCodeType_Reserved_A = 9,
- //iso1DC_EVSEStatusCodeType_Reserved_B = 10,
- //iso1DC_EVSEStatusCodeType_Reserved_C = 11
- res->DC_EVSEStatus.NotificationMaxDelay = 0u;
- res->DC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- //iso1EVSENotificationType_None = 0,
- //iso1EVSENotificationType_StopCharging = 1,
- //iso1EVSENotificationType_ReNegotiation = 2
- }
- /*===========================================================================
- FUNCTION: Proc_din_WeldingDetectionRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_WeldingDetectionRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct WeldingDetectionResponse_DIN70121 *wel;
- static struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- wel = &ShmCcsData->V2GMessage_DIN70121.WeldingDetectionResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- wel->ResponseCode = OK_DIN70121;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- wel->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- wel->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- SAVE_PhysicalValueType_DIN70121(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_DIN70121);
- //EVSE Status Code
- wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Ready;
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //wel->ResponseCode = FAILED_DIN70121;
- wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //wel->ResponseCode = FAILED_DIN70121;
- wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //wel->ResponseCode = FAILED_DIN70121;
- wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- //Isolation Status
- if (sys->IsolationStatus == GFD_Invalid) //0:invalid (on going)
- {
- // wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
- wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
- //wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Update_V2G_Flow_Status(Other_Fault);
- // errn = -1;
- }
- else if (sys->IsolationStatus == GFD_Valid) //1: valid
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Valid; //1
- }
- else if (sys->IsolationStatus == GFD_Warning) //2: warning
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
- }
- else if (sys->IsolationStatus == GFD_Fault) //3: fault
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
- wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_din_WeldingDetectionRes]GFD_Fault => Emergency Shutdown");
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- else //GFD_No_IMD or other unexpected status
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault; //3
- wel->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[Error][Proc_din_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_WeldingDetectionRes(&ccs_exi_doc_DIN, ShmCcsData);
- #else
- Sudo_Parameter_din_WeldingDetectionRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_WeldingDetectionRes][Error]Tx encoded msg error");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_WeldingDetectionRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_WeldingDetectionRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- static struct WeldingDetectionResponse_ISO15118_2014 *wel;
- static struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- wel = &ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- wel->ResponseCode = OK_ISO15118_2014;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- wel->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- wel->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- SAVE_PhysicalValueType_ISO15118_2014(&wel->EVSEPresentVoltage, (int) (sys->PresentChargingVoltage * 10), V_ISO15118_2014);
- //EVSE Status Code
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //wel->ResponseCode = FAILED_ISO15118_2014;
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //wel->ResponseCode = FAILED_ISO15118_2014;
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //wel->ResponseCode = FAILED_ISO15118_2014;
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Ready;
- }
- //Isolation Status
- if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
- {
- //wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
- wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
- // wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- // Update_V2G_Flow_Status(Other_Fault);
- // errn = -1;
- }
- else if (sys->IsolationStatus == GFD_Valid) //1: valid
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Valid; //1
- }
- else if (sys->IsolationStatus == GFD_Warning) //2: warning
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Warning; //2
- }
- else if (sys->IsolationStatus == GFD_Fault) //3: fault
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- SAVE_SYS_LOG_MSG_EVCOMM("[Error][Proc_iso1_WeldingDetectionRes]GFD_Fault => EmergencyShutdown");
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- else
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault; //3
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- sprintf(buf_log_evcomm, "[Error][Proc_iso1_WeldingDetectionRes]IsolationStatus = %d(undefined)", sys->IsolationStatus);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_WeldingDetectionRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_WeldingDetectionRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_WeldingDetectionRes][Error]Tx encoded msg error");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_WeldingDetectionReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_WeldingDetectionReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_din_WeldingDetectionReq] Got WeldingDetectionReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_WeldingDetectionReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
- errn = Proc_din_WeldingDetectionRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[DIN][V2G][Tx]WeldingDetectionRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_din_WeldingDetectionReq]Proc_din_WeldingDetectionRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_WeldingDetectionReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_WeldingDetectionReq(int AcceptFd)
- {
- int errn = 0;
- //SAVE_SYS_LOG_MSG_EVCOMM("[Proc_iso1_WeldingDetectionReq] Got WeldingDetectionReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_WeldingDetectionReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_WeldingDetectionReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.WeldingDetectionRequest.DC_EVStatus.EVErrorCode);
- errn = Proc_iso1_WeldingDetectionRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- //SAVE_SYS_LOG_MSG_EVCOMM("[ISO1][V2G][Tx]WeldingDetectionRes");
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_iso1_WeldingDetectionReq]Proc_iso1_WeldingDetectionRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: SHM_Init_din_SessionStopRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. shm_ccs
- OUTPUT:
- 1. shm_ccs
- GLOBAL VARIABLES:
- =============================================================================*/
- void SHM_Init_din_SessionStopRes(struct CcsData *shm_ccs)
- {
- struct SessionStopResponse_DIN70121 *in;
- in = &shm_ccs->V2GMessage_DIN70121.SessionStopResponse;
- //----- [BODY (1/3)] ResponseCode -----
- in->ResponseCode = dinresponseCodeType_OK;
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_din_SessionStopRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_din_SessionStopRes()
- {
- init_dinBodyType(&ccs_exi_doc_DIN.V2G_Message.Body);
- init_dinSessionStopResType(&ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes);
- ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinSessionStopResType *res;
- res = &ccs_exi_doc_DIN.V2G_Message.Body.SessionStopRes;
- res->ResponseCode = dinresponseCodeType_OK;
- }
- /*===========================================================================
- FUNCTION: Sudo_Parameter_iso1_SessionStopRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- void Sudo_Parameter_iso1_SessionStopRes()
- {
- init_iso1BodyType(&ccs_exi_doc_ISO1.V2G_Message.Body);
- init_iso1SessionStopResType(&ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes);
- ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1SessionStopResType *res;
- res = &ccs_exi_doc_ISO1.V2G_Message.Body.SessionStopRes;
- res->ResponseCode = iso1responseCodeType_OK;
- }
- /*===========================================================================
- FUNCTION: Proc_din_SessionStopRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_SessionStopRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct SessionStopResponse_DIN70121 *stp;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- stp = &ShmCcsData->V2GMessage_DIN70121.SessionStopResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- stp->ResponseCode = OK_DIN70121;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&ccs_exi_doc_DIN) < 0)
- {
- stp->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- stp->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_SessionStopRes(&ccs_exi_doc_DIN, ShmCcsData);
- #else
- Sudo_Parameter_din_SessionStopRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_DIN) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes: fail");
- errn = -1;
- }
- else
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes");
- }
- //STEP 5: ============ Update Flags ===========
- EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
- //Once this is set, the CSU should
- // =========== Annouce to CSU [To-Be Implemented]=============
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
- // =========== Re-initialized [To-Be Implemented]=============
- //Keep 5% PWM for 2 seconds
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 2");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 1");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 0");
- OutputCpPwmDuty(100);
- //[To-Do] Reset All Share memory
- //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
- //system("reboot -f");
- //sleep(5);
- //system("reboot -f");
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_SessionStopRes
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_SessionStopRes(int AcceptFd)
- {
- //[Joseph, To-Do] Check SessionID of ServiceDiscoveryReq,
- //if it is not the same, the packet should be ignored.
- //STEP 1: ============ Initialize ============
- int i = 0;
- int errn = 0;
- bitstream_t v2g_tx_stream;
- struct SessionStopResponse_ISO15118_2014 *stp;
- struct ChargingInfoData *sys;
- size_t pos = 0;
- v2g_tx_stream.pos = &pos;
- v2g_tx_stream.size = V2GTP_MSG_TX_BUFFER_SIZE; //(64*1024) //65,536 = 65.5KB
- v2g_tx_stream.data = V2GTP_Tx_buf;
- stp = &ShmCcsData->V2GMessage_ISO15118_2014.SessionStopResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- stp->ResponseCode = OK_ISO15118_2014;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&ccs_exi_doc_ISO1) < 0)
- {
- stp->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]unmatched SessionID => End_Process");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- stp->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- SAVE_SYS_LOG_MSG_EVCOMM("[ERROR]SequenceError => End_Process");
- errn = -1;
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_ResponseCode_FAILED_SequenceError (023758)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 7;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 8;
- }
- //STEP 2: ============ Modifiy Parameter of ShmCcsData ============
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_SessionStopRes(&ccs_exi_doc_ISO1, ShmCcsData);
- #else
- Sudo_Parameter_iso1_SessionStopRes();
- #endif
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &ccs_exi_doc_ISO1) != 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes: fail");
- errn = -1;
- }
- else
- {
- //send response successfully.
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Tx]SessionStopRes");
- }
- //STEP 5: ============ Update Flags ===========
- EVCOMM_SYS_INFO.ConnectorLocked = FALSE; //Indicating CSU that the Connector is unlocked.
- //Once this is set, the CSU should
- // =========== Annouce to CSU [To-Be Implemented]=============
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE; //This should be also added to EV Error events.
- // =========== Re-initialized [To-Be Implemented]=============
- //Keep 5% PWM for 2 seconds
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 2");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 1");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 5\% countdown: 0");
- OutputCpPwmDuty(100);
- //[To-Do] Reset All Share memory
- //[To-Do] CCS Module enter "idle" mode and CSU should check for this state.
- //system("reboot -f");
- //sleep(5);
- //system("reboot -f");
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_din_SessionStopReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_din_SessionStopReq(int AcceptFd)
- {
- int errn = 0;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]SessionStopReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_SessionStopReq(&ccs_exi_doc_DIN);
- //Save into Share Memory
- SHM_Save_din_SessionStopReq(ShmCcsData, &ccs_exi_doc_DIN, ShmSysConfigAndInfo);
- errn = Proc_din_SessionStopRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_din_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: Proc_iso1_SessionStopReq
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Proc_iso1_SessionStopReq(int AcceptFd)
- {
- int errn = 0;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]SessionStopReq");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_SessionStopReq(&ccs_exi_doc_ISO1);
- //Save into Share Memory
- SHM_Save_iso1_SessionStopReq(ShmCcsData, &ccs_exi_doc_ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_SessionStopRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- }
- else
- {
- sprintf(buf_log_evcomm,
- "[Error][SeccComm][Proc_iso1_SessionStopReq]Proc_iso1_SessionStopRes(): %d (DEC)",
- errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Process_din
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. V2gFlowStatus
- OUTPUT:
- GLOBAL VARIABLES:
- 1. V2gFlowStatus
- =============================================================================*/
- int V2gMsg_Process_din(int AcceptFd)
- {
- unsigned char req_is_responsed = FALSE;
- while (req_is_responsed == FALSE)
- {
- //Check if it is in End_Process
- if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
- {
- break;
- }
- switch(V2gFlowStatus)
- {
- //-------------------------------------------
- case SupportedAppProtocolRequest:
- {
- if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
- {
- ccs_handshake.supportedAppProtocolReq_isUsed = 0;
- if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- Update_V2G_Flow_Status(SupportedAppProtocolResponse);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- }
- req_is_responsed = TRUE;
- break;
- }
- case SupportedAppProtocolResponse:
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
- {
- Update_V2G_Flow_Status(SessionSetupRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case SessionSetupRequest: //19
- {
- if (Proc_din_SessionSetupReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionSetupResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionSetupResponse: //20
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
- {
- Update_V2G_Flow_Status(ServiceDiscoveryRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ServiceDiscoveryRequest: //21
- {
- if (Proc_din_ServiceDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ServiceDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceDiscoveryResponse: //22
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
- {
- Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ServiceAndPaymentSelectionRequest: //25
- {
- if (Proc_din_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceAndPaymentSelectionResponse: //26
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- Update_V2G_Flow_Status(AuthorizationRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- //case ContractAuthenticationReq:
- case AuthorizationRequest: //29
- {
- if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(AuthorizationResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case AuthorizationResponse: //30
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //Check for ChargeParameterDiscoveryReq
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ChargeParameterDiscoveryRequest: //35
- {
- if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargeParameterDiscoveryResponse:
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
- {
- sprintf(buf_log_evcomm,
- "ChargingParameter Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_ChargingParameter_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 2: Check for CableCheckReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- Update_V2G_Flow_Status(CableCheckRequest);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- //STEP 3: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case CableCheckRequest: //37
- {
- //STEP 3: Execute Cable Check Process
- if (Proc_din_CableCheckReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(CableCheckResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CableCheckResponse: //38
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
- sprintf(buf_log_evcomm,
- "CableCheck Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_CableCheck_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 4;
- ShmStatusCodeData->PresentStatusCode[0][5] = 7;
- break;
- }
- #endif
- //STEP 2: Check for CableCheckReq message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //STEP 3: Execute Cable Check Process
- if (Proc_din_CableCheckReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for PreChargeReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(PreChargeRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- //STEP 3: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PreChargeRequest: //39
- {
- if (Proc_din_PreChargeReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PreChargeResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PreChargeResponse: //40
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
- {
- sprintf(buf_log_evcomm,
- "Precharge Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_PreCharge_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 0;
- break;
- }
- #endif
- //STEP 2: Check for PreChargeReq message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_din_PreChargeReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for PowerDeliveryReq message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(PowerDeliveryRequestStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStart: //41
- {
- if (Proc_din_PowerDeliveryStartReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponsetStart: //42
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- if (ccs_exi_doc_DIN.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
- {
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- 2000);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- }
- break;
- }
- #endif
- //STEP 2: Wait for CurrentDemandReq Message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(CurrentDemandRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case CurrentDemandRequest: //45,
- {
- if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(CurrentDemandResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CurrentDemandResponse: //46,
- {
- //STEP 1: Wait for CurrentDemandReq Message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 2: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStop: //49,
- {
- if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
-
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponseStop: //50,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- 2000);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- //STEP 2: Check for WeldingDetectionReq Message
- if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(WeldingDetectionRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Flow_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_din_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case WeldingDetectionRequest: //51,
- {
- if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(WeldingDetectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case WeldingDetectionResponse: //52,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_WeldingDetection_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- //STEP 2: Check for WeldingDetectionReq Message
- if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for SessionStopReq Message
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Flow_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case SessionStopRequest: //53,
- {
- if (Proc_din_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionStopResponse: //54,
- {
- break;
- }
- //-------------------------------------------
- default:
- {
- break;
- }
- }
- }
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Process_iso1_DC
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. V2gFlowStatus
- OUTPUT:
- GLOBAL VARIABLES:
- 1. V2gFlowStatus
- =============================================================================*/
- int V2gMsg_Process_iso1_DC(int AcceptFd)
- {
- unsigned char req_is_responsed = FALSE;
- while (req_is_responsed == FALSE)
- {
- //Check if it is in End_Process
- if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
- {
- break;
- }
- switch(V2gFlowStatus)
- {
- //-------------------------------------------
- case SupportedAppProtocolRequest:
- {
- if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
- {
- ccs_handshake.supportedAppProtocolReq_isUsed = 0;
- if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- Update_V2G_Flow_Status(SupportedAppProtocolResponse);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- }
- req_is_responsed = TRUE;
- break;
- }
- case SupportedAppProtocolResponse:
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
- {
- Update_V2G_Flow_Status(SessionSetupRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case SessionSetupRequest: //19
- {
- if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionSetupResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionSetupResponse: //20
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
- {
- Update_V2G_Flow_Status(ServiceDiscoveryRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ServiceDiscoveryRequest: //21
- {
- if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ServiceDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceDiscoveryResponse: //22
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
- {
- Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ServiceAndPaymentSelectionRequest: //25
- {
- if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceAndPaymentSelectionResponse: //26
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- Update_V2G_Flow_Status(AuthorizationRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- //case ContractAuthenticationReq:
- case AuthorizationRequest: //29
- {
- if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(AuthorizationResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case AuthorizationResponse: //30
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //Check for ChargeParameterDiscoveryReq
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ChargeParameterDiscoveryRequest: //35
- {
- if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargeParameterDiscoveryResponse:
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
- {
- sprintf(buf_log_evcomm,
- "ChargingParameter Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_ChargingParameter_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 2: Check for CableCheckReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- Update_V2G_Flow_Status(CableCheckRequest);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- //STEP 3: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case CableCheckRequest: //37
- {
- //STEP 3: Execute Cable Check Process
- if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(CableCheckResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CableCheckResponse: //38
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
- sprintf(buf_log_evcomm,
- "CableCheck Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_CableCheck_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- break;
- }
- #endif
- //STEP 2: Check for CableCheckReq message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //STEP 3: Execute Cable Check Process
- if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for PreChargeReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(PreChargeRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- //STEP 3: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PreChargeRequest: //39
- {
- if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PreChargeResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PreChargeResponse: //40
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
- {
- sprintf(buf_log_evcomm,
- "Precharge Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_PreCharge_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 0;
- break;
- }
- #endif
- //STEP 2: Check for PreChargeReq message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for PowerDeliveryReq message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(PowerDeliveryRequestStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStart: //41
- {
- if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponsetStart: //42
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
- {
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- 2000);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- }
- break;
- }
- #endif
- //STEP 2: Wait for CurrentDemandReq Message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(CurrentDemandRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case CurrentDemandRequest: //45,
- {
- if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(CurrentDemandResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CurrentDemandResponse: //46,
- {
- //STEP 1: Wait for CurrentDemandReq Message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 2: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
-
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if((EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_Shutdown) && (EVCOMM_SYS_INFO.DC_EVSEStatus != EVSE_EmergencyShutdown))
- {
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 9;
- ShmStatusCodeData->PresentStatusCode[0][4] = 8;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- }
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStop: //49,
- {
- if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
-
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponseStop: //50,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- 2000);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- //STEP 2: Check for WeldingDetectionReq Message
- if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(WeldingDetectionRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Flow_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case WeldingDetectionRequest: //51,
- {
- if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(WeldingDetectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case WeldingDetectionResponse: //52,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_WeldingDetection_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- //STEP 2: Check for WeldingDetectionReq Message
- if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for SessionStopReq Message
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Flow_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg < PowerDeliveryRequestStop)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= PowerDeliveryRequestStop &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]Receive EV Stop Message(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case SessionStopRequest: //53,
- {
- if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionStopResponse: //54,
- {
- break;
- }
- //-------------------------------------------
- default:
- {
- break;
- }
- }
- }
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Process_iso1_AC
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. V2gFlowStatus
- OUTPUT:
- GLOBAL VARIABLES:
- 1. V2gFlowStatus
- =============================================================================*/
- int V2gMsg_Process_iso1_AC(int AcceptFd)
- {
- unsigned char req_is_responsed = FALSE;
- while (req_is_responsed == FALSE)
- {
- //Check if it is in End_Process
- if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
- {
- break;
- }
- switch(V2gFlowStatus)
- {
- //-------------------------------------------
- case SupportedAppProtocolRequest: //17
- {
- if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
- {
- ccs_handshake.supportedAppProtocolReq_isUsed = 0;
- if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- Update_V2G_Flow_Status(SupportedAppProtocolResponse);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- }
- req_is_responsed = TRUE;
- break;
- }
- case SupportedAppProtocolResponse: //18
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
- {
- Update_V2G_Flow_Status(SessionSetupRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case SessionSetupRequest: //19
- {
- if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionSetupResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionSetupResponse: //20
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
- {
- Update_V2G_Flow_Status(ServiceDiscoveryRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ServiceDiscoveryRequest: //21
- {
- if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ServiceDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceDiscoveryResponse: //22
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
- {
- Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ServiceAndPaymentSelectionRequest: //25
- {
- if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceAndPaymentSelectionResponse://26
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- Update_V2G_Flow_Status(AuthorizationRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- //case ContractAuthenticationReq:
- case AuthorizationRequest: //29
- {
- if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(AuthorizationResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case AuthorizationResponse: //30
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //Check for ChargeParameterDiscoveryReq
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ChargeParameterDiscoveryRequest: //35
- {
- if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargeParameterDiscoveryResponse: //36
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
- {
- sprintf(buf_log_evcomm,
- "ChargingParameter Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_ChargingParameter_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStart);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStart: //41
- {
- if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponsetStart: //42
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- if (ccs_exi_doc_ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
- {
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for ChargingStatusReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- 2000);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- }
- break;
- }
- #endif
- //STEP 2: Wait for ChargingStatusReq Message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(ChargingStatusRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargingStatusReq: energy transfering...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_Start);
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ChargingStatusRequest: //43
- {
- if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ChargingStatusResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargingStatusRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargingStatusResponse: //44
- {
- //STEP 1: Wait for ChargingStatusReq Message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargingStatusRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargingStatusRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 2: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- // EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- break;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStop: //49
- {
- if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponseStop: //50
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- 2000);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- //STEP 3: Check for SessionStopReq Message
- if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Flow_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- if(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress==iso1chargeProgressType_Stop)
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case SessionStopRequest: //53
- {
- if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionStopResponse: //54
- {
- break;
- }
- //-------------------------------------------
- default:
- {
- break;
- }
- }
- }
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Process_iso1
- DESCRIPTION:
- 1. EnergyTransferMode:
- AC_single_phase_core = 0,
- AC_three_phase_core = 1,
- DC_core = 2,
- DC_extended = 3,
- DC_combo_core = 4,
- DC_unique = 5
- iso1EnergyTransferModeType_AC_single_phase_core = 0,
- iso1EnergyTransferModeType_AC_three_phase_core = 1,
- iso1EnergyTransferModeType_DC_core = 2,
- iso1EnergyTransferModeType_DC_extended = 3,
- iso1EnergyTransferModeType_DC_combo_core = 4,
- iso1EnergyTransferModeType_DC_unique = 5
- PRE-CONDITION:
- INPUT:
- 1. V2gFlowStatus
- OUTPUT:
- GLOBAL VARIABLES:
- 1. V2gFlowStatus
- =============================================================================*/
- int V2gMsg_Process_iso1(int AcceptFd, unsigned char EnergyTransferMode)
- {
- switch (EnergyTransferMode)
- {
- case DC_extended:
- {
- V2gMsg_Process_iso1_DC(AcceptFd);
- break;
- }
- case AC_single_phase_core:
- case AC_three_phase_core:
- {
- V2gMsg_Process_iso1_AC(AcceptFd);
- break;
- }
- default:
- {
- sprintf(buf_log_evcomm,
- "[ISO1][Warning]Unexpected EnergyTransferMode(%d)",
- EnergyTransferMode);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
- }
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Process_iso2_DC
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. V2gFlowStatus
- OUTPUT:
- GLOBAL VARIABLES:
- 1. V2gFlowStatus
- =============================================================================*/
- int V2gMsg_Process_iso2_DC(int AcceptFd)
- {
- unsigned char req_is_responsed = FALSE;
- while (req_is_responsed == FALSE)
- {
- //Check if it is in End_Process
- if (EVCOMM_SYS_INFO.End_Process_inused == TRUE)
- {
- break;
- }
- switch(V2gFlowStatus)
- {
- //-------------------------------------------
- case SupportedAppProtocolRequest:
- {
- if (ccs_handshake.supportedAppProtocolReq_isUsed == 1u)
- {
- ccs_handshake.supportedAppProtocolReq_isUsed = 0;
- if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- Update_V2G_Flow_Status(SupportedAppProtocolResponse);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]supportedAppProtocolResReq: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- }
- req_is_responsed = TRUE;
- break;
- }
- case SupportedAppProtocolResponse:
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
- {
- Update_V2G_Flow_Status(SessionSetupRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case SessionSetupRequest: //19
- {
- if (Proc_iso2_SessionSetupReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionSetupResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionSetupReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionSetupResponse: //20
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
- {
- Update_V2G_Flow_Status(ServiceDiscoveryRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- #if 0
- //-------------------------------------------
- case ServiceDiscoveryRequest: //21
- {
- if (Proc_iso2_ServiceDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ServiceDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceDiscoveryResponse: //22
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
- {
- Update_V2G_Flow_Status(ServiceAndPaymentSelectionRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ServiceAndPaymentSelectionRequest: //25
- {
- if (Proc_iso2_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ServiceAndPaymentSelectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ServiceAndPaymentSelectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceAndPaymentSelectionResponse: //26
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- Update_V2G_Flow_Status(AuthorizationRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- //case ContractAuthenticationReq:
- case AuthorizationRequest: //29
- {
- if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(AuthorizationResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case AuthorizationResponse: //30
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]AuthorizationReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //Check for ChargeParameterDiscoveryReq
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(ChargeParameterDiscoveryRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]ChargeParameterDiscoveryReq: CSU Permission?");
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case ChargeParameterDiscoveryRequest: //35
- {
- if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(ChargeParameterDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargeParameterDiscoveryResponse:
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
- {
- sprintf(buf_log_evcomm,
- "ChargingParameter Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_ChargingParameter_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]ChargeParameterDiscoveryReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 2: Check for CableCheckReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(CableCheckRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CableCheckReqReq: isolated?");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- //STEP 3: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case CableCheckRequest: //37
- {
- //STEP 3: Execute Cable Check Process
- if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(CableCheckResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CableCheckResponse: //38
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("[CableCheck] end counting...");
- sprintf(buf_log_evcomm,
- "CableCheck Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_CableCheck_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_V2G_CableCheck_Performance_Time (023847)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 4;
- ShmStatusCodeData->PresentStatusCode[0][5] = 7;
- break;
- }
- #endif
- //STEP 2: Check for CableCheckReq message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //STEP 3: Execute Cable Check Process
- if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CableCheckReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for PreChargeReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(PreChargeRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]PreChargeReqReq: waiting for precharge voltage...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- //STEP 3: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- //ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargeParameterDiscovery_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PreChargeRequest: //39
- {
- if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PreChargeResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PreChargeResponse: //40
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
- {
- sprintf(buf_log_evcomm,
- "Precharge Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_PreCharge_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_V2G_PreCharge_Performace_Time (023850)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 5;
- ShmStatusCodeData->PresentStatusCode[0][5] = 0;
- break;
- }
- #endif
- //STEP 2: Check for PreChargeReq message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PreChargeReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for PowerDeliveryReq message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(PowerDeliveryRequestStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStart: //41
- {
- if (Proc_iso2_PowerDeliveryStartReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponsetStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStartReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponsetStart: //42
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- if (ccs_exi_doc_ISO2.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
- {
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //5 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- 2000);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- }
- break;
- }
- #endif
- //STEP 2: Wait for CurrentDemandReq Message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(CurrentDemandRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]CurrentDemandReqReq: energy transfering...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_Start);
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case CurrentDemandRequest: //45,
- {
- if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(CurrentDemandResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CurrentDemandResponse: //46,
- {
- //STEP 1: Wait for CurrentDemandReq Message
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CurrentDemandRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]CurrentDemandReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 2: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_Flow_Status(PowerDeliveryRequestStop);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CurrentDemand_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStop: //49,
- {
- if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]PowerDeliveryStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponseStop: //50,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > 2000) //2 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- 2000);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- //STEP 2: Check for WeldingDetectionReq Message
- if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Flow_Status(WeldingDetectionRequest);
- SAVE_SYS_LOG_MSG_EVCOMM("[V2G][Rx]WeldingDetectionReq: ongoing...");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqStartTime);
- #endif
- }
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Flow_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case WeldingDetectionRequest: //51,
- {
- if (Proc_iso2_WeldingDetectionReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(WeldingDetectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case WeldingDetectionResponse: //52,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
- {
- sprintf(buf_log_evcomm,
- "Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- V2G_SECC_WeldingDetection_Performance_Time);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- break;
- }
- #endif
- //STEP 2: Check for WeldingDetectionReq Message
- if(EVCOMM_SYS_INFO.V2G_Rx_Msg == WeldingDetectionRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]WeldingDetectionReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- //STEP 3: Check for SessionStopReq Message
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Flow_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_End);
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- sprintf(buf_log_evcomm,
- "[ERROR]SequenceError(%d) => Tx Res MSG",
- EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Flow_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- break;
- }
- //-------------------------------------------
- case SessionStopRequest: //53,
- {
- if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Flow_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[Error]SessionStopReqRes: fail");
- Update_V2G_Flow_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionStopResponse: //54,
- {
- break;
- }
- #endif
- //-------------------------------------------
- default:
- {
- break;
- }
- }
- }
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Process_iso2_AC
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. V2gFlowStatus
- OUTPUT:
- GLOBAL VARIABLES:
- 1. V2gFlowStatus
- =============================================================================*/
- int V2gMsg_Process_iso2_AC(int AcceptFd)
- {
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Process_iso2
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- 1. V2gFlowStatus
- OUTPUT:
- GLOBAL VARIABLES:
- 1. V2gFlowStatus
- =============================================================================*/
- int V2gMsg_Process_iso2(int AcceptFd, unsigned char EnergyTransferMode)
- {
- switch (EnergyTransferMode)
- {
- case DC_extended:
- {
- V2gMsg_Process_iso2_DC(AcceptFd);
- break;
- }
- case AC_single_phase_core:
- case AC_three_phase_core:
- {
- V2gMsg_Process_iso2_AC(AcceptFd);
- break;
- }
- default:
- {
- sprintf(buf_log_evcomm,
- "[ISO2][Warning]Unexpected EnergyTransferMode(%d)",
- EnergyTransferMode);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
- }
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Process
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int V2gMsg_Process(int AcceptFd)
- {
- int errn = 0;
- switch (ShmCcsData->CommProtocol)
- {
- case V2GT_MSG_PROTOCOL_DIN70121: //0
- {
- V2gMsg_Process_din(AcceptFd);
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
- {
- V2gMsg_Process_iso1(AcceptFd, ShmCcsData->EnergyTransferMode);
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
- {
- V2gMsg_Process_iso2(AcceptFd, ShmCcsData->EnergyTransferMode);
- break;
- }
- default:
- {
- sprintf(buf_log_evcomm,
- "[Warning]Unexpected CommProtocol(%d)",
- ShmCcsData->CommProtocol);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- break;
- }
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: V2gMsg_Rx
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int V2gMsg_Rx(int AcceptFd)
- {
- int errn = 0;
- unsigned int packet_size = 0;
- memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- #ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- {
- packet_size = SSL_read(ssl, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE);
- }
- else
- {
- packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
- }
- #else
- packet_size = recv(AcceptFd, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, 0);
- #endif
- //[CAUTION] Everytime recv() is called, it will take a default time to wait for TCP packets.
- //The more time you call recv(), the more time you will waste here.
- //Here it is suggested that response immediatedly once you receive any packets.
- //For configuring the Rx waiting time, please use setsockopt().
- if(packet_size > 0) //[Joseph] If there is no data, ignore. (TBD)
- {
- //DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got TCP V2GTP Message: size = %d Bytes\n", packet_size);
- errn = V2gMsgDecoder(V2gtpMsgRxBuf, packet_size, V2gFlowStatus);
- if (errn < 0)
- {
- sprintf(buf_log_evcomm, "[ERROR]V2gMsgDecoder", errn);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- }
- return errn;
- }
- /*===========================================================================
- FUNCTION: V2gComm
- DESCRIPTION:
- PRE-CONDITION:
- 1. TCP socket is connected.
- INPUT:
- 1. AcceptFd //TCP Connection ID
- 2. V2gtpMsgRxBuf[] //V2GTP Messages (Header + Payload)
- 3. V2GTP_MSG_RX_BUFFER_SIZE //64*1024 = 65,536 = 65.5K (Bytes)
- OUTPUT:
- GLOBAL VARIABLES:
- 1. V2gtpMsgRxBuf[]
- =============================================================================*/
- int V2gComm(int AcceptFd)
- {
- int errn = 0;
- if (V2gMsg_Rx(AcceptFd) < 0)
- {
- Update_V2G_Flow_Status(Other_Fault);
- errn = -1;
- }
- //following are the response message handling according to status flag
- if (V2gMsg_Process(AcceptFd) < 0)
- {
- errn = -1;
- }
- //Error Check
- //V2G_Error_Monitor();
- return errn;
- }
- /*===========================================================================
- FUNCTION: SdpUdpConnected
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int SdpUdpConnected()
- {
- int packet_size,Rtn;
- struct sockaddr_in6 ServerAddr,ClientAddr;
- struct V2gtpHeader *header;
- unsigned char *payload;
- if(UdpSock <= 0)
- {
- if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("SdpUdpConnected: Fail to open UdpSock");
- return 0;
- }
- ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp=UdpSock;
- memset(&ServerAddr,0, sizeof(struct sockaddr_in));
- ServerAddr.sin6_family = AF_INET6;
- ServerAddr.sin6_addr = in6addr_any;
- ServerAddr.sin6_port = htons(SdpUdpServerPort);
- if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
- {
- sprintf(buf_log_evcomm,
- "SdpUdpConnected: Fail to bind UdpSock(%d)",
- UdpSock);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- close(UdpSock);
- UdpSock = -1;
- return 0;
- }
- sprintf(buf_log_evcomm, "[UdpSock]opend:%d", UdpSock);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- sprintf(buf_log_evcomm, "[SDP]Req from EVCC: waiting...(%d)", UdpSock);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
- Rtn = sizeof(struct sockaddr_in6);
- packet_size = recvfrom(UdpSock, V2gtpMsgRxBuf, V2GTP_MSG_RX_BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, &Rtn);
- if(packet_size > 0)
- {
- header = (struct V2gtpHeader *) V2gtpMsgRxBuf;
- payload = V2gtpMsgRxBuf+sizeof(struct V2gtpHeader);
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n Got UDP packet_size = %d (Bytes)\n", packet_size);
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***********************************\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("***** Received SDP Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
- for(Rtn = 0; Rtn < 16; Rtn += 2)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n",ClientAddr.sin6_port);
- DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n",header->ProtocolVersion);
- DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n",header->InverseProtocolVersion);
- DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n",htons(header->PayloadType));
- DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n",htonl(header->PayloadLength));
- DEBUG_PRINTF_EVCOMM_DETAIL("htons(header->PayloadType)=0x%x\n",htons(header->PayloadType));
- }
- #endif
- if( (header->ProtocolVersion == 0x01) &&
- (header->InverseProtocolVersion == 0xFE) &&
- (htons(header->PayloadType) == V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
- {
- sprintf(buf_log_evcomm, "[SDP][Rx]Req from EVCC: GOT(%d)", UdpSock);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", *(payload + 0));
- DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", *(payload + 1));
- #ifdef SUPPORT_TLS_CONNECTION
- EvSecurity= *(payload);
- #endif
-
- header->PayloadType = htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
- header->PayloadLength = htonl(20); //Fixed Length=20
- memset(payload, 0, 20);
- // MAC address[0:2] + FFFE + MAC address[3:5]
- payload[0] = (IPV6_LINK_LOCAL_PREFIX>>8) & 0xFF;
- payload[1] = IPV6_LINK_LOCAL_PREFIX & 0xFF;
- payload[8 ]= CsuMac[0];
- payload[8] ^= 0x02;// bit 1 should complemented.
- payload[9] = CsuMac[1];
- payload[10] = CsuMac[2];
- payload[11] = 0xFF;
- payload[12] = 0xFE;
- payload[13] = CsuMac[3];
- payload[14] = CsuMac[4];
- payload[15] = CsuMac[5];
- //TCP port
- payload[16] = (EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active>>8) & 0xFF;
- payload[17] = EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active & 0xFF;
- #ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- payload[18] = SDP_PAYLOAD_SECURITY_TLS; //Security
- else
- payload[18] = SDP_PAYLOAD_SECURITY_NONE; // No Security
- #else
- payload[18] = SDP_PAYLOAD_SECURITY_NONE; //No Security
- #endif
- payload[19] = SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
- //[To-Do] Setup the TCP in advance to receive the coming TCP handshke messages after SDP response.
- Rtn = sendto(UdpSock, V2gtpMsgRxBuf, sizeof(struct V2gtpHeader) + htonl(header->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
- sprintf(buf_log_evcomm, "[SDP][Tx]Res from SECC");
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\n***** Response SDP Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("Send size=%d\n",Rtn);
- DEBUG_PRINTF_EVCOMM_DETAIL("Destination Address=");
- for(Rtn = 0; Rtn < 16; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x, ", ClientAddr.sin6_addr.s6_addr[Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("Destination Port=%d\n", ClientAddr.sin6_port);
- DEBUG_PRINTF_EVCOMM_DETAIL("ProtocolVersion=%d\n", header->ProtocolVersion);
- DEBUG_PRINTF_EVCOMM_DETAIL("InverseProtocolVersion=0x%x\n", header->InverseProtocolVersion);
- DEBUG_PRINTF_EVCOMM_DETAIL("PayloadType=0x%x\n", htons(header->PayloadType));
- DEBUG_PRINTF_EVCOMM_DETAIL("PayloadLength=0x%x\n", htonl(header->PayloadLength));
- DEBUG_PRINTF_EVCOMM_DETAIL("SECC Ipv6 Address=");
- for(Rtn = 0; Rtn < 16; Rtn++)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x:",payload[Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SECC Port=%d\n", (payload[16]<<8 | payload[17]));
- DEBUG_PRINTF_EVCOMM_DETAIL("Security=0x%x\n", payload[19]);
- DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol=0x%x\n", payload[20]);
- }
- #endif
- if(Rtn >= 28)
- {
- return 1;
- }
- }
- }
- return 0;
- }
- /*===========================================================================
- FUNCTION: V2gTcpConnected
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int V2gTcpConnected()
- {
- int packet_size,Rtn,AcceptFd;
- struct sockaddr_in6 ServerAddr,ClientAddr;
- if(TcpSock <= 0)
- {
- if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) < 0)
- {
- sprintf(buf_log_evcomm,
- "V2gTcpConnected: Fail to open TcpSock (%s)",
- strerror(errno));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- usleep(100000); //100ms
- return 0;
- }
- ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp=TcpSock;
- fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
- SAVE_SYS_LOG_MSG_EVCOMM("[TCP]socket set: DONE");
- memset(&ServerAddr,0, sizeof(struct sockaddr_in));
- ServerAddr.sin6_family = PF_INET6;
- ServerAddr.sin6_addr = in6addr_any;
- ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
- //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 10) + 1);
- //printf("SdpTcpServerPort = %d(DEC)\n", htons(ServerAddr.sin6_port));
- if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
- {
- sprintf(buf_log_evcomm,
- "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
- strerror(errno),
- EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Change to another TCP port
- /*
- memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
- ServerAddr.sin6_family = PF_INET6;
- ServerAddr.sin6_addr = in6addr_any;
- //ServerAddr.sin6_port = htons(SdpTcpServerPort + (rand() % 1000) + 1);
- ServerAddr.sin6_port = htons(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
- */
- if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
- {
- sprintf(buf_log_evcomm,
- "V2gTcpConnected: Fail to bind TcpSock (%s), SdpTcpServerPort = %d",
- strerror(errno),
- EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active
- );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- usleep(100000); //100ms
- close(TcpSock);
- TcpSock = -1;
- return 0;
- }
- }
- SAVE_SYS_LOG_MSG_EVCOMM("[TCP]blid: DONE");
- SAVE_SYS_LOG_MSG_EVCOMM("[TCP]listen: START");
- if(listen(TcpSock, 1) < 0) //only accept one connection
- {
- sprintf(buf_log_evcomm,
- "V2gTcpConnected: Fail to listen TcpSock (%s)",
- strerror(errno));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- usleep(100000); //100ms
- close(TcpSock);
- TcpSock = -1;
- return 0;
- }
- SAVE_SYS_LOG_MSG_EVCOMM("[TCP]listen: DONE");
- sprintf(buf_log_evcomm, "[TCP]TcpSock: opened(%d), port=%d", TcpSock, htons(ServerAddr.sin6_port));
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- SAVE_SYS_LOG_MSG_EVCOMM("[TCP]accept: START");
- }
- Rtn = sizeof(struct sockaddr_in6);
- if((AcceptFd = accept(TcpSock, (struct sockaddr *)&ClientAddr, &Rtn)) < 0 )
- {
- static BOOL tmp = 0;
- if (tmp = 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[TCP]Wait TCP connection...");
- tmp = 1;
- }
- else
- {
- //DEBUG_PRINTF_EVCOMM_DETAIL(".");
- }
- return 0;
- }
- ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed=AcceptFd;
- SAVE_SYS_LOG_MSG_EVCOMM("[TCP]accept: DONE\n");
- #if (DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("\n\nAccept one TCP connection:\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("AcceptFd=%d\n",AcceptFd);
- DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress=");
- for(Rtn = 0; Rtn < 16; Rtn += 2)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("%02x%02x:", ClientAddr.sin6_addr.s6_addr[Rtn], ClientAddr.sin6_addr.s6_addr[Rtn+1]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort=%d\n", ClientAddr.sin6_port);
- }
- #endif
-
- #ifdef SUPPORT_TLS_CONNECTION
- /* TCP connection is ready. Do server side SSL connection. */
- if(EvSecurity == 0)//support security
- {
- ssl = SSL_new(ctx);
- SSL_set_fd(ssl, AcceptFd);
- if (SSL_accept(ssl) <= 0)
- {
- //SAVE_SYS_LOG_MSG_EVCOMM("[SSL]SSL_accept Failed");
- //SSL_free(ssl);
- //close(AcceptFd);
- //AcceptFd = -1;
- return 0;
- }
- }
- #endif
- return AcceptFd;
- }
- /*===========================================================================
- FUNCTION: End_Process
- DESCRIPTION:
- PRE-CONDITION:
- 1. <CAUTION> This function could only be used in SeccComm fork2.
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int End_Process()
- {
- if(EVCOMM_SYS_INFO.End_Process_inused == TRUE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("End_Process has been triggered by another event.");
- return -1;
- }
- SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]entering...");
- //STEP 1: Ask CSU to Stop
- EVCOMM_SYS_INFO.End_Process_inused = TRUE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- EVCOMM_SYS_INFO.ConnectorLocked = FALSE;
- ShmInternalComm->ChargingPermission = FALSE;
- //Step 2: Close sockets
- SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]close sockets...");
- if(RawSock > 0)
- {
- close(RawSock);
- }
- if(UdpSock > 0)
- {
- close(UdpSock);
- }
- if(TcpSock > 0)
- {
- close(TcpSock);
- close(TcpAcceptFd);
- }
- RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
- if(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp > 0)
- {
- close(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp);
- ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp=0;
- }
- if(ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp > 0)
- {
- close(ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp);
- ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp=0;
- }
- if(ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp > 0)
- {
- close(ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp);
- close(ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed);
- ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp=0;
- ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed=0;
- }
- /*#ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- {
- SSL_shutdown(ssl);
- SSL_free (ssl);
- }
- SSL_CTX_free (ctx);
- #endif*/
- //STEP 3: Switch to State E
- //SwitchCpStateE(ENABLE);
- //STEP 4: Close tcpdump
- Sniffer_Tcpdump(DISABLE);
- //STEP 5: Keep 100% PWM for 5 seconds
- OutputCpPwmDuty(100);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 5");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 4");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 3");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 2");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 1");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("PWM 100\% countdown: 0");
- AttenProfileCnt = 0;
- init_appHandEXIDocument(&ccs_handshake);
-
- #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]1st sync...");
- system("sync");
- }
- #endif
- //STEP 4: Switch to State E
- //Keep State E for 5 seconds
- #if 0
- SwitchCpStateE(ENABLE); //Set PWM Duty as 0 and set State as E (0V)
- SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 5");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 4");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 3");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 2");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 1");
- sleep(1);
- SAVE_SYS_LOG_MSG_EVCOMM("State E countdown: 0");
- #endif
- //Reset Memory
- unsigned char SlaveAddress_backup;
- unsigned int matched_backup;
- //unsigned char state_backup;
- SAVE_SYS_LOG_MSG_EVCOMM("[CCS Board]soft reset (closing SeccComm)...");
- SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------");
- SAVE_SYS_LOG_MSG_EVCOMM("-- EVCOMM: END --");
- SAVE_SYS_LOG_MSG_EVCOMM("-----------------------------------------\n");
- #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[End_Process]2nd sync...");
- system("sync");
- }
- #endif
- // system("sleep 1");
- //Backup CsuComm flags
- SlaveAddress_backup = ShmInternalComm->SlaveAddress;
- matched_backup = CSUCOMMDC_TASK_FLAG.matched;
- //state_backup = Check_V2G_Flow_Status();
- memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
- memset(&ccs_handshake, 0, sizeof(struct appHandEXIDocument));
- memset(&ccs_exi_doc_DIN, 0, sizeof(struct dinEXIDocument));
- memset(V2GTP_Tx_buf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
- memset(buf_log_evcomm, 0, sizeof(buf_log_evcomm));
- memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
- memset(ShmInternalComm, 0, sizeof(struct InternalComm));
- memset(ShmCcsData, 0, sizeof(struct CcsData));
- ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.ChargeProgress= 0xFF;
- //Resume CsuComm flags
- ShmInternalComm->SlaveAddress = SlaveAddress_backup;
- CSUCOMMDC_TASK_FLAG.matched = matched_backup;
- Sniffer_Candump(DISABLE);
- Sniffer_Candump(ENABLE);
- //memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo)); //EVCOMM_SYS_INFO.End_Process_inused = FALSE;
- //EVCOMM_SYS_INFO.End_Process_inused = TRUE;
- EVCOMM_SYS_INFO.DC_EVSEStatus=EVSE_NotReady;
- //Update_V2G_Flow_Status(state_backup);
- //CP_Detection_Pid = 0;
- //PP_Detection_Pid = 0;
- //Error_Monitor_Pid = 0;
- /* while(CheckConnectorPlugIn() != TRUE)
- {
- sleep(1);
- }*/
- free(V2gtpMsgRxBuf);
- free(V2gtpMsgTxBuf);
- //DetachShareMemory();
- Qca7kPowerReset(); //reset QCA7000 /* +++ 20200808, vern, should disconnected PLC connection after session stop ---*/
- system("cd /root;./reset_soft.sh");
- while(1)
- {
- //wait for CSU configrm
- }
- }
- /*===========================================================================
- FUNCTION: Parameters_Init
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int Parameters_Init()
- {
- //Step 0: Generate random number
- unsigned int value_random;
- struct timeb time_seed;
- ftime(&time_seed);
- srand(time_seed.millitm);
- //Step 1: Init SDP TCP Port
- value_random = rand();
- EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active = (unsigned short)(SdpTcpServerPort + (value_random % 10000) + 1);
- if((EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active <= 49152)||(EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active >= 65535))//49152-65535
- EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active=59438;
- sprintf(buf_log_evcomm,
- "[Init]TCP Port:OK(%d)",
- EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Step 2: Init SessionID
- value_random = rand();
- memcpy(&EVCOMM_SYS_INFO.SessionID[0], &value_random, 4);
- value_random = rand();
- memcpy(&EVCOMM_SYS_INFO.SessionID[4], &value_random, 4);
- sprintf(buf_log_evcomm,
- "[Init]SessionID:OK(%02X%02X%02X%02X%02X%02X%02X%02X)",
- EVCOMM_SYS_INFO.SessionID[0],
- EVCOMM_SYS_INFO.SessionID[1],
- EVCOMM_SYS_INFO.SessionID[2],
- EVCOMM_SYS_INFO.SessionID[3],
- EVCOMM_SYS_INFO.SessionID[4],
- EVCOMM_SYS_INFO.SessionID[5],
- EVCOMM_SYS_INFO.SessionID[6],
- EVCOMM_SYS_INFO.SessionID[7]);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- }
- #ifdef SUPPORT_TLS_CONNECTION
- SSL_CTX *create_sslcontext()
- {
- const SSL_METHOD *method;
- SSL_CTX *ctx;
-
- // Support only TLSv1.2
- method = TLSv1_2_server_method();
-
- // Create context
- ctx = SSL_CTX_new(method);
- if (!ctx)
- {
- ERR_print_errors_fp(stderr);
- return NULL;
- }
- return ctx;
- }
- int configure_sslcertkey_file(SSL_CTX *ctx)
- {
- SSL_CTX_set_ecdh_auto(ctx, 1);
-
- // Load certificate file
- if (SSL_CTX_use_certificate_file(ctx, "/root/cacert.pem", SSL_FILETYPE_PEM) <= 0)
- {
- ERR_print_errors_fp(stderr);
- return -1;
- }
- // Load private key file
- if (SSL_CTX_use_PrivateKey_file(ctx, "/root/cakey.pem", SSL_FILETYPE_PEM) <= 0 )
- {
- ERR_print_errors_fp(stderr);
- return -1;
- }
- return 0;
- }
- #endif
- /*===========================================================================
- FUNCTION: main
- DESCRIPTION:
- PRE-CONDITION:
- INPUT:
- OUTPUT:
- GLOBAL VARIABLES:
- =============================================================================*/
- int main(int argc, char *argv[])
- {
- unsigned char Rtn;
- //Initialization
- if(ShareMemory_Init()==0)
- {
- system("reboot -f");
- sleep(5);
- system("reboot -f");
- }
- memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
- if(RawSock > 0)
- {
- close(RawSock);
- }
- if(UdpSock > 0)
- {
- close(UdpSock);
- }
- if(TcpSock > 0)
- {
- close(TcpSock);
- }
- RawSock = UdpSock = TcpSock = -1;
- Update_V2G_Flow_Status(IDLE);
- SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------");
- SAVE_SYS_LOG_MSG_EVCOMM("-- EVCOMM: START --");
- SAVE_SYS_LOG_MSG_EVCOMM("---------------------------------------------\n");
-
- //Print Linux Kernel Version
- sprintf(buf_log_evcomm, "\nLinux Image SHA1: %s\n", LINUX_IMAGE_VERSION);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Print Hardware Version
- sprintf(buf_log_evcomm, "HW: %s\n", HARDWARE_VERSION);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- //Print Firmware Version
- sprintf(buf_log_evcomm, "FW: %s\n", FIRMWARE_VERSION);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- SAVE_SYS_LOG_MSG_EVCOMM("init...");
- //Init V2G TCP/IPv6 packets buffer
- V2gtpMsgRxBuf = (unsigned char *)malloc(V2GTP_MSG_RX_BUFFER_SIZE);
- memset(V2gtpMsgRxBuf, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- V2gtpMsgTxBuf = (unsigned char *)malloc(V2GTP_MSG_TX_BUFFER_SIZE);
- memset(V2gtpMsgTxBuf, 0, V2GTP_MSG_TX_BUFFER_SIZE);
- //Release State E Control
- SwitchCpStateE(DISABLE);
- OutputCpPwmDuty(100);
- //start to detect CP pilot state
- CP_Detection_Pid = 0;
- CP_Detection(); //fork1
- SAVE_SYS_LOG_MSG_EVCOMM("[fork1]CP Detection: ON");
- //start to detect errors
- Error_Monitor(); //fork2
- SAVE_SYS_LOG_MSG_EVCOMM("[fork2]Error Monitor: ON");
- //CCS connector type
- sprintf(buf_log_evcomm, "CCS connector type : %s\n", ShmInternalComm->CCSConnectorType > 0? "CCS2":"CCS1" );
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
-
- //start to detect PP
- PP_Detection_Pid = 0;
- #if (PP_PROTECTION_MECHANISM == ENABLE)
- PP_Detection();
- SAVE_SYS_LOG_MSG_EVCOMM("[fork3]PP Detection: ON");
- #else
- SAVE_SYS_LOG_MSG_EVCOMM("[fork3]PP Detection: OFF");
- #endif
- //Init communication parameters
- GetEthMac(QcaInterface, CsuMac);
- AttenProfileCnt = 0;
- init_appHandEXIDocument(&ccs_handshake);
- //Init Energy transfer mode
- //[To-Do] Parsing Model Name
- if(CCS_ENERGY_TRANSFER_MODE<=1)
- {
- if((ShmInternalComm->AC_EVSEModelName[2]=='Y') || (ShmInternalComm->AC_EVSEModelName[2]=='D') || (ShmInternalComm->AC_EVSEModelName[2]=='W'))
- //if(ShmSysConfigAndInfo->SysConfig.AcPhaseCount==3)
- ShmCcsData->EnergyTransferMode = MODE_AC_THREE_PHASE_CORE;
- else
- ShmCcsData->EnergyTransferMode = MODE_AC_SINGLE_PHASE_CORE;
- }
- else
- ShmCcsData->EnergyTransferMode = CCS_ENERGY_TRANSFER_MODE;
-
-
- struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- Parameters_Init();
- Sniffer_Tcpdump(ENABLE);
- #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
- sleep(1); //wait for tcpdump getting ready
- #endif
-
- #ifdef SUPPORT_TLS_CONNECTION
- // SSL init
- //SSL_free (ssl);
- //SSL_CTX_free (ctx);
- SSL_load_error_strings();
- OpenSSL_add_ssl_algorithms();
- // Create SSL_CTX
- ctx = create_sslcontext();
- if (ctx == NULL)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[SSL]create_sslcontext Failed");
- }
- else
- SAVE_SYS_LOG_MSG_EVCOMM("[SSL]create_sslcontext OK");
- // Configure cert and key
- if (configure_sslcertkey_file(ctx) < 0)
- {
- SAVE_SYS_LOG_MSG_EVCOMM("[SSL]configure_sslcertkey_file Failed");
- }
- else
- SAVE_SYS_LOG_MSG_EVCOMM("[SSL]configure_sslcertkey_file OK");
- #endif
-
- SAVE_SYS_LOG_MSG_EVCOMM("[Init]DONE");
- while(1)
- {
- //DEBUG_PRINTF_EVCOMM_DETAIL("\nV2gFlowStatus = %d\n", V2gFlowStatus);
- //if((ShmInternalComm->ChargingPermission == 0x01) && (CheckConnectorPlugIn() == 1))
- //if((CheckConnectorPlugIn() == TRUE) && (ShmInternalComm->ChargingPermission == TRUE))
- //if(ShmInternalComm->ChargingPermission == 0x01)
- //if(CheckConnectorPlugIn() == TRUE)
- if (EVCOMM_SYS_INFO.End_Process_inused == FALSE)
- {
- if(V2gFlowStatus < SLACC_SDP_UDP_Connection)
- {
- SlacComm();
- }
- else if(V2gFlowStatus == SLACC_SDP_UDP_Connection)
- {
- if(SdpUdpConnected() == 1)
- {
- Update_V2G_Flow_Status(SLACC_SDP_TCP_Connection);
- continue;
- }
- SlacComm(); //TC_SECC_VTB_CmSlacMatch_004
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
- {
- sprintf(buf_log_evcomm,
- "Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join (%.02lf of %d ms)\n",
- DiffTimeb(SeqStartTime, SeqEndTime),
- TT_match_join);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_SLACC_SDP_UDP_TT_match_join (023823)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 2;
- ShmStatusCodeData->PresentStatusCode[0][5] = 3;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
- }
- }
- else if(V2gFlowStatus == SLACC_SDP_TCP_Connection)
- {
- if((TcpAcceptFd = V2gTcpConnected()) > 0)
- {
- Update_V2G_Flow_Status(SupportedAppProtocolRequest);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- continue;
- }
- SlacComm();
- ftime(&SeqEndTime);
- if(DiffTimeb(SeqStartTime, SeqEndTime) > TT_match_join)
- {
- sprintf(buf_log_evcomm,
- "Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join (%.02lf / %d ms)",
- DiffTimeb(SeqStartTime, SeqEndTime),
- TT_match_join);
- SAVE_SYS_LOG_MSG_EVCOMM(buf_log_evcomm);
- Update_V2G_Flow_Status(Sequence_Timeout);
- //Update_ShmStatusCode(); //[To-Do] to be implemented
- //CCS_SECC_TIMEOUT_SLACC_SDP_TCP_TT_match_join (023824)
- ShmStatusCodeData->PresentStatusCode[0][0] = 0;
- ShmStatusCodeData->PresentStatusCode[0][1] = 2;
- ShmStatusCodeData->PresentStatusCode[0][2] = 3;
- ShmStatusCodeData->PresentStatusCode[0][3] = 8;
- ShmStatusCodeData->PresentStatusCode[0][4] = 2;
- ShmStatusCodeData->PresentStatusCode[0][5] = 4;
- CSUCOMMDC_TASK_FLAG.EV_Stop_Type_Emergency = TRUE;
- Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
- }
- }
- else if(V2gFlowStatus <= SessionStopResponse)
- {
- if (V2gComm(TcpAcceptFd) < 0)
- {
- //error occours
- }
- if(V2gFlowStatus == SessionStopResponse)
- {
- if(RawSock > 0)
- {
- close(RawSock);
- }
- if(UdpSock > 0)
- {
- close(UdpSock);
- }
- if(TcpSock > 0)
- {
- close(TcpSock);
- close(TcpAcceptFd);
- }
- RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
- #ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- {
- SSL_shutdown(ssl);
- SSL_free (ssl);
- }
- SSL_CTX_free (ctx);
- #endif
- }
- }
- else if (V2gFlowStatus >= Performance_Timeout)
- {
- //End_Process
- if(RawSock > 0)
- {
- close(RawSock);
- }
- if(UdpSock > 0)
- {
- close(UdpSock);
- }
- if(TcpSock > 0)
- {
- close(TcpSock);
- close(TcpAcceptFd);
- }
- RawSock = UdpSock = TcpSock = TcpAcceptFd = -1;
- #ifdef SUPPORT_TLS_CONNECTION
- if(EvSecurity == 0)//support security
- {
- SSL_shutdown(ssl);
- SSL_free (ssl);
- }
- SSL_CTX_free (ctx);
- #endif
- }
- else
- {
- //null
- }
- }
- // printf("V2gFlowStatus=%d, socket=%d,%d,%d\n",V2gFlowStatus,RawSock,UdpSock,TcpSock);
- } //while
- }//main while
|