1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549 |
- /*
- * Module_CCS.c
- *
- * Created on: 2020/03/16
- * Author: foluswen
- */
- #include "Module_CCS.h"
- #include "define_ccs.h"
- #include "main.h"
- enum MsgFlowStatus V2gFlowStatus;
- struct SysConfigAndInfo *ShmSysConfigAndInfo;
- struct StatusCodeData *ShmStatusCodeData;
- struct CcsData *ShmCcsData;
- struct InternalComm *ShmInternalComm;
- struct Charger *ShmCharger;
- struct V2G_OBJECT
- {
- struct appHandEXIDocument appHandshake;
- struct dinEXIDocument DIN;
- struct iso1EXIDocument ISO1;
- struct iso2EXIDocument ISO2;
- }v2gObject;
- struct V2G_BUFFER
- {
- unsigned char rx[V2GTP_MSG_RX_BUFFER_SIZE];
- unsigned char tx[V2GTP_MSG_TX_BUFFER_SIZE];
- }v2gBuffer;
- struct SOCKET_HANDLE
- {
- int Raw;
- int Udp;
- int Tcp;
- int TcpAccept;
- }socketFd;
- struct PID_T
- {
- pid_t CP_Detection;
- pid_t PP_Detection;
- pid_t Error_Monitor;
- }pid;
- struct MAC
- {
- unsigned char eth0[6];
- unsigned char eth1[6];
- unsigned char qca[6];
- unsigned char evcc[6];
- }macAddr;
- struct QCA_INFO
- {
- struct MmeHeader SendMmePacket;
- struct sockaddr_ll DestSocketAddress;
- int SendMmePacketSize;
- unsigned char SlacRunId[8];
- struct ifreq Req;
- unsigned char AagGroupsNum;
- unsigned char MnbcSoundNum;
- unsigned char AttenProfileCnt;
- unsigned char NewNmkKey[16];
- unsigned char Nid[7];
- }qcaInfo;
- struct TIMER
- {
- unsigned int PwmStart;
- struct timeb SeqStart;
- struct timeb SeqEnd;
- }timerStart;
- /**
- *
- * @param statusCode
- * @param statusName
- * @return
- */
- uint8_t get_V2G_Status_Name(uint8_t statusCode, char *statusName)
- {
- int result = PASS;
- switch(statusCode)
- {
- case IDLE:
- sprintf(statusName, "IDLE");
- break;
- case CM_SLAC_PARM_REQ:
- sprintf(statusName, "CM_SLAC_PARM_REQ");
- break;
- case CM_SLAC_PARM_CONF:
- sprintf(statusName, "CM_SLAC_PARM_CONF");
- break;
- case CM_START_ATTEN_CHAR_IND:
- sprintf(statusName, "CM_START_ATTEN_CHAR_IND");
- break;
- case CM_MNBC_SOUND_IND:
- sprintf(statusName, "CM_MNBC_SOUND_IND");
- break;
- case CM_ATTEN_CHAR_IND:
- sprintf(statusName, "CM_ATTEN_CHAR_IND");
- break;
- case CM_ATTEN_CHAR_RSP:
- sprintf(statusName, "CM_ATTEN_CHAR_RSP");
- break;
- case CM_VALIDATE_REQ:
- sprintf(statusName, "CM_VALIDATE_REQ");
- break;
- case CM_VALIDATE_CNF:
- sprintf(statusName, "CM_VALIDATE_CNF");
- break;
- case CM_SLAC_MATCH_REQ:
- sprintf(statusName, "CM_SLAC_MATCH_REQ");
- break;
- case CM_SLAC_MATCH_CNF:
- sprintf(statusName, "CM_SLAC_MATCH_CNF");
- break;
- case CM_AMP_MAP_REQ:
- sprintf(statusName, "CM_AMP_MAP_REQ");
- break;
- case CM_AMP_MAP_CNF:
- sprintf(statusName, "CM_AMP_MAP_CNF");
- break;
- case CM_SET_KEY_REQ:
- sprintf(statusName, "CM_SET_KEY_REQ");
- break;
- case CM_SET_KEY_CNF:
- sprintf(statusName, "CM_SET_KEY_CNF");
- break;
- case SLACC_SDP_UDP_Connection:
- sprintf(statusName, "SLACC_SDP_UDP_Connection");
- break;
- case SLACC_SDP_TCP_Connection:
- sprintf(statusName, "SLACC_SDP_TCP_Connection");
- break;
- case SupportedAppProtocolRequest:
- sprintf(statusName, "SupportedAppProtocolReq");
- break;
- case SupportedAppProtocolResponse:
- sprintf(statusName, "SupportedAppProtocolRes");
- break;
- case SessionSetupRequest:
- sprintf(statusName, "SessionSetupReq");
- break;
- case SessionSetupResponse:
- sprintf(statusName, "UnSessionSetupResknown");
- break;
- case ServiceDiscoveryRequest:
- sprintf(statusName, "ServiceDiscoveryReq");
- break;
- case ServiceDiscoveryResponse:
- sprintf(statusName, "ServiceDiscoveryRes");
- break;
- case ServiceDetailRequest:
- sprintf(statusName, "ServiceDetailReq");
- break;
- case ServiceDetailResponse:
- sprintf(statusName, "ServiceDetailRes");
- break;
- case ServiceAndPaymentSelectionRequest:
- sprintf(statusName, "ServiceAndPaymentSelectionReq");
- break;
- case ServiceAndPaymentSelectionResponse:
- sprintf(statusName, "ServiceAndPaymentSelectionRes");
- break;
- case PaymentDetailsRequest:
- sprintf(statusName, "PaymentDetailsReq");
- break;
- case PaymentDetailsResponse:
- sprintf(statusName, "PaymentDetailsRes");
- break;
- case AuthorizationRequest:
- sprintf(statusName, "AuthorizationReq");
- break;
- case AuthorizationResponse:
- sprintf(statusName, "AuthorizationRes");
- break;
- case CertificateUpdateRequest:
- sprintf(statusName, "CertificateUpdateReq");
- break;
- case CertificateUpdateResponse:
- sprintf(statusName, "CertificateUpdateRes");
- break;
- case CertificateInstallationRequest:
- sprintf(statusName, "CertificateInstallationReq");
- break;
- case CertificateInstallationResponse:
- sprintf(statusName, "CertificateInstallationRes");
- break;
- case ChargeParameterDiscoveryRequest:
- sprintf(statusName, "ChargeParameterDiscoveryReq");
- break;
- case ChargeParameterDiscoveryResponse:
- sprintf(statusName, "ChargeParameterDiscoveryRes");
- break;
- case CableCheckRequest:
- sprintf(statusName, "CableCheckReq");
- break;
- case CableCheckResponse:
- sprintf(statusName, "CableCheckRes");
- break;
- case PreChargeRequest:
- sprintf(statusName, "PreChargeReq");
- break;
- case PreChargeResponse:
- sprintf(statusName, "PreChargeRes");
- break;
- case PowerDeliveryRequestStart:
- sprintf(statusName, "PowerDeliveryReqStart");
- break;
- case PowerDeliveryResponsetStart:
- sprintf(statusName, "PowerDeliveryResStart");
- break;
- case ChargingStatusRequest:
- sprintf(statusName, "ChargingStatusReq");
- break;
- case ChargingStatusResponse:
- sprintf(statusName, "ChargingStatusRes");
- break;
- case CurrentDemandRequest:
- sprintf(statusName, "CurrentDemandReq");
- break;
- case CurrentDemandResponse:
- sprintf(statusName, "CurrentDemandRes");
- break;
- case MeteringReceiptRequest:
- sprintf(statusName, "MeteringReceiptReq");
- break;
- case MeteringReceiptResponse:
- sprintf(statusName, "MeteringReceiptRes");
- break;
- case PowerDeliveryRequestStop:
- sprintf(statusName, "PowerDeliveryReqStop");
- break;
- case PowerDeliveryResponseStop:
- sprintf(statusName, "PowerDeliveryResStop");
- break;
- case WeldingDetectionRequest:
- sprintf(statusName, "WeldingDetectionReq");
- break;
- case WeldingDetectionResponse:
- sprintf(statusName, "WeldingDetectionRes");
- break;
- case SessionStopRequest:
- sprintf(statusName, "SessionStopReq");
- break;
- case SessionStopResponse:
- sprintf(statusName, "SessionStopRes");
- break;
- case Performance_Timeout:
- sprintf(statusName, "Performance_Timeout");
- break;
- case Sequence_Timeout:
- sprintf(statusName, "Sequence_Timeout");
- break;
- case Other_Fault:
- sprintf(statusName, "Other_Fault");
- break;
- default:
- sprintf(statusName, "Unknown");
- result = FAIL;
- break;
- }
- return result;
- }
- /**
- *
- * @return
- */
- unsigned char Get_V2G_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;
- }
- /**
- *
- * @return
- */
- unsigned char Get_V2G_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;
- }
- /**
- *
- * @param Fd
- * @param MsgId
- * @param SlaveAddress
- * @param DataLength
- * @param SendData
- * @return
- */
- int CAN_Tx_MSG(int Fd, unsigned int MsgId, unsigned char SlaveAddress, unsigned char DataLength, unsigned char *SendData)
- {
- #if 0
- 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));
- return nbytes;
- #else
- return -1;
- #endif
- }
- /**
- *
- * @param Fd
- * @return
- */
- 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
- }
- 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
- DEBUG_INFO("Sending STOP Command to CSU\n");
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = FALSE;
- return nbytes;
- }
- /**
- *
- * @param cmd
- * @return
- */
- int Sniffer_Candump(char cmd)
- {
- #if (CANDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
- if (cmd == ENABLE)
- {
- DEBUG_INFO("Candump init\n");
- system("cd /mnt/;rm -rf candump/");
- system("cd /mnt/;mkdir candump");
- DEBUG_INFO("Candump on\n");
- system("cd /mnt/candump;candump -l can0 &");
- return 0;
- }
- else if (cmd == DISABLE)
- {
- DEBUG_INFO("Candump off\n");
- system("killall candump");
- DEBUG_INFO("Candump save\n");
- system("cd /;cp -rfv /mnt/candump /Storage/SystemLog/");
- return 0;
- }
- else
- {
- DEBUG_INFO("Candump unexpected cmd(%d)\n", cmd);
- return -1;
- }
- #endif
- return 0;
- }
- /**
- *
- * @param cmd
- * @return
- */
- int Sniffer_Tcpdump(char cmd)
- {
- #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
- if (cmd == ENABLE)
- {
- DEBUG_INFO("Tcpdump init...\n");
- system("cd /mnt/;rm -rf tcpdump/");
- system("cd /mnt/;mkdir tcpdump");
- unsigned char cmdBuf[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((char*)cmdBuf,
- "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
- );
- DEBUG_INFO("Tcpdump on\n");
- system(cmdBuf);
- return 0;
- }
- else if (cmd == DISABLE)
- {
- DEBUG_INFO("Tcpdump off\n");
- system("killall tcpdump");
- for(int idx=2;idx>0;idx--)
- {
- DEBUG_INFO("Tcpdump wait: %ds\n", idx);
- sleep(1);
- }
- DEBUG_INFO("Tcpdump save\n");
- system("cd /;cp -rfv /mnt/tcpdump /Storage/SystemLog/");
- return 0;
- }
- else
- {
- DEBUG_INFO("Tcpdump unexpected cmd(%d)\n", cmd);
- return -1;
- }
- #endif
- return 0;
- }
- /**
- *
- * @param state_new
- * @return
- */
- int Update_V2G_Status(unsigned int state_new)
- {
- unsigned char state_now;
- char nameNow[64], nameNew[64];
- state_now = Get_V2G_Status();
- get_V2G_Status_Name(state_now, nameNow);
- get_V2G_Status_Name(state_new, nameNew);
- 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
- {
- DEBUG_WARN("state-%s(%d) change: ignored (End_Process_inused:%d, FW_Update_Task_inused:%d)\n",
- nameNew, state_new,
- EVCOMM_SYS_INFO.End_Process_inused,
- CSUCOMMDC_TASK_FLAG.FW_Update_Task_inused);
- 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;
- DEBUG_WARN("state-%s(%d) change: ignored(now in error state-%s(%d))\n", nameNow, state_new, nameNew, state_now);
- }
- return -1;
- }
- }
- //Updating the state formally.
- DEBUG_INFO("%s(%02d) > %s(%02d)\n", nameNow, state_now, nameNew, state_new);
- 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;
- }
- }
- return 0;
- }
- /**
- *
- * @param ST
- * @param ET
- * @return
- */
- 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)
- {
- return -1;
- }
- return t_diff;
- }
- /**
- *
- * @param ST
- * @param ET
- * @return
- */
- 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)
- {
- return -1;
- }
- return t_diff;
- }
- /**
- *
- * @param ST
- * @param ET
- * @return
- */
- 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)
- {
- return -1;
- }
- return t_diff;
- }
- /**
- *
- * @return
- */
- int ShareMemory_Init()
- {
- int MeterSMId;
- //create ShmSysConfigAndInfo
- if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("ShareMemory_Init:shmget ShmSysConfigAndInfo NG\n");
- return 0;
- }
- else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("ShareMemory_Init:shmat ShmSysConfigAndInfo NG\n");
- return 0;
- }
- //create ShmStatusCodeData
- if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("ShareMemory_Init:shmget ShmStatusCodeData NG\n");
- return 0;
- }
- else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("ShareMemory_Init:shmat ShmStatusCodeData NG\n");
- return 0;
- }
- //create ShmCcsData
- if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("ShareMemory_Init:shmget ShmCcsData NG\n");
- return 0;
- }
- else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("ShareMemory_Init:shmat ShmCcsData NG\n");
- return 0;
- }
- //create ShmInternalComm
- if ((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), IPC_CREAT | 0777)) < 0)
- {
- DEBUG_ERROR("ShareMemory_Init:shmget ShmInternalComm NG\n");
- return 0;
- }
- else if ((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("ShareMemory_Init:shmat ShmInternalComm NG\n");
- return 0;
- }
- //Initial ShmCharger
- if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0)
- {
- DEBUG_ERROR("shmget ShmChargerKey NG\n");
- return 0;
- }
- else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
- {
- DEBUG_ERROR("shmat ShmChargerKey NG\n");
- return 0;
- }
- //[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;
- }
- /**
- * 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.
- * @param Eth
- * @param mac
- * @return
- */
- int GetEthMac(unsigned char *Eth, unsigned char *mac)
- {
- //Parameters:MAC,IP,Mask,Gateway
- int fd;
- unsigned char addr[18], Buffer[128];
- memset(Buffer, 0, sizeof(Buffer));
- sprintf((char*)Buffer, "cat /sys/class/net/%s/address > /mnt/GetEthInfo", Eth); //CsuMac (Eth = eth1)
- system((char*)Buffer);
- fd = open("/mnt/GetEthInfo", O_RDONLY);
- if(fd < 0)
- {
- system("rm -f /mnt/GetEthInfo");
- DEBUG_ERROR("GetEthMac: MAC Address open error\n");
- return 0;
- }
- memset(mac, 0, 6);
- memset(addr, 0, sizeof(addr));
- read(fd, addr, 17);
- close(fd);
- system("rm -f /mnt/GetEthInfo");
- sscanf((char*)addr, "%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t *)&mac[0], (uint32_t *)&mac[1], (uint32_t *)&mac[2], (uint32_t *)&mac[3], (uint32_t *)&mac[4], (uint32_t *)&mac[5]); //CsuMac (Eth = eth1)
- DEBUG_INFO("EVSE MAC address(%s): %02X:%02X:%02X:%02X:%02X:%02X\n", Eth, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
- return 1;
- }
- /**
- *
- * @param AdcChannel
- * @return
- */
- float ReadAdcVolt(unsigned char AdcChannel)
- {
- //AIN0=CCS GUN Temp 1
- //AIN1=CCS GUN Temp 2
- //AIN2=CCS_Proximity/2
- //AIN3=pilot voltage
- #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
- return 0;
- #else
- 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 < 40) //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((char*)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((char*)str, "cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw", AdcChannel);
- fp=popen((char*)str, "r");
- if(fgets((char*)AdcValue,sizeof(AdcValue),fp) == NULL)
- {
- pclose(fp);
- return -1;
- }
- pclose(fp);
- //Vin = Vref *D / (2^n - 1)
- return ((float)1.8*(float)atoi((char*)AdcValue))/4095;
- }
- #endif
- }
- /**
- *
- * @return
- */
- float ReadAdcVolt_PP_fork3()
- {
- #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
- return 0;
- #else
- 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((char*)SampleBuf);
- lseek(fd, 0, SEEK_SET);
- AvgSample += TmpVolt;
- }
- close(fd);
- AvgSample /= AvgTimes;
- V_pp = (3.6*AvgSample)/4095; //PP
- usleep(20000); //20ms
- return V_pp;
- }
- else
- {
- return -1;
- }
- #endif
- }
- /**
- *
- */
- void Qca7kPowerReset()
- {
- DEBUG_INFO("QCA7000 reset...\n");
- system("ifconfig eth1 down");
- usleep(500000);
- system("echo 0 > /sys/class/gpio/gpio115/value");
- usleep(500000);
- system("echo 1 > /sys/class/gpio/gpio115/value");
- usleep(500000);
- system("ifconfig eth1 up");
- usleep(500000);
- }
- /**
- *
- * @param OnOff
- * @return
- */
- int SwitchCpStateE(unsigned char OnOff)
- {
- /*
- * TODO: Request CP change to state E
- */
- 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)
- {
- //DEBUG_INFO("SwitchCpStateE: released\n");
- CSUCOMMAC_SHM.CpSetStateE = DISABLE;
- }
- else
- {
- OutputCpPwmDuty(100); //set CP duty as 100, firstly.
- CSUCOMMAC_SHM.CpSetStateE = ENABLE;
- //DEBUG_INFO("SwitchCpStateE: enabled!\n");
- }
- }
- #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
- {
- if(OnOff == DISABLE)
- {
- //DEBUG_INFO("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");
- //DEBUG_INFO("SwitchCpStateE: enabled!\n");
- }
- }
- #endif
- if (ccs->SwitchCpStateE_status_pre != ccs->SwitchCpStateE_status)
- {
- DEBUG_INFO("SwitchCpStateE: %d >> %d\n",
- ccs->SwitchCpStateE_status_pre,
- ccs->SwitchCpStateE_status);
- ccs->SwitchCpStateE_status_pre = ccs->SwitchCpStateE_status;
- }
- return 0;
- }
- /**
- *
- * @param Duty
- * @return
- */
- int OutputCpPwmDuty(unsigned char Duty)
- {
- #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
- char cmdBuf[1024];
- int DutyInNanoSec;
- #endif
- 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((char*)cmdBuf, "echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle", DutyInNanoSec);//nanoseconds
- system((char*)cmdBuf);
- }
- #endif
- ccs->CpDuty = Duty;
- //CP Duty
- if (ccs->CpDuty != ccs->CpDuty_pre)
- {
- DEBUG_INFO("CP Duty: %d%% >> %d%%\n", ccs->CpDuty_pre, ccs->CpDuty);
- ccs->CpDuty_pre = ccs->CpDuty;
- }
- return 0;
- }
- /**
- *
- * @param ccs
- */
- //#if DEBUG_INFO_SWITCH == ENABLE
- void Check_Plugin_Status_Update(struct ChargingInfoData *ccs)
- {
- if (ccs->ConnectorPlugIn != ccs->ConnectorPlugIn_new)
- {
- DEBUG_INFO("[fork1]Plugin: %d >> %d (CP=%.2fV, PP=%.2fV)\n",
- ccs->ConnectorPlugIn,
- ccs->ConnectorPlugIn_new,
- ccs->CpVoltage,
- ccs->PpVoltage);
- ccs->ConnectorPlugIn_pre = ccs->ConnectorPlugIn;
- ccs->ConnectorPlugIn = ccs->ConnectorPlugIn_new;
- //ccs->CpVoltage_pre = ccs->CpVoltage;
- }
- }
- //#endif
- /**
- *
- * @return
- */
- int CheckConnectorPlugIn()
- {
- /*
- * TODO: Return connector status depedon CP
- */
- static struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- #if (CP_PROTECTION_MECHANISM == ENABLE)
- return (int)ccs->ConnectorPlugIn;
- #else
- return TRUE;
- #endif
- }
- /**
- *
- * @param ccs
- * @return
- */
- int Check_CP_State_Error(struct ChargingInfoData *ccs)
- {
- #if (CP_PROTECTION_MECHANISM == DISABLE)
- {
- return -1;
- }
- #endif
- unsigned char state = 0;
- #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
- double time_diff = 0;
- #endif
- state = Get_V2G_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)
- {
- #ifdef TEST_WITH_ETH0
- if((ShmCcsData->EnergyTransferMode == MODE_DC_EXTENDED) && ((ccs->CpState != 2) && (ccs->CpState != 3)))
- #else
- if((ccs->CpState != 2) && (ccs->CpState != 3))
- #endif
- {
- if (ccs->CpState_err == FALSE)
- {
- DEBUG_ERROR("[fork1][CP]before CPD\n"); //CPD: ChargeParameterDiscoveryRequest
- //CPD: ChargeParameterDiscovery
- }
- ccs->CpState_err = TRUE;
- }
- }
- #else
- {
- if(ccs->CpState != 3)
- {
- if (ccs->CpState_err == FALSE)
- {
- DEBUG_ERROR("[fork1][CP]]before CPD\n"); //CPD: ChargeParameterDiscoveryRequest
- //CPD: ChargeParameterDiscovery
- }
- ccs->CpState_err = TRUE;
- }
- }
- #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
- {
- #ifdef TEST_WITH_ETH0
- if((ccs->CpState != 3) && ((ShmCcsData->EnergyTransferMode != MODE_DC_EXTENDED) && (ccs->CpState != 4)))
- #else
- if(ccs->CpState != 3)
- #endif
- {
- if (ccs->CpState_err == FALSE)
- {
- DEBUG_ERROR("[fork1][CP]]CPD\n");
- //PRC: Precharge
- //CUD: CurrentDemand
- }
- ccs->CpState_err = TRUE;
- }
- }
- //ChargingStatus
- if(state >= ChargingStatusRequest && //43
- state <= ChargingStatusResponse) //44
- {
- if((ccs->CpState != 3) && (ccs->CpState != 4) && (ccs->CpState != 5))
- {
- if (ccs->CpState_err == FALSE)
- {
- DEBUG_ERROR("[fork1][CP]CGS\n");
- //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
- {
- DEBUG_INFO("[fork1][CP]check C(4),D(5): ON (%.02lf of %dms)\n", time_diff, V2G_SECC_CP_Timeout_CableCheck);
- ccs->CableCheckPreCountDownDone = TRUE;
- }
- }
- if(ccs->CableCheckPreCountDownDone == TRUE)
- {
- if(ccs->CpState != 4 && ccs->CpState != 5)
- {
- if (ccs->CpState_err == FALSE)
- {
- DEBUG_ERROR("[fork1][CP]]CPD and CCK (after CNT)\n");
- //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)
- {
- DEBUG_ERROR("[fork1][CP]CPD and CCK (before CNT)\n");
- //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_err == FALSE)
- {
- DEBUG_ERROR("[fork1][CP]PRC and CUD\n");
- //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);
- DEBUG_ERROR("[fork1]CP(%d) Error in state %d(%d)\n", ccs->CpState, state, ccs->CableCheckPreCountDownDone);
- ccs->CpState_err_logged = TRUE;
- }
- return 0;
- }
- /**
- *
- * @param ccs
- */
- void Check_CP_State_Update(struct ChargingInfoData *ccs)
- {
- //CP State
- if (ccs->CpState != ccs->CpState_pre)
- {
- DEBUG_INFO("[fork1]CP State: %d >> %d (%.2fV)\n",
- ccs->CpState_pre,
- ccs->CpState,
- ccs->CpVoltage);
- ccs->CpState_pre = ccs->CpState;
- }
- }
- /**
- *
- */
- void CP_Detection()
- {
- pid_t tmp = 0;
- #if ((CCS_ENERGY_TRANSFER_MODE != MODE_AC_SINGLE_PHASE_CORE) && (CCS_ENERGY_TRANSFER_MODE != MODE_AC_THREE_PHASE_CORE))
- unsigned char Statetmp;
- float TotalTmpVolt;
- #endif
- struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- if(pid.CP_Detection == 0)
- {
- tmp = fork();
- if(tmp > 0)
- {
- pid.CP_Detection = tmp;
- #if 1
- unsigned char buf[64];
- memset(buf, 0, sizeof(buf));
- //sprintf((char*)buf, "renice -20 -p %d", tmp);
- sprintf((char*)buf, "renice -10 -p %d", tmp);
- system((char*)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))
- {
- ccs->CpVoltage = ShmInternalComm->AC_CpPositiveVoltage;
- ccs->CpState = ShmInternalComm->AC_CpPresentState;
- }
- #else //CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED
- {
- 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(ccs);
- Check_CP_State_Error(ccs);
- //Updating Plugin status
- #if (PP_PROTECTION_MECHANISM == ENABLE)
- if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ) && (ccs->PpVoltage >= 1.0)) //PP >= 1.0V
- #else
- if((ccs->CpState >= 2 ) && (ccs->CpState <= 5 ))
- #endif
- {
- ccs->ConnectorPlugIn_new = TRUE;
- }
- else
- {
- ccs->ConnectorPlugIn_new = FALSE;
- OutputCpPwmDuty(100);
- }
- Check_Plugin_Status_Update(ccs);
- usleep(1000);
- }//while
- }
- /**
- * 1. In order to detect CP in efficient response time, we create an independent
- * thread for this procedure.
- 2. The priority of this thread is set as the same as other tasks.
- */
- void PP_Detection()
- {
- pid_t tmp = 0;
- // struct timeb StartTime, EndTime;
- #if ((CCS_ENERGY_TRANSFER_MODE == MODE_DC_EXTENDED))
- //unsigned char Statetmp;
- #endif
- float TotalTmpVolt;
- if(pid.PP_Detection == 0)
- {
- tmp = fork();
- if(tmp > 0)
- {
- pid.PP_Detection = tmp;
- #if 0
- unsigned char buf[64];
- memset(buf, 0, sizeof(buf));
- sprintf((char*)buf, "renice -20 -p %d", tmp);
- system(buf);
- #endif
- return;
- }
- }
- while(1)
- {
- TotalTmpVolt = ReadAdcVolt_PP_fork3();
- EVCOMM_SYS_INFO.PpVoltage = TotalTmpVolt;
- if (EVCOMM_SYS_INFO.PpVoltage_pre != EVCOMM_SYS_INFO.PpVoltage)
- {
- if ((EVCOMM_SYS_INFO.PpVoltage_pre < 0.5 && EVCOMM_SYS_INFO.PpVoltage >= 1.0) ||
- (EVCOMM_SYS_INFO.PpVoltage_pre >= 1.0 && EVCOMM_SYS_INFO.PpVoltage < 0.5))
- {
- DEBUG_INFO("[fork3]PP(%.2f >> %.2fV)\n", EVCOMM_SYS_INFO.PpVoltage_pre, EVCOMM_SYS_INFO.PpVoltage);
- EVCOMM_SYS_INFO.PpVoltage_pre = EVCOMM_SYS_INFO.PpVoltage;
- }
- }
- usleep(1000);
- }//while
- }
- /**
- *
- */
- void Error_Monitor()
- {
- pid_t tmp = 0;
- double time_diff = 0;
- unsigned char status = 0;
- struct ChargingInfoData *ccs;
- ccs = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- if(pid.Error_Monitor == 0)
- {
- tmp = fork(); //SeccComm fork2
- if(tmp > 0)
- {
- pid.Error_Monitor = tmp;
- #if 0
- unsigned char buf[64];
- memset(buf, 0, sizeof(buf));
- sprintf((char*)buf, "renice -20 -p %d", tmp);
- system(buf);
- #endif
- return;
- }
- }
- for(;;)
- {
- //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 = Get_V2G_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)
- //DEBUG_INFO("[fork2] Emergency Stop (due to Connector is plugged out during communication.)\n");
- DEBUG_ERROR("[fork2]Plug out Error => End_Process\n");
- //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
- //DEBUG_INFO("CP_PROTECTION_MECHANISM is disabled. Emergency Stop: skipped\n");
- #endif
- }
- }
- //Step 2: Check for V2G_SECC_Sequence_Timeout
- //#if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- status = Get_V2G_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
- {
- DEBUG_ERROR("[fork2]V2G_SECC_Sequence_Timeout in state %d - (%.02lf of %d ms)\n", status, time_diff, V2G_SECC_Sequence_Timeout);
- Update_V2G_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;
- 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)
- {
- DEBUG_INFO("[Error_Monitor]EVSE_Shutdown\n");
- Update_V2G_Status(Other_Fault);
- }
- else if (EVCOMM_SYS_INFO.DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- DEBUG_INFO("[Error_Monitor]EVSE_EmergencyShutdown\n");
- Update_V2G_Status(Other_Fault);
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- if (status >= ChargeParameterDiscoveryRequest) //&& status < SessionStopRequest
- {
- DEBUG_INFO("[Error_Monitor]ChargingPermission = FALSE\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- else
- {
- //null
- }
- }
- else
- {
- //null
- }
- }
- //Step 3: Check and Response to Error V2gFlowStatus
- status = Get_V2G_Status();
- if (status == Performance_Timeout ||
- status == Sequence_Timeout ||
- status == Other_Fault)
- {
- //Normal Stop
- DEBUG_ERROR("[fork2]Timeout or Fault State(%d) => End_Process\n", status);
- End_Process();
- }
- //Step 4: Check and Response to CP State Error
- if(ccs->CpState_err == TRUE)
- {
- DEBUG_ERROR("[fork2]CP Error => End_Process\n");
- Update_V2G_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 (Get_V2G_Status() <= SLACC_SDP_TCP_Connection)
- {
- DEBUG_INFO("[fork2]EVSE Shutdown(%d) => End_Process\n", EVCOMM_SYS_INFO.DC_EVSEStatus);
- Update_V2G_Status(Other_Fault);
- End_Process();
- }
- }
- //Step 6: Check and Response to SessionStop
- status = Get_V2G_Status();
- if (status == SessionStopResponse)
- {
- DEBUG_INFO("[fork2]SessionStopResponse => End_Process\n");
- 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)
- {
- DEBUG_INFO("[fork2]Permission OFF before V2G msg(%d) => End_Process\n", ShmInternalComm->ChargingPermission);
- Update_V2G_Status(Other_Fault);
- End_Process();
- }
- }
- //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%
- {
- DEBUG_ERROR("[fork2]OVP => End_Process (%.02f > %.02f)\n",
- EVCOMM_SYS_INFO.PresentChargingVoltage,
- (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02));
- Update_V2G_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))
- {
- DEBUG_INFO("[fork2]Over V Req => End_Process (%.02f > %.02f)\n",
- EVCOMM_SYS_INFO.EvBatterytargetVoltage,
- (EVCOMM_SYS_INFO.EvBatteryMaxVoltage * 1.02));
- Update_V2G_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();
- }
- }
- //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
- {
- DEBUG_INFO("[fork2]DC Output Voltage is over 60V => End_Process\n");
- Update_V2G_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();
- }
- }
- //Step 10: Check if the connector is unplug from plugin
- if (EVCOMM_SYS_INFO.ConnectorPlugIn_pre == TRUE && EVCOMM_SYS_INFO.ConnectorPlugIn == FALSE)
- {
- DEBUG_INFO("[fork2]Unplug Reset => End_Process\n");
- Update_V2G_Status(Other_Fault);
- End_Process();
- }
- usleep(1000);
- }//while
- }
- /**
- *
- * @return
- */
- int SendSetKey()
- {
- unsigned char nRandValue = 0x0;
- unsigned char ConstString[16] = "PhihongKey000000";
- memset(&qcaInfo.SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(qcaInfo.SendMmePacket.ODA, macAddr.qca, 6);
- memcpy(qcaInfo.SendMmePacket.OSA, macAddr.eth1, 6);
- qcaInfo.SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- qcaInfo.SendMmePacket.MMV = 0x01;
- qcaInfo.SendMmePacket.MMTYPE = MMTYPE_CM_SET_KEY_REQ;
- qcaInfo.SendMmePacket.FMI[0] = qcaInfo.SendMmePacket.FMI[1] = 0;
- qcaInfo.SendMmePacketSize = 0;
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x01;//Fixed value (0x01) to indicate ��NMK��
- memset(qcaInfo.SendMmePacket.MMENTRY+qcaInfo.SendMmePacketSize, 0, 4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
- qcaInfo.SendMmePacketSize += 4;
- memset(qcaInfo.SendMmePacket.MMENTRY+qcaInfo.SendMmePacketSize, 0, 4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
- qcaInfo.SendMmePacketSize += 4;
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x04;//PID, Fixed value (0x04) to indicate ��HLE protocol��
- memset(qcaInfo.SendMmePacket.MMENTRY+qcaInfo.SendMmePacketSize, 0, 2);//PRN, Fixed value(0x00), encrypted payload not used
- qcaInfo.SendMmePacketSize += 2;
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x00;//PMN, Fixed value(0x00) encrypted payload not used
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x01;//CCo Capablility
- srand(time(NULL));
- for(int 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(qcaInfo.NewNmkKey, 0, sizeof(qcaInfo.NewNmkKey));
- memset(qcaInfo.Nid, 0, sizeof(qcaInfo.Nid));
- HPAVKeyNMK(qcaInfo.NewNmkKey, (char*)ConstString);
- HPAVKeyNID(qcaInfo.Nid, qcaInfo.NewNmkKey, DEFAULT_LEVEL);
- memcpy(qcaInfo.SendMmePacket.MMENTRY+qcaInfo.SendMmePacketSize, qcaInfo.Nid, sizeof(qcaInfo.Nid)); //NID, 54 LSBs contain the NID 2 MSBs = 0b00
- qcaInfo.SendMmePacketSize += sizeof(qcaInfo.Nid);
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x01;//NewEKS,Fixed value (0x01)to indicate ��NMK��
- memcpy(qcaInfo.SendMmePacket.MMENTRY+qcaInfo.SendMmePacketSize, qcaInfo.NewNmkKey,sizeof(qcaInfo.NewNmkKey));//NewKey
- qcaInfo.SendMmePacketSize += sizeof(qcaInfo.NewNmkKey);
- qcaInfo.SendMmePacketSize += 19; //the size before MMENTRY
- DEBUG_INFO("QCA7000 [TX]CM_SET_KEY_REQ\n");
- DEBUG_INFO("SendSetKey: send size: %d\n", sendto(socketFd.Raw, &qcaInfo.SendMmePacket, qcaInfo.SendMmePacketSize, 0, (struct sockaddr*)&qcaInfo.DestSocketAddress, sizeof(struct sockaddr_ll)));
- Update_V2G_Status(CM_SET_KEY_REQ);
- return 0;
- }
- /**
- *
- * @return
- */
- int GetQca7kMac()
- {
- struct QcaVendorMmeHeader SendPacket;
- DEBUG_INFO("Req for QCA7K MacAddr\n");
- memset(&SendPacket, 0, sizeof(struct QcaVendorMmeHeader));
- memset(SendPacket.ODA, 0xFF, 6); //broadcast
- memcpy(SendPacket.OSA, macAddr.eth1, 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;
- DEBUG_INFO("GetQca7kMac: send size: %d\n", sendto(socketFd.Raw, &SendPacket, 20, 0, (struct sockaddr*)&qcaInfo.DestSocketAddress, sizeof(struct sockaddr_ll)));
- return 0;
- }
- /**
- *
- * @param ptr
- * @param size
- * @return
- */
- 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;
- }
- /**
- *
- * @param ptrA
- * @param ptrB
- * @param size
- * @return
- */
- 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
- DEBUG_INFO("[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);
- #endif
- break;
- }
- }
- return result;
- }
- /**
- *
- * @param evcc
- * @param EvMac_in
- * @return
- */
- 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
- DEBUG_ERROR("DB length(%d) > %d\n", evcc->arrayLen, EVCC_SLAC_DATA_ARRAY_TYPE_ARRAY_SIZE);
- 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;
- }
- /**
- *
- * @param evcc
- * @param EvMac_in
- * @param RunID_in
- * @return
- */
- 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;
- }
- /**
- *
- * @param EvMac_in
- * @param RunID_in
- * @return
- */
- 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
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("data does not exist => added to %d-th\n", SLAC_INFO.arrayLen);
- 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
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR]arrayLen: unexpected(%d)\n", SLAC_INFO.arrayLen);
- SLAC_INFO.arrayLen = 0;
- }
- }
- else
- {
- //DB is full
- DEBUG_PRINTF_EVCOMM_DETAIL("DB is full(%d) => bypass\n", SLAC_INFO.arrayLen);
- }
- }
- else
- {
- #if 0
- DEBUG_INFO("EvMac: existed (%d)\n", idx);
- #endif
- //Check RunID
- if (Array_Compare_Identity(SLAC_INFO.array[idx].RunID, RunID_in, SLAC_RUNID_LENGTH) == TRUE)
- {
- //RunID is the same
- //DEBUG_INFO("RunID: same\n");
- }
- else
- {
- DEBUG_INFO("RunID: diff\n");
- }
- //Reset all corresponding parameters
- #if 0
- DEBUG_INFO("EvMac: reset para(%d)\n", idx);
- #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;
- }
- /**
- *
- * @return
- */
- int SLAC_DB_Reset()
- {
- memset(&SLAC_INFO, 0, sizeof(struct EVCC_SLAC_DATA_TYPE));
- DEBUG_INFO("DONE\n");
- return 0;
- }
- /**
- *
- * @param Buffer
- * @param DataLength
- * @return
- */
- int MmeProcess(unsigned char *Buffer, int DataLength)
- {
- //struct ethhdr *EthPacket;
- struct MmeHeader *MmePacket;
- static unsigned char counter;
- unsigned char state = 0;
- unsigned char tmpBuf[2048]={0};
- int Rtn = 0;
- int idx = 0;
- unsigned char *EvMac_in;
- unsigned char *RunID_in;
- MmePacket = (struct MmeHeader *)Buffer;
- state = Get_V2G_Status();
- DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\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]);
- #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
- )
- {
- //DEBUG_INFO("[SLAC]ignored(wrong CP state)\n");
- 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%02x\n", MmePacket->MMENTRY[0]);
- DEBUG_INFO("CM_SET_KEY_CNF (SetKey: DONE)\n");
- Update_V2G_Status(CM_SET_KEY_CNF);
- break;
- }
- case MMTYPE_CM_SLAC_PARM_REQ:
- {
- //Check QCA7000 status
- if (EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
- {
- //DEBUG_WARN("[SLAC][RX]CM_SLAC_PARM_REQ: ignored(QCA7K init...)\n");
- break;
- }
- //Check error state
- state = Get_V2G_Status();
- if (state == Performance_Timeout || //253
- state == Sequence_Timeout || //254
- state == Other_Fault) //255
- {
- DEBUG_WARN("CM_SLAC_PARM_REQ: ignored(in error state)\n");
- break;
- }
- //Printing EV MAC Address
- DEBUG_INFO("CM_SLAC_PARM_REQ\n");
- //Avoid Coupled SLAC_PARM_REQ
- if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
- {
- #if 0
- DEBUG_WARN("[SLAC][RX]CM_SLAC_PARM_REQ: ignored(coupled SLAC,%d)\n", CheckConnectorPlugIn());
- #endif
- break;
- }
- //[TC_SECC_VTB_CmSlacParm_003] SECURITY_TYPE needs to be 0x00 (no security)
- if (MmePacket->MMENTRY[1] != 0)
- {
- DEBUG_INFO("CM_SLAC_PARM_REQ: ignored(invalid SECURITY_TYPE,%d)\n", //Source MAC Address (EV MAC)
- MmePacket->MMENTRY[1]);
- break;
- }
- //=================== Legal CM_SLAC_PARM_REQ Zone =================
- Update_V2G_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);
- DEBUG_INFO("Check Permission: %d (SLAC first => START)\n", ShmInternalComm->ChargingPermission);
- }
- 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]);
- //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)
- {
- DEBUG_WARN("DB is full or errors occour(%d) => ignore\n", idx);
- break;
- }
- //Select the 1st EV MAC address
- if (SLAC_INFO.arrayLen == 1) //1st Req
- {
- DEBUG_INFO("CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X, %02X%02X%02X%02X%02X%02X%02X%02X):selected\n",
- (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]);
- }
- else //2nd Req
- {
- DEBUG_INFO("CM_SLAC_PARM_REQ[%d](%02X:%02X:%02X:%02X:%02X:%02X, %02X%02X%02X%02X%02X%02X%02X%02X):not selected\n",
- (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]);
- }
- memcpy(macAddr.evcc, MmePacket->OSA, sizeof(macAddr.evcc));
- memcpy(qcaInfo.DestSocketAddress.sll_addr, MmePacket->OSA, SLAC_EVMAC_LENGTH);
- memcpy(qcaInfo.SlacRunId, MmePacket->MMENTRY + 2, SLAC_RUNID_LENGTH);
- memset(&qcaInfo.SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(qcaInfo.SendMmePacket.ODA, MmePacket->OSA, 6);
- memcpy(qcaInfo.SendMmePacket.OSA, macAddr.eth1, 6);
- qcaInfo.SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- qcaInfo.SendMmePacket.MMV = MmePacket->MMV;
- qcaInfo.SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_PARM_CNF;
- qcaInfo.SendMmePacket.FMI[0] = qcaInfo.SendMmePacket.FMI[1] = 0;
- qcaInfo.SendMmePacketSize = 0;
- memset(qcaInfo.SendMmePacket.MMENTRY, 0xFF, 6); //M-SOUND_TARGET(6-byte:0xFFFFFFFFFFFF): Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
- qcaInfo.SendMmePacketSize += 6;
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = C_EV_match_MNBC; //NUM_SOUNDS(0x0A): Number of M-Sounds to be transmitted by the EV GP Station during the SLAC process
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 6; //Time_Out(0x06): unit = 100ms
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.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(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, SLAC_INFO.array[idx].EvMac, 6); //FORWARDING_STA(MAC Address of the EV HLE)
- qcaInfo.SendMmePacketSize += 6;
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00): 0x00(PEV-EVSE Association), 0x01-0xFF(Reserved)
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00): 0x00(No Security), 0x01(Public Key Signature), 0x02-0xFF(Reserved)
- memcpy(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, qcaInfo.SlacRunId, SLAC_RUNID_LENGTH); //RunID (8-byte)
- qcaInfo.SendMmePacketSize += SLAC_RUNID_LENGTH;
- qcaInfo.SendMmePacketSize += 19; //the size before MMENTRY
- DEBUG_PRINTF_EVCOMM_DETAIL("***** Response MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- qcaInfo.SendMmePacket.ODA[0],qcaInfo.SendMmePacket.ODA[1],qcaInfo.SendMmePacket.ODA[2],qcaInfo.SendMmePacket.ODA[3],qcaInfo.SendMmePacket.ODA[4],qcaInfo.SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- qcaInfo.SendMmePacket.OSA[0],qcaInfo.SendMmePacket.OSA[1],qcaInfo.SendMmePacket.OSA[2],qcaInfo.SendMmePacket.OSA[3],qcaInfo.SendMmePacket.OSA[4],qcaInfo.SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(qcaInfo.SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", qcaInfo.SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", qcaInfo.SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", qcaInfo.SendMmePacket.FMI[0],qcaInfo.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",
- qcaInfo.SendMmePacket.MMENTRY[0],qcaInfo.SendMmePacket.MMENTRY[1],qcaInfo.SendMmePacket.MMENTRY[2],qcaInfo.SendMmePacket.MMENTRY[3],qcaInfo.SendMmePacket.MMENTRY[4],qcaInfo.SendMmePacket.MMENTRY[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("NUM_SOUNDS: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[6]);
- DEBUG_PRINTF_EVCOMM_DETAIL("Time_Out: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[7]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_TYPE: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[8]);
- DEBUG_PRINTF_EVCOMM_DETAIL("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- qcaInfo.SendMmePacket.MMENTRY[9],qcaInfo.SendMmePacket.MMENTRY[10],qcaInfo.SendMmePacket.MMENTRY[11],qcaInfo.SendMmePacket.MMENTRY[12],qcaInfo.SendMmePacket.MMENTRY[13],qcaInfo.SendMmePacket.MMENTRY[14]);
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[15]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[16]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
- qcaInfo.SendMmePacket.MMENTRY[17],qcaInfo.SendMmePacket.MMENTRY[18],qcaInfo.SendMmePacket.MMENTRY[19],qcaInfo.SendMmePacket.MMENTRY[20],qcaInfo.SendMmePacket.MMENTRY[21],qcaInfo.SendMmePacket.MMENTRY[22],qcaInfo.SendMmePacket.MMENTRY[23],qcaInfo.SendMmePacket.MMENTRY[24]);
- Update_V2G_Status(CM_SLAC_PARM_CONF);
- Rtn = sendto(socketFd.Raw, &qcaInfo.SendMmePacket, qcaInfo.SendMmePacketSize, 0, (struct sockaddr*)&qcaInfo.DestSocketAddress, sizeof(struct sockaddr_ll));
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d, Rtn=%d\n", qcaInfo.SendMmePacketSize,Rtn);
- ftime(&timerStart.SeqStart);
- counter = 0;
- break;
- }
- case MMTYPE_CM_START_ATTEN_CHAR_IND:
- {
- if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
- {
- DEBUG_INFO("CM_START_ATTEN_CHAR_IND: ignored(time up)\n");
- break;
- }
- //Avoid Coupled CM_START_ATTEN_CHAR_IND
- if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
- {
- DEBUG_INFO("CM_START_ATTEN_CHAR_IND: ignored(coupled SLAC,%d)\n", CheckConnectorPlugIn());
- break;
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n", counter);
- 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]);
- 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_Status(CM_START_ATTEN_CHAR_IND);
- counter++;
- //[TC_SECC_VTB_AttenuationCharacterization_013]
- if (MmePacket->MMENTRY[0] != 0) //APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
- {
- DEBUG_INFO("[CM_START_ATTEN_CHAR_IND]APPLICATION_TYPE(%d): invalid => ignore Req\n", MmePacket->MMENTRY[0]);
- break;
- }
- //[TC_SECC_VTB_AttenuationCharacterization_014]
- if (MmePacket->MMENTRY[1] != 0) //SECURITY_TYPE must be 0x00(No Security)
- {
- DEBUG_INFO("[CM_START_ATTEN_CHAR_IND]SECURITY_TYPE(%d): invalid => ignore Req\n", MmePacket->MMENTRY[1]);
- break;
- }
- //[TC_SECC_VTB_AttenuationCharacterization_017]
- if (MmePacket->MMENTRY[4] != 0x01) //RESP_TYPE must be 0x01(Send to another GP STA(EV))
- {
- DEBUG_INFO("[CM_START_ATTEN_CHAR_IND]RESP_TYPE(%d): invalid => ignore Req\n", MmePacket->MMENTRY[4]);
- 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)
- {
- DEBUG_INFO("[CM_START_ATTEN_CHAR_IND]FORWARDING_STA(%02X:%02X:%02X:%02X:%02X:%02X): invalid => ignore Req\n",
- MmePacket->MMENTRY[5], MmePacket->MMENTRY[6],
- MmePacket->MMENTRY[7], MmePacket->MMENTRY[8],
- MmePacket->MMENTRY[9], MmePacket->MMENTRY[10]);
- 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 (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(&timerStart.SeqStart); //start TT_EVSE_match_MNBC
- }
- else if (SLAC_INFO.array[idx].StartAttenCharCnt >= 3)
- {
- DEBUG_INFO("[CM_START_ATTEN_CHAR_IND]counter(%d): unexpected \n", SLAC_INFO.array[idx].StartAttenCharCnt);
- }
- else
- {
- //null
- }
- }
- else
- {
- //This RunID is not matched with this EvMac,
- //or this RunID is not found in DB.
- DEBUG_INFO("[CM_START_ATTEN_CHAR_IND]EvMac-RunID: unmatched => ignore Req\n");
- //Response: ignore
- }
- }
- else
- {
- //this msg source is not in database
- //ignore
- }
- break;
- }
- case MMTYPE_CM_MNBC_SOUND_IND:
- {
- if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
- {
- DEBUG_INFO("CM_MNBC_SOUND_IND: ignored(timeup)\n");
- break;
- }
- //Avoid Coupled CM_MNBC_SOUND_IND
- if (CheckConnectorPlugIn() == FALSE) //12V(State 1)
- {
- DEBUG_INFO("CM_MNBC_SOUND_IND: ignored(coupled SLAC,%d)\n", CheckConnectorPlugIn());
- break;
- }
- if(V2gFlowStatus == CM_START_ATTEN_CHAR_IND)
- {
- counter = 0;
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n", counter, SLAC_INFO.array[idx].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]);
- 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_Status(CM_MNBC_SOUND_IND);
- counter++;
- //Check for RunID
- if (SLAC_DB_Check_EvMac_RunID_Matching(&SLAC_INFO, EvMac_in, RunID_in) == TRUE)
- {
- SLAC_INFO.array[idx].MnbcSoundCnt++;
- }
- else
- {
- //RunID is not matched or does not exist.
- DEBUG_INFO("CM_MNBC_SOUND_IND]EvMac-RunID: unmatched\n");
- }
- }
- else
- {
- //ignore
- DEBUG_INFO("CM_MNBC_SOUND_IND]EvMac does not exist\n");
- }
- break;
- }
- case MMTYPE_CM_ATTEN_PROFILE_IND:
- {
- if(V2gFlowStatus >= CM_ATTEN_CHAR_IND)
- {
- DEBUG_INFO("CM_ATTEN_PROFILE_IND: ignore(timeup)\n");
- break;
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n", counter, SLAC_INFO.array[idx].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]);
- memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
- for(Rtn = 0; Rtn < MmePacket->MMENTRY[6]; Rtn++)
- {
- sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, MmePacket->MMENTRY[8 + Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("AAG: %s\n", tmpBuf);
- 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);
- if (idx >= 0)
- {
- SLAC_INFO.array[idx].AttenProfileCnt++;
- 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_Status(CM_MNBC_SOUND_IND);
- break;
- }
- else
- {
- //The EvMac is not in the database
- //ignore
- DEBUG_INFO("[CM_ATTEN_PROFILE_IND]EvMac(%02X%02X%02X%02X%02X%02X): not exist => ignore\n", EvMac_in[0], EvMac_in[1], EvMac_in[2], EvMac_in[3], EvMac_in[4], EvMac_in[5]);
- break;
- }
- }
- case MMTYPE_CM_ATTEN_CHAR_RSP:
- {
- 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]);
- memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
- for(Rtn = 0; Rtn < 17; Rtn++)
- {
- sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, MmePacket->MMENTRY[16 + Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: %s\n", tmpBuf);
- ;
- memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
- for(Rtn = 0; Rtn < 17; Rtn++)
- {
- sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, MmePacket->MMENTRY[33 + Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: %s\n", tmpBuf);
- DEBUG_PRINTF_EVCOMM_DETAIL("Result: 0x%x\n", MmePacket->MMENTRY[50]); //Fixed value of 0x00 indicates a successful SLAC process
- //Check ODA (Destination Address)
- if (Array_Compare_Identity(macAddr.eth1, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
- {
- DEBUG_INFO("[CM_ATTEN_CHAR_RSP]wrong ODA: ignore\n");
- 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++;
- DEBUG_WARN("[SLAC][RX]CM_ATTEN_CHAR_RSP:invalid para(%d,%d,%d,%d,%d) => %d-th retry\n",
- 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
- );
- if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry <= 2) //limited to 2 retries
- {
- Update_V2G_Status(CM_MNBC_SOUND_IND);
- ftime(&timerStart.SeqStart);
- break;
- }
- else
- {
- DEBUG_ERROR("[SLAC][RX]CM_ATTEN_CHAR_RSP:invalid para => 2-retry fail => End_Process\n");
- Update_V2G_Status(Other_Fault);
- break;
- }
- }
- else
- {
- //The CM_ATTEN_CHAR_IND is legal
- SLAC_INFO.array[idx].AttenCharRspCnt++;
- DEBUG_INFO("[SLAC][RX]CM_ATTEN_CHAR_RSP[%d]:%d-th\n", (idx + 1), SLAC_INFO.array[idx].AttenCharRspCnt);
- EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry = 0;
- Update_V2G_Status(CM_ATTEN_CHAR_RSP);
- ftime(&timerStart.SeqStart);
- break;
- }
- }
- case MMTYPE_CM_VALIDATE_REQ: //BCB Toggle
- {
- 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��.
- counter = 0;
- EvMac_in = &MmePacket->OSA[0];
- idx = SLAC_DB_Search_EvMac_idx(&SLAC_INFO, EvMac_in);
- if (idx >= 0)
- {
- Update_V2G_Status(CM_VALIDATE_CNF);
- SLAC_INFO.array[idx].ValidateReqCnt++;
- DEBUG_INFO("[SLAC][RX]CM_VALIDATE_REQ[%d]:%d-th\n", (idx + 1), SLAC_INFO.array[idx].ValidateReqCnt);
- //TODO:
- // 1. Protection
- memset(&qcaInfo.SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(qcaInfo.SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
- memcpy(qcaInfo.SendMmePacket.OSA, macAddr.eth1, 6);
- qcaInfo.SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- qcaInfo.SendMmePacket.MMV = 0x01;
- qcaInfo.SendMmePacket.MMTYPE = MMTYPE_CM_VALIDATE_CNF;
- qcaInfo.SendMmePacket.FMI[0] = qcaInfo.SendMmePacket.FMI[1] = 0;
- qcaInfo.SendMmePacketSize = 0;
- if(counter == 0)
- {
- //The First MMTYPE_CM_VALIDATE_REQ because Unicast
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0; //SignalType(0x00): Fixed value to indicate "EV S2 toggles on control pilot line"
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.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)
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 1; //0x01 = Ready
- #else
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 4; //0x04 = Not Required
- #endif
- }
- else
- {
- //The Second MMTYPE_CM_VALIDATE_REQ because Broadcast
- unsigned char PreStatus = 3;
- unsigned char ToggleNum = 0;
- ftime(&timerStart.SeqStart);
- while(1)
- {
- if((EVCOMM_SYS_INFO.CpState == 4) && (PreStatus == 3))
- {
- ToggleNum++;
- PreStatus = 4;
- }
- else
- {
- PreStatus = 3;
- }
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) >= (qcaInfo.SendMmePacket.MMENTRY[1]*100 + 100))
- {
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0; //Fixed value to indicate "PEV S2 toggles on control pilot line"
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = ToggleNum;
- #if (SUPPORT_BCB_TOGGLE_FUNCTION == ENABLE)
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 2; //0x02 = Success
- #else
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 4; //0x04 = Not Required
- #endif
- break;
- }
- usleep(1000);
- }
- }
- qcaInfo.SendMmePacketSize += 19; //the size before MMENTRY
- Rtn = sendto(socketFd.Raw, &qcaInfo.SendMmePacket, qcaInfo.SendMmePacketSize, 0, (struct sockaddr*)&qcaInfo.DestSocketAddress, sizeof(struct sockaddr_ll));
- ftime(&timerStart.SeqStart);
- }
- else
- {
- //EvMac does not exist.
- //ignore
- }
- break;
- }
- case MMTYPE_CM_SLAC_MATCH_REQ:
- {
- char buf[512];
- 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
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<17; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, MmePacket->MMENTRY[4+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<6; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, MmePacket->MMENTRY[21+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<17; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, MmePacket->MMENTRY[27+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: %d\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<6; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, MmePacket->MMENTRY[44+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<8; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, MmePacket->MMENTRY[50+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<8; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, MmePacket->MMENTRY[58+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: %s\n", buf);
- //Check ODA (Destination Address)
- if (Array_Compare_Identity(macAddr.eth1, MmePacket->ODA, SLAC_EVSE_MAC_LENGTH) == FALSE)
- {
- DEBUG_WARN("[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_Status(CM_SLAC_MATCH_REQ);
- SLAC_INFO.array[idx].MatchReqNum++;
- DEBUG_INFO("CM_SLAC_MATCH_REQ[%d]:%d-th\n", (idx + 1), SLAC_INFO.array[idx].MatchReqNum);
- //[TC_SECC_VTB_CmSlacMatch_007] APPLICATION_TYPE must be 0x00(EV-EVSE Matching)
- //[TC_SECC_VTB_CmSlacMatch_008]
- if (MmePacket->MMENTRY[0] != 0)
- {
- DEBUG_WARN("CM_SLAC_MATCH_REQ[%d]:wrong APPLICATION_TYPE(%d)\n", (idx + 1), MmePacket->MMENTRY[0]);
- break;
- }
- //[TC_SECC_VTB_CmSlacMatch_009] SECURITY_TYPE must be 0x00(No Security)
- //[TC_SECC_VTB_CmSlacMatch_010]
- if (MmePacket->MMENTRY[1] != 0)
- {
- DEBUG_WARN("CM_SLAC_MATCH_REQ[%d]:wrong SECURITY_TYPE(%d)\n", (idx + 1), MmePacket->MMENTRY[1]);
- 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)
- {
- DEBUG_WARN("CM_SLAC_MATCH_REQ[%d]:wrong MVFLength(%d,%d)\n", (idx + 1), MmePacket->MMENTRY[2], MmePacket->MMENTRY[3]);
- 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)
- {
- DEBUG_WARN("CM_SLAC_MATCH_REQ[%d]: wrong EV ID\n", (idx + 1));
- 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)
- {
- DEBUG_WARN("CM_SLAC_MATCH_REQ[%d]: wrong EV MAC(%02X:%02X:%02X:%02X:%02X:%02X)\n",
- (idx + 1),
- MmePacket->MMENTRY[21], MmePacket->MMENTRY[22], MmePacket->MMENTRY[23],
- MmePacket->MMENTRY[24], MmePacket->MMENTRY[25], MmePacket->MMENTRY[26]);
- 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)
- {
- DEBUG_WARN("CM_SLAC_MATCH_REQ[%d]: wrong EVSE ID\n", (idx + 1));
- break;
- }
- //[TC_SECC_VTB_CmSlacMatch_019] EVSE MAC
- //[TC_SECC_VTB_CmSlacMatch_020]
- if (Array_Compare_Identity(macAddr.eth1, &MmePacket->MMENTRY[44], SLAC_EVSE_MAC_LENGTH) == FALSE)
- {
- DEBUG_WARN("CM_SLAC_MATCH_REQ[%d]: wrong EVSE MAC(%02X:%02X:%02X:%02X:%02X:%02X)\n",
- (idx + 1),
- MmePacket->MMENTRY[44], MmePacket->MMENTRY[45], MmePacket->MMENTRY[46],
- MmePacket->MMENTRY[47], MmePacket->MMENTRY[48], MmePacket->MMENTRY[49]);
- 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(&qcaInfo.SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(qcaInfo.SendMmePacket.ODA, MmePacket->OSA, 6);
- memcpy(qcaInfo.SendMmePacket.OSA, macAddr.eth1, 6);
- qcaInfo.SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- qcaInfo.SendMmePacket.MMV = MmePacket->MMV;
- qcaInfo.SendMmePacket.MMTYPE = MMTYPE_CM_SLAC_MATCH_CNF;
- qcaInfo.SendMmePacket.FMI[0] = qcaInfo.SendMmePacket.FMI[1] = 0;
- qcaInfo.SendMmePacketSize = 0;
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x00; //APPLICATION_TYPE: Fixed value (0x00: EV-EVSE matching)
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x00; //SECURITY_TYPE: Fixed value (0x00: No Security)
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x56; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x00; //MVFLength: MatchVarField Length (Fixed value: 0x0056)
- memset(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, 0, 17); //EV ID
- qcaInfo.SendMmePacketSize += 17;
- memcpy(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //EV MAC
- qcaInfo.SendMmePacketSize += 6;
- memset(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, 0, 17); //EVSE ID
- qcaInfo.SendMmePacketSize += 17;
- memcpy(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, macAddr.eth1, 6); //EVSE MAC
- qcaInfo.SendMmePacketSize += 6;
- memcpy(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
- qcaInfo.SendMmePacketSize += SLAC_RUNID_LENGTH;
- memset(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, 0, 8); //RSVD
- qcaInfo.SendMmePacketSize += 8;
- memcpy(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, qcaInfo.Nid, sizeof(qcaInfo.Nid)); //NID: Network ID given by the CCo(EVSE)
- qcaInfo.SendMmePacketSize += sizeof(qcaInfo.Nid); //NID caculated from the random NMK that will be set.
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0x00; //RSVD
- memcpy(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, qcaInfo.NewNmkKey, sizeof(qcaInfo.NewNmkKey)); //NMK: Random value
- qcaInfo.SendMmePacketSize += sizeof(qcaInfo.NewNmkKey); //NMK: Private NMK of the EVSE (random value)
- qcaInfo.SendMmePacketSize += 19; //the size before MMENTRY
- DEBUG_PRINTF_EVCOMM_DETAIL("***** Response MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- qcaInfo.SendMmePacket.ODA[0],qcaInfo.SendMmePacket.ODA[1],qcaInfo.SendMmePacket.ODA[2],qcaInfo.SendMmePacket.ODA[3],qcaInfo.SendMmePacket.ODA[4],qcaInfo.SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
- qcaInfo.SendMmePacket.OSA[0],qcaInfo.SendMmePacket.OSA[1],qcaInfo.SendMmePacket.OSA[2],qcaInfo.SendMmePacket.OSA[3],qcaInfo.SendMmePacket.OSA[4],qcaInfo.SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(qcaInfo.SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", qcaInfo.SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", qcaInfo.SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", qcaInfo.SendMmePacket.FMI[0],qcaInfo.SendMmePacket.FMI[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_SLAC_MATCH_CNF ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MVFLength: 0x%x, 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[2],qcaInfo.SendMmePacket.MMENTRY[3]);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<17; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, qcaInfo.SendMmePacket.MMENTRY[4+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV ID: %d\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<6; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, qcaInfo.SendMmePacket.MMENTRY[21+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("PEV MAC: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<17; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, qcaInfo.SendMmePacket.MMENTRY[27+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE ID: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<6; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, qcaInfo.SendMmePacket.MMENTRY[44+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("EVSE MAC: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<8; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, qcaInfo.SendMmePacket.MMENTRY[50+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<8; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, qcaInfo.SendMmePacket.MMENTRY[58+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: %s\n", buf);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<7; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, qcaInfo.SendMmePacket.MMENTRY[66+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("NID: %s\n", buf);
- DEBUG_PRINTF_EVCOMM_DETAIL("RSVD: 0x%02x\n", qcaInfo.SendMmePacket.MMENTRY[73]);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn=0; Rtn<16; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, qcaInfo.SendMmePacket.MMENTRY[74+Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("NMK: \n");
- Update_V2G_Status(CM_SLAC_MATCH_CNF);
- Rtn = sendto(socketFd.Raw, &qcaInfo.SendMmePacket, qcaInfo.SendMmePacketSize, 0, (struct sockaddr*)&qcaInfo.DestSocketAddress, sizeof(struct sockaddr_ll));
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", qcaInfo.SendMmePacketSize,Rtn);
- DEBUG_INFO( "CM_SLAC_MATCH_CNF[%d]\n", (idx + 1));
- ftime(&timerStart.SeqStart);
- }
- else
- {
- //RunID does not match and it's not the first SLAC request
- //Reset the SLAC database to embrace SLAC retry
- DEBUG_INFO("[CM_SLAC_MATCH_REQ]No Real MATCH_REQ\n");
- 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:
- {
- // Only Set key for local QCA7000
- if((MmePacket->OSA[0] == MmePacket->MMENTRY[12]) &&
- (MmePacket->OSA[1] == MmePacket->MMENTRY[13]) &&
- (MmePacket->OSA[2] == MmePacket->MMENTRY[14]) &&
- (MmePacket->OSA[3] == MmePacket->MMENTRY[15]) &&
- (MmePacket->OSA[4] == MmePacket->MMENTRY[16]) &&
- (MmePacket->OSA[5] == MmePacket->MMENTRY[17]))
- {
- memcpy(macAddr.qca, MmePacket->OSA, 6);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
- DEBUG_INFO("EVSE MAC address(QCA): %02X:%02X:%02X:%02X:%02X:%02X(comm:OK)\n",
- macAddr.qca[0], macAddr.qca[1], macAddr.qca[2], macAddr.qca[3], macAddr.qca[4], macAddr.qca[5]);
- Update_V2G_Status(CM_SET_KEY_REQ);
- ftime(&timerStart.SeqStart);
- }
- break;
- }
- case MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF:
- {
- struct QcaVendorMmeHeader *RecvPacket;
- RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
- if(RecvPacket->MBODY[1]==0)
- {
- //PLC disconnected
- DEBUG_INFO("[MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF]Got PLC Link Status:%d\n", RecvPacket->MBODY[1]);
- Update_V2G_Status(Other_Fault);
- }
- else
- Update_V2G_Status(CM_SET_KEY_REQ);
- ftime(&timerStart.SeqStart);
- break;
- }
- default:
- {
- break;
- }
- }
- return 0;
- }
- /**
- *
- * @return
- */
- int SlacComm()
- {
- static unsigned char qca7k_comm_retry = 0;
- double t_diff = 0;
- int packet_size = 0;
- int count = 0;
- unsigned char tmpBuf[2048]={0};
- unsigned char *EvMac_in;
- unsigned char *RunID_in;
- int i = 0;
- if(socketFd.Raw >= 0)
- {
- memset(v2gBuffer.rx, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- packet_size = recvfrom(socketFd.Raw, v2gBuffer.rx, V2GTP_MSG_RX_BUFFER_SIZE, 0, NULL, NULL);
- if(packet_size > 0)
- {
- MmeProcess(v2gBuffer.rx, packet_size);
- }
- }
- switch(Get_V2G_Status())
- {
- case IDLE:
- {
- if(socketFd.Raw < 0)
- {
- socketFd.Raw = socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
- DEBUG_INFO("[RawSock]opened(%d)\n", socketFd.Raw);
- if(socketFd.Raw == -1)
- {
- DEBUG_ERROR("SlacComm:Failed to create socket\n");
- Update_V2G_Status(Other_Fault);
- return -1;
- }
- if (setsockopt(socketFd.Raw, SOL_SOCKET, SO_BINDTODEVICE, QcaInterface, 4) < 0)
- {
- DEBUG_ERROR("SlacComm:Set SO_BINDTODEVICE NG\n");
- Update_V2G_Status(Other_Fault);
- return -1;
- }
- struct timeval tv;
- tv.tv_sec = 0;
- tv.tv_usec = 100000; //100ms (Rx timeout)
- if (setsockopt(socketFd.Raw, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
- {
- DEBUG_ERROR("SlacComm:Set SO_RCVTIMEO NG\n");
- Update_V2G_Status(Other_Fault);
- return -1;
- }
- tv.tv_usec = 100000; //100ms (Tx timeout)
- if (setsockopt(socketFd.Raw, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
- {
- DEBUG_ERROR("SlacComm:Set SO_SNDTIMEO NG\n");
- Update_V2G_Status(Other_Fault);
- return -1;
- }
- memset(&qcaInfo.Req, 0, sizeof(struct ifreq));
- strcpy( (char*)qcaInfo.Req.ifr_name, QcaInterface);
- if (ioctl(socketFd.Raw, SIOCGIFINDEX, &qcaInfo.Req) < 0)
- {
- DEBUG_ERROR("SlacComm: ioctl NG\n");
- Update_V2G_Status(Other_Fault);
- return -1;
- }
- memset(&qcaInfo.DestSocketAddress, 0, sizeof(struct sockaddr_ll));
- qcaInfo.DestSocketAddress.sll_ifindex = qcaInfo.Req.ifr_ifindex;
- qcaInfo.DestSocketAddress.sll_halen = ETH_ALEN;
- timerStart.PwmStart = 0;
- EVCOMM_SYS_INFO.QCA7K_SetKeyDone = FALSE;
- DEBUG_INFO("QCA7000 connecting...\n");
- //Get QCA7K MAC address
- GetQca7kMac();
- ftime(&timerStart.SeqStart);
- break;
- }
- else //RawSock: opened
- {
- if(EVCOMM_SYS_INFO.QCA7K_SetKeyDone == FALSE)
- {
- ftime(&timerStart.SeqEnd);
- t_diff = DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd);
- if (t_diff > V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD) //3 secs
- {
- qca7k_comm_retry++;
- DEBUG_INFO("Re-try connecting...(%.02lf/%dms)\n", t_diff, V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD);
- GetQca7kMac(); //re-send req
- ftime(&timerStart.SeqStart);
- break;
- }
- else
- {}
- //Retry by 3 times
- if (qca7k_comm_retry >= 3)
- {
- DEBUG_ERROR("Comm: fail (retry by %d times)\n", qca7k_comm_retry);
- //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 = FALSE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Proc_EVStopRes(ShmInternalComm->FD_CAN_Socket);
- Update_V2G_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(timerStart.PwmStart <= 0)
- {
- //Sniffer_Tcpdump(ENABLE);
- //#if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
- //sleep(1); //wait for tcpdump to be ready.
- //#endif
- SwitchCpStateE(DISABLE);
- OutputCpPwmDuty(5);
- timerStart.PwmStart = time(NULL);
- #ifdef TEST_WITH_ETH0
- Update_V2G_Status(SLACC_SDP_UDP_Connection);
- #endif
- }
- else
- {
- if((time(NULL) - timerStart.PwmStart) > TT_EVSE_SLAC_init)
- {
- DEBUG_ERROR("SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init, NowTime(%ld)-timerStart.PwmStart(%d)>%d (sec)\n", time(NULL), timerStart.PwmStart, TT_EVSE_SLAC_init);
- //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_Status(Sequence_Timeout);
- timerStart.PwmStart = 0;
- return -1;
- }
- else
- {
- //waiting for CM_SLAC_PARM_REQ
- }
- }
- }
- else
- {
- timerStart.PwmStart = 0;
- }
- }
- }
- break;
- }
- case CM_SET_KEY_REQ: //13
- {
- //CM_SET_KEY_REQ
- //DEBUG_INFO("QCA7000 [RX]CM_SET_KEY_REQ\n");
- ftime(&timerStart.SeqEnd);
- t_diff = DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd);
- if (t_diff > V2G_SECC_QCA7000_COMM_TIMEOUT) //10 seconds
- {
- DEBUG_ERROR("QCA7000 Failed on SetKey => End_Process (%.02lf/%dms)\n", t_diff, V2G_SECC_QCA7000_COMM_TIMEOUT);
- //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 = FALSE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Sequence_Timeout);
- }
- else if (t_diff > V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD) //2 seconds
- {
- DEBUG_INFO("QCA7000 SetKey: proceed (%.02lf/%dms)\n", t_diff, V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD);
- SendSetKey();
- ftime(&timerStart.SeqStart);
- }
- else
- {
- //null
- }
- break;
- }
- case CM_SET_KEY_CNF: //14
- {
- DEBUG_INFO("Wait: plugin(%d), matached(%d), permission(%d)...\n", CheckConnectorPlugIn(), CSUCOMMDC_TASK_FLAG.matched, ShmInternalComm->ChargingPermission);
- EVCOMM_SYS_INFO.QCA7K_SetKeyDone = TRUE;
- timerStart.PwmStart = 0;
- Update_V2G_Status(IDLE);
- break;
- }
- case CM_SLAC_PARM_CONF:
- {
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > TT_match_sequence)
- {
- DEBUG_ERROR("SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence (%.02lf of %dms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), TT_match_sequence);
- //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 = FALSE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_START_ATTEN_CHAR_IND:
- {
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > (TP_EV_batch_msg_interval)) //one more time interval for tolerance
- {
- DEBUG_ERROR("SlacComm: Wait CM_MNBC_SOUND_IND Timeout - TP_EV_batch_msg_interval (%.02lf of %dms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), TP_EV_batch_msg_interval);
- //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 = FALSE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_MNBC_SOUND_IND:
- {
- ftime(&timerStart.SeqEnd);
- t_diff = DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd);
- //printf("time:%.02lf, profilNum:%d\n",DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd),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)
- {
- DEBUG_WARN("[SLAC][TX]CM_ATTEN_CHAR_IND[%d]: timeup(%.2f/%dms) => send\n", (i + 1), t_diff, TT_EVSE_match_MNBC);
- }
- //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)
- DEBUG_WARN("[SLAC][TX]CM_ATTEN_CHAR_IND[%d]: para err(%d,%d,%d,%d,%d) => canceled\n",
- (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);
- 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))
- {
- DEBUG_INFO("[SLAC][TX]CM_ATTEN_CHAR_IND[%d]: canceled\n", (i + 1));
- break;
- }
- EvMac_in = SLAC_INFO.array[i].EvMac;
- RunID_in = SLAC_INFO.array[i].RunID;
- memset(&qcaInfo.SendMmePacket, 0, sizeof(struct MmeHeader));
- memcpy(qcaInfo.SendMmePacket.ODA, EvMac_in, SLAC_EVMAC_LENGTH);
- memcpy(qcaInfo.SendMmePacket.OSA, macAddr.eth1, 6);
- qcaInfo.SendMmePacket.MTYPE = htons(EtherType_HomePlug);
- qcaInfo.SendMmePacket.MMV = 0x01;
- qcaInfo.SendMmePacket.MMTYPE = MMTYPE_CM_ATTEN_CHAR_IND;
- qcaInfo.SendMmePacket.FMI[0] = qcaInfo.SendMmePacket.FMI[1] = 0;
- qcaInfo.SendMmePacketSize = 0;
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0; //APPLICATION_TYPE(0x00: EV-EVSE Matching)
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = 0; //SECURITY_TYPE(0x00: No Security)
- memcpy(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, EvMac_in, SLAC_EVMAC_LENGTH); //SOURCE_ADDRESS, MAC address of the EV Host
- qcaInfo.SendMmePacketSize += SLAC_EVMAC_LENGTH;
- memcpy(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, RunID_in, SLAC_RUNID_LENGTH);
- qcaInfo.SendMmePacketSize += SLAC_RUNID_LENGTH;
- memset(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, 0, 17); //SOURCE_ID(0x00)
- qcaInfo.SendMmePacketSize += 17;
- memset(qcaInfo.SendMmePacket.MMENTRY + qcaInfo.SendMmePacketSize, 0, 17); //RESP_ID(0x00)
- qcaInfo.SendMmePacketSize += 17;
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = SLAC_INFO.array[i].AttenProfileCnt; //NumSounds: Number of M-Sounds used for generation of the ATTEN_PROFILE
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.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
- qcaInfo.SendMmePacket.MMENTRY[qcaInfo.SendMmePacketSize++] = TmpAag;
- SLAC_INFO.array[i].AAG_quality_refined += (float) TmpAag; //refined signal quality
- }
- qcaInfo.SendMmePacketSize += 19; //the size before MMENTRY
- DEBUG_PRINTF_EVCOMM_DETAIL("***** Send MME Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n", qcaInfo.SendMmePacket.ODA[0],qcaInfo.SendMmePacket.ODA[1],qcaInfo.SendMmePacket.ODA[2],qcaInfo.SendMmePacket.ODA[3],qcaInfo.SendMmePacket.ODA[4],qcaInfo.SendMmePacket.ODA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n", qcaInfo.SendMmePacket.OSA[0],qcaInfo.SendMmePacket.OSA[1],qcaInfo.SendMmePacket.OSA[2],qcaInfo.SendMmePacket.OSA[3],qcaInfo.SendMmePacket.OSA[4],qcaInfo.SendMmePacket.OSA[5]);
- DEBUG_PRINTF_EVCOMM_DETAIL("MTYPE: 0x%x\n", htons(qcaInfo.SendMmePacket.MTYPE));
- DEBUG_PRINTF_EVCOMM_DETAIL("MMV: 0x%x\n", qcaInfo.SendMmePacket.MMV);
- DEBUG_PRINTF_EVCOMM_DETAIL("MMTYPE: 0x%x\n", qcaInfo.SendMmePacket.MMTYPE);
- DEBUG_PRINTF_EVCOMM_DETAIL("FMI 0x%x, 0x%x\n", qcaInfo.SendMmePacket.FMI[0],qcaInfo.SendMmePacket.FMI[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("--- CM_ATTEN_CHAR_IND ---\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("APPLICATION_TYPE: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[0]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SECURITY_TYPE: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[1]);
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n", qcaInfo.SendMmePacket.MMENTRY[2],qcaInfo.SendMmePacket.MMENTRY[3],qcaInfo.SendMmePacket.MMENTRY[4],qcaInfo.SendMmePacket.MMENTRY[5],qcaInfo.SendMmePacket.MMENTRY[6],qcaInfo.SendMmePacket.MMENTRY[7]);
- DEBUG_PRINTF_EVCOMM_DETAIL("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n", qcaInfo.SendMmePacket.MMENTRY[8],qcaInfo.SendMmePacket.MMENTRY[9],qcaInfo.SendMmePacket.MMENTRY[10],qcaInfo.SendMmePacket.MMENTRY[11],qcaInfo.SendMmePacket.MMENTRY[12],qcaInfo.SendMmePacket.MMENTRY[13],qcaInfo.SendMmePacket.MMENTRY[14],qcaInfo.SendMmePacket.MMENTRY[15]);
- memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
- for(count=0; count<17; count++)
- {
- sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, qcaInfo.SendMmePacket.MMENTRY[16+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("SOURCE_ID: %s\n", tmpBuf);
- memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
- for(count=0; count<17; count++)
- {
- sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, qcaInfo.SendMmePacket.MMENTRY[33+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("RESP_ID: %s\n", tmpBuf);
- DEBUG_PRINTF_EVCOMM_DETAIL("NumSounds: 0x%x\n", qcaInfo.SendMmePacket.MMENTRY[50]);
- memset(tmpBuf, 0x00, ARRAY_SIZE(tmpBuf));
- for(count=0; count<qcaInfo.AagGroupsNum; count++)
- {
- sprintf((char*)tmpBuf, "%s%02x,", tmpBuf, qcaInfo.SendMmePacket.MMENTRY[51+count]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("ATTEN_PROFILE: %s\n", tmpBuf);
- count = sendto(socketFd.Raw, &qcaInfo.SendMmePacket, qcaInfo.SendMmePacketSize, 0, (struct sockaddr*)&qcaInfo.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)
- {
- DEBUG_INFO("[SLAC][TX]CM_ATTEN_CHAR_IND[%d]: %d-th resend (Q=%.2f/%.2f)(%d/%d)\n",
- (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);
- }
- else if (EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry == 0)
- {
- DEBUG_INFO("[SLAC][TX]CM_ATTEN_CHAR_IND[%d]: Q=%.2f/%.2f(%d/%d)\n",
- (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);
- }
- else
- {
- DEBUG_INFO("[SLAC][TX]CM_ATTEN_CHAR_IND[%d]: unexpected CM_ATTEN_CHAR_IND_retry(%d))\n", i, EVCOMM_SYS_INFO.CM_ATTEN_CHAR_IND_retry);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("SendMmePacketSize=%d,Rtn=%d\n", qcaInfo.SendMmePacketSize, count);
- } //end of for loop
- Update_V2G_Status(CM_ATTEN_CHAR_IND);
- ftime(&timerStart.SeqStart);
- }
- break;
- }
- case CM_ATTEN_CHAR_IND:
- {
- ftime(&timerStart.SeqEnd);
- //if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd)>TT_match_response)
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > TT_match_response) //extended to 400ms due to the response of CM_ATTEN_CHAR.RSP of some EVCC is slower than 200ms.
- {
- DEBUG_ERROR("SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response (%.02lf of %dms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), TT_match_response);
- //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 = FALSE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_ATTEN_CHAR_RSP:
- {
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > TT_EVSE_match_session)
- {
- DEBUG_ERROR("SlacComm: Wait CM_VALIDATE_REQ_1ST or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session (%.02lf of %dms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), TT_EVSE_match_session);
- //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 = FALSE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_VALIDATE_CNF:
- {
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > TT_match_sequence)
- {
- DEBUG_ERROR("SlacComm: Wait CM_VALIDATE_REQ_2ND or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence (%.02lf of %dms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), TT_match_sequence);
- //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 = FALSE;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Sequence_Timeout);
- return -1;
- }
- break;
- }
- case CM_SLAC_MATCH_CNF:
- {
- if(socketFd.Udp > 0)
- {
- close(socketFd.Udp);
- socketFd.Udp = -1;
- }
- if(socketFd.Tcp > 0)
- {
- close(socketFd.Tcp);
- socketFd.Tcp = -1;
- }
- ftime(&timerStart.SeqStart);
- V2gTcpConnected();
- Update_V2G_Status(SLACC_SDP_UDP_Connection);
- DEBUG_INFO("SLAAC, SDP, UDP: connecting...\n");
- break;
- }
- default:
- {
- break;
- }
- }
- return 0;
- }
- /**
- * 1. Decode the V2GTP messages inside "msg" and save the decoded
- messages in v2gObject.DIN, v2gObject.ISO1, and v2gObject.ISO2,
- respectively.
- 2. After decoding, V2gMsg_Process() could then use
- v2gObject.DIN, v2gObject.ISO1, or v2gObject.ISO2
- to deal with the corresponding Response messages, respectively.
- * @param msg
- * @param msg_length
- * @param v2g_state
- * @return
- */
- 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, &v2gObject.appHandshake)) < 0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: SupportedAppProtocolRequest()\n", errn);
- }
- else //decoded successfully.
- {
- //PRINT_XML_DOC_supportedAppProtocolReq(&v2gObject.appHandshake);
- }
- }
- //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, &v2gObject.DIN)) < 0)
- {
- DEBUG_INFO("[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_DIN()\n", errn);
- }
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
- {
- //ISO1
- if((errn = API_V2GMSG_EXI_Decoder_ISO1(msg, msg_length, &v2gObject.ISO1)) < 0)
- {
- DEBUG_INFO("[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO1()\n", errn);
- }
- break;
- }
- case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
- {
- //ISO2
- if((errn = API_V2GMSG_EXI_Decoder_ISO2(msg, msg_length, &v2gObject.ISO2)) < 0)
- {
- DEBUG_INFO("[ERROR = %d (DEC)]V2gMsgDecoder: API_V2GMSG_EXI_Decoder_ISO2()\n", errn);
- }
- break;
- }
- default:
- break;
- }
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR = %d (DEC)]V2gMsgDecoder: Unexpected v2g_state\n", errn);
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param v2g_tx_stream
- * @param v2gObject
- * @return
- */
- int encode_din_V2GTP_stream(bitstream_t *v2g_tx_stream, struct dinEXIDocument *v2gObject)
- {
- int errn = 0;
- *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
- errn = encode_dinExiDocument(v2g_tx_stream, v2gObject);
- 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]write_v2gtpHeader(): %d (DEC)\n", errn);
- }
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm]encode_dinExiDocument(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param v2g_tx_stream
- * @param v2gObject
- * @return
- */
- int encode_iso1_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso1EXIDocument *v2gObject)
- {
- int errn = 0;
- *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
- errn = encode_iso1ExiDocument(v2g_tx_stream, v2gObject);
- 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]write_v2gtpHeader(): %d (DEC)\n", errn);
- }
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm]encode_iso1ExiDocument(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param v2g_tx_stream
- * @param v2gObject
- * @return
- */
- int encode_iso2_V2GTP_stream(bitstream_t *v2g_tx_stream, struct iso2EXIDocument *v2gObject)
- {
- int errn = 0;
- *v2g_tx_stream->pos = V2GTP_HEADER_LENGTH;
- errn = encode_iso2ExiDocument(v2g_tx_stream, v2gObject);
- 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]write_v2gtpHeader(): %d (DEC)\n", errn);
- }
- }
- else
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR][SeccComm]encode_iso2ExiDocument(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @param v2g_tx_stream
- * @param v2gObject
- * @return
- */
- int send_encoded_din_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct dinEXIDocument *v2gObject)
- {
- int errn = 0;
- // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
- errn = encode_din_V2GTP_stream(v2g_tx_stream, v2gObject);
- // STEP 2: =========== Send Response Packet ===========
- int rtn = 0;
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- if (rtn == v2g_tx_stream->size)
- {
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("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]Incomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n", rtn, v2g_tx_stream->size);
- }
- else
- {
- errn = rtn;
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR]send(): %d (DEC)\n", errn);
- }
- //STEP 3: ========= Reset V2G MSG Flags ==========
- init_dinBodyType(&v2gObject->V2G_Message.Body);
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @param v2g_tx_stream
- * @param v2gObject
- * @return
- */
- int send_encoded_iso1_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso1EXIDocument *v2gObject)
- {
- int errn = 0;
- // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
- errn = encode_iso1_V2GTP_stream(v2g_tx_stream, v2gObject);
- // STEP 2: =========== Send Response Packet ===========
- int rtn = 0;
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- if (rtn == v2g_tx_stream->size)
- {
- //DEBUG_PRINTF_EVCOMM_DETAIL("Response message 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]Incomplete Tx (%d/%d)(Bytes, DEC): FAIL\n", rtn, v2g_tx_stream->size);
- }
- else
- {
- errn = rtn;
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR]send(): %d(DEC)\n", errn);
- }
- //STEP 3: ========= Reset V2G MSG Flags ==========
- init_iso1BodyType(&v2gObject->V2G_Message.Body);
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @param v2g_tx_stream
- * @param v2gObject
- * @return
- */
- int send_encoded_iso2_V2GTP_Stream(int AcceptFd, bitstream_t *v2g_tx_stream, struct iso2EXIDocument *v2gObject)
- {
- int errn = 0;
- // STEP 1: =========== Encoding into EXI and Composing into V2GTP Stream ==========
- errn = encode_iso2_V2GTP_stream(v2g_tx_stream, v2gObject);
- // STEP 2: =========== Send Response Packet ===========
- int rtn = 0;
- rtn = send(AcceptFd, v2g_tx_stream->data, v2g_tx_stream->size, 0);
- if (rtn == v2g_tx_stream->size)
- {
- /*
- DEBUG_PRINTF_EVCOMM_DETAIL("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]Incomplete Tx ( %d / %d ). (Bytes, DEC): FAIL\n",
- rtn, v2g_tx_stream->size);
- }
- else
- {
- errn = rtn;
- DEBUG_PRINTF_EVCOMM_DETAIL("[ERROR]send(): %d (DEC)\n", errn);
- }
- //STEP 3: ========= Reset V2G MSG Flags ==========
- init_iso2BodyType(&v2gObject->V2G_Message.Body);
- return errn;
- }
- /**
- *
- * @param exi_doc_DIN
- * @return
- */
- 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
- {
- DEBUG_ERROR("SessionID: incorrect length(%d)\n", leng);
- 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
- {
- DEBUG_ERROR("SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)\n",
- 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]);
- }
- //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;
- }
- /**
- *
- * @param exi_doc_ISO1
- * @return
- */
- 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
- {
- DEBUG_ERROR("SessionID: incorrect length(%d)\n", leng);
- 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
- {
- DEBUG_ERROR("SessionID: incorrect ID (RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)\n",
- 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]);
- }
- //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;
- }
- /**
- *
- * @param exi_doc_ISO2
- * @return
- */
- 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
- {
- DEBUG_ERROR("SessionID: incorrect length(%d)\n", leng);
- 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
- {
- DEBUG_ERROR("SessionID: incorrect ID(RX:%02X%02X%02X%02X%02X%02X%02X%02X, ORI:%02X%02X%02X%02X%02X%02X%02X%02X)\n",
- 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]);
- }
- //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;
- }
- /**
- * 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?
- * @param target
- * @return
- */
- int GetSchemaID_of_Protocol(unsigned char target)
- {
- int i = 0;
- int ii = 0;
- int id = 0;
- unsigned char pri = 20; //priority = 1(highest)~20(lowerest)
- char num[10];
- //Choose the 1st protocol as default.
- 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)
- {
- DEBUG_INFO("support(%d/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)\n",
- (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);
- if (target == V2GT_MSG_PROTOCOL_DIN70121)
- {
- DEBUG_INFO("select(%d/%d): DIN 70121(%d:v%d.%d;id=%d,pri=%d)\n",
- (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);
- 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)
- {
- DEBUG_INFO("support(%d/%d): ISO 15118-2(ed1,%d:v%d.%d;id=%d,pri=%d)\n",
- (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);
- if (target == V2GT_MSG_PROTOCOL_ISO15118_2014)
- {
- DEBUG_INFO("select(%d/%d): ISO 15118-2,ed1(%d:v%d.%d;id=%d,pri=%d)\n",
- (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);
- 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
- {
- DEBUG_INFO("support(%d/%d): ISO 15118-20(ed2,%d:v%d.%d;id=%d,pri=%d)\n",
- (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);
- if (target == V2GT_MSG_PROTOCOL_ISO15118_2018)
- {
- DEBUG_INFO("select(%d/%d): ISO 15118-20,ed2(%d:v%d.%d;id=%d,pri=%d)\n",
- (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);
- 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
- DEBUG_INFO("unsupport(%d/%d): ISO 15118-X(unexpected year:%d,v%d.%d),id=%d,pri=%d\n",
- (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);
- }
- }
- else
- {
- DEBUG_INFO("unsupport protocol(%d/%d)(%d:v%d.%d;id=%d,pri=%d)\n",
- (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);
- }
- }
- //The final result of highest priority protocol
- DEBUG_INFO("select(%d/%d): pro=%d(0:DIN,1:ISO1,2:ISO2);id=%d,pri=%d\n",
- (ii+1),
- CCS_HANDSHAKE_PROTOCOLS.arrayLen,
- ShmCcsData->CommProtocol,
- id,
- pri);
- if (id < 0)
- {
- EVCOMM_SYS_INFO.SupportedAppProtocol_result = appHandresponseCodeType_Failed_NoNegotiation;
- }
- return id;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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(&v2gObject.appHandshake);
- v2gObject.appHandshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_OK_SuccessfulNegotiation;
- v2gObject.appHandshake.supportedAppProtocolRes_isUsed = 1u;
- //select the 1st one as the default
- v2gObject.appHandshake.supportedAppProtocolRes.SchemaID = CCS_HANDSHAKE_PROTOCOLS.array[0].SchemaID;
- v2gObject.appHandshake.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 ---*/
- v2gObject.appHandshake.supportedAppProtocolRes.ResponseCode = EVCOMM_SYS_INFO.SupportedAppProtocol_result; //updating the response code
- if (id < 0)
- {
- DEBUG_ERROR("No available CCS protocol (id = %d, preference = %d)\n", id, V2GT_MSG_PROTOCOL_PREFERENCE);
- }
- else
- {
- //selected SchemaID
- v2gObject.appHandshake.supportedAppProtocolRes.SchemaID = (unsigned char) id;
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- DEBUG_INFO("EVSE_Shutdown => End_Process\n");
- v2gObject.appHandshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- DEBUG_INFO("EVSE_EmergencyShutdown => End_Process\n");
- v2gObject.appHandshake.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)
- {
- DEBUG_ERROR("[DIN][supportedAppProtocolRes]Permission OFF\n");
- v2gObject.appHandshake.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
- {
- v2gObject.appHandshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- DEBUG_INFO("Emergency Stop by CP Error (%d, %.02f V)\n",
- sys->CpState,
- sys->CpVoltage);
- }
- }
- #else
- {
- //Detect for CP State should be 9V (State B)
- if (sys->CpState != 3) //B2
- {
- v2gObject.appHandshake.supportedAppProtocolRes.ResponseCode = appHandresponseCodeType_Failed_NoNegotiation;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- DEBUG_INFO("Emergency Stop by CP Error (%d, %.02f V)\n",
- sys->CpState,
- sys->CpVoltage);
- }
- }
- #endif
- }
- #endif
- //STEP 2: =========== Encode into EXI ===========
- if ((errn = API_V2GMSG_EXI_Encoder_AppProtocol(&v2gObject.appHandshake, &v2g_tx_stream)) !=0)
- {
- DEBUG_PRINTF_EVCOMM_DETAIL("[Error]API_V2GMSG_EXI_Encoder_AppProtocol\n");
- return errn;
- }
- //STEP 3: =========== Send Response Packet ===========
- int Rtn = 0;
- Rtn = send(AcceptFd, v2g_tx_stream.data, v2g_tx_stream.size, 0);
- //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 =========
- //[ 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(&v2gObject.appHandshake);
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_supportedAppProtocolReq(int AcceptFd)
- {
- //[ To-Do] analysis on Req message and choose the prefered protocol
- //Default: DIN 70121 (find SchemaID)
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- SHM_Save_din_supportedAppProtocolReq(ShmCcsData, &v2gObject.appHandshake, ShmSysConfigAndInfo);
- errn = Proc_supportedAppProtocolRes(AcceptFd);
- if (errn == 0)
- {
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_supportedAppProtocolRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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 = v2gBuffer.tx;
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinSessionSetupResType(&v2gObject.DIN.V2G_Message.Body.SessionSetupRes);
- // ====== [BODY (1/2) ResponseCode ======
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_OK_NewSessionEstablished;
- //[HEADER] Assign Res SessionID
- v2gObject.DIN.V2G_Message.Header.SessionID.bytesLen = 8;
- memset(v2gObject.DIN.V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(v2gObject.DIN.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError;
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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(&v2gObject.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
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- #else
- DEBUG_INFO("Emergency Stop by CP Error (%d): ignored\n", sys->CpState);
- #endif
- }
- //Check for shutdown commands from EVSE(DC Main Board)
- if (sys->DC_EVSEStatus == EVSE_Shutdown ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
- DEBUG_INFO("Stop by EVSE(%d:normal, %d:emergency): (%d)\n", EVSE_Shutdown, EVSE_EmergencyShutdown, sys->DC_EVSEStatus);
- 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)
- {
- DEBUG_ERROR("[DIN]Permission OFF");
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = dinresponseCodeType_FAILED;
- errn = -1;
- }
- // ====== [BODY (2/3) EVSEID ======
- //EVSEID = all zero
- memset(v2gObject.DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes, 0, sizeof(v2gObject.DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytes));
- //vern, should be encode by SN
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.EVSEID.bytesLen = 1; //max: DIN = 32, ISO1/ISO2 = 37 bytes
- // ====== [BODY (3/3) DateTimeNow ======
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow_isUsed = 1u;
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.DateTimeNow = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
- #if PARAMETER_NORMAL_MODE == ENABLE
- ///////////SHM_Read_din_SessionSetupRes(&v2gObject.DIN, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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 = v2gBuffer.tx;
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1SessionSetupResType(&v2gObject.ISO1.V2G_Message.Body.SessionSetupRes);
- // ====== [BODY (1/2) ResponseCode ======
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_OK_NewSessionEstablished;
- //[HEADER] Assign Res SessionID
- v2gObject.ISO1.V2G_Message.Header.SessionID.bytesLen = 8;
- memset(v2gObject.ISO1.V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(v2gObject.ISO1.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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(&v2gObject.ISO1, 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
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- #else
- DEBUG_INFO("Emergency Stop by CP Error (%d): ignored\n", sys->CpState);
- #endif
- }
- //Check for shutdown commands from EVSE(DC Main Board)
- if (sys->DC_EVSEStatus == EVSE_Shutdown ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
- DEBUG_INFO("Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
- EVSE_Shutdown,
- EVSE_EmergencyShutdown,
- sys->DC_EVSEStatus);
- errn = -1;
- }
- //Check for Permission Changing from TRUE to FALSE
- if (ShmInternalComm->ChargingPermission_pre == TRUE &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- DEBUG_ERROR("Permission OFF\n");
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED;
- errn = -1;
- }
- // ====== [BODY (2/3) EVSEID ======
- //EVSEID = all zero
- memset(v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
- /*+++ 20200808, vern, set default EVSEID +++*/
- //vern, should be encoded by SN
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[0]='Z';
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[1]='Z';
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[2]='0';
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[3]='0';
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[4]='0';
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[5]='0';
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.characters[6]='0';
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 7; //max: DIN = 32, ISO1/ISO2 = 37 bytes
- /*--- 20200808, vern, set default EVSEID ---*/
- // ====== [BODY (3/3) DateTimeNow ======
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
- #if PARAMETER_NORMAL_MODE == ENABLE
- ///////////SHM_Read_iso1_SessionSetupRes(&v2gObject.ISO1, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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 = v2gBuffer.tx;
- init_iso2BodyType(&v2gObject.ISO2.V2G_Message.Body);
- init_iso2SessionSetupResType(&v2gObject.ISO2.V2G_Message.Body.SessionSetupRes);
- // ====== [BODY (1/2) ResponseCode ======
- v2gObject.ISO2.V2G_Message.Body.SessionSetupRes_isUsed = 1u;
- v2gObject.ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_OK_NewSessionEstablished;
- //[HEADER] Assign Res SessionID
- v2gObject.ISO2.V2G_Message.Header.SessionID.bytesLen = 8;
- memset(v2gObject.ISO2.V2G_Message.Header.SessionID.bytes, 0, 8);
- memcpy(v2gObject.ISO2.V2G_Message.Header.SessionID.bytes, EVCOMM_SYS_INFO.SessionID, 8);
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.ISO1.V2G_Message.Body.SessionSetupRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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(&v2gObject.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
- v2gObject.ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- #else
- DEBUG_INFO("Emergency Stop by CP Error (%d): ignored\n", sys->CpState);
- #endif
- }
- //Check for shutdown commands from EVSE(DC Main Board)
- if (sys->DC_EVSEStatus == EVSE_Shutdown ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- v2gObject.ISO2.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
- DEBUG_INFO("Stop by EVSE(%d:normal, %d:emergency): (%d)\n",
- EVSE_Shutdown,
- EVSE_EmergencyShutdown,
- sys->DC_EVSEStatus);
- 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)
- {
- DEBUG_ERROR("Permission OFF\n");
- v2gObject.DIN.V2G_Message.Body.SessionSetupRes.ResponseCode = iso2responseCodeType_FAILED;
- errn = -1;
- }
- // ====== [BODY (2/3) EVSEID ======
- //EVSEID = all zero
- memset(v2gObject.ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters, 0, sizeof(v2gObject.ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.characters));
- v2gObject.ISO2.V2G_Message.Body.SessionSetupRes.EVSEID.charactersLen = 15; //max: DIN = 32, ISO1/ISO2 = 37 bytes
- // ====== [BODY (3/3) DateTimeNow ======
- v2gObject.ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed = 1u;
- v2gObject.ISO2.V2G_Message.Body.SessionSetupRes.EVSETimeStamp = (int64_t)time(NULL); //[Joseph] Format: Unix Time Stamp
- #if PARAMETER_NORMAL_MODE == ENABLE
- ///////////SHM_Read_iso2_SessionSetupRes(&v2gObject.ISO2, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso2_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &v2gObject.ISO2) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_SessionSetupReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_SessionSetupReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_SessionSetupReq(ShmCcsData, &v2gObject.DIN, ShmSysConfigAndInfo);
- errn = Proc_din_SessionSetupRes(AcceptFd);
- if (errn == 0)
- {
- //successfully send response.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_SessionSetupRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_SessionSetupReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_SessionSetupReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_SessionSetupReq(ShmCcsData, &v2gObject.ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_SessionSetupRes(AcceptFd);
- if (errn == 0)
- {
- //successfully send response.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_SessionSetupRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso2_SessionSetupReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO2_SessionSetupReq(&v2gObject.ISO2);
- //Save into Share Memory
- SHM_Save_iso2_SessionSetupReq(ShmCcsData, &v2gObject.ISO2, ShmSysConfigAndInfo);
- errn = Proc_iso2_SessionSetupRes(AcceptFd);
- if (errn == 0)
- {
- //successfully send response.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso2_SessionSetupRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_ServiceDiscoveryRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- //req = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryRequest;
- res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinServiceDiscoveryResType(&v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes);
- //[1/4] Response Code
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&v2gObject.DIN) < 0)
- {
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- #else
- DEBUG_INFO("Emergency Stop by CP Error (%d): ignored\n", sys->CpState);
- #endif
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
- DEBUG_INFO("shutdown by EVSE\n");
- 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)
- {
- DEBUG_ERROR("[DIN]Permission OFF\n");
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = dinresponseCodeType_FAILED;
- errn = -1;
- }
- //[2/4] PaymentOptions
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.arrayLen = 1u;
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptions.PaymentOption.array[0] = dinpaymentOptionType_ExternalPayment; //1
- //[3/4] Charge Service
- res->ChargeService_DIN70121.Services.ServiceTag.ServiceID = 1;
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceID = (unsigned short) res->ChargeService_DIN70121.Services.ServiceTag.ServiceID;
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceTag.ServiceCategory = dinserviceCategoryType_EVCharging;
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
- v2gObject.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(&v2gObject.DIN, ShmCcsData);
- //#endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_ServiceDiscoveryRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- //req = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryRequest;
- res = &ShmCcsData->V2GMessage_ISO15118_2014.ServiceDiscoveryResponse;
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1ServiceDiscoveryResType(&v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes);
- //[1/4] Response Code
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes_isUsed = 1u;
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&v2gObject.ISO1) < 0)
- {
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- #else
- DEBUG_INFO("Emergency Stop by CP Error (%d): ignored", sys->CpState);
- #endif
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
- DEBUG_INFO("shutdown by EVSE\n");
- 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)
- {
- DEBUG_ERROR("Permission OFF\n");
- v2gObject.DIN.V2G_Message.Body.ServiceDiscoveryRes.ResponseCode = iso1responseCodeType_FAILED;
- errn = -1;
- }
- //[2/4] PaymentOptionList
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.arrayLen = 1u;
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.PaymentOptionList.PaymentOption.array[0] = iso1paymentOptionType_ExternalPayment; //1
- //[3/4] Charge Service
- res->ChargeService.Services.ServiceID = 1;
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceID = (unsigned short) res->ChargeService.Services.ServiceID;
- //v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName_isUsed = 1; //new in ISO1, not be used, yet.
- //v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.charactersLen = xxx;
- //v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceName.characters[i] = xxx;
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.ServiceCategory = iso1serviceCategoryType_EVCharging;
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.FreeService = 1; //[Joseph] for test
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.arrayLen = 1u; // max = 6
- switch (ShmCcsData->EnergyTransferMode)
- {
- case DC_extended:
- {
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_DC_extended;
- break;
- }
- case AC_single_phase_core:
- {
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_single_phase_core;
- break;
- }
- case AC_three_phase_core:
- {
- v2gObject.ISO1.V2G_Message.Body.ServiceDiscoveryRes.ChargeService.SupportedEnergyTransferMode.EnergyTransferMode.array[0] = iso1EnergyTransferModeType_AC_three_phase_core;
- break;
- }
- default:
- {
- DEBUG_WARN("unexpected EnergyTransferMode(%d)\n", ShmCcsData->EnergyTransferMode);
- break;
- }
- }
- //[4/4] Service List (null, not be uesed for now.)
- //#if PARAMETER_NORMAL_MODE == ENABLE
- ///////////////SHM_Read_iso1_ServiceDiscoveryRes(&v2gObject.ISO1, ShmCcsData);
- //#endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_ServiceDiscoveryReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_ServiceDiscoveryReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_ServiceDiscoveryReq(ShmCcsData, &v2gObject.DIN, ShmSysConfigAndInfo);
- errn = Proc_din_ServiceDiscoveryRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_ServiceDiscoveryRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_ServiceDiscoveryReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_ServiceDiscoveryReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_ServiceDiscoveryReq(ShmCcsData, &v2gObject.ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_ServiceDiscoveryRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_ServiceDiscoveryRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_ServiceAndPaymentSelectionRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- req = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionRequest;
- //res = &ShmCcsData->V2GMessage_DIN70121.ServiceAndPaymentSelectionResponse;
- sd_res = &ShmCcsData->V2GMessage_DIN70121.ServiceDiscoveryResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinServicePaymentSelectionResType(&v2gObject.DIN.V2G_Message.Body.ServicePaymentSelectionRes);
- //[1/1] Response Code
- v2gObject.DIN.V2G_Message.Body.ServicePaymentSelectionRes_isUsed = 1u;
- v2gObject.DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&v2gObject.DIN) < 0)
- {
- v2gObject.DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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 != ExternalPayment) //1
- {
- v2gObject.DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_PaymentSelectionInvalid;
- DEBUG_ERROR("unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)\n", req->SelectedPaymentOption);
- 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)
- {
- v2gObject.DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED_ServiceSelectionInvalid; //8
- DEBUG_ERROR("Wrong selected ServiceID(%d) => End_Process\n", req->SelectedServiceList.SelectedService[0].ServiceID);
- 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
- v2gObject.DIN.V2G_Message.Body.ServicePaymentSelectionRes.ResponseCode = dinresponseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- #else
- DEBUG_INFO("Emergency Stop by CP Error (%d): ignored due to function is disabled\n", sys->CpState);
- #endif
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- DEBUG_INFO("shutdown by EVSE\n");
- v2gObject.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)
- {
- DEBUG_ERROR("Permission OFF\n");
- v2gObject.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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_ServiceAndPaymentSelectionRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1PaymentServiceSelectionResType(&v2gObject.ISO1.V2G_Message.Body.PaymentServiceSelectionRes);
- //[1/1] Response Code
- v2gObject.ISO1.V2G_Message.Body.PaymentServiceSelectionRes_isUsed = 1u;
- v2gObject.ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_OK;
- //[HEADER] Check Req SessionID
- if (Check_iso1_V2G_Rx_MSG_SessionID(&v2gObject.ISO1) < 0)
- {
- v2gObject.ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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 != ExternalPayment) //1
- {
- v2gObject.ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_PaymentSelectionInvalid;
- DEBUG_ERROR("unexpected SelectedPaymentOption(%d) => End_Process (EIM only, no PnC, yet.)\n", req->SelectedPaymentOption);
- 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.Services.ServiceID)
- {
- v2gObject.ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED_ServiceSelectionInvalid; //8
- DEBUG_ERROR("Wrong selected ServiceID(%d) => End_Process\n", req->SelectedServiceList.SelectedService[0].ServiceID);
- 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
- v2gObject.ISO1.V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode = iso1responseCodeType_FAILED;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- #else
- DEBUG_INFO("Emergency Stop by CP Error (%d): ignored due to function is disabled\n", sys->CpState);
- #endif
- }
- if (sys->DC_EVSEStatus == EVSE_Shutdown ||
- sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- DEBUG_INFO("shutdown by EVSE\n");
- v2gObject.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)
- {
- DEBUG_ERROR("Permission OFF\n");
- v2gObject.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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_ServiceAndPaymentSelectionReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_ServiceAndPaymentSelectionReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_ServiceAndPaymentSelectionReq(ShmCcsData, &v2gObject.DIN, ShmSysConfigAndInfo);
- errn = Proc_din_ServiceAndPaymentSelectionRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_ServiceAndPaymentSelectionRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_ServiceAndPaymentSelectionReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_ServiceAndPaymentSelectionReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_ServiceAndPaymentSelectionReq(ShmCcsData, &v2gObject.ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_ServiceAndPaymentSelectionRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_ServiceAndPaymentSelectionRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_ContractAuthenticationRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinContractAuthenticationResType(&v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes);
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes_isUsed = 1u;
- //[BODY (1/2)] ResponseCode
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_OK;
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Ongoing; //0
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&v2gObject.DIN) < 0)
- {
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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
- {
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- }
- #endif
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
- errn = -1;
- }
- //[BODY (2/2)] EVSEProcessing
- if(ShmInternalComm->ChargingPermission == TRUE)
- {
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished; //0
- DEBUG_INFO("CSU Permission: OK\n");
- #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
- {
- //Set PWM as 5% (for SLAC first case)
- DEBUG_INFO("Set PWM as 5%%\n");
- SwitchCpStateE(DISABLE);
- OutputCpPwmDuty(5);
- }
- #endif
- }
- //Check for Permission Changing from TRUE to FALSE
- if (ShmInternalComm->ChargingPermission_pre == TRUE &&
- ShmInternalComm->ChargingPermission == FALSE)
- {
- DEBUG_ERROR("Permission OFF\n");
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.ResponseCode = dinresponseCodeType_FAILED;
- v2gObject.DIN.V2G_Message.Body.ContractAuthenticationRes.EVSEProcessing = dinEVSEProcessingType_Finished;
- errn = -1;
- }
- #if PARAMETER_NORMAL_MODE == ENABLE
- ////////////SHM_Read_din_ContractAuthenticationRes(&v2gObject.DIN, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_din_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_AuthorizationRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1AuthorizationResType(&v2gObject.ISO1.V2G_Message.Body.AuthorizationRes);
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes_isUsed = 1u;
- //[BODY (1/2)] ResponseCode
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_OK;
- /*+++ 20200808, vern, EVSEProcessing should be waiting for Customer during authrization +++*/
- v2gObject.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(&v2gObject.ISO1) < 0)
- {
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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
- {
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = iso1responseCodeType_FAILED;
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d)\n", sys->CpState);
- }
- #endif
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
- errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
- errn = -1;
- }
- //[BODY (2/2)] EVSEProcessing
- //Check for Permission from CSU
- if(ShmInternalComm->ChargingPermission == TRUE)
- {
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished; //0
- DEBUG_INFO("CSU Permission: OK\n");
- #if (SLAC_FIRST_RESPONSE_METHOD == SET_5_PWM_ONCE_GET_PERMISSION_IN_AUTHORIZATIONRES)
- {
- //Set PWM as 5% (for SLAC first case)
- DEBUG_INFO("Set PWM as 5%%\n");
- 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)
- {
- DEBUG_ERROR("Permission OFF\n");
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.ResponseCode = FAILED_ISO15118_2014;
- v2gObject.ISO1.V2G_Message.Body.AuthorizationRes.EVSEProcessing = iso1EVSEProcessingType_Finished;
- errn = -1;
- }
- #if PARAMETER_NORMAL_MODE == ENABLE
- ////////////SHM_Read_iso1_AuthorizationRes(&v2gObject.ISO1, ShmCcsData);
- #endif
- // ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_ContractAuthenticationReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_ContractAuthenticationReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_ContractAuthenticationReq(ShmCcsData, &v2gObject.DIN, ShmSysConfigAndInfo);
- errn = Proc_din_ContractAuthenticationRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Resonse out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_ContractAuthenticationRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_AuthenticationReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_AuthorizationReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_AuthorizationReq(ShmCcsData, &v2gObject.ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_AuthorizationRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_AuthorizationRes(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param in
- */
- 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
- }
- /**
- *
- * @param obj
- * @param value
- * @param multiplier
- * @param unit
- */
- void SHM_Save_dinPhysicalValueType(struct PhysicalValueType_DIN70121 *obj, short value, int multiplier, unsigned char unit)
- {
- obj->Value = value;
- obj->Multiplier = multiplier;
- obj->Unit =unit;
- }
- /**
- *
- * @param shm_ccs
- */
- 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);
- }
- /**
- *
- */
- void Sudo_Parameter_din_ChargeParameterDiscoveryRes()
- {
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinChargeParameterDiscoveryResType(&v2gObject.DIN.V2G_Message.Body.ChargeParameterDiscoveryRes);
- v2gObject.DIN.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
- //----- [BODY (1/5)] ResponseCode -----
- struct dinChargeParameterDiscoveryResType *res;
- res = &v2gObject.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;
- */
- }
- /**
- *
- */
- void Sudo_Parameter_iso1_ChargeParameterDiscoveryRes()
- {
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1ChargeParameterDiscoveryResType(&v2gObject.ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes);
- v2gObject.ISO1.V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed = 1u;
- //----- [BODY (1/5)] ResponseCode -----
- struct iso1ChargeParameterDiscoveryResType *res;
- res = &v2gObject.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;
- */
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_ChargeParameterDiscoveryRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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(&v2gObject.DIN) < 0)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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)
- {
- DEBUG_ERROR("EvBatteryMaxCurrent is negative(%.02f) => End_Process\n", sys->EvBatteryMaxCurrent);
- 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, 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 != DC_extended)
- {
- DEBUG_ERROR("Wrong EVRequestedEnergyTransferType(%d,%d)\n", req->EVRequestedEnergyTransferType, dinEVSESupportedEnergyTransferType_DC_extended);
- 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_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)
- {
- DEBUG_INFO("EVSE_Shutdown\n");
- 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)
- {
- DEBUG_INFO("EVSE_EmergencyShutdown\n");
- 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_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d, %.02f V)\n", sys->CpState, sys->CpVoltage);
- }
- #endif
- //Check for Permission from CSU
- if (ShmInternalComm->ChargingPermission == TRUE)
- {
- res->EVSEProcessing = Finished_DIN70121;
- }
- //Check for Permission Off
- if (ShmInternalComm->ChargingPermission == FALSE)
- {
- DEBUG_ERROR("Permission OFF\n");
- 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(&v2gObject.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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STPE 5: ============ Update Flags ============
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_ChargeParameterDiscoveryRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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 = 10; //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(&v2gObject.ISO1) < 0)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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]
- /*+++ 20200808, vern, should check the voltage and current to see if the range of battery parameter is accepted by charger ---*/
- #ifdef TEST_WITH_ETH0
- if((ShmCcsData->EnergyTransferMode == MODE_DC_EXTENDED) && ((sys->EvBatteryMaxCurrent < 0) || (sys->EvBatteryMaxVoltage<150)))
- #else
- if ((sys->EvBatteryMaxCurrent < 0) ||(sys->EvBatteryMaxVoltage<150))
- #endif
- {
- DEBUG_ERROR("EvBatteryMaxCurrent is negative(%.02f) or EvBatteryMaxVoltage is under 150(%.02f)=> End_Process\n", sys->EvBatteryMaxCurrent, sys->EvBatteryMaxVoltage);
- 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 ============
- if(ShmCcsData->EnergyTransferMode == MODE_DC_EXTENDED)
- {
- //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, 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
- }
- else
- {
- //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->EVSENominalVoltage, (int) 220, V_ISO15118_2014);
- SAVE_PhysicalValueType_ISO15118_2014(&ac_para->EVSEMaxCurrent, (int) 48, A_ISO15118_2014);
- }
- //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.
- {
- DEBUG_ERROR("Unmatched RequestedEnergyTransferMode(%d,%d)\n",
- req->RequestedEnergyTransferMode,
- ShmCcsData->EnergyTransferMode);
- 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_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)
- {
- DEBUG_INFO("EVSE_Shutdown\n");
- 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)
- {
- DEBUG_INFO("EVSE_EmergencyShutdown\n");
- 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_Status(Other_Fault);
- errn = -1;
- DEBUG_INFO("Emergency Stop by CP Error (%d, %.02f V)\n", sys->CpState, sys->CpVoltage);
- }
- #endif
- //Check for Permission from CSU
- if(ShmInternalComm->ChargingPermission == TRUE)
- {
- res->EVSEProcessing = iso1EVSEProcessingType_Finished;
- }
- //Check for Permission Off
- if (ShmInternalComm->ChargingPermission == FALSE)
- {
- DEBUG_ERROR("Permission OFF\n");
- 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(&v2gObject.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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STPE 5: ============ Update Flags ============
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_ChargeParameterDiscoveryReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //ftime(&timerStart.SeqStart);
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_ChargeParameterDiscoveryReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_ChargeParameterDiscoveryReq(ShmCcsData, &v2gObject.DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.ChargeParameterDiscoveryRequest.DC_EVChargeParameter.DC_EVStatus.EVErrorCode);
- errn = Proc_din_ChargeParameterDiscoveryRes(AcceptFd);
- //ftime(&timerStart.SeqEnd);
- //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd));
- if ( errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_ChargeParameterDiscoveryRes() fail: %d (DEC)\n",errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_ChargeParameterDiscoveryReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //ftime(&timerStart.SeqStart);
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_ChargeParameterDiscoveryReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_ChargeParameterDiscoveryReq(ShmCcsData, &v2gObject.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(&timerStart.SeqEnd);
- //DEBUG_PRINTF_EVCOMM_DETAIL("\ndelta = %.02lf ms\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd));
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_ChargeParameterDiscoveryRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param shm_ccs
- */
- 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
- }
- /**
- *
- */
- void Sudo_Parameter_din_CableCheckRes()
- {
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinCableCheckResType(&v2gObject.DIN.V2G_Message.Body.CableCheckRes);
- v2gObject.DIN.V2G_Message.Body.CableCheckRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinCableCheckResType *res;
- res = &v2gObject.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
- }
- /**
- *
- */
- void Sudo_Parameter_iso1_CableCheckRes()
- {
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1CableCheckResType(&v2gObject.ISO1.V2G_Message.Body.CableCheckRes);
- v2gObject.ISO1.V2G_Message.Body.CableCheckRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1CableCheckResType *res;
- res = &v2gObject.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
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_CableCheckRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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(&v2gObject.DIN) < 0)
- {
- cab->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- cab->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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
- {
- DEBUG_INFO("[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)\n", sys->PresentChargingVoltage, sys->IsolationStatus);
- //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
- {
- DEBUG_WARN("unexpected IsolationStatus(%d)\n", sys->IsolationStatus);
- }
- 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;
- DEBUG_INFO("IsolationStatus = 3 (fault)\n");
- 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;
- DEBUG_INFO("Undefined Isolation Status(%d)\n", sys->IsolationStatus);
- }
- //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;
- DEBUG_INFO("EVSE_Shutdown\n");
- }
- 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;
- DEBUG_INFO("EVSE_EmergencyShutdown\n");
- }
- 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;
- DEBUG_ERROR("ChargingPermission = FALSE\n");
- }
- 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_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;
- DEBUG_INFO("Emergency Stop by CP Error (%d, %.02f V, %d)\n", sys->CpState, sys->CpVoltage, cab->cnt );
- //cab->cnt = 0;
- }
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_CableCheckRes(&v2gObject.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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_CableCheckRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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(&v2gObject.ISO1) < 0)
- {
- cab->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- cab->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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
- {
- DEBUG_INFO( "[V2G][CableCheck]Pass (V_now = %.02f, Isolated = %d)\n", sys->PresentChargingVoltage, sys->IsolationStatus);
- //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
- {
- DEBUG_WARN("unexpected IsolationStatus(%d)\n", sys->IsolationStatus);
- }
- 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;
- DEBUG_INFO("IsolationStatus = 3 (fault)\n");
- 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;
- DEBUG_INFO("Undefined Isolation Status.\n");
- }
- //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;
- DEBUG_INFO("EVSE_Shutdown\n");
- }
- 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;
- DEBUG_INFO("EVSE_EmergencyShutdown\n");
- }
- 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;
- DEBUG_ERROR("ChargingPermission = FALSE\n");
- }
- 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_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;
- DEBUG_INFO("Emergency Stop by CP Error (%d, %.02f V, %d)\n", sys->CpState, sys->CpVoltage, cab->cnt);
- //cab->cnt = 0;
- }
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_CableCheckRes(&v2gObject.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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- sys->ConnectorLocked = TRUE; //Inicating EVSE that the CCS Connector is Locked.
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_CableCheckReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_CableCheckReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_CableCheckReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_CableCheckRes() fail: %d (DEC)", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_CableCheckReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_CableCheckReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_CableCheckReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_CableCheckRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param shm_ccs
- */
- 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);
- }
- /**
- *
- */
- void Sudo_Parameter_din_PreChargeRes()
- {
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinPreChargeResType(&v2gObject.DIN.V2G_Message.Body.PreChargeRes);
- v2gObject.DIN.V2G_Message.Body.PreChargeRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinPreChargeResType *res;
- res = &v2gObject.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
- }
- /**
- *
- */
- void Sudo_Parameter_iso1_PreChargeRes()
- {
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1PreChargeResType(&v2gObject.ISO1.V2G_Message.Body.PreChargeRes);
- v2gObject.ISO1.V2G_Message.Body.PreChargeRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1PreChargeResType *res;
- res = &v2gObject.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
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_PreChargeRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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(&v2gObject.DIN) < 0)
- {
- pre->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- pre->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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
- {
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
- pre->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_ERROR("IsolationStatus = %d\n", sys->IsolationStatus);
- }
- 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
- {
- DEBUG_ERROR("GFD_Fault => Emergency Shutdown\n");
- 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_Status(Other_Fault);
- errn = -1;
- DEBUG_ERROR("IsolationStatus = %d (undefined)\n", sys->IsolationStatus);
- }
- //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)
- {
- DEBUG_ERROR("CCS GFD trip => EVSE_Shutdown\n");
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- }
- else
- {
- DEBUG_ERROR("EVSE_Shutdown\n");
- 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)
- {
- DEBUG_ERROR("CCS GFD trip => EVSE_EmergencyShutdown\n");
- pre->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- }
- else
- {
- DEBUG_ERROR("EVSE_EmergencyShutdown\n");
- 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)
- {
- DEBUG_ERROR("ChargingPermission = FALSE\n");
- 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_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;
- DEBUG_ERROR("Emergency Stop by CP Error (%d, %.02f V)\n", sys->CpState, sys->CpVoltage);
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_PreChargeRes(&v2gObject.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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_PreChargeRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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(&v2gObject.ISO1) < 0)
- {
- pre->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- pre->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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)
- {
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
- pre->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_Status(Other_Fault);
- errn = -1;
- DEBUG_ERROR("IsolationStatus = %d\n", sys->IsolationStatus);
- }
- 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
- {
- DEBUG_ERROR("GFD_Fault => Emergency Shutdown\n");
- 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_Status(Other_Fault);
- errn = -1;
- DEBUG_ERROR("IsolationStatus = %d (undefined)\n", sys->IsolationStatus);
- }
- //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)
- {
- DEBUG_ERROR("CCS GFD trip => EVSE_Shutdown\n");
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- }
- else
- {
- DEBUG_ERROR("EVSE_Shutdown\n");
- 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)
- {
- DEBUG_ERROR("CCS GFD trip => EVSE_EmergencyShutdown\n");
- pre->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- }
- else
- {
- DEBUG_ERROR("EVSE_EmergencyShutdown\n");
- 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)
- {
- DEBUG_ERROR("ChargingPermission = FALSE\n");
- 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_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;
- DEBUG_ERROR("Emergency Stop by CP Error (%d, %.02f V)\n", sys->CpState, sys->CpVoltage);
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_PreChargeRes(&v2gObject.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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_PreChargeReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_PreChargeReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_PreChargeReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_PreChargeRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_PreChargeReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_PreChargeReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_PreChargeReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_PreChargeRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param shm_ccs
- */
- 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);
- }
- /**
- *
- */
- void Sudo_Parameter_din_PowerDeliveryRes()
- {
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinPowerDeliveryResType(&v2gObject.DIN.V2G_Message.Body.PowerDeliveryRes);
- v2gObject.DIN.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinPowerDeliveryResType *res;
- res = &v2gObject.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
- }
- /**
- *
- */
- void Sudo_Parameter_iso1_PowerDeliveryRes()
- {
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1PowerDeliveryResType(&v2gObject.ISO1.V2G_Message.Body.PowerDeliveryRes);
- v2gObject.ISO1.V2G_Message.Body.PowerDeliveryRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1PowerDeliveryResType *res;
- res = &v2gObject.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
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_PowerDeliveryStartRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- res = &v2gObject.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(&v2gObject.DIN) < 0)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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(&v2gObject.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;
- }
- 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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_PowerDeliveryStartRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- res = &v2gObject.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(&v2gObject.ISO1) < 0)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- 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(&v2gObject.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;
- }
- 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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_PowerDeliveryStartReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_PowerDeliveryReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_PowerDeliveryReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_PowerDeliveryStartRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_PowerDeliveryStartReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_PowerDeliveryReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_PowerDeliveryStartRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param shm_ccs
- */
- 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);
- }
- /**
- *
- */
- void Sudo_Parameter_din_CurrentDemandRes()
- {
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinCurrentDemandResType(&v2gObject.DIN.V2G_Message.Body.CurrentDemandRes);
- v2gObject.DIN.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
- //----- [BODY (1/10)] ResponseCode -----
- struct dinCurrentDemandResType *res;
- res = &v2gObject.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;
- }
- /**
- *
- */
- void Sudo_Parameter_iso1_CurrentDemandRes()
- {
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1CurrentDemandResType(&v2gObject.ISO1.V2G_Message.Body.CurrentDemandRes);
- v2gObject.ISO1.V2G_Message.Body.CurrentDemandRes_isUsed = 1u;
- //----- [BODY (1/10)] ResponseCode -----
- struct iso1CurrentDemandResType *res;
- res = &v2gObject.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;
- }
- /**
- *
- */
- void Sudo_Parameter_iso1_ChargingStatusRes()
- {
- //int i = 0;
- struct iso1ChargingStatusResType *res;
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1ChargingStatusResType(&v2gObject.ISO1.V2G_Message.Body.ChargingStatusRes);
- res = &v2gObject.ISO1.V2G_Message.Body.ChargingStatusRes;
- v2gObject.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((char*)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((char*)res->MeterInfo.MeterID , CCS_AC_METER_ID);
- //[MeterInfo][2/5] SigMeterReading (optional)
- //sprintf((char*)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
- }
- /**
- *
- * @param code
- */
- void Check_EVErrorCode(int code)
- {
- if (code != NO_ERROR) //NO_ERROR = 0
- {
- //Asking CSU to Stop
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- //Update_V2G_Status(Other_Fault);
- DEBUG_INFO("Stop by EV (EVErrorCode = %d (DEC))\n", code);
- }
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_CurrentDemandRes(int AcceptFd)
- {
- //[ 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;
- static struct CurrentDemandResponse_DIN70121 *cur;
- static struct ChargingInfoData *sys;
- // int i = 0;
- // 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 = v2gBuffer.tx;
- 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(&v2gObject.DIN) < 0)
- {
- cur->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- cur->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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)
- {
- DEBUG_ERROR("EvBatteryMaxCurrent is negative(%.02f) => End_Process\n", sys->EvBatteryMaxCurrent);
- 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)
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Invalid; //0
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- DEBUG_ERROR("IsolationStatus = %d\n", sys->IsolationStatus);
- Update_V2G_Status(Other_Fault);
- errn = -1;
- }
- 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;
- DEBUG_ERROR("GFD_Fault => Emergency Shutdown\n");
- Update_V2G_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;
- DEBUG_ERROR("IsolationStatus = %d(undefined)\n", sys->IsolationStatus);
- Update_V2G_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)
- {
- DEBUG_ERROR("[DIN]CCS GFD trip => EVSE_Shutdown\n");
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- }
- else
- {
- DEBUG_ERROR("[DIN]]EVSE_Shutdown\n");
- 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)
- {
- DEBUG_INFO("[DIN]]CCS GFD trip => EVSE_EmergencyShutdown\n");
- cur->DC_EVSEStatus.EVSEIsolationStatus = dinisolationLevelType_Fault;
- }
- else
- {
- DEBUG_ERROR("[DIN]EVSE_EmergencyShutdown\n");
- 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)
- {
- DEBUG_ERROR("[DIN]Permission OFF\n");
- //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)
- {
- cur->ResponseCode = FAILED_DIN70121;
- cur->DC_EVSEStatus.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_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;
- DEBUG_INFO("Emergency Stop by CP Error (%d, %.02f V)\n", sys->CpState, sys->CpVoltage);
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_CurrentDemandRes(&v2gObject.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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_CurrentDemandRes(int AcceptFd)
- {
- //[ 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;
- static struct CurrentDemandResponse_ISO15118_2014 *cur;
- static struct ChargingInfoData *sys;
- // int i = 0;
- // 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 = v2gBuffer.tx;
- 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(&v2gObject.ISO1) < 0)
- {
- cur->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- cur->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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)
- {
- DEBUG_ERROR("EvBatteryMaxCurrent is negative(%.02f) => End_Process\n", sys->EvBatteryMaxCurrent);
- 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)
- {
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- DEBUG_ERROR("IsolationStatus = %d\n", sys->IsolationStatus);
- Update_V2G_Status(Other_Fault);
- errn = -1;
- }
- 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 = dinisolationLevelType_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;
- DEBUG_ERROR("GFD_Fault => EmergencyShutdown\n");
- Update_V2G_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;
- DEBUG_ERROR("IsolationStatus = %d(undefined)\n", sys->IsolationStatus);
- Update_V2G_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)
- {
- DEBUG_ERROR("CCS GFD trip => EVSE_Shutdown\n");
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- }
- else
- {
- DEBUG_ERROR("EVSE_Shutdown\n");
- 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)
- {
- DEBUG_ERROR("CCS GFD trip => EVSE_EmergencyShutdown\n");
- cur->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Fault;
- }
- else
- {
- DEBUG_ERROR("EVSE_EmergencyShutdown\n");
- 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)
- {
- DEBUG_ERROR("Permission OFF\n");
- //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)
- {
- cur->ResponseCode = FAILED_ISO15118_2014;
- cur->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- Update_V2G_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;
- DEBUG_INFO("[CurrentDemand]Emergency Stop by CP Error (%d, %.02f V)\n", sys->CpState, sys->CpVoltage);
- }
- #endif
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_CurrentDemandRes(&v2gObject.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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_ChargingStatusRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- res = &ShmCcsData->V2GMessage_ISO15118_2014.ChargingStatusResponse;
- sys = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[0];
- //Init
- res->ResponseCode = OK_ISO15118_2014;
- res->ReceiptRequired = FALSE; //optional
- res->SAScheduleTupleID = 0;
- 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(&v2gObject.ISO1) < 0)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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));
- sprintf((char*)res->EVSEID, CCS_AC_EVSEID);
- //[MeterInfo][0/5] init
- //memset(res->MeterInfo.MeterID, 0, sizeof(res->MeterInfo.MeterID));
- //memset(res->MeterInfo.SigMeterReading, 0, sizeof(res->MeterInfo.SigMeterReading));
- //[MeterInfo][1/5] MeterID
- //sprintf((char*)res->MeterInfo.MeterID, CCS_AC_METER_ID);
- //[MeterInfo][2/5] SigMeterReading (optional)
- //sprintf((char*)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
- //STEP 2: ============ Modify Parameter of ShmCcsData ============
- if(ShmCcsData->EnergyTransferMode == MODE_DC_EXTENDED)
- {
- SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
- //Isolation Status (RCD)
- if (sys->IsolationStatus == 0) //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;
- DEBUG_ERROR("IsolationStatus: %d\n", sys->IsolationStatus);
- Update_V2G_Status(Other_Fault);
- errn = -1;
- }
- else if (sys->IsolationStatus == 1) //Isolation is valid
- {
- res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- }
- else
- {
- res->AC_EVSEStatus.RCD = TRUE; //FALSE(no error), TRUE(error is detected)
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- DEBUG_ERROR("IsolationStatus = %d(undefined)\n", sys->IsolationStatus);
- Update_V2G_Status(Other_Fault);
- errn = -1;
- }
- //Check for CSU command of "Stop by EVSE"
- if (sys->DC_EVSEStatus == EVSE_Shutdown)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- //errn = -1;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- //errn = -1;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- //errn = -1;
- }
- //Response to CP Error
- #if CP_PROTECTION_MECHANISM == ENABLE
- if ((sys->CpState != 4) && (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_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;
- DEBUG_INFO("Emergency Stop by CP Error (%d, %.02f V)\n", sys->CpState, sys->CpVoltage);
- }
- #endif
- }
- else
- {
- SAVE_PhysicalValueType_ISO15118_2014(&res->EVSEMaxCurrent, (int)(sys->AvailableChargingCurrent * 10), A_ISO15118_2014);
- //Isolation Status (RCD)
- res->AC_EVSEStatus.RCD = FALSE; //FALSE(no error), TRUE(error is detected)
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- //Check for CSU command of "Stop by EVSE"
- if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //res->ResponseCode = FAILED_ISO15118_2014;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_StopCharging;
- //errn = -1;
- }
- //Response to CP Error
- #if CP_PROTECTION_MECHANISM == ENABLE
- if((sys->CpState != 3) && (sys->CpState != 4) && (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_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;
- DEBUG_ERROR("Emergency Stop by CP Error (%d, %.02f V)\n", sys->CpState, sys->CpVoltage);
- }
- #endif
- }
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_ChargingStatusRes(&v2gObject.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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_CurrentDemandReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("[V2G[RX]]CurrentDemandReq\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_CurrentDemandReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_CurrentDemandReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("[V2G][TX]CurrentDemandRes\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_CurrentDemandRes fail: (%d,DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_CurrentDemandReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_CurrentDemandReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_CurrentDemandReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_CurrentDemandRes fail: (%d,DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_ChargingStatusReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_ChargingStatusReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_ChargingStatusReq(ShmCcsData, &v2gObject.ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- //no content in ISO1
- errn = Proc_iso1_ChargingStatusRes(AcceptFd);
- if (errn == 0)
- {
- //Response is sent successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_ChargingStatusRes() fail: (%d,DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_PowerDeliveryStopRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- res = &v2gObject.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(&v2gObject.DIN) < 0)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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(&v2gObject.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;
- }
- 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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_PowerDeliveryStopRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- res = &v2gObject.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(&v2gObject.ISO1) < 0)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- res->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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(ShmCcsData->EnergyTransferMode == MODE_DC_EXTENDED)
- {
- #if PARAMETER_NORMAL_MODE == ENABLE
- ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryResponse.DC_EVSEStatus.DC_EVSEStatusCode = EVSE_NotReady;
- SHM_Read_iso1_PowerDeliveryRes(&v2gObject.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;
- }
- 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 ---*/
- }
- }
- else
- {
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_PowerDeliveryRes(&v2gObject.ISO1, ShmCcsData);
- #endif
- //EVSE Status Code
- res->AC_EVSEStatus.RCD = 0;
- res->AC_EVSEStatus.EVSENotification = iso1EVSENotificationType_None;
- res->AC_EVSEStatus.NotificationMaxDelay = 10;
- }
- //STEP 4: ============ Encode and Send Response Message ===========
- if (send_encoded_iso1_V2GTP_Stream(AcceptFd, &v2g_tx_stream, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_PowerDeliveryStopReq(int AcceptFd)
- {
- int errn = 0;
- //Request CSU to STOP
- //This should be reponsed as soon as possible once this message is received.
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
- EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_PowerDeliveryReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_PowerDeliveryReq(ShmCcsData, &v2gObject.DIN, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_DIN70121.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
- //[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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_PowerDeliveryStopRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_PowerDeliveryStopReq(int AcceptFd)
- {
- int errn = 0;
- //Request CSU to STOP
- //This should be reponsed as soon as possible once this message is received.
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- EVCOMM_SYS_INFO.EvBatterytargetVoltage = 0;
- EVCOMM_SYS_INFO.EvBatterytargetCurrent = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_PowerDeliveryReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_PowerDeliveryReq(ShmCcsData, &v2gObject.ISO1, ShmSysConfigAndInfo);
- //Check for EV Error Code
- Check_EVErrorCode(ShmCcsData->V2GMessage_ISO15118_2014.PowerDeliveryRequest.DC_EVPowerDeliveryParameter.DC_EVStatus.EVErrorCode);
- //[To-Do] Sending response after the EVSE output voltage decreases to under 60V
- usleep(1500000); //1.5 seconds
- //sleep(1); //1 second
- errn = Proc_iso1_PowerDeliveryStopRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_PowerDeliveryStopRes fail(): %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param shm_ccs
- */
- 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);
- }
- /**
- *
- */
- void Sudo_Parameter_din_WeldingDetectionRes()
- {
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinWeldingDetectionResType(&v2gObject.DIN.V2G_Message.Body.WeldingDetectionRes);
- v2gObject.DIN.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinWeldingDetectionResType *res;
- res = &v2gObject.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
- }
- /**
- *
- */
- void Sudo_Parameter_iso1_WeldingDetectionRes()
- {
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1WeldingDetectionResType(&v2gObject.ISO1.V2G_Message.Body.WeldingDetectionRes);
- v2gObject.ISO1.V2G_Message.Body.WeldingDetectionRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1WeldingDetectionResType *res;
- res = &v2gObject.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
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_WeldingDetectionRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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(&v2gObject.DIN) < 0)
- {
- wel->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- wel->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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;
- }
- 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.EVSEStatusCode = dinDC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- DEBUG_ERROR("IsolationStatus = %d\n", sys->IsolationStatus);
- Update_V2G_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;
- DEBUG_ERROR("GFD_Fault => Emergency Shutdown\n");
- Update_V2G_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;
- DEBUG_ERROR("IsolationStatus = %d(undefined)\n", sys->IsolationStatus);
- Update_V2G_Status(Other_Fault);
- errn = -1;
- }
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_din_WeldingDetectionRes(&v2gObject.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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_WeldingDetectionRes(int AcceptFd)
- {
- //[ 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 = v2gBuffer.tx;
- 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(&v2gObject.ISO1) < 0)
- {
- wel->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- wel->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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_Shutdown;
- }
- else if (sys->DC_EVSEStatus == EVSE_EmergencyShutdown)
- {
- //wel->ResponseCode = FAILED_ISO15118_2014;
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- }
- else if (ShmInternalComm->ChargingPermission == FALSE)
- {
- //wel->ResponseCode = FAILED_ISO15118_2014;
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_Shutdown;
- }
- //Isolation Status
- if (sys->IsolationStatus == GFD_Invalid) //0: invalid (on going)
- {
- wel->DC_EVSEStatus.EVSEIsolationStatus = iso1isolationLevelType_Invalid; //0
- wel->DC_EVSEStatus.DC_EVSEStatusCode = iso1DC_EVSEStatusCodeType_EVSE_EmergencyShutdown;
- CSUCOMMDC_TASK_FLAG.Send_EVStopReq = TRUE;
- DEBUG_ERROR("IsolationStatus = %d\n", sys->IsolationStatus);
- Update_V2G_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;
- DEBUG_ERROR("GFD_Fault => EmergencyShutdown\n");
- Update_V2G_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;
- DEBUG_ERROR("IsolationStatus = %d(undefined)\n", sys->IsolationStatus);
- Update_V2G_Status(Other_Fault);
- errn = -1;
- }
- //STEP 3: ============ Save Parameters from ShmCcsData to EXI Engine Buffer ============
- #if PARAMETER_NORMAL_MODE == ENABLE
- SHM_Read_iso1_WeldingDetectionRes(&v2gObject.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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //STEP 5: ============ Update Flags ===========
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_WeldingDetectionReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_WeldingDetectionReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_WeldingDetectionReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_WeldingDetectionRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_WeldingDetectionReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_WeldingDetectionReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_WeldingDetectionReq(ShmCcsData, &v2gObject.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.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_WeldingDetectionRes() fail: %d (DEC)", errn);
- }
- return errn;
- }
- /**
- *
- * @param shm_ccs
- */
- 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;
- }
- /**
- *
- */
- void Sudo_Parameter_din_SessionStopRes()
- {
- init_dinBodyType(&v2gObject.DIN.V2G_Message.Body);
- init_dinSessionStopResType(&v2gObject.DIN.V2G_Message.Body.SessionStopRes);
- v2gObject.DIN.V2G_Message.Body.SessionStopRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct dinSessionStopResType *res;
- res = &v2gObject.DIN.V2G_Message.Body.SessionStopRes;
- res->ResponseCode = dinresponseCodeType_OK;
- }
- /**
- *
- */
- void Sudo_Parameter_iso1_SessionStopRes()
- {
- init_iso1BodyType(&v2gObject.ISO1.V2G_Message.Body);
- init_iso1SessionStopResType(&v2gObject.ISO1.V2G_Message.Body.SessionStopRes);
- v2gObject.ISO1.V2G_Message.Body.SessionStopRes_isUsed = 1u;
- //----- [BODY (1/3)] ResponseCode -----
- struct iso1SessionStopResType *res;
- res = &v2gObject.ISO1.V2G_Message.Body.SessionStopRes;
- res->ResponseCode = iso1responseCodeType_OK;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_SessionStopRes(int AcceptFd)
- {
- //[ 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;
- 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 = v2gBuffer.tx;
- stp = &ShmCcsData->V2GMessage_DIN70121.SessionStopResponse;
- stp->ResponseCode = OK_DIN70121;
- //[HEADER] Check Req SessionID
- if (Check_din_V2G_Rx_MSG_SessionID(&v2gObject.DIN) < 0)
- {
- stp->ResponseCode = dinresponseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- stp->ResponseCode = dinresponseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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(&v2gObject.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, &v2gObject.DIN) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //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
- for(int idx=3;idx>0;idx++)
- {
- DEBUG_INFO("PWM 5\%% countdown: %d\n", idx);
- sleep(1);
- }
- 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;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_SessionStopRes(int AcceptFd)
- {
- //[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 = v2gBuffer.tx;
- 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(&v2gObject.ISO1) < 0)
- {
- stp->ResponseCode = iso1responseCodeType_FAILED_UnknownSession; //6
- DEBUG_ERROR("unmatched SessionID => End_Process\n");
- errn = -1;
- }
- //Check for SequenceError
- if (EVCOMM_SYS_INFO.SequenceError == TRUE)
- {
- stp->ResponseCode = iso1responseCodeType_FAILED_SequenceError; //5
- DEBUG_ERROR("SequenceError => End_Process\n");
- 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(&v2gObject.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, &v2gObject.ISO1) != 0)
- {
- DEBUG_ERROR("Tx encoded msg error\n");
- errn = -1;
- }
- //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
- for(int idx=2;idx>0;idx--)
- {
- DEBUG_INFO("PWM 5\%% count down: %d\n", idx);
- sleep(1);
- }
- 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;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_din_SessionStopReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_DIN_SessionStopReq(&v2gObject.DIN);
- //Save into Share Memory
- SHM_Save_din_SessionStopReq(ShmCcsData, &v2gObject.DIN, ShmSysConfigAndInfo);
- errn = Proc_din_SessionStopRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_din_SessionStopRes() fail: %d (DEC)", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int Proc_iso1_SessionStopReq(int AcceptFd)
- {
- int errn = 0;
- DEBUG_INFO("Request in.\n");
- //Print the decoded XML Document
- PRINT_XML_DOC_ISO1_SessionStopReq(&v2gObject.ISO1);
- //Save into Share Memory
- SHM_Save_iso1_SessionStopReq(ShmCcsData, &v2gObject.ISO1, ShmSysConfigAndInfo);
- errn = Proc_iso1_SessionStopRes(AcceptFd);
- if (errn == 0)
- {
- //send response successfully.
- DEBUG_INFO("Response out.\n");
- }
- else
- {
- DEBUG_ERROR("Proc_iso1_SessionStopRes() fail: %d (DEC)\n", errn);
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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 (v2gObject.appHandshake.supportedAppProtocolReq_isUsed == 1u)
- {
- v2gObject.appHandshake.supportedAppProtocolReq_isUsed = 0;
- if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- Update_V2G_Status(SupportedAppProtocolResponse);
- }
- else
- {
- DEBUG_ERROR("supportedAppProtocolResReq: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- req_is_responsed = TRUE;
- break;
- }
- case SupportedAppProtocolResponse:
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case SessionSetupRequest: //19
- {
- if (Proc_din_SessionSetupReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionSetupResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionSetupReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionSetupResponse: //20
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case ServiceDiscoveryRequest: //21
- {
- if (Proc_din_ServiceDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ServiceDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ServiceDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceDiscoveryResponse: //22
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case ServiceAndPaymentSelectionRequest: //25
- {
- if (Proc_din_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ServiceAndPaymentSelectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ServiceAndPaymentSelectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceAndPaymentSelectionResponse: //26
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- //case ContractAuthenticationReq:
- case AuthorizationRequest: //29
- {
- if (Proc_din_ContractAuthenticationReq(AcceptFd) == 0)
- {
- Update_V2G_Status(AuthorizationResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("AuthorizationReqRes: fail\n");
- Update_V2G_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
- {
- DEBUG_ERROR("AuthorizationReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //Check for ChargeParameterDiscoveryReq
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Status(ChargeParameterDiscoveryRequest);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case ChargeParameterDiscoveryRequest: //35
- {
- if (Proc_din_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ChargeParameterDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ChargeParameterDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargeParameterDiscoveryResponse:
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
- {
- DEBUG_ERROR("ChargingParameter Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_ChargingParameter_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("ChargeParameterDiscoveryReqRes: fail\n");
- Update_V2G_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;
- DEBUG_INFO("[V2G][RX]CableCheckReqReq: isolated?\n");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- Update_V2G_Status(CableCheckRequest);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #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_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(&timerStart.SeqStart);
- #endif
- if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case CableCheckRequest: //37
- {
- //STEP 3: Execute Cable Check Process
- if (Proc_din_CableCheckReq(AcceptFd) == 0)
- {
- Update_V2G_Status(CableCheckResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("CableCheckReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CableCheckResponse: //38
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
- {
- //DEBUG_INFO("[CableCheck] end counting...\n");
- DEBUG_ERROR("CableCheck Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_CableCheck_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("CableCheckReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //STEP 3: Check for PreChargeReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Status(PreChargeRequest);
- DEBUG_INFO("[V2G][RX]PreChargeReqReq: waiting for pre-charge voltage...\n");
- 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(&timerStart.SeqStart);
- #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_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(&timerStart.SeqStart);
- #endif
- if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case PreChargeRequest: //39
- {
- if (Proc_din_PreChargeReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PreChargeResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PreChargeReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PreChargeResponse: //40
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
- {
- DEBUG_ERROR("Precharge Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_PreCharge_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("PreChargeReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //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_Status(PowerDeliveryRequestStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStart: //41
- {
- if (Proc_din_PowerDeliveryStartReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponsetStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStartReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponsetStart: //42
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- if (v2gObject.DIN.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
- {
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > 2000) //5 seconds
- {
- DEBUG_ERROR("Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), 2000);
- Update_V2G_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_Status(CurrentDemandRequest);
- DEBUG_INFO("[V2G][RX]CurrentDemandReqReq: energy transfering...\n");
- 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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case CurrentDemandRequest: //45,
- {
- if (Proc_din_CurrentDemandReq(AcceptFd) == 0)
- {
- Update_V2G_Status(CurrentDemandResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("CurrentDemandReqRes: fail\n");
- Update_V2G_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
- {
- DEBUG_ERROR("CurrentDemandReqRes: fail\n");
- Update_V2G_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_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(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStop: //49,
- {
- if (Proc_din_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponseStop: //50,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > 2000) //2 seconds
- {
- DEBUG_ERROR("Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), 2000);
- Update_V2G_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_Status(WeldingDetectionRequest);
- DEBUG_INFO("[V2G][RX]WeldingDetectionReq: ongoing...\n");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_din_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case WeldingDetectionRequest: //51,
- {
- if (Proc_din_WeldingDetectionReq(AcceptFd) == 0)
- {
- Update_V2G_Status(WeldingDetectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("WeldingDetectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case WeldingDetectionResponse: //52,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
- {
- DEBUG_ERROR("Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_WeldingDetection_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("WeldingDetectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //STEP 3: Check for SessionStopReq Message
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case SessionStopRequest: //53,
- {
- if (Proc_din_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionStopResponse: //54,
- {
- break;
- }
- //-------------------------------------------
- default:
- {
- break;
- }
- }
- usleep(1000);
- }
- return 0;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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 (v2gObject.appHandshake.supportedAppProtocolReq_isUsed == 1u)
- {
- v2gObject.appHandshake.supportedAppProtocolReq_isUsed = 0;
- if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- Update_V2G_Status(SupportedAppProtocolResponse);
- }
- else
- {
- DEBUG_ERROR("supportedAppProtocolResReq: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- req_is_responsed = TRUE;
- break;
- }
- case SupportedAppProtocolResponse:
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case SessionSetupRequest: //19
- {
- if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionSetupResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionSetupReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionSetupResponse: //20
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case ServiceDiscoveryRequest: //21
- {
- if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ServiceDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ServiceDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceDiscoveryResponse: //22
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case ServiceAndPaymentSelectionRequest: //25
- {
- if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ServiceAndPaymentSelectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ServiceAndPaymentSelectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceAndPaymentSelectionResponse: //26
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- //case ContractAuthenticationReq:
- case AuthorizationRequest: //29
- {
- if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
- {
- Update_V2G_Status(AuthorizationResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("AuthorizationReqRes: fail\n");
- Update_V2G_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
- {
- DEBUG_ERROR("AuthorizationReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //Check for ChargeParameterDiscoveryReq
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Status(ChargeParameterDiscoveryRequest);
- DEBUG_INFO("[V2G][RX]ChargeParameterDiscoveryReq: CSU Permission?\n");
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case ChargeParameterDiscoveryRequest: //35
- {
- if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ChargeParameterDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ChargeParameterDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargeParameterDiscoveryResponse:
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
- {
- DEBUG_ERROR("ChargingParameter Timeout - (%.02lf of %d ms)\n",
- DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd),
- V2G_SECC_ChargingParameter_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("ChargeParameterDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //STEP 2: Check for CableCheckReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == CableCheckRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- DEBUG_INFO("[V2G][RX]CableCheckReqReq: isolated?\n");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_Start);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_CableCheck_Timer_End);
- Update_V2G_Status(CableCheckRequest);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #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_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(&timerStart.SeqStart);
- #endif
- if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case CableCheckRequest: //37
- {
- //STEP 3: Execute Cable Check Process
- if (Proc_iso1_CableCheckReq(AcceptFd) == 0)
- {
- Update_V2G_Status(CableCheckResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("CableCheckReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CableCheckResponse: //38
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
- {
- //DEBUG_INFO("[CableCheck] end counting...\n");
- DEBUG_ERROR("CableCheck Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_CableCheck_Performance_Time);
- Update_V2G_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_iso1_CableCheckReq(AcceptFd) == 0)
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("CableCheckReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //STEP 3: Check for PreChargeReq message
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == PreChargeRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Status(PreChargeRequest);
- DEBUG_INFO("[V2G][RX]PreChargeReqReq: waiting for pre-charge voltage...\n");
- 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(&timerStart.SeqStart);
- #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_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(&timerStart.SeqStart);
- #endif
- if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case PreChargeRequest: //39
- {
- if (Proc_iso1_PreChargeReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PreChargeResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PreChargeReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PreChargeResponse: //40
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
- {
- DEBUG_ERROR("Precharge Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_PreCharge_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("PreChargeReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //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_Status(PowerDeliveryRequestStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStart: //41
- {
- if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponsetStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStartReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponsetStart: //42
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- if (v2gObject.ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
- {
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > 2000) //5 seconds
- {
- DEBUG_ERROR("Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), 2000);
- Update_V2G_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_Status(CurrentDemandRequest);
- DEBUG_INFO("[V2G][RX]CurrentDemandReqReq: energy transfering...\n");
- 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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- case CurrentDemandRequest: //45,
- {
- if (Proc_iso1_CurrentDemandReq(AcceptFd) == 0)
- {
- Update_V2G_Status(CurrentDemandResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("CurrentDemandReqRes: fail\n");
- Update_V2G_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
- {
- DEBUG_ERROR("CurrentDemandReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //STEP 2: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_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(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStop: //49,
- {
- if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponseStop: //50,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > 2000) //2 seconds
- {
- DEBUG_ERROR("Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), 2000);
- Update_V2G_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_Status(WeldingDetectionRequest);
- DEBUG_INFO("[V2G][RX]WeldingDetectionReq: ongoing...\n");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case WeldingDetectionRequest: //51,
- {
- if (Proc_iso1_WeldingDetectionReq(AcceptFd) == 0)
- {
- Update_V2G_Status(WeldingDetectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("WeldingDetectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case WeldingDetectionResponse: //52,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
- {
- DEBUG_ERROR("Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_WeldingDetection_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("WeldingDetectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //STEP 3: Check for SessionStopReq Message
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case SessionStopRequest: //53,
- {
- if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionStopResponse: //54,
- {
- break;
- }
- //-------------------------------------------
- default:
- {
- break;
- }
- }
- usleep(1000);
- }
- return 0;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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 (v2gObject.appHandshake.supportedAppProtocolReq_isUsed == 1u)
- {
- v2gObject.appHandshake.supportedAppProtocolReq_isUsed = 0;
- if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- Update_V2G_Status(SupportedAppProtocolResponse);
- }
- else
- {
- DEBUG_ERROR("supportedAppProtocolResReq: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- req_is_responsed = TRUE;
- break;
- }
- case SupportedAppProtocolResponse: //18
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n",EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- case SessionSetupRequest: //19
- {
- if (Proc_iso1_SessionSetupReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionSetupResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionSetupReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionSetupResponse: //20
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- case ServiceDiscoveryRequest: //21
- {
- if (Proc_iso1_ServiceDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ServiceDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ServiceDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceDiscoveryResponse: //22
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- case ServiceAndPaymentSelectionRequest: //25
- {
- if (Proc_iso1_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ServiceAndPaymentSelectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ServiceAndPaymentSelectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceAndPaymentSelectionResponse://26
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- //case ContractAuthenticationReq:
- case AuthorizationRequest: //29
- {
- if (Proc_iso1_AuthenticationReq(AcceptFd) == 0)
- {
- Update_V2G_Status(AuthorizationResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("AuthorizationReqRes: fail\n");
- Update_V2G_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
- {
- DEBUG_ERROR("AuthorizationReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //Check for ChargeParameterDiscoveryReq
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ChargeParameterDiscoveryRequest)
- {
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- Update_V2G_Status(ChargeParameterDiscoveryRequest);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- case ChargeParameterDiscoveryRequest: //35
- {
- if (Proc_iso1_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ChargeParameterDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ChargeParameterDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargeParameterDiscoveryResponse: //36
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
- {
- DEBUG_ERROR("ChargingParameter Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_ChargingParameter_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("ChargeParameterDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //STEP 3: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_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(&timerStart.SeqStart);
- #endif
- /*
- if(Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }*/
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- }
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStart: //41
- {
- if (Proc_iso1_PowerDeliveryStartReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponsetStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStartReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponsetStart: //42
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- if (v2gObject.ISO1.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
- {
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > 2000) //5 seconds
- {
- DEBUG_ERROR("Wait for ChargingStatusReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), 2000);
- Update_V2G_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_Status(ChargingStatusRequest);
- DEBUG_INFO("[V2G][RX]ChargingStatusReq: energy transfering...\n");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_ChargingStatus_Timer_Start);
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- case ChargingStatusRequest: //43
- {
- if (Proc_iso1_ChargingStatusReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ChargingStatusResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ChargingStatusRes: fail\n");
- Update_V2G_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
- {
- DEBUG_ERROR("ChargingStatusRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- }
- //STEP 2: Wait for PowerDeliveryReq Message
- else if((EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStop) ||
- (EVCOMM_SYS_INFO.V2G_Rx_Msg == PowerDeliveryRequestStart))
- {
- Update_V2G_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(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- case PowerDeliveryRequestStop: //49
- {
- if (Proc_iso1_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponseStop: //50
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > 2000) //2 seconds
- {
- DEBUG_ERROR("Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), 2000);
- Update_V2G_Status(Sequence_Timeout);
- break;
- }
- #endif
- //STEP 3: Check for SessionStopReq Message
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_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))
- {
- if((EVCOMM_SYS_INFO.V2G_Rx_Msg != ChargeParameterDiscoveryRequest))
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- }
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- case SessionStopRequest: //53
- {
- if (Proc_iso1_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionStopResponse: //54
- {
- break;
- }
- default:
- {
- break;
- }
- }
- usleep(1000);
- }
- return 0;
- }
- /**
- *
- * @param AcceptFd
- * @param EnergyTransferMode
- * @return
- */
- int V2gMsg_Process_iso1(int AcceptFd, unsigned char EnergyTransferMode)
- {
- switch (EnergyTransferMode)
- {
- case DC_extended:
- {
- //DEBUG_INFO("EnergyTransferMode: DC_extended\n");
- V2gMsg_Process_iso1_DC(AcceptFd);
- break;
- }
- case AC_single_phase_core:
- case AC_three_phase_core:
- {
- //DEBUG_INFO("EnergyTransferMode: AC_single_phase_core or AC_three_phase_core\n");
- V2gMsg_Process_iso1_AC(AcceptFd);
- break;
- }
- default:
- {
- DEBUG_WARN("Unexpected EnergyTransferMode: (%d)\n", EnergyTransferMode);
- break;
- }
- }
- return 0;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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 (v2gObject.appHandshake.supportedAppProtocolReq_isUsed == 1u)
- {
- v2gObject.appHandshake.supportedAppProtocolReq_isUsed = 0;
- if (Proc_supportedAppProtocolReq(AcceptFd) == 0) //0: no error
- {
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- Update_V2G_Status(SupportedAppProtocolResponse);
- }
- else
- {
- DEBUG_ERROR("supportedAppProtocolResReq: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- }
- req_is_responsed = TRUE;
- break;
- }
- case SupportedAppProtocolResponse:
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionSetupRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- //-------------------------------------------
- case SessionSetupRequest: //19
- {
- if (Proc_iso2_SessionSetupReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionSetupResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionSetupReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case SessionSetupResponse: //20
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceDiscoveryRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {}
- break;
- }
- #if 0
- //-------------------------------------------
- case ServiceDiscoveryRequest: //21
- {
- if (Proc_iso2_ServiceDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ServiceDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ServiceDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceDiscoveryResponse: //22
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == ServiceAndPaymentSelectionRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case ServiceAndPaymentSelectionRequest: //25
- {
- if (Proc_iso2_ServiceAndPaymentSelectionReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ServiceAndPaymentSelectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ServiceAndPaymentSelectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ServiceAndPaymentSelectionResponse: //26
- {
- if (EVCOMM_SYS_INFO.V2G_Rx_Msg == AuthorizationRequest)
- {
- Update_V2G_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- //case ContractAuthenticationReq:
- case AuthorizationRequest: //29
- {
- if (Proc_iso2_AuthenticationReq(AcceptFd) == 0)
- {
- Update_V2G_Status(AuthorizationResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("AuthorizationReqRes: fail\n");
- Update_V2G_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
- {
- DEBUG_ERROR("AuthorizationReqRes: fail\n");
- Update_V2G_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_Status(ChargeParameterDiscoveryRequest);
- DEBUG_INFO("[V2G][RX]ChargeParameterDiscoveryReq: CSU Permission?\n");
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case ChargeParameterDiscoveryRequest: //35
- {
- if (Proc_iso2_ChargeParameterDiscoveryReq(AcceptFd) == 0)
- {
- Update_V2G_Status(ChargeParameterDiscoveryResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("ChargeParameterDiscoveryReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case ChargeParameterDiscoveryResponse:
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_ChargingParameter_Performance_Time) //60 seconds
- {
- DEBUG_ERROR("ChargingParameter Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_ChargingParameter_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("ChargeParameterDiscoveryReqRes: fail\n");
- Update_V2G_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_Status(CableCheckRequest);
- DEBUG_INFO("[V2G][RX]CableCheckReqReq: isolated?\n");
- 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(&timerStart.SeqStart);
- #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_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(&timerStart.SeqStart);
- #endif
- if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case CableCheckRequest: //37
- {
- //STEP 3: Execute Cable Check Process
- if (Proc_iso2_CableCheckReq(AcceptFd) == 0)
- {
- Update_V2G_Status(CableCheckResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("CableCheckReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case CableCheckResponse: //38
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_CableCheck_Performance_Time) //38 seconds
- {
- //DEBUG_INFO("[CableCheck] end counting...\n");
- DEBUG_ERROR("CableCheck Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_CableCheck_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("CableCheckReqRes: fail\n");
- Update_V2G_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_Status(PreChargeRequest);
- DEBUG_INFO("[V2G][RX]PreChargeReqReq: waiting for pre-charge voltage...\n");
- 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(&timerStart.SeqStart);
- #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_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(&timerStart.SeqStart);
- #endif
- if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case PreChargeRequest: //39
- {
- if (Proc_iso2_PreChargeReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PreChargeResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PreChargeReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PreChargeResponse: //40
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_PreCharge_Performance_Time) //5 seconds
- {
- DEBUG_ERROR("Pre-charge Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_PreCharge_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("PreChargeReqRes: fail\n");
- Update_V2G_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_Status(PowerDeliveryRequestStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Precharge_Timer_End);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case PowerDeliveryRequestStart: //41
- {
- if (Proc_iso2_PowerDeliveryStartReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponsetStart);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStartReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponsetStart: //42
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- if (v2gObject.ISO2.V2G_Message.Body.PowerDeliveryReq_isUsed == 1u)
- {
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > 2000) //5 seconds
- {
- DEBUG_ERROR("Wait for CurrentDemandReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), 2000);
- Update_V2G_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_Status(CurrentDemandRequest);
- DEBUG_INFO("[V2G][RX]CurrentDemandReqReq: energy transfering...\n");
- 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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case CurrentDemandRequest: //45,
- {
- if (Proc_iso2_CurrentDemandReq(AcceptFd) == 0)
- {
- Update_V2G_Status(CurrentDemandResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("CurrentDemandReqRes: fail\n");
- Update_V2G_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
- {
- DEBUG_ERROR("CurrentDemandReqRes: fail\n");
- Update_V2G_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_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(&timerStart.SeqStart);
- #endif
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case PowerDeliveryRequestStop: //49,
- {
- if (Proc_iso2_PowerDeliveryStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(PowerDeliveryResponseStop);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else
- {
- DEBUG_ERROR("PowerDeliveryStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case PowerDeliveryResponseStop: //50,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > 2000) //2 seconds
- {
- DEBUG_ERROR("Wait for WeldingDetectionReq or SessionStopReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), 2000);
- Update_V2G_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_Status(WeldingDetectionRequest);
- DEBUG_INFO("[V2G][RX]WeldingDetectionReq: ongoing...\n");
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_WeldingDetection_Timer_Start);
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqStart);
- #endif
- }
- else if(EVCOMM_SYS_INFO.V2G_Rx_Msg == SessionStopRequest)
- {
- Update_V2G_Status(SessionStopRequest);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- break;
- }
- else if (EVCOMM_SYS_INFO.V2G_Rx_Msg >= SupportedAppProtocolRequest &&
- EVCOMM_SYS_INFO.V2G_Rx_Msg <= SessionStopRequest)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case WeldingDetectionRequest: //51,
- {
- if (Proc_iso2_WeldingDetectionReq(AcceptFd) == 0)
- {
- Update_V2G_Status(WeldingDetectionResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("WeldingDetectionReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- break;
- }
- case WeldingDetectionResponse: //52,
- {
- //STEP 1: Check for Process Timeout
- #if V2G_SECC_TIMEOUT_PROTECTION == ENABLE
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > V2G_SECC_WeldingDetection_Performance_Time) //20 seconds
- {
- DEBUG_ERROR("Wait for SessionStopReq Timeout - (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), V2G_SECC_WeldingDetection_Performance_Time);
- Update_V2G_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
- {
- DEBUG_ERROR("WeldingDetectionReqRes: fail\n");
- Update_V2G_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_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)
- {
- DEBUG_ERROR("SequenceError(%d) => Tx Res MSG\n", EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.SequenceError = TRUE;
- Update_V2G_Status(EVCOMM_SYS_INFO.V2G_Rx_Msg);
- EVCOMM_SYS_INFO.V2G_Rx_Msg = 0;
- }
- else
- {
- break;
- }
- }
- //-------------------------------------------
- case SessionStopRequest: //53,
- {
- if (Proc_iso2_SessionStopReq(AcceptFd) == 0)
- {
- Update_V2G_Status(SessionStopResponse);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- }
- else
- {
- DEBUG_ERROR("SessionStopReqRes: fail\n");
- Update_V2G_Status(Other_Fault);
- }
- req_is_responsed = TRUE;
- //break;
- }
- case SessionStopResponse: //54,
- {
- break;
- }
- #endif
- //-------------------------------------------
- default:
- {
- break;
- }
- }
- usleep(1000);
- }
- return 0;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int V2gMsg_Process_iso2_AC(int AcceptFd)
- {
- return 0;
- }
- /**
- *
- * @param AcceptFd
- * @param EnergyTransferMode
- * @return
- */
- 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:
- {
- DEBUG_WARN("Unexpected EnergyTransferMode: (%d)\n", EnergyTransferMode);
- break;
- }
- }
- return 0;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- 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:
- {
- DEBUG_WARN("Unexpected Communication Protocol: (%d)\n", ShmCcsData->CommProtocol);
- break;
- }
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int V2gMsg_Rx(int AcceptFd)
- {
- int errn = 0;
- unsigned int packet_size = 0;
- memset(v2gBuffer.rx, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- packet_size = recv(AcceptFd, v2gBuffer.rx, V2GTP_MSG_RX_BUFFER_SIZE, 0);
- //[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(v2gBuffer.rx, packet_size, V2gFlowStatus);
- if (errn < 0)
- {
- DEBUG_ERROR("V2gMsgDecoder fail: (%d)\n", errn);
- }
- }
- return errn;
- }
- /**
- *
- * @param AcceptFd
- * @return
- */
- int V2gComm(int AcceptFd)
- {
- int errn = 0;
- if (V2gMsg_Rx(AcceptFd) < 0)
- {
- Update_V2G_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;
- }
- /**
- *
- * @return
- */
- int SdpUdpConnected()
- {
- int packet_size,Rtn;
- struct sockaddr_in6 ServerAddr,ClientAddr;
- struct V2gtpHeader *header;
- unsigned char *payload;
- // UDP server initial
- if(socketFd.Udp <= 0)
- {
- if ((socketFd.Udp = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
- {
- DEBUG_ERROR("Fail to open UdpSock\n");
- return 0;
- }
- memset(&ServerAddr,0, sizeof(struct sockaddr_in));
- ServerAddr.sin6_family = AF_INET6;
- ServerAddr.sin6_addr = in6addr_any;
- ServerAddr.sin6_port = htons(SdpUdpServerPort);
- if(bind(socketFd.Udp, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
- {
- DEBUG_ERROR("Fail to bind UdpSock(%d)\n", socketFd.Udp);
- close(socketFd.Udp);
- socketFd.Udp = -1;
- return 0;
- }
- DEBUG_INFO("[UDP] opened: %d\n", socketFd.Udp);
- DEBUG_INFO("[UDP] Wait connect request from EVCC\n");
- }
- // Receive packet from udp server
- memset(v2gBuffer.rx, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- memset(&ClientAddr, 0, sizeof(struct sockaddr_in));
- Rtn = sizeof(struct sockaddr_in6);
- packet_size = recvfrom(socketFd.Udp, v2gBuffer.rx, V2GTP_MSG_RX_BUFFER_SIZE, MSG_DONTWAIT, (struct sockaddr *)&ClientAddr, (socklen_t *)&Rtn);
- if(packet_size > 0)
- {
- char buf[128];
- header = (struct V2gtpHeader *) v2gBuffer.rx;
- payload = v2gBuffer.rx+sizeof(struct V2gtpHeader);
- DEBUG_PRINTF_EVCOMM_DETAIL("Got UDP packet_size: %d (Bytes)\n", packet_size);
- DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("***** Received SDP Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("***********************************\n");
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn = 0; Rtn < 16; Rtn += 2)
- {
- sprintf(buf, "%s%02x%02x:", buf, ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress: %s\n", buf);
- 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));
- if( (header->ProtocolVersion == 0x01) &&
- (header->InverseProtocolVersion == 0xFE) &&
- (htons(header->PayloadType) == V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
- {
- DEBUG_INFO("[UDP] Get connect request from EVCC: (%d)\n", socketFd.Udp);
- DEBUG_PRINTF_EVCOMM_DETAIL("Security: 0x%02X\n", *(payload + 0));
- DEBUG_PRINTF_EVCOMM_DETAIL("TransportProtocol: 0x%02X\n", *(payload + 1));
- 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;
- #ifdef TEST_WITH_ETH0
- payload[8] = macAddr.eth0[0];
- payload[8] ^= 0x02;// bit 1 should complemented.
- payload[9] = macAddr.eth0[1];
- payload[10] = macAddr.eth0[2];
- payload[11] = 0xFF;
- payload[12] = 0xFE;
- payload[13] = macAddr.eth0[3];
- payload[14] = macAddr.eth0[4];
- payload[15] = macAddr.eth0[5];
- #else
- payload[8] = macAddr.eth1[0];
- payload[8] ^= 0x02;// bit 1 should complemented.
- payload[9] = macAddr.eth1[1];
- payload[10] = macAddr.eth1[2];
- payload[11] = 0xFF;
- payload[12] = 0xFE;
- payload[13] = macAddr.eth1[3];
- payload[14] = macAddr.eth1[4];
- payload[15] = macAddr.eth1[5];
- #endif
- // Report 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;
- payload[18] = SDP_PAYLOAD_SECURITY_NONE; //Security
- payload[19] = SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
- // TODO:
- // Setup the TCP in advance to receive the coming TCP handshake messages after SDP response.
- Rtn = sendto(socketFd.Udp, v2gBuffer.rx, sizeof(struct V2gtpHeader) + htonl(header->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
- DEBUG_INFO("[UDP] Response to EVCC\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("***** Response SDP Packet *****\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("Send size: %d\n", Rtn);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn = 0; Rtn < 16; Rtn++)
- {
- sprintf(buf, "%s%02x ", buf, ClientAddr.sin6_addr.s6_addr[Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("Destination Address: %s\n", buf);
- 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));
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn = 0; Rtn < 16; Rtn++)
- {
- sprintf(buf, "%s%02x:", buf, payload[Rtn]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("SECC Ipv6 Address: %s\n", buf);
- 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]);
- if(Rtn > 0)
- {
- return 1;
- }
- }
- }
- return 0;
- }
- /**
- *
- * @return
- */
- int V2gTcpConnected()
- {
- int Rtn,AcceptFd;
- char buf[128];
- struct sockaddr_in6 ServerAddr,ClientAddr;
- // Initial TCP server
- if(socketFd.Tcp <= 0)
- {
- if ((socketFd.Tcp = socket(PF_INET6, SOCK_STREAM, 0)) < 0)
- {
- DEBUG_ERROR("Fail to open TcpSock (%s)\n", strerror(errno));
- usleep(100000);
- return 0;
- }
- fcntl(socketFd.Tcp, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
- DEBUG_INFO("[TCP]Socket set: DONE.\n");
- 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);
- if(bind(socketFd.Tcp, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
- {
- DEBUG_ERROR("Fail to bind TcpSock(%s), SdpTcpServerPort: %d\n", strerror(errno), EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
- if(bind(socketFd.Tcp, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) < 0)
- {
- DEBUG_INFO("[Error Fail to bind TcpSock(%s), SdpTcpServerPort: %d\n", strerror(errno), EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
- usleep(100000);
- close(socketFd.Tcp);
- socketFd.Tcp = -1;
- return 0;
- }
- DEBUG_INFO("[TCP]bind: DONE\n");
- }
- DEBUG_INFO("[TCP]listen: START\n");
- if(listen(socketFd.Tcp, 1) == -1) //only accept one connection
- {
- DEBUG_ERROR("Fail to listen TcpSock(%s)", strerror(errno));
- usleep(100000);
- close(socketFd.Tcp);
- socketFd.Tcp = -1;
- return 0;
- }
- DEBUG_INFO("[TCP]listen: DONE\n");
- DEBUG_INFO("[TCP]TcpSock: opened(%d), port=%d\n", socketFd.Tcp, htons(ServerAddr.sin6_port));
- DEBUG_INFO("[TCP]accept: START\n");
- }
- // Wait connection in
- Rtn = sizeof(struct sockaddr_in6);
- if((AcceptFd = accept(socketFd.Tcp, (struct sockaddr *)&ClientAddr, (socklen_t *)&Rtn)) == -1)
- {
- static BOOL tmp = 0;
- if (tmp == 0)
- {
- DEBUG_INFO("[TCP]Wait TCP connection...\n");
- tmp = 1;
- }
- else
- {
- //DEBUG_PRINTF_EVCOMM_DETAIL(".");
- }
- return 0;
- }
- DEBUG_INFO("[TCP]Accept: DONE\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("Accept one TCP connection:\n");
- DEBUG_PRINTF_EVCOMM_DETAIL("AcceptFd: %d\n",AcceptFd);
- memset(buf, 0x00, ARRAY_SIZE(buf));
- for(Rtn = 0; Rtn < 16; Rtn += 2)
- {
- sprintf(buf, "%s%02x%02x:", buf, ClientAddr.sin6_addr.s6_addr[Rtn], ClientAddr.sin6_addr.s6_addr[Rtn+1]);
- }
- DEBUG_PRINTF_EVCOMM_DETAIL("ClientAddress: %s\n", buf);
- DEBUG_PRINTF_EVCOMM_DETAIL("ClientPort: %d\n", ClientAddr.sin6_port);
- return AcceptFd;
- }
- /**
- *
- * @return
- */
- int End_Process()
- {
- if(EVCOMM_SYS_INFO.End_Process_inused == TRUE)
- {
- DEBUG_INFO("End_Process has been triggered by another event.\n");
- return -1;
- }
- DEBUG_INFO("Entering...\n");
- //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
- DEBUG_INFO("Close RAW, UDP, TCP sockets...\n");
- if(socketFd.Raw > 0)
- {
- close(socketFd.Raw);
- }
- if(socketFd.Udp > 0)
- {
- close(socketFd.Udp);
- }
- if(socketFd.Tcp > 0)
- {
- close(socketFd.Tcp);
- close(socketFd.TcpAccept);
- }
- socketFd.Raw = socketFd.Udp = socketFd.Tcp = socketFd.TcpAccept = -1;
- //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);
- for(int idx=5;idx>0;idx--)
- {
- DEBUG_INFO("Wait PWM switch to 100%% count down: %d\n", idx);
- sleep(1);
- }
- qcaInfo.AttenProfileCnt = 0;
- init_appHandEXIDocument(&v2gObject.appHandshake);
- // Qca7kPowerReset(); //reset QCA7000 /* +++ 20200808, vern, should disconnected PLC connection after session stop ---*/
- #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
- {
- 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)
- for(uint8_t idx=5;idx>0;idx--)
- {
- DEBUG_INFO("Wait CP change to State E count down: %d\n", idx);
- sleep(1);
- }
- #endif
- //Reset Memory
- unsigned char SlaveAddress_backup;
- unsigned int matched_backup;
- //unsigned char state_backup;
- #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
- {
- system("sync");
- }
- #endif
- sleep(1);
- //Backup CsuComm flags
- SlaveAddress_backup = ShmInternalComm->SlaveAddress;
- matched_backup = CSUCOMMDC_TASK_FLAG.matched;
- //state_backup = Get_V2G_Status();
- memset(v2gBuffer.rx, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- memset(v2gBuffer.tx, 0, V2GTP_MSG_TX_BUFFER_SIZE);
- memset(&v2gObject.appHandshake, 0, sizeof(struct appHandEXIDocument));
- memset(&v2gObject.DIN, 0, sizeof(struct dinEXIDocument));
- memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
- memset(ShmInternalComm, 0, sizeof(struct InternalComm));
- memset(ShmCcsData, 0, sizeof(struct CcsData));
- //Resume CsuComm flags
- ShmInternalComm->SlaveAddress = SlaveAddress_backup;
- CSUCOMMDC_TASK_FLAG.matched = matched_backup;
- Sniffer_Candump(DISABLE);
- Sniffer_Candump(ENABLE);
- DEBUG_INFO("---------------------------------------------\n");
- DEBUG_INFO("-- EVCOMM: END --\n");
- DEBUG_INFO("---------------------------------------------\n");
- system("pkill Module_CCS");
- while(1)
- {
- //wait for CSU confirm
- usleep(1000);
- }
- }
- /**
- *
- * @return
- */
- 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
- srand(time(NULL));
- value_random = rand();
- EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active = (unsigned short)(SdpTcpServerPort + (value_random % 10000) + 1);
- DEBUG_INFO("TCP Port assign: %d\n", EVCOMM_SYS_INFO.SDP_TCP_Server_Port_active);
- //Step 2: Init SessionID
- srand(time(NULL));
- value_random = rand();
- memcpy(&EVCOMM_SYS_INFO.SessionID[0], &value_random, 4);
- srand(time(NULL));
- value_random = rand();
- memcpy(&EVCOMM_SYS_INFO.SessionID[4], &value_random, 4);
- DEBUG_INFO("SessionID: (%02X%02X%02X%02X%02X%02X%02X%02X)\n",
- 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]);
- return 0;
- }
- /**
- *
- * @return
- */
- int SyncAcShreaMemory()
- {
- #if ((CCS_ENERGY_TRANSFER_MODE == MODE_AC_SINGLE_PHASE_CORE) || (CCS_ENERGY_TRANSFER_MODE == MODE_AC_THREE_PHASE_CORE))
- pid_t pid;
- pid = fork();
- if(pid == 0)
- {
- for(;;)
- {
- if(!EVCOMM_SYS_INFO.End_Process_inused)
- {
- for(uint8_t gun_index=0;gun_index<1;gun_index++)
- {
- //========================================
- // CSU -> CCS setting
- //========================================
- // Heart beat
- ShmCharger->gun_info[gun_index].acCcsInfo.CcsHeartBeat++;
- // Permission
- if(ShmInternalComm->ChargingPermission != ShmCharger->gun_info[gun_index].acCcsInfo.ChargingPermission)
- {
- DEBUG_INFO("AC permission: %d -> %d\n", ShmInternalComm->ChargingPermission, ShmCharger->gun_info[gun_index].acCcsInfo.ChargingPermission);
- ShmInternalComm->ChargingPermission_new = ShmCharger->gun_info[gun_index].acCcsInfo.ChargingPermission;
- ShmInternalComm->ChargingPermission_pre = ShmInternalComm->ChargingPermission;
- ShmInternalComm->ChargingPermission = ShmInternalComm->ChargingPermission_new;
- }
- // CP
- ShmInternalComm->AC_CpPositiveVoltage = ShmCharger->gun_info[gun_index].acCcsInfo.CpPositiveVoltage;
- if(ShmInternalComm->AC_CpPresentState != ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState)
- {
- DEBUG_INFO("CP state: %d -> %d\n", ShmInternalComm->AC_CpPresentState, ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState);
- ShmInternalComm->AC_CpPresentState = ShmCharger->gun_info[gun_index].acCcsInfo.CpPresentState;
- }
- // Charging parameter
- ShmSysConfigAndInfo->SysInfo.CcsChargingData[gun_index].AvailableChargingCurrent = ShmInternalComm->AvailableChargingCurrent = ShmCharger->gun_info[gun_index].targetCurrent;
- //========================================
- // CCS -> CSU check
- //========================================
- // V2G message flow status
- if(ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus != Get_V2G_Status())
- {
- //DEBUG_INFO("PresentMsgFlowStatus: %d -> %d\n", ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus, Get_V2G_Status());
- ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus = Get_V2G_Status();
- switch(ShmCharger->gun_info[gun_index].acCcsInfo.PresentMsgFlowStatus)
- {
- case PowerDeliveryRequestStart ... SessionStopResponse:
- ShmCharger->gun_info[gun_index].acCcsInfo.EVChargeProgress = HLC_START_MODE;
- break;
- case CM_SLAC_PARM_REQ ... PreChargeResponse:
- ShmCharger->gun_info[gun_index].acCcsInfo.EVChargeProgress = HLC_STANDBY_MODE;
- break;
- default:
- ShmCharger->gun_info[gun_index].acCcsInfo.EVChargeProgress = HLC_STOP_MODE;
- break;
- }
- }
- }
- }
- usleep(1000);
- }
- }
- #endif
- return 0;
- }
- /**
- *
- * @param argc
- * @param argv
- * @return
- */
- int main(int argc, char *argv[])
- {
- DEBUG_INFO("---------------------------------------------\n");
- DEBUG_INFO("-- EVCOMM: START --\n");
- DEBUG_INFO("---------------------------------------------\n");
- // QCA7000 chip reset
- Qca7kPowerReset();
- // Share memory Initialization
- ShareMemory_Init();
- memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
- // Release socket handler
- if(socketFd.Raw > 0)
- {
- close(socketFd.Raw);
- }
- if(socketFd.Udp > 0)
- {
- close(socketFd.Udp);
- }
- if(socketFd.Tcp > 0)
- {
- close(socketFd.Tcp);
- }
- socketFd.Raw = socketFd.Udp = socketFd.Tcp = -1;
- Update_V2G_Status(IDLE);
- //Init V2G TCP/IPv6 packets buffer
- memset(v2gBuffer.rx, 0, V2GTP_MSG_RX_BUFFER_SIZE);
- memset(v2gBuffer.tx, 0, V2GTP_MSG_TX_BUFFER_SIZE);
- //Release State E Control
- SwitchCpStateE(DISABLE);
- OutputCpPwmDuty(100);
- //start to detect CP pilot state
- pid.CP_Detection = 0;
- CP_Detection(); //fork1
- DEBUG_INFO("[fork1]CP Detection: ON\n");
- //start to detect errors
- Error_Monitor(); //fork2
- DEBUG_INFO("[fork2]Error Monitor: ON\n");
- //start to detect PP
- pid.PP_Detection = 0;
- #if (PP_PROTECTION_MECHANISM == ENABLE)
- PP_Detection();
- DEBUG_INFO("[fork3]PP Detection: ON\n");
- #else
- DEBUG_INFO("[fork3]PP Detection: OFF\n");
- #endif
- // Get network interface MAC address
- GetEthMac((uint8_t*)"eth0", macAddr.eth0);
- GetEthMac((uint8_t*)QcaInterface, macAddr.eth1);
- // XML parser initialization
- qcaInfo.AttenProfileCnt = 0;
- init_appHandEXIDocument(&v2gObject.appHandshake);
- // Init Energy transfer mode
- // TODO:
- // 1. Parsing Model Name
- ShmCcsData->EnergyTransferMode = CCS_ENERGY_TRANSFER_MODE;
- Parameters_Init();
- Sniffer_Tcpdump(TCPDUMP_PACKETS_SNIFFER_SWITCH);
- #if (TCPDUMP_PACKETS_SNIFFER_SWITCH == ENABLE)
- sleep(1); //wait for TCP dump getting ready
- #endif
- // AC share memory exchange
- SyncAcShreaMemory();
- DEBUG_INFO("[fork4]AC share memory exchange: ON\n");
- DEBUG_INFO("Module_CCS initialize OK.\n");
- for(;;)
- {
- if(!EVCOMM_SYS_INFO.End_Process_inused)
- {
- if(V2gFlowStatus < SLACC_SDP_UDP_Connection)
- {
- SlacComm();
- }
- else if(V2gFlowStatus == SLACC_SDP_UDP_Connection)
- {
- if(SdpUdpConnected() == 1)
- {
- Update_V2G_Status(SLACC_SDP_TCP_Connection);
- continue;
- }
- SlacComm(); //TC_SECC_VTB_CmSlacMatch_004
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > TT_match_join)
- {
- DEBUG_ERROR("Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join (%.02lf of %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), TT_match_join);
- Update_V2G_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((socketFd.TcpAccept = V2gTcpConnected()) > 0)
- {
- Update_V2G_Status(SupportedAppProtocolRequest);
- ftime(&EVCOMM_SYS_INFO.V2G_SECC_Sequence_Timer_Start);
- continue;
- }
- SlacComm();
- ftime(&timerStart.SeqEnd);
- if(DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd) > TT_match_join)
- {
- DEBUG_ERROR("Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join (%.02lf / %d ms)\n", DiffTimeb(timerStart.SeqStart, timerStart.SeqEnd), TT_match_join);
- Update_V2G_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(socketFd.TcpAccept) < 0)
- {
- //error occurs
- }
- }
- else if (V2gFlowStatus >= Performance_Timeout)
- {
- //End_Process
- }
- else
- {}
- }
- else
- {
- // TODO:
- // 1. After complete or error occur task do not need to end
- //Update_V2G_Status(IDLE);
- //SwitchCpStateE(DISABLE);
- //OutputCpPwmDuty(100);
- }
- usleep(1000);
- } //while
- }//main while
|