freertos.c 752 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * File Name : freertos.c
  5. * Description : Code for freertos applications
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under Ultimate Liberty license
  13. * SLA0044, the "License"; You may not use this file except in compliance with
  14. * the License. You may obtain a copy of the License at:
  15. * www.st.com/SLA0044
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "FreeRTOS.h"
  22. #include "task.h"
  23. #include "main.h"
  24. #include "cmsis_os.h"
  25. /* Private includes ----------------------------------------------------------*/
  26. /* USER CODE BEGIN Includes */
  27. #include "dma.h" //Hao@20231020
  28. #include "adc.h"
  29. #include "crc.h"
  30. #include "flash_if.h"
  31. #include "gpio.h"
  32. #include "iwdg.h"
  33. #include "rtc.h"
  34. #include "tim.h"
  35. #include "usart.h"
  36. #include "cp_detection.h"
  37. #include "W25QXX.h"
  38. #include "usbd_cdc_if.h"
  39. #include "time.h"
  40. #include "driver_meter.h"
  41. #include "i2c.h"
  42. #ifdef FUNC_LIN_CP
  43. #include "LinCP.h"
  44. #endif
  45. #ifdef FUNC_EKM_OMNIMETER
  46. #include "EKM_Omnimeter.h"
  47. #endif
  48. #ifdef FUNC_AES256
  49. #include "..\Middlewares\AES256\aes256.h"
  50. #endif
  51. #ifdef FUNC_ECDSA
  52. #include "cmox_crypto.h"
  53. #endif
  54. /* USER CODE END Includes */
  55. /* Private typedef -----------------------------------------------------------*/
  56. /* USER CODE BEGIN PTD */
  57. /* USER CODE END PTD */
  58. /* Private define ------------------------------------------------------------*/
  59. /* USER CODE BEGIN PD */
  60. /* USER CODE END PD */
  61. /* Private macro -------------------------------------------------------------*/
  62. /* USER CODE BEGIN PM */
  63. /* USER CODE END PM */
  64. /* Private variables ---------------------------------------------------------*/
  65. /* USER CODE BEGIN Variables */
  66. #ifdef FUNC_SYSTEM_KEEP_INFO
  67. __no_init __root SystemKeepInfo g_SystemKeepInfo;
  68. void SystemKeepInfo_Display(PSystemKeepInfo p)
  69. {
  70. u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)p->m_Buf, (sizeof(p->m_Buf) >> 2));
  71. // XP("=======<SYSTEM_KEEP_INFO>=======\r\n");
  72. // XP("BootCount = %d\r\n", p->m_BootCount);
  73. // XP("CsuIsRequestOn = %d\r\n", p->m_CsuIsRequestOn);
  74. // XP("CpPwmVal = %d\r\n", p->m_CpPwmVal);
  75. // XP("CRC32 = 0x%04X (%s)\r\n", p->m_CRC32, (p->m_CRC32 == crc32 ? "OK" : "NG"));
  76. // XP("CRC32_CALC = 0x%04X\r\n", crc32);
  77. // XP("================================\r\n");
  78. DEBUG_INFO("BootCount(%d) CsuIsRequestOn(%d) CpPwmVal(%d) CRC32(0x%04X,%s)\r\n",
  79. p->m_BootCount, p->m_CsuIsRequestOn, p->m_CpPwmVal, p->m_CRC32, (p->m_CRC32 == crc32 ? "OK" : "NG"));
  80. }
  81. void SystemKeepInfo_Update(PSystemKeepInfo p)
  82. {
  83. u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)p->m_Buf, (sizeof(p->m_Buf) >> 2));
  84. p->m_CRC32 = crc32;
  85. }
  86. HTK_BOOL SystemKeepInfo_Check(PSystemKeepInfo p)
  87. {
  88. u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)p->m_Buf, (sizeof(p->m_Buf) >> 2));
  89. return (p->m_CRC32 == crc32 ? HTK_TRUE : HTK_FALSE);
  90. }
  91. #endif //FUNC_SYSTEM_KEEP_INFO
  92. uint32_t alarm_record_code[32] =
  93. {
  94. 0x00012200, // Input L1 OVP
  95. 0x00012203, // Input L1 UVP
  96. 0x00012216, // Output L1 OCP
  97. 0x00012223, // Over temperature
  98. 0x00012255, // Ground fault
  99. 0x00023703, // Pilot error
  100. 0x00012233, // AC CCID
  101. 0x00012233, // DC CCID
  102. 0x00012256, // MCU self test
  103. 0x00012258, // Hand shaking timeout
  104. 0x00012251, // Emergency stop
  105. 0x00011009, // Relay welding
  106. 0x00011032, // Leak module test fail
  107. 0x00011034, // shutter fault
  108. 0x00012212, // L1 Power drop
  109. 0x00012262, // L1 Circuit short
  110. 0x00011033, // Maximum Output Current setup error
  111. 0x00011010, // AC output relay driving fault
  112. 0x00011035, // Ble module broken
  113. 0x00012201, // Input L2 OVP
  114. 0x00012202, // Input L3 OVP
  115. 0x00012204, // Input L2 UVP
  116. 0x00012205, // Input L3 UVP
  117. 0x00012299, // Output L2 OCP
  118. 0x00012300, // Output L3 OCP
  119. 0x00012301, // L2 Circuit short
  120. 0x00012302, // L3 Circuit short
  121. 0x00000000,
  122. 0x00000000,
  123. 0x00000000,
  124. 0x00000000
  125. };
  126. uint32_t binCRCTarget, binCRCCal;
  127. __IO uint32_t flashdestination;
  128. __IO uint32_t newdestination;
  129. volatile unsigned long ulHighFrequencyTimerTicks;
  130. sCPModuleResult_t CpDetectionResult;
  131. #ifndef FUNC_CP_ADC_MODIFY
  132. sCPVoltageBoundary_t CpBoundary = {
  133. CP_P12V_HIGH,
  134. CP_P12V_LOW,
  135. CP_P9V_HIGH,
  136. CP_P9V_LOW,
  137. CP_P6V_HIGH,
  138. CP_P6V_LOW,
  139. CP_P3V_HIGH,
  140. CP_P3V_LOW,
  141. CP_0V_HIGH,
  142. CP_0V_LOW,
  143. CP_N12V_HIGH,
  144. CP_N12V_LOW,
  145. };
  146. sCPVoltageBoundary_t SpecDefBoundary = {
  147. CP_SPEC_P12V_HIGH,
  148. CP_SPEC_P12V_LOW,
  149. CP_SPEC_P9V_HIGH,
  150. CP_SPEC_P9V_LOW,
  151. CP_SPEC_P6V_HIGH,
  152. CP_SPEC_P6V_LOW,
  153. CP_SPEC_P3V_HIGH,
  154. CP_SPEC_P3V_LOW,
  155. CP_SPEC_0V_HIGH,
  156. CP_SPEC_0V_LOW,
  157. CP_SPEC_N12V_HIGH,
  158. CP_SPEC_N12V_LOW,
  159. };
  160. sCPVoltageHysteresis_t CpHysteresis = {
  161. HYSTERESIS_P12V_HIGH,
  162. HYSTERESIS_P12V_LOW,
  163. HYSTERESIS_P9V_HIGH,
  164. HYSTERESIS_P9V_LOW,
  165. HYSTERESIS_P6V_HIGH,
  166. HYSTERESIS_P6V_LOW,
  167. HYSTERESIS_P3V_HIGH,
  168. HYSTERESIS_P3V_LOW,
  169. HYSTERESIS_0V_HIGH,
  170. HYSTERESIS_0V_LOW,
  171. };
  172. #endif //FUNC_CP_ADC_MODIFY
  173. struct EVSE Charger;
  174. const unsigned char CharacterArray[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  175. uint32_t test_logA = 0 ;
  176. uint32_t test_logB = 0 ;
  177. extern I2C_HandleTypeDef hi2c2;
  178. /* USER CODE END Variables */
  179. #ifndef DISABLE_OS_ETH_TASK
  180. osThreadId ethTaskHandle;
  181. #endif
  182. osThreadId uartTaskHandle;
  183. osThreadId adcTaskHandle;
  184. osThreadId timeoutTaskHandle;
  185. osThreadId rfidTaskHandle;
  186. osThreadId led_speakerTaskHandle;
  187. osThreadId cpTaskHandle;
  188. osThreadId alarmTaskHandle;
  189. osThreadId bleTaskHandle;
  190. osThreadId memoryTaskHandle;
  191. osThreadId wifiTaskHandle;
  192. osThreadId MeterTaskHandle;
  193. #ifdef RECODE_FUNC_METER_IC_TASK
  194. osThreadId MeterIcTaskHandle;
  195. #endif
  196. #ifdef FUNC_TASK_MONITOR
  197. osThreadId MonitorTaskHandle;
  198. #endif
  199. #ifdef FUNC_LIN_CP
  200. osThreadId LinCpTaskHandle;
  201. #endif
  202. #ifdef FUNC_VERIFY_TASK
  203. osThreadId VerifyTaskHandle;
  204. #endif
  205. #ifdef FUNC_METER_IC_READ_PHASE_ANGLE
  206. char *AC_PERIOD_MODE_STR[AC_PERIOD_MODE_NUM] = { "?Hz", "50Hz", "60Hz" };
  207. char *AC_PHASE_MODE_STR[AC_PHASE_MODE_NUM] = { "?", "AC_PHASE_MODE_1P", "240_120_120_SEQ_OK", "120_120_240_SEQ_NG", "360_360_360" };
  208. #endif
  209. /* Private function prototypes -----------------------------------------------*/
  210. /* USER CODE BEGIN FunctionPrototypes */
  211. #ifdef FUNC_RS485_SLAVE
  212. uint8_t isValidCheckSum_IAP(uint8_t *RxBuf);
  213. #else
  214. uint8_t isValidCheckSum_IAP(void);
  215. #endif
  216. uint8_t isValidCheckSum_BLE(void);
  217. uint8_t isValidCheckSum_WIFI(void);
  218. void setChargerMode(uint8_t mode);
  219. uint8_t isModeChange(void);
  220. uint8_t isMode(uint8_t mode);
  221. uint8_t rfidCheckSumCal(uint8_t *data, uint8_t length);
  222. uint8_t Test_LeakModule(void);
  223. uint8_t Valid_RFID_SN(void);
  224. void recordAlarmHis(void);
  225. #ifdef FUNC_METER_IC_HISTORY
  226. uint8_t recordMeterICHis(MeterIC_CaliValType Type, int32_t Val);
  227. #else
  228. uint8_t recordChargingHis(uint8_t isColdLoadPickUp, uint32_t statusCode);
  229. #endif
  230. void setLedMotion(uint8_t action);
  231. #ifdef FUNC_CUSTOMIZED_LED_MODE_FROM_CSU
  232. void setLedMotion_User(uint8_t action, PLED_UserCfg p);
  233. #endif
  234. #ifdef FUNC_AW48_NET_LED
  235. void setNetLedMotion(uint8_t action);
  236. #endif
  237. void getlastRecord(void);
  238. void getRotarySwitchSetting(void);
  239. void CLC_Corr_Gain_Par(uint16_t SpecData_H ,uint16_t SpecData_L ,uint16_t MCUData_H , uint16_t MCUData_L , float *GainA , float *GainB ) ;
  240. void CLC_Corr_Gain_Par2(uint16_t SpecData_H ,uint16_t SpecData_L ,uint16_t MCUData_H , uint16_t MCUData_L , float *GainA , float *GainB , uint8_t *PosorNeg ) ;
  241. uint8_t Array_data_Check ( uint8_t *s1, uint8_t *s2 ) ;
  242. void Relay_Control_Function (void) ;
  243. #ifdef FUNC_OUTP_TYPE_E
  244. void SE_Relay_Control_Function(void);
  245. #endif
  246. uint8_t WatchDogLeakRawDataCheck_Event(void) ;
  247. uint16_t getBrightnessDuty(uint16_t max_duty);
  248. void parseVersionInfoFromModelname(void);
  249. #ifdef ENABLE_PRINT_IMCP_MSG
  250. int CheckPrintImcpMsg(uint8_t MsgID);
  251. #endif
  252. #ifdef MODIFY_IMCP
  253. void UpdateCheckSum(uint8_t *Buf, uint16_t Len);
  254. #endif
  255. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  256. void ColdLoadPickup_Delay(const char* Description);
  257. #endif
  258. #ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME
  259. void Update_McuCtrlMode(void);
  260. #endif
  261. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  262. void IdleUntilReadAllMemory(void);
  263. #endif
  264. #ifdef FUNC_IDLE_UNTIL_INIT_METER_IC
  265. void IdleUntilInitMeterIC(void);
  266. #endif
  267. #ifdef FUNC_GUN_LOCK
  268. void GL_Init(void);
  269. ////void GL_Lock(void);
  270. void GL_Unlock(void);
  271. HTK_BOOL GL_IsLock(void);
  272. void GL_Trig(GL_MODE mode);
  273. void GL_Proc(void);
  274. #endif
  275. #ifdef FUNC_AX32_TRIG_LEAKAGE
  276. void TrigLeakage_Init(void);
  277. void TrigLeakage_Trig(void);
  278. void TrigLeakage_Proc(void);
  279. #endif
  280. #ifdef MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK
  281. void AlarmDetect_RelayWelding_UseADC(void);
  282. #ifdef FUNC_USE_RELAY_B_CONTACT
  283. HTK_BOOL IsRelayContact_Closed(void);
  284. void AlarmDetect_RelayWelding_UseGPIO(void);
  285. #endif
  286. #endif //MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK
  287. #ifdef FUNC_AX80_ADD_TILT_SENSOR
  288. void TILT_TrigLeakage_Init(void);
  289. void TILT_TrigLeakage_Trig(void);
  290. void TILT_TrigLeakage_Proc(void);
  291. void AlarmDetect_TiltSensor(void);
  292. #endif
  293. #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE
  294. void RS485_TX_Enable(void);
  295. void RS485_TX_Disable(void);
  296. void Prefix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf);
  297. void Postfix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf);
  298. #endif
  299. #ifdef FUNC_RS485_BLE_SW
  300. void RS485_SW(HTK_BOOL bON);
  301. void BLE_SW(HTK_BOOL bON);
  302. #endif
  303. #ifdef FUNC_LIN_EN_SW
  304. void LIN_EN(HTK_BOOL bEnable);
  305. void LIN_SW(HTK_BOOL bUseLIN);
  306. #endif
  307. #ifdef FUNC_AW48_NET_LED
  308. void Proc_NetLedActionSubState(void);
  309. #endif
  310. #ifdef FUNC_AES256
  311. HTK_BOOL AES256_Verify(u8* Data, int DataLen, u8* Key, u8* IV, u8* RemoteEncryptedData);
  312. void AES256_Test(void);
  313. #endif
  314. #ifdef FUNC_ECDSA
  315. HTK_BOOL ECDSA_Verify(u8* PublicKey, int PublicKeyLen, u8* Hash, int HashLen, u8* Signature, int SignatureLen);
  316. void ECDSA_VerifyTest(void);
  317. #endif
  318. /* USER CODE END FunctionPrototypes */
  319. #ifndef DISABLE_OS_ETH_TASK
  320. void StartEthTask(void const * argument);
  321. #endif
  322. void StartUartTask(void const * argument);
  323. void StartAdcTask(void const * argument);
  324. void StartTimeoutTask(void const * argument);
  325. #ifdef FUNC_ENABLE_USART1_RFID
  326. void StartRfidTask(void const * argument);
  327. #endif
  328. void StartLedSpeakerTask(void const * argument);
  329. void StartCpTask(void const * argument);
  330. void StartAlarmTask(void const * argument);
  331. void StartBleTask(void const * argument);
  332. void StartMemoryTask(void const * argument);
  333. void StartWifiTask(void const * argument);
  334. void StartMeterTask(void const * argument);
  335. #ifdef RECODE_FUNC_METER_IC_TASK
  336. void StartMeterIcTask(void const * argument);
  337. #endif
  338. #ifdef FUNC_TASK_MONITOR
  339. void StartMonitorTask(void const * argument);
  340. #endif
  341. #ifdef FUNC_LIN_CP
  342. void StartLinCpTask(void const * argument);
  343. #endif
  344. #ifdef FUNC_VERIFY_TASK
  345. void StartVerifyTask(void const * argument);
  346. #endif
  347. extern void MX_USB_DEVICE_Init(void);
  348. void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
  349. /* GetIdleTaskMemory prototype (linked to static allocation support) */
  350. void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );
  351. /* Hook prototypes */
  352. void configureTimerForRunTimeStats(void);
  353. unsigned long getRunTimeCounterValue(void);
  354. /* USER CODE BEGIN 1 */
  355. /* Functions needed when configGENERATE_RUN_TIME_STATS is on */
  356. __weak void configureTimerForRunTimeStats(void)
  357. {
  358. ulHighFrequencyTimerTicks = 0ul;
  359. }
  360. __weak unsigned long getRunTimeCounterValue(void)
  361. {
  362. return ulHighFrequencyTimerTicks;
  363. }
  364. /* USER CODE END 1 */
  365. /* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
  366. static StaticTask_t xIdleTaskTCBBuffer;
  367. static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];
  368. void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
  369. {
  370. *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;
  371. *ppxIdleTaskStackBuffer = &xIdleStack[0];
  372. *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
  373. /* place for user code */
  374. }
  375. /* USER CODE END GET_IDLE_TASK_MEMORY */
  376. /**
  377. * @brief FreeRTOS initialization
  378. * @param None
  379. * @retval None
  380. */
  381. void UpdateFirmwareVersion(void)
  382. {
  383. #ifdef FUNC_FW_VER_TRACE
  384. #if (FW_VER_NUM >= 1000)
  385. //--------------------------------------------------------------
  386. #if (FW_VER_TYPE == FW_VER_TYPE_DEVELOP)
  387. #ifdef FORCE_VER_WITH_T_PREFIX
  388. sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  389. #else
  390. sprintf(Charger.Ver_FW, "D%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  391. //sprintf(Charger.Ver_FW, "D0.02.X0.0011.P0"); //test
  392. #endif
  393. #elif (FW_VER_TYPE == FW_VER_TYPE_PVT)
  394. #ifdef FORCE_VER_WITH_T_PREFIX
  395. #ifdef FORCE_VER_WITH_F_PREFIX
  396. sprintf(Charger.Ver_FW, "F%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  397. #else
  398. sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  399. #endif
  400. #else //FORCE_VER_WITH_T_PREFIX
  401. #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU
  402. if (
  403. ( Charger.m_bModelNameAX48_1P
  404. #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX32_MODELNAME_WITH_CSU
  405. || Charger.m_bModelNameAX32_3P
  406. #endif
  407. )
  408. &&
  409. IS_CSU_MOUNTED) //With CSU
  410. {
  411. sprintf(Charger.Ver_FW, "V%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  412. }
  413. else
  414. {
  415. sprintf(Charger.Ver_FW, "B%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  416. }
  417. #else
  418. sprintf(Charger.Ver_FW, "B%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  419. #endif
  420. #endif //FORCE_VER_WITH_T_PREFIX
  421. #elif (FW_VER_TYPE == FW_VER_TYPE_FORMAL)
  422. sprintf(Charger.Ver_FW, "V%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  423. #elif (FW_VER_TYPE == FW_VER_TYPE_TEST)
  424. sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  425. #endif
  426. //--------------------------------------------------------------
  427. #else //(FW_VER_NUM >= 1000)
  428. #if (FW_VER_TYPE == FW_VER_TYPE_DEVELOP)
  429. sprintf(Charger.Ver_FW, "D%4.2f.X0.0011.P0", FW_VER_NUM * 0.01);
  430. #elif (FW_VER_TYPE == FW_VER_TYPE_PVT)
  431. #ifdef FORCE_VER_WITH_T_PREFIX
  432. //---------------
  433. #ifdef FORCE_VER_WITH_F_PREFIX
  434. sprintf(Charger.Ver_FW, "F%4.2f.X0.0011.P0", FW_VER_NUM * 0.01);
  435. #else
  436. sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.01);
  437. #endif
  438. //---------------
  439. //sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.01);
  440. #else //FORCE_VER_WITH_T_PREFIX
  441. #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU
  442. if (
  443. ( Charger.m_bModelNameAX48_1P
  444. #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX32_MODELNAME_WITH_CSU
  445. || Charger.m_bModelNameAX32_3P
  446. #endif
  447. #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX80_MODELNAME_WITH_CSU
  448. || Charger.m_bModelNameAX80_1P
  449. #endif
  450. )
  451. &&
  452. IS_CSU_MOUNTED) //With CSU
  453. {
  454. sprintf(Charger.Ver_FW, "V%4.2f.X0.0011.P0", FW_VER_NUM * 0.01);
  455. }
  456. else
  457. {
  458. sprintf(Charger.Ver_FW, "B%4.2f.X0.0011.P0", FW_VER_NUM * 0.01);
  459. }
  460. #else //AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU
  461. sprintf(Charger.Ver_FW, "B%4.2f.X0.0011.P0", FW_VER_NUM * 0.01);
  462. #endif //AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU
  463. #endif //FORCE_VER_WITH_T_PREFIX
  464. #elif (FW_VER_TYPE == FW_VER_TYPE_FORMAL)
  465. sprintf(Charger.Ver_FW, "V%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  466. #elif (FW_VER_TYPE == FW_VER_TYPE_TEST)
  467. sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
  468. #endif
  469. #endif //(FW_VER_NUM >= 1000)
  470. #else //FUNC_FW_VER_TRACE
  471. //sprintf(Charger.Ver_FW, "D0.11.X0.0011.P0");
  472. //sprintf(Charger.Ver_FW, "D0.12.X0.0011.P0"); //AX_1P, AX_3P Generic version (=>Git)
  473. //sprintf(Charger.Ver_FW, "D0.13.X0.0011.P0"); //0.13.001: POWER_CONSUME_64_BIT, CDFA_V2
  474. //sprintf(Charger.Ver_FW, "D0.13.X0.0011.P0"); //0.13.002: FUNC_METER_IC_COMM_ALARM, CDFA_V3
  475. //sprintf(Charger.Ver_FW, "D0.14.X0.0011.P0"); //0.14.000: MODIFY_CPTASK_CSU_0_1_CHARGE_MODE (Fix UL test issue) + Relay welding
  476. //sprintf(Charger.Ver_FW, "D0.15.X0.0011.P0"); //0.15: FUNC_NEW_RELAY_MONITOR, FUNC_ZEROING_WHEN_MEM_CLEARNED
  477. //sprintf(Charger.Ver_FW, "D0.16.X0.0011.P0"); //0.16: FUNC_NEW_RELAY_MONITOR/Relay_LL_DriveFault_Slop/Relay_LL_DriveFault_Offs
  478. #endif //FUNC_FW_VER_TRACE
  479. #ifdef FUNC_VERSION_USE_NEW_SPEC_20240926
  480. //Indicate firmware belong which module board
  481. //L: LED board
  482. //R: Relay board
  483. //C: CHAdeMO board
  484. //G: GBT board
  485. //F: Fan board
  486. //D: DCM 407
  487. //A: AC main board
  488. //S: CCS board
  489. //M: CSU board
  490. Charger.Ver_FW[6] = 'A';
  491. //0: For formal release specification
  492. //1: For lab certificate specification
  493. #ifdef FUNC_VERSION_FOR_LAB_CERTIFICATE_SPEC
  494. Charger.Ver_FW[7] = '1';
  495. #else
  496. Charger.Ver_FW[7] = '0';
  497. #endif
  498. #endif //FUNC_VERSION_USE_NEW_SPEC_20240926
  499. }
  500. //---------------
  501. #ifdef FUNC_STM32_FLASH_INFO
  502. enum { STM32_UID_LEN = 12 }; //96 bits (12 bytes)
  503. typedef struct _STM32_Flash_Info
  504. {
  505. union
  506. {
  507. u8 m_UID[STM32_UID_LEN];
  508. u32 m_UIDw[3];
  509. };
  510. u32 m_DeviceID;
  511. u32 m_FlashSizeKB;
  512. }
  513. STM32_Flash_Info, *PSTM32_Flash_Info;
  514. void STM32_Flash_Info_Init(PSTM32_Flash_Info p)
  515. {
  516. memset(p, 0, sizeof(STM32_Flash_Info));
  517. }
  518. void STM32_Flash_Info_Read(PSTM32_Flash_Info p)
  519. {
  520. //UID
  521. memcpy(p->m_UID, (u8*)UID_BASE, STM32_UID_LEN);
  522. //Device ID
  523. p->m_DeviceID = (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_DEV_ID));
  524. //Flash size
  525. p->m_FlashSizeKB = (uint32_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE)) & 0xFFFF);
  526. }
  527. void STM32_Flash_Info_Disp(PSTM32_Flash_Info p)
  528. {
  529. XP("[FlashInfo]------------------------\r\n");
  530. //UID
  531. HTK_ByteArray2HexStr_XP("UID", p->m_UID, 0, STM32_UID_LEN);
  532. //Device ID
  533. XP("DeviceID: 0x%03X\r\n", p->m_DeviceID);
  534. {
  535. char *s = "DeviceFamily: ";
  536. if (p->m_DeviceID == 0x413)
  537. {
  538. XP("%sSTM32F40xxx/F41xxx\r\n", s);
  539. }
  540. else if (p->m_DeviceID == 0x419)
  541. {
  542. XP("%sSTM32F42xxx/F43xxx\r\n", s);
  543. }
  544. else
  545. {
  546. XP("%sUnknow\r\n", s);
  547. }
  548. }
  549. //Flash size
  550. XP("DeviceFlashSize: %d Kbytes\r\n", p->m_FlashSizeKB);
  551. #ifdef FUNC_DISP_MCU_CLOCK_INFO
  552. XP("PWR->CR: 0x%08X, PWR->CSR: 0x%08X\r\n", PWR->CR, PWR->CSR);
  553. #endif
  554. }
  555. void STM32_Flash_Info_Proc(void)
  556. {
  557. PSTM32_Flash_Info p = HTK_Malloc(sizeof(STM32_Flash_Info));
  558. if (p != NULL)
  559. {
  560. STM32_Flash_Info_Init(p);
  561. STM32_Flash_Info_Read(p);
  562. STM32_Flash_Info_Disp(p);
  563. }
  564. else
  565. {
  566. XP("PSTM32_Flash_Info malloc NG\r\n");
  567. }
  568. }
  569. #endif //FUNC_STM32_FLASH_INFO
  570. #ifdef FUNC_STM32_FLASH_OPTION_BYTES
  571. typedef struct _STM32_Flash_OB
  572. {
  573. FLASH_OBProgramInitTypeDef m_SetOB;
  574. FLASH_OBProgramInitTypeDef m_CurOB;
  575. u8 m_nRST_STDBY: 1; //0: Reset generated when entering the Standby mode
  576. //1: No reset generated
  577. u8 m_nRST_STOP: 1; //0: Reset generated when entering the Stop mode
  578. //1: No reset generated
  579. u8 m_WDG_SW: 1; //0: Hardware independent watchdog
  580. //1: Software independent watchdog
  581. }
  582. STM32_Flash_OB, *PSTM32_Flash_OB;
  583. void STM32_Flash_OB_Init(PSTM32_Flash_OB p)
  584. {
  585. memset(p, 0, sizeof(STM32_Flash_OB));
  586. //Set default
  587. p->m_SetOB.OptionType = OPTIONBYTE_WRP /*| OPTIONBYTE_RDP*/ | OPTIONBYTE_USER | OPTIONBYTE_BOR;
  588. p->m_SetOB.WRPState = OB_WRPSTATE_ENABLE;
  589. p->m_SetOB.Banks = 0;
  590. p->m_SetOB.BORLevel = OB_BOR_LEVEL3;
  591. p->m_SetOB.USERConfig = OB_IWDG_SW | OB_STOP_NO_RST | OB_STDBY_NO_RST;
  592. #ifdef FUNC_USE_STM32_SBSFU
  593. //Sector_0~4: Write Protection; Sector_5~11: No Write Protection
  594. p->m_SetOB.WRPSector = OB_WRP_SECTOR_0 | OB_WRP_SECTOR_1 | OB_WRP_SECTOR_2 | OB_WRP_SECTOR_3 | OB_WRP_SECTOR_4;
  595. p->m_SetOB.RDPLevel = OB_RDP_LEVEL_1;
  596. #else
  597. //Sector_0~11: No Write Protection
  598. p->m_SetOB.WRPSector = ~OB_WRP_SECTOR_All;
  599. p->m_SetOB.RDPLevel = OB_RDP_LEVEL_0;
  600. #endif
  601. }
  602. void STM32_Flash_OB_Read(PSTM32_Flash_OB p)
  603. {
  604. __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  605. HAL_FLASHEx_OBGetConfig(&p->m_CurOB);
  606. __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
  607. p->m_nRST_STDBY = BIT_GET(p->m_CurOB.USERConfig, 7);
  608. p->m_nRST_STOP = BIT_GET(p->m_CurOB.USERConfig, 6);
  609. p->m_WDG_SW = BIT_GET(p->m_CurOB.USERConfig, 5);
  610. }
  611. void STM32_Flash_OB_WriteDefault(PSTM32_Flash_OB p)
  612. {
  613. XP("<Write default OB>\r\n");
  614. __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  615. HAL_FLASH_Unlock();
  616. HAL_FLASH_OB_Unlock();
  617. {
  618. {
  619. XP("<Set OB Default>\r\n");
  620. HAL_FLASHEx_OBProgram(&p->m_SetOB);
  621. HAL_FLASH_OB_Launch();
  622. }
  623. {
  624. FLASH_OBProgramInitTypeDef ob;
  625. memcpy(&ob, &p->m_SetOB, sizeof(p->m_SetOB));
  626. ob.OptionType = OPTIONBYTE_WRP;
  627. ob.WRPState = OB_WRPSTATE_DISABLE;
  628. ob.WRPSector = (~p->m_SetOB.WRPSector) & OB_WRP_SECTOR_All;
  629. XP("<Set OB.WRPSector => Disable>\r\n");
  630. HAL_FLASHEx_OBProgram(&ob);
  631. HAL_FLASH_OB_Launch();
  632. }
  633. if (p->m_CurOB.RDPLevel == OB_RDP_LEVEL_0 && p->m_SetOB.RDPLevel == OB_RDP_LEVEL_1)
  634. {
  635. FLASH_OBProgramInitTypeDef ob;
  636. memcpy(&ob, &p->m_SetOB, sizeof(p->m_SetOB));
  637. ob.OptionType = OPTIONBYTE_RDP;
  638. XP("<Set OB.RDPLevel => Level 1> Please power off and then power on to restart !\r\n");
  639. HAL_FLASHEx_OBProgram(&ob);
  640. HAL_FLASH_OB_Launch();
  641. /* Set the OPTSTRT bit in OPTCR register */
  642. // XP("*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT [BEG]\r\n");
  643. // *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT;
  644. // XP("*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT [BEG]\r\n");
  645. //HAL_Delay(1000);
  646. //NVIC_SystemReset();
  647. }
  648. }
  649. HAL_FLASH_OB_Lock();
  650. HAL_FLASH_Lock();
  651. __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
  652. }
  653. void STM32_Flash_OB_Disp(PSTM32_Flash_OB p)
  654. {
  655. XP("[OB]-------------------------------\r\n");
  656. XP("OptionType: 0x%08X\r\n", p->m_CurOB.OptionType);
  657. XP("WRPState : 0x%08X\r\n", p->m_CurOB.WRPState);
  658. XP("WRPSector : 0x%08X\r\n", p->m_CurOB.WRPSector);
  659. {
  660. for (int i = 0; i < 12; i++)
  661. {
  662. XP("\tSector_%d: %s Protection\r\n", i, BIT_GET(p->m_CurOB.WRPSector, i) == 1 ? "No" : "Write");
  663. }
  664. }
  665. XP("Banks : 0x%08X\r\n", p->m_CurOB.Banks);
  666. XP("RDPLevel : 0x%08X (0: 0xAA, 1: 0x55, 2: 0xCC)\r\n", p->m_CurOB.RDPLevel);
  667. XP("BORLevel : 0x%08X (3: 0x00, 2: 0x04, 1: 0x08, OFF: 0x0C)\r\n", p->m_CurOB.BORLevel);
  668. XP("USERConfig: 0x%02X\r\n", p->m_CurOB.USERConfig);
  669. {
  670. XP("\tnRST_STDBY = %d (%s)\r\n", p->m_nRST_STDBY, (p->m_nRST_STDBY == 0 ? "STDBY_RST(0)" : "STDBY_NO_RST(0x80)"));
  671. XP("\tnRST_STOP = %d (%s)\r\n", p->m_nRST_STOP, (p->m_nRST_STOP == 0 ? "STOP_RST(0)" : "STOP_NO_RST(0x40)"));
  672. XP("\tWDG_SW = %d (%s)\r\n", p->m_WDG_SW, (p->m_WDG_SW == 0 ? "IWDG_HW(0)" : "IWDG_SW(0x20)"));
  673. }
  674. }
  675. HTK_BOOL STM32_Flash_OB_IsDefault(PSTM32_Flash_OB p)
  676. {
  677. XP("m_CurOB.BORLevel = 0x%08X, m_SetOB.BORLevel = 0x%08X\r\n", p->m_CurOB.BORLevel, p->m_SetOB.BORLevel);
  678. XP("m_CurOB.RDPLevel = 0x%08X, m_SetOB.RDPLevel = 0x%08X\r\n", p->m_CurOB.RDPLevel, p->m_SetOB.RDPLevel);
  679. XP("m_CurOB.USERConfig = 0x%08X, m_SetOB.USERConfig = 0x%08X\r\n", p->m_CurOB.USERConfig, p->m_SetOB.USERConfig);
  680. XP("m_CurOB.WRPSector = 0x%08X, m_SetOB.WRPSector = 0x%08X\r\n", p->m_CurOB.WRPSector, p->m_SetOB.WRPSector);
  681. XP("(~p->m_SetOB.WRPSector) & OB_WRP_SECTOR_All = 0x%08X\r\n", (~p->m_SetOB.WRPSector) & OB_WRP_SECTOR_All);
  682. if (
  683. (p->m_CurOB.BORLevel == p->m_SetOB.BORLevel) &&
  684. (p->m_CurOB.RDPLevel == p->m_SetOB.RDPLevel) &&
  685. (p->m_CurOB.USERConfig == p->m_SetOB.USERConfig) &&
  686. (p->m_CurOB.WRPSector == ((~p->m_SetOB.WRPSector) & OB_WRP_SECTOR_All))
  687. )
  688. {
  689. XP("<OB is Default>\r\n");
  690. return HTK_TRUE;
  691. }
  692. else
  693. {
  694. XP("<OB is NOT Default>\r\n");
  695. return HTK_FALSE;
  696. }
  697. }
  698. void STM32_Flash_OB_ProcDefault(void)
  699. {
  700. PSTM32_Flash_OB p = HTK_Malloc(sizeof(STM32_Flash_OB));
  701. if (p != NULL)
  702. {
  703. STM32_Flash_OB_Init(p);
  704. STM32_Flash_OB_Read(p);
  705. STM32_Flash_OB_Disp(p);
  706. if (!STM32_Flash_OB_IsDefault(p))
  707. {
  708. STM32_Flash_OB_WriteDefault(p);
  709. STM32_Flash_OB_Read(p);
  710. STM32_Flash_OB_Disp(p);
  711. if (STM32_Flash_OB_IsDefault(p))
  712. {
  713. XP("<Write default OB success>\r\n");
  714. }
  715. else
  716. {
  717. XP("<Write default OB fail>\r\n");
  718. }
  719. }
  720. }
  721. else
  722. {
  723. XP("STM32_Flash_OB malloc NG\r\n");
  724. }
  725. }
  726. #endif //FUNC_STM32_FLASH_OPTION_BYTES
  727. void MX_FREERTOS_Init(void) {
  728. /* USER CODE BEGIN Init */
  729. #ifdef FUNC_BOOT_TICK
  730. Charger.m_BootTick = HAL_GetTick();
  731. #endif
  732. #ifdef FUNC_STM32_FLASH_INFO
  733. STM32_Flash_Info_Proc();
  734. #endif //FUNC_STM32_FLASH_INFO
  735. #ifdef FUNC_STM32_FLASH_OPTION_BYTES
  736. STM32_Flash_OB_ProcDefault();
  737. #endif
  738. #ifdef FUNC_RS485_BLE_SW
  739. RS485_SW(HTK_TRUE);
  740. BLE_SW(HTK_FALSE); //Disable BLE (remove part from PCB)
  741. #endif
  742. #ifdef FUNC_SYSTEM_KEEP_INFO
  743. if (!SystemKeepInfo_Check(&g_SystemKeepInfo))
  744. {
  745. memset(&g_SystemKeepInfo, 0, sizeof(g_SystemKeepInfo));
  746. }
  747. g_SystemKeepInfo.m_BootCount++;
  748. SystemKeepInfo_Update(&g_SystemKeepInfo);
  749. SystemKeepInfo_Display(&g_SystemKeepInfo);
  750. #endif
  751. UpdateFirmwareVersion();
  752. sprintf(Charger.Ver_HW, "1.0");
  753. HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port, OUT_Leak_Test_Pin, GPIO_PIN_SET);
  754. /* USER CODE END Init */
  755. /* USER CODE BEGIN RTOS_MUTEX */
  756. /* add mutexes, ... */
  757. /* USER CODE END RTOS_MUTEX */
  758. /* USER CODE BEGIN RTOS_SEMAPHORES */
  759. /* add semaphores, ... */
  760. /* USER CODE END RTOS_SEMAPHORES */
  761. /* USER CODE BEGIN RTOS_TIMERS */
  762. /* start timers, add new ones, ... */
  763. /* USER CODE END RTOS_TIMERS */
  764. /* USER CODE BEGIN RTOS_QUEUES */
  765. /* add queues, ... */
  766. /* USER CODE END RTOS_QUEUES */
  767. /* Create the thread(s) */
  768. /* definition and creation of ethTask */
  769. #ifndef DISABLE_OS_ETH_TASK
  770. //osThreadDef(ethTask, StartEthTask, osPriorityIdle, 0, 1024);
  771. osThreadDef(ethTask, StartEthTask, osPriorityIdle, 0, 128); //Empty(USB)
  772. ethTaskHandle = osThreadCreate(osThread(ethTask), NULL);
  773. #endif
  774. /* definition and creation of uartTask */
  775. osThreadDef(uartTask, StartUartTask, osPriorityNormal, 0, 1024);
  776. uartTaskHandle = osThreadCreate(osThread(uartTask), NULL);
  777. /* definition and creation of adcTask */
  778. #ifdef MODIFY_OS_ADC_TASK_DEFINE_DATA
  779. osThreadDef(adcTask, StartAdcTask, osPriorityRealtime, 0, 512);
  780. #else
  781. osThreadDef(adcTask, StartAdcTask, osPriorityRealtime, 0, 256);
  782. #endif
  783. adcTaskHandle = osThreadCreate(osThread(adcTask), NULL);
  784. /* definition and creation of timeoutTask */
  785. osThreadDef(timeoutTask, StartTimeoutTask, osPriorityNormal, 0, 128);
  786. timeoutTaskHandle = osThreadCreate(osThread(timeoutTask), NULL);
  787. #ifdef FUNC_ENABLE_USART1_RFID
  788. /* definition and creation of rfidTask */
  789. osThreadDef(rfidTask, StartRfidTask, osPriorityIdle, 0, 256);
  790. rfidTaskHandle = osThreadCreate(osThread(rfidTask), NULL);
  791. #endif
  792. /* definition and creation of led_speakerTask */
  793. osThreadDef(led_speakerTask, StartLedSpeakerTask, osPriorityNormal, 0, 128);
  794. led_speakerTaskHandle = osThreadCreate(osThread(led_speakerTask), NULL);
  795. /* definition and creation of cpTask */
  796. osThreadDef(cpTask, StartCpTask, osPriorityHigh, 0, 256);
  797. cpTaskHandle = osThreadCreate(osThread(cpTask), NULL);
  798. /* definition and creation of alarmTask */
  799. osThreadDef(alarmTask, StartAlarmTask, osPriorityHigh, 0, 256);
  800. alarmTaskHandle = osThreadCreate(osThread(alarmTask), NULL);
  801. /* definition and creation of bleTask */
  802. #ifdef LOCAL_LINK_BLE
  803. osThreadDef(bleTask, StartBleTask, osPriorityHigh, 0, 1024);
  804. bleTaskHandle = osThreadCreate(osThread(bleTask), NULL);
  805. #endif
  806. /* definition and creation of memoryTask */
  807. osThreadDef(memoryTask, StartMemoryTask, osPriorityIdle, 0, 256);
  808. memoryTaskHandle = osThreadCreate(osThread(memoryTask), NULL);
  809. /* definition and creation of wifiTask */
  810. #ifdef LOCAL_LINK_WIFI
  811. osThreadDef(wifiTask, StartWifiTask, osPriorityIdle, 0, 1024);
  812. wifiTaskHandle = osThreadCreate(osThread(wifiTask), NULL);
  813. #endif
  814. /* definition and creation of MeterTask */
  815. osThreadDef(MeterTask, StartMeterTask, osPriorityIdle, 0, 1024);
  816. MeterTaskHandle = osThreadCreate(osThread(MeterTask), NULL);
  817. /* USER CODE BEGIN RTOS_THREADS */
  818. /* add threads, ... */
  819. #ifdef RECODE_FUNC_METER_IC_TASK
  820. #ifdef MODIFY_METER_IC_TASK_PRIORITY
  821. //osThreadDef(MeterIcTask, StartMeterIcTask, osPriorityAboveNormal, 0, 1024);
  822. osThreadDef(MeterIcTask, StartMeterIcTask, osPriorityHigh, 0, 1024);
  823. #else
  824. osThreadDef(MeterIcTask, StartMeterIcTask, osPriorityNormal, 0, 1024);
  825. #endif
  826. MeterIcTaskHandle = osThreadCreate(osThread(MeterIcTask), NULL);
  827. #endif
  828. #ifdef FUNC_TASK_MONITOR
  829. osThreadDef(MonitorTask, StartMonitorTask, osPriorityIdle, 0, 256);
  830. MonitorTaskHandle = osThreadCreate(osThread(MonitorTask), NULL);
  831. #endif
  832. #ifdef FUNC_LIN_CP
  833. //osThreadDef(LinCpTask, StartLinCpTask, osPriorityIdle, 0, 256 * 4);
  834. osThreadDef(LinCpTask, StartLinCpTask, osPriorityIdle, 0, 256);
  835. LinCpTaskHandle = osThreadCreate(osThread(LinCpTask), NULL);
  836. #endif
  837. #ifdef FUNC_VERIFY_TASK
  838. osThreadDef(VerifyTask, StartVerifyTask, osPriorityIdle, 0, 256);
  839. VerifyTaskHandle = osThreadCreate(osThread(VerifyTask), NULL);
  840. #endif
  841. /* USER CODE END RTOS_THREADS */
  842. }
  843. #ifndef DISABLE_OS_ETH_TASK
  844. /* USER CODE BEGIN Header_StartEthTask */
  845. /**
  846. * @brief Function implementing the ethTask thread.
  847. * @param argument: Not used
  848. * @retval None
  849. */
  850. /* USER CODE END Header_StartEthTask */
  851. void StartEthTask(void const * argument)
  852. {
  853. /* init code for USB_DEVICE */
  854. MX_USB_DEVICE_Init();
  855. /* USER CODE BEGIN StartEthTask */
  856. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  857. IdleUntilReadAllMemory();
  858. #endif
  859. /* Infinite loop */
  860. for(;;)
  861. {
  862. osDelay(1);
  863. }
  864. /* USER CODE END StartEthTask */
  865. }
  866. #endif //DISABLE_OS_ETH_TASK
  867. /* USER CODE BEGIN Header_StartUartTask */
  868. /**
  869. * @brief Function implementing the uartTask thread.
  870. * @param argument: Not used
  871. * @retval None
  872. */
  873. /* USER CODE END Header_StartUartTask */
  874. void StartUartTask(void const * argument)
  875. {
  876. /* USER CODE BEGIN StartUartTask */
  877. //uuart
  878. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  879. IdleUntilReadAllMemory();
  880. #endif
  881. #ifndef DISABLE_PRINT_RTOS_MSG
  882. uint8_t pcWriteBuffer[1024];
  883. #endif
  884. #ifndef FUNC_USE_STM32_SBSFU
  885. uint8_t endFlag[4]={0x55,0xaa,0x55,0xaa};
  886. uint32_t checksum;
  887. #endif
  888. __IO uint32_t flash;
  889. uint8_t dbgIdx;
  890. #if defined(DEBUG) || defined(RTOS_STAT)
  891. DEBUG_INFO("========== AP initial OK ==========\n\r");
  892. DEBUG_INFO(" Version: %s\n\r", Charger.Ver_FW);
  893. DEBUG_INFO("===================================\n\r");
  894. if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) DEBUG_INFO("Reset flag: Pin reset \r\n");
  895. if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) DEBUG_INFO("Reset flag: POR reset \r\n");
  896. if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) DEBUG_INFO("Reset flag: SW reset \r\n");
  897. if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) DEBUG_INFO("Reset flag: IWDG reset \r\n");
  898. if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) DEBUG_INFO("Reset flag: WWDG reset \r\n");
  899. if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) != RESET) DEBUG_INFO("Reset flag: LP reset \r\n");
  900. DEBUG_INFO("\r\n");
  901. __HAL_RCC_CLEAR_RESET_FLAGS();
  902. #endif
  903. Charger.CSUisReady = OFF ;
  904. #ifdef FUNC_RS485_SLAVE
  905. HAL_GPIO_WritePin(OUT_Meter_485_DE_GPIO_Port, OUT_Meter_485_DE_Pin, GPIO_PIN_RESET);
  906. HAL_GPIO_WritePin(OUT_Meter_485_RE_GPIO_Port, OUT_Meter_485_RE_Pin, GPIO_PIN_RESET);
  907. #endif
  908. #ifdef FUNC_IDLE_UNTIL_INIT_METER_IC
  909. IdleUntilInitMeterIC();
  910. #endif
  911. #ifdef FUNC_CSU_PUBLIC_KEY_OPERATION
  912. if (Charger.m_bCsuSignInMustVerify)
  913. {
  914. #ifdef FUNC_SECURITY_DEBUG_INFO
  915. HTK_ByteArray2HexStr_XP("CSU_PublicKey", Charger.memory.EVSE_Config.data.item.m_CsuPublicKey, 0, CSU_PUBLIC_KEY_LEN);
  916. #endif
  917. }
  918. #endif
  919. #ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
  920. u8 CsuSetRelayOffCount = 0;
  921. #endif
  922. //#ifdef FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD
  923. // u8 CsuSetRequestOffCount = 0;
  924. //#endif
  925. /* Infinite loop */
  926. for(;;)
  927. {
  928. timerEnable(TIMER_IDX_RTOS_STAT, 500);
  929. if(timer[TIMER_IDX_RTOS_STAT].isAlarm)
  930. {
  931. switch(dbgIdx)
  932. {
  933. case 0:
  934. #ifdef RTOS_STAT
  935. #ifndef DISABLE_PRINT_RTOS_MSG
  936. printf("=================================================\r\n");
  937. printf("Task_Name \tState \tPrior \tStack \tTask_Id\r\n");
  938. vTaskList((char *)&pcWriteBuffer);
  939. printf("%s\r\n", pcWriteBuffer);
  940. printf("-------------------------------------------------\r\n");
  941. printf("Task_Name \tRun_Time(10us) \tUsage_Percent\r\n");
  942. vTaskGetRunTimeStats((char *)&pcWriteBuffer);
  943. printf("%s\r\n", pcWriteBuffer);
  944. #endif //DISABLE_PRINT_RTOS_MSG
  945. #endif
  946. #ifdef FUNC_PTB_METER_WM3M4C
  947. if (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C)
  948. {
  949. const PWM3M4C p = Charger.m_pWM3M4C;
  950. #ifdef DEBUG_PTB_METER_WM3M4C
  951. XP("========================< WM3M4C Information >=====================\r\n");
  952. XP("[30001 ModelName ] %s\r\n", p->m_ModelName.m_Str);
  953. XP("[30009 SerialNumber ] %s\r\n", p->m_SerialNumber.m_Str);
  954. XP("[30013 SW_Version ] %.2f\r\n", (float)p->m_SW_Ver.m_Val * 0.01);
  955. XP("[30014 HW_Version ] %s\r\n", p->m_HW_Ver.m_Str);
  956. XP("===================================================================\r\n");
  957. XP("[30400 CheckSumStatus ] 0x%04X\r\n", p->m_CheckSumStatus.m_Val);
  958. XP("===================================================================\r\n");
  959. XP("[30414 EngCountExp1 ] %d\r\n", p->m_EngCountExp1.m_Val);
  960. XP("[30415 EngCountExp2 ] %d\r\n", p->m_EngCountExp2.m_Val);
  961. XP("[30418 EngCount1 (Wh) ] %d\r\n", p->m_EngCount1.m_Val);
  962. XP("[30420 EngCount2 (Wh) ] %d\r\n", p->m_EngCount2.m_Val);
  963. XP("[30434 EngCount1x1000 ] %d\r\n", p->m_EngCount1x1000.m_Val);
  964. XP("[30436 EngCount2x1000 ] %d\r\n", p->m_EngCount2x1000.m_Val);
  965. XP("[----- Eng1 (0.0001Wh) ] %llu\r\n", p->m_AccuEnergy1);
  966. XP("===================================================================\r\n");
  967. XP("[47000 MeasurementStatus] %d\r\n", p->m_MeasurementStatus.m_Val);
  968. XP("[47001 Duration ] %d\r\n", p->m_Duration.m_Val);
  969. XP("[47003 Consumption ] %d\r\n", p->m_Consumption.m_Val);
  970. XP("[47005 ActivePowerTotal ] %lf\r\n", p->m_ActivePowerTotal.m_Val);
  971. XP("[47007 DateTime ] %d (%s)\r\n", p->m_GetDateTime.m_Val, p->m_GetDateTime.m_Str);
  972. XP("[47013 SignaturesCount ] %d\r\n", p->m_SignaturesCount.m_Val);
  973. XP("===================================================================\r\n");
  974. XP("[47052 SignatureStatus ] %d\r\n", p->m_SignatureStatus.m_Val);
  975. XP("[47053 TimeZoneOffset ] %d\r\n", p->m_TimeZoneOffset.m_Val);
  976. XP("[47054 SetDataTime ] %d (%s)\r\n", p->m_SetDataTime.m_Val, p->m_SetDataTime.m_Str);
  977. XP("[47056 InpMsgLen ] %d\r\n", p->m_InpMsgLen.m_Val);
  978. XP("[47057 OutpMsgLen ] %d\r\n", p->m_OutpMsgLen.m_Val);
  979. XP("[47058 OutpSigLen ] %d (x2 = %d)\r\n", p->m_OutpSigLen.m_Val, p->m_OutpSigLen.m_Val * 2);
  980. XP("[----- ExpOutpMsgSigLen ] %d\r\n", p->m_ExpectOutpMsgSigLen);
  981. XP("[47059 OutpSigFmt ] %d\r\n", p->m_OutpSigFmt.m_Val);
  982. XP("[47060 OutpSigAlg ] %d\r\n", p->m_OutpSigAlg.m_Val);
  983. XP("[47061 Backlit ] %d\r\n", p->m_Backlit.m_Val);
  984. XP("===================================================================\r\n");
  985. XP("[47100 DataSetInput ] %s (%d:%d)\r\n", p->m_InputJsonMsg.m_All, p->m_InpMsgLen.m_Val, strlen(p->m_InputJsonMsg.m_All));
  986. XP("===================================================================\r\n");
  987. XP("[47612 OutpMsg ] %s (%d:%d)\r\n", (char*)p->m_OutpMsg.m_Buf, p->m_OutpMsgLen.m_Val, strlen((char*)p->m_OutpMsg.m_Buf));
  988. XP("===================================================================\r\n");
  989. XP("[FIXED PublicKeyHeader ] %s (%d)\r\n", p->m_PublicKeyHStr, WM3M3C_PUBLIC_KEY_H_LEN * 2);
  990. XP("[48124 PublicKey ] %s (%d)\r\n", p->m_PublicKey.m_Str, p->m_PublicKeyStrLen);
  991. XP("===================================================================\r\n");
  992. XP("[48188 OutpSig ] %s (%d)\r\n", p->m_OutpSig.m_Str, p->m_OutpSigLen.m_Val);
  993. XP("===================================================================\r\n");
  994. XP("[----- OutpMsgSig ] %s (%d)\r\n", p->m_OutpMsgSig, p->m_OutpMsgSigLen);
  995. XP("[----- Header+PKey ] %s (%d)\r\n", p->m_HPKey, p->m_HPKeyLen);
  996. XP("===================================================================\r\n");
  997. #else //DEBUG_PTB_METER_WM3M4C
  998. XP("[OutpMsgSig] %s (%d)\r\n", p->m_OutpMsgSig, p->m_OutpMsgSigLen);
  999. XP("[Header+PKey] %s (%d)\r\n\r\n", p->m_HPKey, p->m_HPKeyLen);
  1000. #endif //DEBUG_PTB_METER_WM3M4C
  1001. }
  1002. #endif //FUNC_PTB_METER_WM3M4C
  1003. #ifdef FUNC_EKM_OMNIMETER_DISPLAY
  1004. if (Charger.m_bUseExtMeter_OMNIMETER && Charger.m_pEKM_Omnimeter)
  1005. {
  1006. EKM_Omnimeter_Display(Charger.m_pEKM_Omnimeter);
  1007. }
  1008. #endif
  1009. #ifdef FUNC_LINCP_DISPLAY
  1010. if (Charger.m_bUseLinCP && Charger.m_pLinCP)
  1011. {
  1012. LIN_Display(Charger.m_pLinCP);
  1013. }
  1014. #endif
  1015. //#ifdef FUNC_SALT_AND_BLEND
  1016. // if (0)
  1017. // {
  1018. // enum
  1019. // {
  1020. // KeyLen = 64,
  1021. // SaltLen = 64,
  1022. // MixtureLen = KeyLen + SaltLen,
  1023. // SaltMapLen = GET_BOX_NUM(MixtureLen, 8),
  1024. // AllLen = MixtureLen + SaltMapLen,
  1025. // };
  1026. //
  1027. // u8* Key = (u8*)HTK_Malloc(KeyLen);
  1028. // if (Key != NULL)
  1029. // {
  1030. // for (int i = 0; i < KeyLen; i++) { Key[i] = i + 1; }
  1031. // u8* Mixture = (u8*)HTK_Malloc(AllLen);
  1032. // if (Mixture != NULL)
  1033. // {
  1034. // DataEncryption(Key, KeyLen, Mixture, AllLen, 0);
  1035. // DataEncryption(Key, KeyLen, Mixture, AllLen, 1);
  1036. // HTK_Free(Mixture);
  1037. // }
  1038. // HTK_Free(Key);
  1039. // }
  1040. // }
  1041. //#endif //FUNC_SALT_AND_BLEND
  1042. dbgIdx++;
  1043. break;
  1044. case 1:
  1045. #ifdef FUNC_USE_STM32_SBSFU
  1046. DEBUG_INFO("Firmware version: %s [S]\r\n", Charger.Ver_FW);
  1047. #else
  1048. DEBUG_INFO("Firmware version: %s\r\n", Charger.Ver_FW);
  1049. #endif
  1050. #ifdef FUNC_BUILD_DATE_TIME
  1051. DEBUG_INFO("Build: %s %s\r\n", __DATE__, __TIME__); //ex Build: Mar 10 2022 14:53:25
  1052. #endif
  1053. #ifdef FUNC_CSU_SIGN_IN_VERIFY
  1054. DEBUG_INFO("MCU_Control_Mode: %x (%s%s)\r\n",Charger.memory.EVSE_Config.data.item.MCU_Control_Mode,
  1055. Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU ? "CSU" : "No CSU",
  1056. Charger.m_bCsuSignInMustVerify ? (Charger.m_bCsuSignInVerifyOK ? ": VerifyOK" : ": NotVerify") : "");
  1057. #else
  1058. DEBUG_INFO("MCU_Control_Mode: %x (%s)\r\n",Charger.memory.EVSE_Config.data.item.MCU_Control_Mode,
  1059. Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU ? "CSU" : "No CSU");
  1060. #endif
  1061. DEBUG_INFO("ModelName: %s\r\n",Charger.memory.EVSE_Config.data.item.ModelName);
  1062. DEBUG_INFO("SerialNumber: %s\r\n",Charger.memory.EVSE_Config.data.item.SerialNumber);
  1063. #ifdef FUNC_BOOT_TICK
  1064. DEBUG_INFO("UpTime(s): %d\r\n", (HAL_GetTick() - Charger.m_BootTick) / 1000);
  1065. #endif
  1066. dbgIdx++;
  1067. break;
  1068. case 2:
  1069. if (Charger.CCID_Module_Type == CCID_MODULE_CORMEX)
  1070. {
  1071. DEBUG_INFO("Charger.CCID_Module_Type is CCID_MODULE_CORMEX\n\r");
  1072. }
  1073. else if (Charger.CCID_Module_Type == CCID_MODULE_VAC)
  1074. {
  1075. DEBUG_INFO("Charger.CCID_Module_Type is CCID_MODULE_VAC\n\r");
  1076. }
  1077. DEBUG_INFO("System mode: %d\r\n", Charger.Mode);
  1078. DEBUG_INFO("Alarm code: 0x%08X\r\n", Charger.Alarm_Code);
  1079. #ifdef FUNC_WARNING_CODE
  1080. DEBUG_INFO("Warning code: 0x%08X\r\n", Charger.Warning_Code);
  1081. #endif
  1082. #ifdef FUNC_SHOW_RELAY_INFO
  1083. DEBUG_INFO("Relay action: Main(%d), TypeE(%d)\r\n", Charger.Relay_Action, Charger.SE_Relay_Action);
  1084. #endif
  1085. #ifdef FUNC_MODE_DEBUG_REC_RELAY_ON_TIMES
  1086. if (Charger.isDebugEnable)
  1087. {
  1088. DEBUG_INFO("[Debug Mode] RelayOnTimes: %d\r\n", Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes);
  1089. }
  1090. #endif
  1091. dbgIdx++;
  1092. break;
  1093. case 3:
  1094. #ifndef FUNC_REPLACE_ADC_WITH_METER_IC
  1095. DEBUG_INFO("Original L1 Voltage: %fV\r\n", adc_value.ADC3_IN9_Voltage_L1.value/100.0);
  1096. DEBUG_INFO("Original L2 Voltage: %fV\r\n", adc_value.ADC3_IN8_Voltage_L2.value/100.0);
  1097. DEBUG_INFO("Original L3 Voltage: %fV\r\n", adc_value.ADC3_IN10_Voltage_L3.value/100.0);
  1098. #endif
  1099. dbgIdx++;
  1100. break;
  1101. case 4:
  1102. #ifndef FUNC_REPLACE_ADC_WITH_METER_IC
  1103. DEBUG_INFO("Original L1 Current: %fA\r\n", adc_value.ADC3_IN7_Current_L1.value/100.0);
  1104. DEBUG_INFO("Original L2 Current: %fA\r\n", adc_value.ADC3_IN5_Current_L2.value/100.0);
  1105. DEBUG_INFO("Original L3 Current: %fA\r\n", adc_value.ADC3_IN11_Current_L3.value/100.0);
  1106. #endif
  1107. dbgIdx++;
  1108. break;
  1109. case 5:
  1110. #ifdef FUNC_INFO_METER_IC_RAW_DATA
  1111. DEBUG_INFO("Correction L1 Voltage[0]: %fV (%d)\r\n", Charger.Voltage[0]/100.0, Charger.m_MeterIC_MeasVals.m_AVRMS_LRIP);
  1112. DEBUG_INFO("Correction L2 Voltage[1]: %fV (%d)\r\n", Charger.Voltage[1]/100.0, Charger.m_MeterIC_MeasVals.m_BVRMS_LRIP);
  1113. DEBUG_INFO("Correction L3 Voltage[2]: %fV (%d)\r\n", Charger.Voltage[2]/100.0, Charger.m_MeterIC_MeasVals.m_CVRMS_LRIP);
  1114. #else
  1115. DEBUG_INFO("Correction L1 Voltage[0]: %fV\r\n", Charger.Voltage[0]/100.0);
  1116. DEBUG_INFO("Correction L2 Voltage[1]: %fV\r\n", Charger.Voltage[1]/100.0);
  1117. DEBUG_INFO("Correction L3 Voltage[2]: %fV\r\n", Charger.Voltage[2]/100.0);
  1118. #endif
  1119. dbgIdx++;
  1120. break;
  1121. case 6:
  1122. #ifdef FUNC_INFO_METER_IC_RAW_DATA
  1123. DEBUG_INFO("Correction L1 Current[0]: %fA (%d)\r\n", Charger.Current[0]/100.0, Charger.m_MeterIC_MeasVals.m_AIRMS_LRIP);
  1124. DEBUG_INFO("Correction L2 Current[1]: %fA (%d)\r\n", Charger.Current[1]/100.0, Charger.m_MeterIC_MeasVals.m_BIRMS_LRIP);
  1125. DEBUG_INFO("Correction L3 Current[2]: %fA (%d)\r\n", Charger.Current[2]/100.0, Charger.m_MeterIC_MeasVals.m_CIRMS_LRIP);
  1126. #else
  1127. DEBUG_INFO("Correction L1 Current[0]: %fA\r\n", Charger.Current[0]/100.0);
  1128. DEBUG_INFO("Correction L2 Current[1]: %fA\r\n", Charger.Current[1]/100.0);
  1129. DEBUG_INFO("Correction L3 Current[2]: %fA\r\n", Charger.Current[2]/100.0);
  1130. #endif
  1131. #ifdef FUNC_METER_IC_READ_PHASE_ANGLE
  1132. {
  1133. #ifndef DISABLE_PRINT_DEBUG_MSG
  1134. const PMeterIC_ExtraInfo pEx = &Charger.m_MeterIcEx;
  1135. #endif
  1136. DEBUG_INFO("MeterIC: MMODE(0x%02X) COMPMODE(0x%04X) STATUS01(0x%08X, 0x%08X) Period(%d:%s)\r\n",
  1137. pEx->m_MMODE,
  1138. pEx->m_COMPMODE,
  1139. pEx->m_STATUS0,
  1140. pEx->m_STATUS1,
  1141. Charger.m_MeterIC_MeasVals.m_Period,
  1142. AC_PERIOD_MODE_STR[pEx->m_AcPeriodMode]);
  1143. DEBUG_INFO("MeterIC: ANGLE_REG3_DEG3(%4d, %4d, %4d, %10.6lf, %10.6lf, %10.6lf) SEQERR(%d) [%s]\r\n",
  1144. pEx->m_AngleReg[0],
  1145. pEx->m_AngleReg[1],
  1146. pEx->m_AngleReg[2],
  1147. pEx->m_AngleDegree[0],
  1148. pEx->m_AngleDegree[1],
  1149. pEx->m_AngleDegree[2],
  1150. pEx->m_bSEQERR,
  1151. AC_PHASE_MODE_STR[pEx->m_AcPhaseMode]);
  1152. }
  1153. #endif //FUNC_METER_IC_READ_PHASE_ANGLE
  1154. dbgIdx++;
  1155. break;
  1156. case 7:
  1157. DEBUG_INFO("PE(ADC): %d\r\n", adc_value.ADC3_IN4_GMI_VL1.value );
  1158. DEBUG_INFO("PE(V): %f\r\n", adc_value.ADC3_IN4_GMI_VL1.value*3.3/4095 );
  1159. DEBUG_INFO("adc_value.ADC2_IN5_Welding.value : %d(unit:0.01v)\r\n", adc_value.ADC2_IN5_Welding.value );
  1160. #ifdef DEBUG_RELAY_MONITOR_SHOW_INFO
  1161. {
  1162. double threshold =
  1163. Charger.Voltage[0] * 0.01 *
  1164. Charger.alarm_spec.Relay_LL_Welding_Slop +
  1165. Charger.alarm_spec.Relay_LL_Welding_Offs;
  1166. XP("#Welding threshold : %lf\r\n", threshold);
  1167. }
  1168. #endif //DEBUG_RELAY_MONITOR_SHOW_INFO
  1169. DEBUG_INFO("SystemAmbientTemp: %d (unit:C)\r\n", Charger.temperature.SystemAmbientTemp);
  1170. #ifdef FUNC_TMP100
  1171. if (Charger.m_bUseTMP100)
  1172. {
  1173. DEBUG_INFO("TMP100: %.4f (unit:C) >>> CcsConnectorTemp: %d \r\n", Charger.m_TMP100_cTemp, Charger.temperature.CcsConnectorTemp);
  1174. }
  1175. #endif
  1176. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  1177. if (Charger.m_bModelNameAX80_1P)
  1178. {
  1179. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  1180. if (Charger.m_bModelNameAX80_NACS_1P)
  1181. {
  1182. #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  1183. DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T12](%d), MAX_G3[T34](%d), MAX_G4[T56](%d)\r\n",
  1184. Charger.temperature.AX80_NACS_T1_L1_IN,
  1185. Charger.temperature.AX80_NACS_T2_L2_IN,
  1186. Charger.temperature.AX80_NACS_T3_L1_OUT,
  1187. Charger.temperature.AX80_NACS_T4_L2_OUT,
  1188. Charger.temperature.AX80_NACS_T5_L1_GUN,
  1189. Charger.temperature.AX80_NACS_T6_L2_GUN,
  1190. Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp);
  1191. #else //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  1192. DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX(%d)\r\n",
  1193. Charger.temperature.AX80_NACS_T1_L1_IN,
  1194. Charger.temperature.AX80_NACS_T2_L2_IN,
  1195. Charger.temperature.AX80_NACS_T3_L1_OUT,
  1196. Charger.temperature.AX80_NACS_T4_L2_OUT,
  1197. Charger.temperature.AX80_NACS_T5_L1_GUN,
  1198. Charger.temperature.AX80_NACS_T6_L2_GUN,
  1199. Charger.temperature.Group2_MaxTemp);
  1200. #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  1201. #ifdef DEBUG_SHOW_AX80_NACS_TEMP_SENSOR_ADC_COUNT
  1202. DEBUG_INFO("[ADC_COUNT] T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d)\r\n",
  1203. adc_value.ADC3_IN9_AX80_NACS_T1.value,
  1204. adc_value.ADC3_IN8_AX80_NACS_T2.value,
  1205. adc_value.ADC3_IN10_AX80_NACS_T3.value,
  1206. adc_value.ADC3_IN7_AX80_NACS_T4.value,
  1207. adc_value.ADC3_IN5_AX80_NACS_T5.value,
  1208. adc_value.ADC3_IN11_AX80_NACS_T6.value);
  1209. #endif //DEBUG_SHOW_AX80_NACS_TEMP_SENSOR_ADC_COUNT
  1210. }
  1211. else
  1212. {
  1213. DEBUG_INFO("Relay1(%d), Relay2(%d), InL1(%d), InL2N(%d), Max(%d)\r\n",
  1214. Charger.temperature.AX80_Relay1Temp,
  1215. Charger.temperature.AX80_Relay2Temp,
  1216. Charger.temperature.AX80_Input_L1_Temp,
  1217. Charger.temperature.AX80_Input_N_L2_Temp,
  1218. Charger.temperature.Group2_MaxTemp);
  1219. }
  1220. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  1221. DEBUG_INFO("Relay1(%d), Relay2(%d), InL1(%d), InL2N(%d), Max(%d)\r\n",
  1222. Charger.temperature.AX80_Relay1Temp,
  1223. Charger.temperature.AX80_Relay2Temp,
  1224. Charger.temperature.AX80_Input_L1_Temp,
  1225. Charger.temperature.AX80_Input_N_L2_Temp,
  1226. Charger.temperature.Group2_MaxTemp);
  1227. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  1228. }
  1229. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  1230. else if (Charger.m_bModelNameAW48_1P)
  1231. {
  1232. #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  1233. #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  1234. DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T12](%d), MAX_G3[T34](%d), MAX_G4[T56](%d)\r\n",
  1235. Charger.temperature.AW48_T1_L1_IN,
  1236. Charger.temperature.AW48_T2_L2_IN,
  1237. Charger.temperature.AW48_T3_L1_OUT,
  1238. Charger.temperature.AW48_T4_L2_OUT,
  1239. Charger.temperature.AW48_T5_L1_GUN,
  1240. Charger.temperature.AW48_T6_L2_GUN,
  1241. Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp);
  1242. #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  1243. DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T1256](%d), MAX_G3[T34](%d)\r\n",
  1244. Charger.temperature.AW48_T1_L1_IN,
  1245. Charger.temperature.AW48_T2_L2_IN,
  1246. Charger.temperature.AW48_T3_L1_OUT,
  1247. Charger.temperature.AW48_T4_L2_OUT,
  1248. Charger.temperature.AW48_T5_L1_GUN,
  1249. Charger.temperature.AW48_T6_L2_GUN,
  1250. Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp);
  1251. #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  1252. #else //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  1253. DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX(%d)\r\n",
  1254. Charger.temperature.AW48_T1_L1_IN,
  1255. Charger.temperature.AW48_T2_L2_IN,
  1256. Charger.temperature.AW48_T3_L1_OUT,
  1257. Charger.temperature.AW48_T4_L2_OUT,
  1258. Charger.temperature.AW48_T5_L1_GUN,
  1259. Charger.temperature.AW48_T6_L2_GUN,
  1260. Charger.temperature.Group2_MaxTemp);
  1261. #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  1262. #ifdef DEBUG_SHOW_AW48_TEMP_SENSOR_ADC_COUNT
  1263. DEBUG_INFO("[ADC_COUNT] T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d)\r\n",
  1264. adc_value.ADC3_IN9_AW48_T1.value,
  1265. adc_value.ADC3_IN8_AW48_T2.value,
  1266. adc_value.ADC3_IN10_AW48_T3.value,
  1267. adc_value.ADC3_IN7_AW48_T4.value,
  1268. adc_value.ADC3_IN5_AW48_T5.value,
  1269. adc_value.ADC3_IN11_AW48_T6.value);
  1270. #endif //DEBUG_SHOW_AW48_TEMP_SENSOR_ADC_COUNT
  1271. }
  1272. #endif //FUNC_AW48_ADD_6_TEMP_SENEOR
  1273. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  1274. else if (Charger.m_bModelNameAX48_NACS_1P)
  1275. {
  1276. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  1277. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  1278. DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T12](%d), MAX_G3[T34](%d), MAX_G4[T56](%d)\r\n",
  1279. Charger.temperature.AX48_NACS_T1_L1_IN,
  1280. Charger.temperature.AX48_NACS_T2_L2_IN,
  1281. Charger.temperature.AX48_NACS_T3_L1_OUT,
  1282. Charger.temperature.AX48_NACS_T4_L2_OUT,
  1283. Charger.temperature.AX48_NACS_T5_L1_GUN,
  1284. Charger.temperature.AX48_NACS_T6_L2_GUN,
  1285. Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp);
  1286. #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  1287. DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T1256](%d), MAX_G3[T34](%d)\r\n",
  1288. Charger.temperature.AX48_NACS_T1_L1_IN,
  1289. Charger.temperature.AX48_NACS_T2_L2_IN,
  1290. Charger.temperature.AX48_NACS_T3_L1_OUT,
  1291. Charger.temperature.AX48_NACS_T4_L2_OUT,
  1292. Charger.temperature.AX48_NACS_T5_L1_GUN,
  1293. Charger.temperature.AX48_NACS_T6_L2_GUN,
  1294. Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp);
  1295. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  1296. #else //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  1297. DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX(%d)\r\n",
  1298. Charger.temperature.AX48_NACS_T1_L1_IN,
  1299. Charger.temperature.AX48_NACS_T2_L2_IN,
  1300. Charger.temperature.AX48_NACS_T3_L1_OUT,
  1301. Charger.temperature.AX48_NACS_T4_L2_OUT,
  1302. Charger.temperature.AX48_NACS_T5_L1_GUN,
  1303. Charger.temperature.AX48_NACS_T6_L2_GUN,
  1304. Charger.temperature.Group2_MaxTemp);
  1305. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  1306. #ifdef DEBUG_SHOW_AX48_NACS_TEMP_SENSOR_ADC_COUNT
  1307. DEBUG_INFO("[ADC_COUNT] T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d)\r\n",
  1308. adc_value.ADC3_IN9_AX48_NACS_T1.value,
  1309. adc_value.ADC3_IN8_AX48_NACS_T2.value,
  1310. adc_value.ADC3_IN10_AX48_NACS_T3.value,
  1311. adc_value.ADC3_IN7_AX48_NACS_T4.value,
  1312. adc_value.ADC3_IN5_AX48_NACS_T5.value,
  1313. adc_value.ADC3_IN11_AX48_NACS_T6.value);
  1314. #endif //DEBUG_SHOW_AX48_NACS_TEMP_SENSOR_ADC_COUNT
  1315. }
  1316. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  1317. #endif //FUNC_AX80_ADD_4_TEMP_SENEOR
  1318. dbgIdx++;
  1319. break;
  1320. case 8:
  1321. if (Charger.CCID_Module_Type == CCID_MODULE_CORMEX)
  1322. {
  1323. DEBUG_INFO("Original GF[0]: %fmA\r\n", adc_value.ADC2_IN6_GF.value/100.0);
  1324. DEBUG_INFO("Charger.Leak_Current: %fmA\r\n", Charger.Leak_Current/100.0);
  1325. }
  1326. else
  1327. {
  1328. //DEBUG_INFO("Temperature ADC raw data : %d\r\n", adc_value.ADC3_IN15_Temp.value);
  1329. //DEBUG_INFO("Temperature : %d\r\n", Charger.temperature.SystemAmbientTemp);
  1330. DEBUG_INFO("ADC3_Buffer[1] (ADC): %d(unit:ADC)\r\n", ADC3_Buffer[1] );
  1331. DEBUG_INFO("Charger.Led_Mode: %d\r\n", Charger.Led_Mode );
  1332. }
  1333. dbgIdx++;
  1334. break;
  1335. case 9:
  1336. DEBUG_INFO("CP+(ADC): %d(unit:ADC)\r\n",CpDetectionResult.PositiveValue );
  1337. DEBUG_INFO("CP-(ADC): %d(unit:ADC)\r\n",CpDetectionResult.NegativeValue );
  1338. //if(CpDetectionResult.PositiveValue>0)
  1339. {
  1340. #ifdef FUNC_CP_ADC_MODIFY
  1341. //DEBUG_INFO("CP +voltage: %f\r\n", CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue));
  1342. DEBUG_INFO("CP +voltage: %f\r\n", (CpDetectionResult.PositiveValue == 0 ? 0 : HTK_GetPosFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue))));
  1343. #else
  1344. //DEBUG_INFO("CP +voltage: %f\r\n", (float)((1.59131-((3.3*CpDetectionResult.PositiveValue)/4095))*(475/53.6)));
  1345. #endif
  1346. }
  1347. // else
  1348. // {
  1349. // DEBUG_INFO("CP +voltage: 0\r\n");
  1350. // }
  1351. //if(CpDetectionResult.NegativeValue>0)
  1352. {
  1353. #ifdef FUNC_CP_ADC_MODIFY
  1354. //DEBUG_INFO("CP -voltage: %f\r\n", CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue));
  1355. DEBUG_INFO("CP -voltage: %f\r\n", (CpDetectionResult.NegativeValue == 0 ? 0 : HTK_GetNegFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue))));
  1356. #else
  1357. //DEBUG_INFO("CP -voltage: %f\r\n", (float)((1.59131-((3.3*CpDetectionResult.NegativeValue)/4095))*(475/53.6)));
  1358. #endif
  1359. }
  1360. // else
  1361. // {
  1362. // DEBUG_INFO("CP -voltage: 0\r\n");
  1363. // }
  1364. #ifdef FUNC_DISP_CURRENT_CP_PWM
  1365. DEBUG_INFO("CP state: %d (%.1f%)\r\n", Charger.CP_State, Charger.m_CP_CurPWM / 10.0f);
  1366. #else
  1367. DEBUG_INFO("CP state: %d\r\n", Charger.CP_State);
  1368. #endif
  1369. #ifdef FUNC_DETECT_PP
  1370. if (Charger.m_bDetectPP)
  1371. {
  1372. DEBUG_INFO("#PP(ADC): %d\r\n", adc_value.ADC3_IN6_Gun_Detec.value);
  1373. DEBUG_INFO("#PP(CURR): %d\r\n", Charger.m_PPInfo.m_CurCurr);
  1374. }
  1375. #endif
  1376. #ifdef FUNC_DETECT_PP_NACS
  1377. if (Charger.m_bDetectPP_NACS)
  1378. {
  1379. DEBUG_INFO("#PP_NACS(ADC): %d\r\n", adc_value.ADC3_IN6_Gun_Detec.value);
  1380. //DEBUG_INFO("#PP(CURR): %d\r\n", Charger.m_PPInfo.m_CurCurr);
  1381. }
  1382. #endif
  1383. #ifdef FUNC_OUTP_TYPE_E
  1384. if (Charger.m_bEnableTypeE)
  1385. {
  1386. DEBUG_INFO("#TypeE: isOnSocketE(%d), IsTypeEPlugIn(%d)\r\n", Charger.isOnSocketE, IsTypeEPlugIn());
  1387. }
  1388. #endif
  1389. #ifdef FUNC_GUN_LOCK
  1390. if (Charger.m_bUseGunLock)
  1391. {
  1392. #ifdef FUNC_GUN_LOCK_TRIG_MODE
  1393. DEBUG_INFO("#GunLock Status: %s ,TrigMode(%d)\r\n", GL_IsLock() ? "Locked" : "Unlocked", (int)Charger.m_GunLockTrigMode);
  1394. #else
  1395. DEBUG_INFO("#GunLock Status: %s\r\n", GL_IsLock() ? "Locked" : "Unlocked");
  1396. #endif
  1397. }
  1398. #endif
  1399. #ifdef FUNC_USE_RELAY_B_CONTACT
  1400. if (Charger.m_bUseRelayBContact)
  1401. {
  1402. DEBUG_INFO("#Relay b Contact Status: %s\r\n", IsRelayContact_Closed() ? "Closed" : "Opened");
  1403. }
  1404. #endif
  1405. dbgIdx++;
  1406. break;
  1407. case 10:
  1408. DEBUG_INFO("Power_Consumption_Cumulative: %llu (0.0001 kWh)\r\n", Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total);
  1409. DEBUG_INFO("#Current rating value: %d A\r\n", Charger.maxRatingCurrent);
  1410. if (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=20)
  1411. {
  1412. DEBUG_INFO("OCP tigger : %d\r\n", (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification)-100 );
  1413. }
  1414. else
  1415. {
  1416. DEBUG_INFO("OCP tigger : %d\r\n", (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100 );
  1417. }
  1418. DEBUG_INFO("#Charger.am3352.isRequestOn: %d\r\n", Charger.am3352.isRequestOn);
  1419. #ifdef FUNC_OCP_WITH_PP
  1420. #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC
  1421. DEBUG_INFO("#OCPInfo(%d, %d, %d, %d) [%s]\r\n",
  1422. Charger.m_OCP_CurMaxCurr, Charger.OCP_Magnification,
  1423. Charger.m_OCP_BegThreshold, Charger.m_OCP_EndThreshold,
  1424. Charger.m_bModelNameWithEuroSpecOCP ? "EuroSpec" : "NotEuroSpec");
  1425. #else
  1426. DEBUG_INFO("#OCPInfo(%d, %d, %d, %d)\r\n",
  1427. Charger.m_OCP_CurMaxCurr, Charger.OCP_Magnification,
  1428. Charger.m_OCP_BegThreshold, Charger.m_OCP_EndThreshold);
  1429. #endif //MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC
  1430. #endif //FUNC_OCP_WITH_PP
  1431. #ifdef FUNC_GET_TRIP_TIME
  1432. if (Charger.m_TripBeg != 0 && Charger.m_TripBeg < Charger.m_TripEnd)
  1433. {
  1434. DEBUG_INFO("Trip period: %d\r\n", Charger.m_TripEnd - Charger.m_TripBeg);
  1435. }
  1436. #endif
  1437. #ifdef RECODE_METER_PRO380
  1438. if (Charger.m_bUseExtMeter_PRO380 && Charger.m_pPRO380)
  1439. {
  1440. #ifndef DISABLE_PRINT_DEBUG_MSG
  1441. const PPRO380 p = Charger.m_pPRO380;
  1442. #endif
  1443. DEBUG_INFO("PRO380(%s, %d, %d) E(%.2f %.2f, %.2f %.2f %.2f)\r\n",
  1444. p->m_bCommTimeout ? "[NG]" : "OK",
  1445. p->m_UpdateOkTimes,
  1446. p->m_UpdateNgTimes,
  1447. p->m_T1_Total_active_energy.m_Val,
  1448. p->m_T2_Total_active_energy.m_Val,
  1449. p->m_L1_Total_active_energy.m_Val,
  1450. p->m_L2_Total_active_energy.m_Val,
  1451. p->m_L3_Total_active_energy.m_Val);
  1452. }
  1453. #endif
  1454. #ifdef FUNC_PTB_METER_WM3M4C
  1455. if (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C)
  1456. {
  1457. #ifndef DISABLE_PRINT_DEBUG_MSG
  1458. const PWM3M4C p = Charger.m_pWM3M4C;
  1459. #endif
  1460. DEBUG_INFO("WM3M4C(%s, %d, %d) I(%s V%.2f%s) E(%d, %d, %d) M(%d) S(%d) T(%s)\r\n",
  1461. p->m_bCommTimeout ? "[NG]" : "OK",
  1462. p->m_UpdateOkTimes,
  1463. p->m_UpdateNgTimes,
  1464. p->m_SerialNumber.m_Str,
  1465. (float)p->m_SW_Ver.m_Val * 0.01,
  1466. p->m_HW_Ver.m_Str,
  1467. p->m_EngCountExp1.m_Val,
  1468. p->m_EngCount1.m_Val,
  1469. p->m_EngCount1x1000.m_Val,
  1470. p->m_MeasurementStatus.m_Val,
  1471. p->m_SignatureStatus.m_Val,
  1472. p->m_GetDateTime.m_Str);
  1473. }
  1474. #endif
  1475. #ifdef FUNC_TASK_MONITOR
  1476. {
  1477. #ifndef DISABLE_PRINT_DEBUG_MSG
  1478. const PTaskADCInfo p = &Charger.m_TaskMonitor.m_ADC;
  1479. #endif
  1480. DEBUG_INFO("#TaskMonitor: ADC[%d/%d](%d, %d, %d) ADC->SR(0x%04X, 0x%04X, 0x%04X)\r\n",
  1481. p->m_ContinueResetCounter, p->m_TotalResetCounter,
  1482. p->m_ADC1_Counter[0],
  1483. p->m_ADC2_Counter[0],
  1484. p->m_ADC3_Counter[0], ADC1->SR, ADC2->SR, ADC3->SR);
  1485. }
  1486. #endif //FUNC_TASK_MONITOR
  1487. #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS
  1488. DEBUG_INFO("CCSInfo(%d, %d, %d)\r\n", Charger.m_bRunCCS, Charger.m_bGotCsuCpDutyCmd, Charger.m_bPassGotCsuCpDutyCmd);
  1489. #endif
  1490. #ifdef FUNC_SYSTEM_KEEP_INFO
  1491. SystemKeepInfo_Display(&g_SystemKeepInfo);
  1492. #endif
  1493. dbgIdx++;
  1494. break;
  1495. case 11:
  1496. if (Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE)
  1497. DEBUG_INFO("#ALARM_L1_OVER_VOLTAGE \n\r");
  1498. if (Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE)
  1499. DEBUG_INFO("#ALARM_L1_UNDER_VOLTAGE \n\r");
  1500. if (Charger.Alarm_Code & ALARM_L1_OVER_CURRENT)
  1501. DEBUG_INFO("#ALARM_L1_OVER_CURRENT \n\r");
  1502. if (Charger.Alarm_Code & ALARM_L2_OVER_VOLTAGE)
  1503. DEBUG_INFO("#ALARM_L2_OVER_VOLTAGE \n\r");
  1504. if (Charger.Alarm_Code & ALARM_L2_UNDER_VOLTAGE)
  1505. DEBUG_INFO("#ALARM_L2_UNDER_VOLTAGE \n\r");
  1506. if (Charger.Alarm_Code & ALARM_L2_OVER_CURRENT)
  1507. DEBUG_INFO("#ALARM_L2_OVER_CURRENT \n\r");
  1508. if (Charger.Alarm_Code & ALARM_L3_OVER_VOLTAGE)
  1509. DEBUG_INFO("#ALARM_L3_OVER_VOLTAGE \n\r");
  1510. if (Charger.Alarm_Code & ALARM_L3_UNDER_VOLTAGE)
  1511. DEBUG_INFO("#ALARM_L3_UNDER_VOLTAGE \n\r");
  1512. if (Charger.Alarm_Code & ALARM_L3_OVER_CURRENT)
  1513. DEBUG_INFO("#ALARM_L3_OVER_CURRENT \n\r");
  1514. dbgIdx++;
  1515. break;
  1516. case 12:
  1517. if (Charger.Alarm_Code & ALARM_OVER_TEMPERATURE)
  1518. DEBUG_INFO("#ALARM_OVER_TEMPERATURE \n\r");
  1519. if (Charger.Alarm_Code & ALARM_GROUND_FAIL)
  1520. DEBUG_INFO("#ALARM_GROUND_FAIL \n\r");
  1521. if (Charger.Alarm_Code & ALARM_CP_ERROR)
  1522. DEBUG_INFO("#ALARM_CP_ERROR \n\r");
  1523. if (Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)
  1524. DEBUG_INFO("#ALARM_CURRENT_LEAK_AC \n\r");
  1525. if (Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)
  1526. DEBUG_INFO("#ALARM_CURRENT_LEAK_DC \n\r");
  1527. if (Charger.Alarm_Code & ALARM_MCU_TESTFAIL)
  1528. DEBUG_INFO("#ALARM_MCU_TESTFAIL \n\r");
  1529. if (Charger.Alarm_Code & ALARM_HANDSHAKE_TIMEOUT)
  1530. DEBUG_INFO("#ALARM_HANDSHAKE_TIMEOUT \n\r");
  1531. if (Charger.Alarm_Code & ALARM_EMERGENCY_STOP)
  1532. DEBUG_INFO("#ALARM_EMERGENCY_STOP \n\r");
  1533. dbgIdx++;
  1534. break;
  1535. case 13:
  1536. if (Charger.Alarm_Code & ALARM_RELAY_STATUS)
  1537. DEBUG_INFO("#ALARM_RELAY_STATUS \n\r");
  1538. if (Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL)
  1539. DEBUG_INFO("#ALARM_LEAK_MODULE_FAIL \n\r");
  1540. if (Charger.Alarm_Code & ALARM_SHUTTER_FAULT)
  1541. DEBUG_INFO("#ALARM_SHUTTER_FAULT \n\r");
  1542. if (Charger.Alarm_Code & ALARM_LOCKER_FAULT)
  1543. DEBUG_INFO("#ALARM_LOCKER_FAULT \n\r");
  1544. if (Charger.Alarm_Code & ALARM_POWER_DROP)
  1545. DEBUG_INFO("#ALARM_POWER_DROP \n\r");
  1546. if (Charger.Alarm_Code & ALARM_L1_CIRCUIT_SHORT)
  1547. DEBUG_INFO("#ALARM_L1_CIRCUIT_SHORT \n\r");
  1548. if (Charger.Alarm_Code & ALARM_L2_CIRCUIT_SHORT)
  1549. DEBUG_INFO("#ALARM_L2_CIRCUIT_SHORT \n\r");
  1550. if (Charger.Alarm_Code & ALARM_L3_CIRCUIT_SHORT)
  1551. DEBUG_INFO("#ALARM_L3_CIRCUIT_SHORT \n\r");
  1552. if (Charger.Alarm_Code & ALARM_ROTATORY_SWITCH_FAULT)
  1553. DEBUG_INFO("#ALARM_ROTATORY_SWITCH_FAULT \n\r");
  1554. if (Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT)
  1555. DEBUG_INFO("#ALARM_RELAY_DRIVE_FUALT \n\r");
  1556. if (Charger.Alarm_Code & ALARM_METER_TIMEOUT)
  1557. DEBUG_INFO("#ALARM_METER_TIMEOUT \n\r");
  1558. #ifdef FUNC_METER_IC_COMM_ALARM
  1559. if (Charger.Alarm_Code & ALARM_METER_IC_TIMEOUT)
  1560. DEBUG_INFO("#ALARM_METER_IC_TIMEOUT \n\r");
  1561. #endif
  1562. #ifdef FUNC_ALARM_CP_NEG_ERROR
  1563. if (Charger.Alarm_Code & ALARM_CP_NEG_ERROR)
  1564. DEBUG_INFO("#ALARM_CP_NEG_ERROR \n\r");
  1565. #endif
  1566. #ifdef FUNC_AX80_ADD_TILT_SENSOR
  1567. if (Charger.Alarm_Code & ALARM_TILT_SENSOR)
  1568. DEBUG_INFO("#ALARM_TILT_SENSOR \n\r");
  1569. #endif
  1570. #ifdef FUNC_WARNING_CODE
  1571. //------------------------------------------------------------
  1572. #ifdef FUNC_EKM_OMNIMETER
  1573. if (Charger.Warning_Code & WARN_OMNIMETER_COMM_TIMEOUT)
  1574. DEBUG_INFO("#WARN_OMNIMETER_COMM_TIMEOUT \n\r");
  1575. #endif
  1576. //------------------------------------------------------------
  1577. #endif //FUNC_WARNING_CODE
  1578. // XP("sizeof(Charger.memory.EVSE_Config.data.value) = %d\r\n", sizeof(Charger.memory.EVSE_Config.data.value));
  1579. // XP("sizeof(Charger.memory.EVSE_Config.data.item) = %d\r\n", sizeof(Charger.memory.EVSE_Config.data.item));
  1580. #ifdef FUNC_METER_IC_HISTORY_DEBUG
  1581. XP("sizeof(Charger.memory.hisMeterIC) = %d\r\n", sizeof(Charger.memory.hisMeterIC));
  1582. XP("sizeof(Charger.memory.hisMeterIC.data) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data));
  1583. XP("sizeof(Charger.memory.hisMeterIC.data.value) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.value));
  1584. XP("sizeof(Charger.memory.hisMeterIC.data.item) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item));
  1585. XP("sizeof(Charger.memory.hisMeterIC.data.item[0]) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0]));
  1586. XP("sizeof(Charger.memory.hisMeterIC.data.item[0].DateTime) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0].DateTime));
  1587. XP("sizeof(Charger.memory.hisMeterIC.data.item[0].m_CaliValType) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0].m_CaliValType));
  1588. XP("sizeof(Charger.memory.hisMeterIC.data.item[0].m_CaliVal) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0].m_CaliVal));
  1589. XP("sizeof(Charger.memory.hisMeterIC.data.item[0].m_Reserved) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0].m_Reserved));
  1590. XP("sizeof(Charger.memory.hisMeterIC.op_bits) = %d\r\n", sizeof(Charger.memory.hisMeterIC.op_bits));
  1591. #endif //FUNC_METER_IC_HISTORY_DEBUG
  1592. dbgIdx++;
  1593. break;
  1594. default:
  1595. getlastRecord();
  1596. dbgIdx = 0;
  1597. break;
  1598. }
  1599. timerRefresh(TIMER_IDX_RTOS_STAT);
  1600. }
  1601. HAL_IWDG_Refresh(&hiwdg);
  1602. #ifdef FUNC_RS485_SLAVE
  1603. if(UART_IAP_recv_end_flag == 1 || UART_RS485_recv_end_flag == 1)
  1604. #else
  1605. if(UART_IAP_recv_end_flag == 1)
  1606. #endif
  1607. {
  1608. #ifdef FUNC_UART_IAP_TX_BUF_INIT_ZERO
  1609. uint8_t tx[UART_BUFFER_SIZE] = { 0 };
  1610. #else
  1611. uint8_t tx[UART_BUFFER_SIZE];
  1612. #endif
  1613. #ifdef MODIFY_UART_TX_LEN_FROM_U8_TO_U16
  1614. uint16_t tx_len;
  1615. #else
  1616. uint8_t tx_len;
  1617. #endif
  1618. uint8_t chksum = 0;
  1619. uint8_t tmpBuf = 0 ;
  1620. // Protocol process
  1621. #ifdef FUNC_RS485_SLAVE
  1622. uint8_t *CurRxBuf = NULL;
  1623. uint16_t *pCurRxBuf_RxLen = NULL;
  1624. uint8_t *pCurRecvEndFlag = NULL;
  1625. UART_HandleTypeDef *pUartHandle = NULL;
  1626. if (UART_IAP_recv_end_flag == 1 && isValidCheckSum_IAP(UART_IAP_rx_buffer) == ON)
  1627. {
  1628. CurRxBuf = UART_IAP_rx_buffer;
  1629. pCurRxBuf_RxLen = &UART_IAP_rx_len;
  1630. pCurRecvEndFlag = &UART_IAP_recv_end_flag;
  1631. pUartHandle = &IAP_USART;
  1632. #ifdef FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT
  1633. Charger.m_CSU_RxTick = HAL_GetTick();
  1634. #endif
  1635. }
  1636. else if (UART_RS485_recv_end_flag == 1 && isValidCheckSum_IAP(UART_RS485_rx_buffer) == ON)
  1637. {
  1638. CurRxBuf = UART_RS485_rx_buffer;
  1639. pCurRxBuf_RxLen = &UART_RS485_rx_len;
  1640. pCurRecvEndFlag = &UART_RS485_recv_end_flag;
  1641. pUartHandle = &RS485_USART;
  1642. #ifdef FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT //DC Model
  1643. Charger.m_CSU_RxTick = HAL_GetTick();
  1644. #endif
  1645. }
  1646. if (CurRxBuf != NULL)
  1647. #else
  1648. uint8_t *CurRxBuf = UART_IAP_rx_buffer;
  1649. if(isValidCheckSum_IAP() == ON)
  1650. #endif
  1651. {
  1652. Charger.CSUisReady = ON ;
  1653. #ifdef ENABLE_PRINT_IMCP_MSG
  1654. #ifdef FUNC_RS485_SLAVE
  1655. #ifdef PRINT_IMCP_MSG_ONLY_ON_UPDATEPORT
  1656. if (CurRxBuf == UART_IAP_rx_buffer && CheckPrintImcpMsg(CurRxBuf[IMCP_FM_MSGID_IDX]))
  1657. {
  1658. XP("-------------------------------------------\r\n");
  1659. HTK_ByteArray2HexStr_XP(NULL, CurRxBuf, 0, IMCP_FM_HEAD_LEN + HTK_U16(CurRxBuf[IMCP_FM_DATALEN_LSB_IDX]) + IMCP_FM_TAIL_LEN);
  1660. }
  1661. #else
  1662. if (CheckPrintImcpMsg(CurRxBuf[IMCP_FM_MSGID_IDX]))
  1663. {
  1664. XP("-------------------------------------------\r\n");
  1665. HTK_ByteArray2HexStr_XP(NULL, CurRxBuf, 0, IMCP_FM_HEAD_LEN + HTK_U16(CurRxBuf[IMCP_FM_DATALEN_LSB_IDX]) + IMCP_FM_TAIL_LEN);
  1666. }
  1667. #endif //PRINT_IMCP_MSG_ONLY_ON_UPDATEPORT
  1668. #else //FUNC_RS485_SLAVE
  1669. if (CheckPrintImcpMsg(UART_IAP_rx_buffer[IMCP_FM_MSGID_IDX]))
  1670. {
  1671. XP("-------------------------------------------\r\n");
  1672. HTK_ByteArray2HexStr_XP(NULL, UART_IAP_rx_buffer, 0, IMCP_FM_HEAD_LEN + HTK_U16(UART_IAP_rx_buffer[IMCP_FM_DATALEN_LSB_IDX]) + IMCP_FM_TAIL_LEN);
  1673. }
  1674. #endif //FUNC_RS485_SLAVE
  1675. #endif //ENABLE_PRINT_IMCP_MSG
  1676. #ifdef FUNC_RS485_SLAVE
  1677. switch (CurRxBuf[3])
  1678. #else
  1679. switch (UART_IAP_rx_buffer[3])
  1680. #endif
  1681. {
  1682. /*
  1683. Query message
  1684. */
  1685. case PROTOCOL_MESSAGE_QUERY_FW_VER:
  1686. tx_len = 7 + (strlen(Charger.Ver_FW));
  1687. tx[0] = 0xaa;
  1688. tx[1] = PROTOCOL_ADDR;
  1689. tx[2] = CurRxBuf[1];
  1690. tx[3] = PROTOCOL_MESSAGE_QUERY_FW_VER;
  1691. tx[4] = strlen(Charger.Ver_FW)&0xff;
  1692. tx[5] = (strlen(Charger.Ver_FW)>>0x08) & 0xff;
  1693. for(uint8_t idx=0;idx<strlen(Charger.Ver_FW);idx++)
  1694. {
  1695. tx[6+idx] = Charger.Ver_FW[idx];
  1696. }
  1697. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1698. {
  1699. chksum ^= tx[6 + idx];
  1700. }
  1701. tx[6+(tx[4] | (tx[5]<<8))] = chksum;
  1702. break;
  1703. case PROTOCOL_MESSAGE_QUERY_HW_VER:
  1704. tx_len = 7 + strlen(Charger.Ver_HW);
  1705. tx[0] = 0xaa;
  1706. tx[1] = PROTOCOL_ADDR;
  1707. tx[2] = CurRxBuf[1];
  1708. tx[3] = PROTOCOL_MESSAGE_QUERY_HW_VER;
  1709. tx[4] = strlen(Charger.Ver_HW) & 0xff;
  1710. tx[5] = (strlen(Charger.Ver_HW)>>0x08) & 0xff;
  1711. for(uint8_t idx=0;idx<strlen(Charger.Ver_HW);idx++)
  1712. {
  1713. tx[6+idx] = Charger.Ver_HW[idx];
  1714. }
  1715. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1716. {
  1717. chksum ^= tx[6 + idx];
  1718. }
  1719. tx[6+(tx[4] | (tx[5]<<8))] = chksum;
  1720. break;
  1721. case PROTOCOL_MESSAGE_QUERY_PRESENT_INPUT_VOLTAGE:
  1722. tx_len = 14;
  1723. tx[0] = 0xaa;
  1724. tx[1] = PROTOCOL_ADDR;
  1725. tx[2] = CurRxBuf[1];
  1726. tx[3] = PROTOCOL_MESSAGE_QUERY_PRESENT_INPUT_VOLTAGE;
  1727. tx[4] = 0x07;
  1728. tx[5] = 0x00;
  1729. tx[6] = 0x00;
  1730. tx[7] = (((Charger.Voltage[0]/10)>>0) & 0xff);
  1731. tx[8] = (((Charger.Voltage[0]/10)>>8) & 0xff);
  1732. tx[9] = (((Charger.Voltage[1]/10)>>0) & 0xff);
  1733. tx[10] = (((Charger.Voltage[1]/10)>>8) & 0xff);
  1734. tx[11] = (((Charger.Voltage[2]/10)>>0) & 0xff);
  1735. tx[12] = (((Charger.Voltage[2]/10)>>8) & 0xff);
  1736. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1737. {
  1738. chksum ^= tx[6 + idx];
  1739. }
  1740. tx[13] = chksum;
  1741. break;
  1742. case PROTOCOL_MESSAGE_QUERY_PRESENT_OUTPUT_VOLTAGE:
  1743. tx_len = 15;
  1744. tx[0] = 0xaa;
  1745. tx[1] = PROTOCOL_ADDR;
  1746. tx[2] = CurRxBuf[1];
  1747. tx[3] = PROTOCOL_MESSAGE_QUERY_PRESENT_OUTPUT_VOLTAGE;
  1748. tx[4] = 0x08;
  1749. tx[5] = 0x00;
  1750. tx[6] = 0x00;
  1751. tx[7] = 0x00;
  1752. tx[8] = 0x00;
  1753. tx[9] = 0x00;
  1754. tx[10] = 0x00;
  1755. tx[11] = 0x00;
  1756. tx[12] = 0x00;
  1757. tx[13] = 0x00;
  1758. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1759. {
  1760. chksum ^= tx[6 + idx];
  1761. }
  1762. tx[14] = chksum;
  1763. break;
  1764. case PROTOCOL_MESSAGE_QUERY_FAN_SPEED:
  1765. tx_len = 15;
  1766. tx[0] = 0xaa;
  1767. tx[1] = PROTOCOL_ADDR;
  1768. tx[2] = CurRxBuf[1];
  1769. tx[3] = PROTOCOL_MESSAGE_QUERY_FAN_SPEED;
  1770. tx[4] = 0x08;
  1771. tx[5] = 0x00;
  1772. tx[6] = 0x00;
  1773. tx[7] = 0x00;
  1774. tx[8] = 0x00;
  1775. tx[9] = 0x00;
  1776. tx[10] = 0x00;
  1777. tx[11] = 0x00;
  1778. tx[12] = 0x00;
  1779. tx[13] = 0x00;
  1780. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1781. {
  1782. chksum ^= tx[6 + idx];
  1783. }
  1784. tx[14] = chksum;
  1785. break;
  1786. case PROTOCOL_MESSAGE_QUERY_TEMPERATURE:
  1787. tx_len = 15;
  1788. tx[0] = 0xaa;
  1789. tx[1] = PROTOCOL_ADDR;
  1790. tx[2] = CurRxBuf[1];
  1791. tx[3] = PROTOCOL_MESSAGE_QUERY_TEMPERATURE;
  1792. tx[4] = 0x08;
  1793. tx[5] = 0x00;
  1794. tx[6] = (((Charger.temperature.SystemAmbientTemp+60)>>0) & 0xff);
  1795. tx[7] = (((Charger.temperature.CcsConnectorTemp+60)>>0) & 0xff);
  1796. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  1797. if (Charger.m_bModelNameAX80_1P)
  1798. {
  1799. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  1800. if (Charger.m_bModelNameAX80_NACS_1P)
  1801. {
  1802. tx[8] = (((Charger.temperature.AX80_NACS_T1_L1_IN+60)>>0) & 0xff);
  1803. tx[9] = (((Charger.temperature.AX80_NACS_T2_L2_IN+60)>>0) & 0xff);
  1804. tx[10] = (((Charger.temperature.AX80_NACS_T3_L1_OUT+60)>>0) & 0xff);
  1805. tx[11] = (((Charger.temperature.AX80_NACS_T4_L2_OUT+60)>>0) & 0xff);
  1806. tx[12] = (((Charger.temperature.AX80_NACS_T5_L1_GUN+60)>>0) & 0xff);
  1807. tx[13] = (((Charger.temperature.AX80_NACS_T6_L2_GUN+60)>>0) & 0xff);
  1808. }
  1809. else
  1810. {
  1811. tx[8] = (((Charger.temperature.AX80_Relay1Temp+60)>>0) & 0xff);
  1812. tx[9] = (((Charger.temperature.AX80_Relay2Temp+60)>>0) & 0xff);
  1813. tx[10] = (((Charger.temperature.AX80_Input_L1_Temp+60)>>0) & 0xff);
  1814. tx[11] = (((Charger.temperature.AX80_Input_N_L2_Temp+60)>>0) & 0xff);
  1815. tx[12] = 0x00;
  1816. tx[13] = 0x00;
  1817. }
  1818. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  1819. tx[8] = (((Charger.temperature.AX80_Relay1Temp+60)>>0) & 0xff);
  1820. tx[9] = (((Charger.temperature.AX80_Relay2Temp+60)>>0) & 0xff);
  1821. tx[10] = (((Charger.temperature.AX80_Input_L1_Temp+60)>>0) & 0xff);
  1822. tx[11] = (((Charger.temperature.AX80_Input_N_L2_Temp+60)>>0) & 0xff);
  1823. tx[12] = 0x00;
  1824. tx[13] = 0x00;
  1825. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  1826. }
  1827. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  1828. else if (Charger.m_bModelNameAW48_1P)
  1829. {
  1830. tx[8] = (((Charger.temperature.AW48_T1_L1_IN+60)>>0) & 0xff);
  1831. tx[9] = (((Charger.temperature.AW48_T2_L2_IN+60)>>0) & 0xff);
  1832. tx[10] = (((Charger.temperature.AW48_T3_L1_OUT+60)>>0) & 0xff);
  1833. tx[11] = (((Charger.temperature.AW48_T4_L2_OUT+60)>>0) & 0xff);
  1834. tx[12] = (((Charger.temperature.AW48_T5_L1_GUN+60)>>0) & 0xff);
  1835. tx[13] = (((Charger.temperature.AW48_T6_L2_GUN+60)>>0) & 0xff);
  1836. }
  1837. #endif //FUNC_AW48_ADD_6_TEMP_SENEOR
  1838. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  1839. else if (Charger.m_bModelNameAX48_NACS_1P)
  1840. {
  1841. tx[8] = (((Charger.temperature.AX48_NACS_T1_L1_IN+60)>>0) & 0xff);
  1842. tx[9] = (((Charger.temperature.AX48_NACS_T2_L2_IN+60)>>0) & 0xff);
  1843. tx[10] = (((Charger.temperature.AX48_NACS_T3_L1_OUT+60)>>0) & 0xff);
  1844. tx[11] = (((Charger.temperature.AX48_NACS_T4_L2_OUT+60)>>0) & 0xff);
  1845. tx[12] = (((Charger.temperature.AX48_NACS_T5_L1_GUN+60)>>0) & 0xff);
  1846. tx[13] = (((Charger.temperature.AX48_NACS_T6_L2_GUN+60)>>0) & 0xff);
  1847. }
  1848. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  1849. else
  1850. {
  1851. tx[8] = 0x00;
  1852. tx[9] = 0x00;
  1853. tx[10] = 0x00;
  1854. tx[11] = 0x00;
  1855. tx[12] = 0x00;
  1856. tx[13] = 0x00;
  1857. }
  1858. #else //FUNC_AX80_ADD_4_TEMP_SENEOR
  1859. tx[8] = 0x00;
  1860. tx[9] = 0x00;
  1861. tx[10] = 0x00;
  1862. tx[11] = 0x00;
  1863. tx[12] = 0x00;
  1864. tx[13] = 0x00;
  1865. #endif //FUNC_AX80_ADD_4_TEMP_SENEOR
  1866. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1867. {
  1868. chksum ^= tx[6 + idx];
  1869. }
  1870. tx[14] = chksum;
  1871. break;
  1872. case PROTOCOL_MESSAGE_QUERY_AUX_POWER_VOLTAGE:
  1873. tx_len = 15;
  1874. tx[0] = 0xaa;
  1875. tx[1] = PROTOCOL_ADDR;
  1876. tx[2] = CurRxBuf[1];
  1877. tx[3] = PROTOCOL_MESSAGE_QUERY_AUX_POWER_VOLTAGE;
  1878. tx[4] = 0x08;
  1879. tx[5] = 0x00;
  1880. tx[6] = 0x00;
  1881. tx[7] = 0x00;
  1882. tx[8] = 0x00;
  1883. tx[9] = 0x00;
  1884. tx[10] = 0x00;
  1885. tx[11] = 0x00;
  1886. tx[12] = 0x00;
  1887. tx[13] = 0x00;
  1888. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1889. {
  1890. chksum ^= tx[6 + idx];
  1891. }
  1892. tx[14] = chksum;
  1893. break;
  1894. case PROTOCOL_MESSAGE_QUERY_RELAY_OUTPUT_STATUS:
  1895. tx_len = 9;
  1896. tx[0] = 0xaa;
  1897. tx[1] = PROTOCOL_ADDR;
  1898. tx[2] = CurRxBuf[1];
  1899. tx[3] = PROTOCOL_MESSAGE_QUERY_RELAY_OUTPUT_STATUS;
  1900. tx[4] = 0x02;
  1901. tx[5] = 0x00;
  1902. tx[6] = ((Relay1_Action_Get()==GPIO_RELAY1_ACTION_OFF)?0:1);
  1903. tx[7] = ((Relay2_Action_Get()==GPIO_RELAY2_ACTION_OFF)?0:1);
  1904. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1905. {
  1906. chksum ^= tx[6 + idx];
  1907. }
  1908. tx[8] = chksum;
  1909. break;
  1910. case PROTOCOL_MESSAGE_QUERY_GFD_ADC_VALUE:
  1911. tx_len = 15;
  1912. tx[0] = 0xaa;
  1913. tx[1] = PROTOCOL_ADDR;
  1914. tx[2] = CurRxBuf[1];
  1915. tx[3] = PROTOCOL_MESSAGE_QUERY_GFD_ADC_VALUE;
  1916. tx[4] = 0x08;
  1917. tx[5] = 0x00;
  1918. tx[6] = ((adc_value.ADC2_IN6_GF.value>>0) & 0xff);
  1919. tx[7] = ((adc_value.ADC2_IN6_GF.value>>8) & 0xff);
  1920. tx[8] = 0x00;
  1921. tx[9] = 0x00;
  1922. tx[10] = 0x00;
  1923. tx[11] = 0x00;
  1924. tx[12] = 0x00;
  1925. tx[13] = 0x00;
  1926. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1927. {
  1928. chksum ^= tx[6 + idx];
  1929. }
  1930. tx[14] = chksum;
  1931. break;
  1932. case PROTOCOL_MESSAGE_QUERY_INPUT_GPIO_STATUS:
  1933. tx_len = 9;
  1934. tx[0] = 0xaa;
  1935. tx[1] = PROTOCOL_ADDR;
  1936. tx[2] = CurRxBuf[1];
  1937. tx[3] = PROTOCOL_MESSAGE_QUERY_INPUT_GPIO_STATUS;
  1938. tx[4] = 0x02;
  1939. tx[5] = 0x00;
  1940. tx[6] = 0x00;
  1941. tx[7] = 0x00 | ((HAL_GPIO_ReadPin(IN_BTN_ModeSw_GPIO_Port, IN_BTN_ModeSw_Pin)?0:1) << 7);
  1942. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1943. {
  1944. chksum ^= tx[6 + idx];
  1945. }
  1946. tx[8] = chksum;
  1947. break;
  1948. case PROTOCOL_MESSAGE_QUERY_ALARM_LOG:
  1949. tx_len = 17;
  1950. tx[0] = 0xaa;
  1951. tx[1] = PROTOCOL_ADDR;
  1952. tx[2] = CurRxBuf[1];
  1953. tx[3] = PROTOCOL_MESSAGE_QUERY_ALARM_LOG;
  1954. tx[4] = 0x0a;
  1955. tx[5] = 0x00;
  1956. tx[6] = CurRxBuf[7] ;
  1957. tx[7] = CurRxBuf[8] ;
  1958. tx[8] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0xF0000000)>>28];
  1959. tx[9] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x0F000000)>>24];
  1960. tx[10] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x00F00000)>>20];
  1961. tx[11] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x000F0000)>>16];
  1962. tx[12] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x0000F000)>>12];
  1963. tx[13] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x00000F00)>>8];
  1964. tx[14] = CharacterArray[(Charger.memory.hisAlarm.data.item [CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x000000F0)>>4];
  1965. tx[15] = CharacterArray[ Charger.memory.hisAlarm.data.item [CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x0000000F ];
  1966. #ifdef FUNC_TRACE_MEM_HIS_ALARM
  1967. XP("ALARM_LOG[%d] = 0x%08X (%c%c%c%c%c%c%c%c)\r\n", CurRxBuf[7] | (CurRxBuf[8]>>8), Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode,
  1968. tx[8], tx[9], tx[10], tx[11], tx[12], tx[13], tx[14], tx[15]);
  1969. XP("sizeof(Charger.memory.hisAlarm.data.item[0]) = %d\r\n", sizeof(Charger.memory.hisAlarm.data.item[0]));
  1970. #endif
  1971. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1972. {
  1973. chksum ^= tx[6 + idx];
  1974. }
  1975. tx[16] = chksum;
  1976. break;
  1977. case PROTOCOL_MESSAGE_QUERY_SN:
  1978. // head +checksum = 7 , SystemDateTimeyear month day = 8 , SerialNumber
  1979. tx_len = 15 + strlen(Charger.memory.EVSE_Config.data.item.SerialNumber);
  1980. tx[0] = 0xaa;
  1981. tx[1] = PROTOCOL_ADDR;
  1982. tx[2] = CurRxBuf[1];
  1983. tx[3] = PROTOCOL_MESSAGE_QUERY_SN;
  1984. tx[4] = (strlen(Charger.memory.EVSE_Config.data.item.SerialNumber)+8)&0xff;
  1985. tx[5] = ((strlen(Charger.memory.EVSE_Config.data.item.SerialNumber)+8)>>0x08) & 0xff;
  1986. tx[6] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.year/1000)+'0';
  1987. tx[7] = ((Charger.memory.EVSE_Config.data.item.SystemDateTime.year%1000)/100)+'0';
  1988. tx[8] = ((Charger.memory.EVSE_Config.data.item.SystemDateTime.year%100)/10)+'0';
  1989. tx[9] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.year%10) +'0';
  1990. tx[10] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.month/10) +'0';
  1991. tx[11] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.month%10) +'0';
  1992. tx[12] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.day/10) +'0';
  1993. tx[13] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.day%10) +'0';
  1994. for(uint8_t idx=0;idx<strlen(Charger.memory.EVSE_Config.data.item.SerialNumber);idx++)
  1995. {
  1996. tx[14+idx] = Charger.memory.EVSE_Config.data.item.SerialNumber[idx];
  1997. }
  1998. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  1999. {
  2000. chksum ^= tx[6 + idx];
  2001. }
  2002. tx[6+(tx[4] | (tx[5]<<8))] = chksum;
  2003. break;
  2004. case PROTOCOL_MESSAGE_QUERY_MODEL_NAME:
  2005. tx_len = 7 + strlen(Charger.memory.EVSE_Config.data.item.ModelName);;
  2006. tx[0] = 0xaa;
  2007. tx[1] = PROTOCOL_ADDR;
  2008. tx[2] = CurRxBuf[1];
  2009. tx[3] = PROTOCOL_MESSAGE_QUERY_MODEL_NAME;
  2010. tx[4] = strlen(Charger.memory.EVSE_Config.data.item.ModelName)&0xff;
  2011. tx[5] = (strlen(Charger.memory.EVSE_Config.data.item.ModelName)>>0x08) & 0xff;
  2012. for(uint8_t idx=0;idx<strlen(Charger.memory.EVSE_Config.data.item.ModelName);idx++)
  2013. {
  2014. tx[6+idx] = Charger.memory.EVSE_Config.data.item.ModelName[idx];
  2015. }
  2016. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2017. {
  2018. chksum ^= tx[6 + idx];
  2019. }
  2020. tx[6+(tx[4] | (tx[5]<<8))] = chksum;
  2021. break;
  2022. case PROTOCOL_MESSAGE_QUERY_PARAMETER:
  2023. tx_len = 11;
  2024. tx[0] = 0xaa;
  2025. tx[1] = PROTOCOL_ADDR;
  2026. tx[2] = CurRxBuf[1];
  2027. tx[3] = PROTOCOL_MESSAGE_QUERY_PARAMETER;
  2028. tx[4] = 0x04;
  2029. tx[5] = 0x00;
  2030. tx[6] = CurRxBuf[6];
  2031. tx[7] = CurRxBuf[7];
  2032. switch(CurRxBuf[6])
  2033. {
  2034. case INPUT_L1_AC_VOLTAGE:
  2035. tx[8] = Charger.memory.EVSE_Config.data.item.Correction_VL1[CurRxBuf[7]][1] & 0xff;
  2036. tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_VL1[CurRxBuf[7]][1]>>8) & 0xff;
  2037. break;
  2038. case INPUT_L2_AC_VOLTAGE:
  2039. tx[8] = Charger.memory.EVSE_Config.data.item.Correction_VL2[CurRxBuf[7]][1] & 0xff;
  2040. tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_VL2[CurRxBuf[7]][1]>>8) & 0xff;
  2041. break;
  2042. case INPUT_L3_AC_VOLTAGE:
  2043. tx[8] = Charger.memory.EVSE_Config.data.item.Correction_VL3[CurRxBuf[7]][1] & 0xff;
  2044. tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_VL3[CurRxBuf[7]][1]>>8) & 0xff;
  2045. break;
  2046. case OUTPUT_L1_CURRENT:
  2047. tx[8] = Charger.memory.EVSE_Config.data.item.Correction_CL1[CurRxBuf[7]][1] & 0xff;
  2048. tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_CL1[CurRxBuf[7]][1]>>8) & 0xff;
  2049. break;
  2050. case OUTPUT_L2_CURRENT:
  2051. tx[8] = Charger.memory.EVSE_Config.data.item.Correction_CL2[CurRxBuf[7]][1] & 0xff;
  2052. tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_CL2[CurRxBuf[7]][1]>>8) & 0xff;
  2053. break;
  2054. case OUTPUT_L3_CURRENT:
  2055. tx[8] = Charger.memory.EVSE_Config.data.item.Correction_CL3[CurRxBuf[7]][1] & 0xff;
  2056. tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_CL3[CurRxBuf[7]][1]>>8) & 0xff;
  2057. break;
  2058. case LEAK_CURRENT:
  2059. tx[8] = (Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][1]/100) & 0xff;
  2060. tx[9] = ((Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][1]/100)>>8) & 0xff;
  2061. break;
  2062. }
  2063. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2064. {
  2065. chksum ^= tx[6 + idx];
  2066. }
  2067. tx[10] = chksum;
  2068. break;
  2069. case PROTOCOL_MESSAGE_QUERY_RTC:
  2070. tx_len = 21;
  2071. tx[0] = 0xaa;
  2072. tx[1] = PROTOCOL_ADDR;
  2073. tx[2] = CurRxBuf[1];
  2074. tx[3] = PROTOCOL_MESSAGE_QUERY_RTC;
  2075. tx[4] = 0x0e;
  2076. tx[5] = 0x00;
  2077. tx[6] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.year/1000)+'0';
  2078. tx[7] = ((Charger.memory.EVSE_Config.data.item.SystemDateTime.year%1000)/100)+'0';
  2079. tx[8] = ((Charger.memory.EVSE_Config.data.item.SystemDateTime.year%100)/10)+'0';
  2080. tx[9] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.year%10) +'0';
  2081. tx[10] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.month/10) +'0';
  2082. tx[11] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.month%10) +'0';
  2083. tx[12] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.day/10) +'0';
  2084. tx[13] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.day%10) +'0';
  2085. tx[14] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.hour/10) +'0';
  2086. tx[15] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.hour%10) +'0';
  2087. tx[16] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.min/10) +'0';
  2088. tx[17] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.min%10) +'0';
  2089. tx[18] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.sec/10) +'0';
  2090. tx[19] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.sec%10) +'0';
  2091. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2092. {
  2093. chksum ^= tx[6 + idx];
  2094. }
  2095. tx[20] = chksum;
  2096. break;
  2097. case PROTOCOL_MESSAGE_QUERY_PRESENT_OUTPUT_CURRENT:
  2098. tx_len = 19;
  2099. tx[0] = 0xaa;
  2100. tx[1] = PROTOCOL_ADDR;
  2101. tx[2] = CurRxBuf[1];
  2102. tx[3] = PROTOCOL_MESSAGE_QUERY_PRESENT_OUTPUT_CURRENT;
  2103. tx[4] = 0x0c;
  2104. tx[5] = 0x00;
  2105. tx[6] = (((Charger.Current[0]/10)>>0) & 0xff);
  2106. tx[7] = (((Charger.Current[0]/10)>>8) & 0xff);
  2107. tx[8] = (((Charger.Current[1]/10)>>0) & 0xff);
  2108. tx[9] = (((Charger.Current[1]/10)>>8) & 0xff);
  2109. tx[10] = (((Charger.Current[2]/10)>>0) & 0xff);
  2110. tx[11] = (((Charger.Current[2]/10)>>8) & 0xff);
  2111. tx[12] = 0x00;
  2112. tx[13] = 0x00;
  2113. tx[14] = 0x00;
  2114. tx[15] = 0x00;
  2115. tx[16] = 0x00;
  2116. tx[17] = 0x00;
  2117. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2118. {
  2119. chksum ^= tx[6 + idx];
  2120. }
  2121. tx[18] = chksum;
  2122. break;
  2123. case PROTOCOL_MESSAGE_QUERY_EVSE_STATE:
  2124. tx_len = 22;
  2125. tx[0] = 0xaa;
  2126. tx[1] = PROTOCOL_ADDR;
  2127. tx[2] = CurRxBuf[1];
  2128. tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_STATE;
  2129. tx[4] = 15;
  2130. tx[5] = 0x00;
  2131. tx[6] = Charger.CP_State;
  2132. #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE
  2133. #ifdef FUNC_AW48
  2134. if (Charger.m_bModelNameAX || Charger.m_bModelNameAT || Charger.m_bModelNameAW48_1P)
  2135. #else //FUNC_AW48
  2136. #ifdef FUNC_AT32
  2137. if (Charger.m_bModelNameAX || Charger.m_bModelNameAT)
  2138. #else
  2139. if (Charger.m_bModelNameAX)
  2140. #endif
  2141. #endif //FUNC_AW48
  2142. {
  2143. //AX32/48
  2144. tx[7] = (Charger.AC_MaxChargingCurrentOrDuty&0xff);
  2145. tx[8] = Charger.AC_MaxChargingCurrentOrDuty>>8;
  2146. }
  2147. else
  2148. {
  2149. //DC Model
  2150. tx[7] = (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent&0xff);
  2151. tx[8] = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>>8;
  2152. }
  2153. #else
  2154. tx[7] = (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent&0xff);
  2155. tx[8] = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>>8;
  2156. #endif
  2157. uint16_t transfer_float;
  2158. {
  2159. #ifdef FUNC_CP_ADC_MODIFY
  2160. transfer_float = (uint16_t)(CpDetectionResult.PositiveValue == 0 ? 0 : HTK_GetPosFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue)) * 100);
  2161. #else
  2162. //transfer_float = (uint16_t)((float)(((1.59131-((3.3*CpDetectionResult.PositiveValue)/4095))*(475/53.6)))*100);
  2163. #endif
  2164. }
  2165. tx[9] = (transfer_float&0xff);
  2166. tx[10] = (transfer_float&0xff00)>>8;
  2167. {
  2168. #ifdef FUNC_CP_ADC_MODIFY
  2169. transfer_float = (uint16_t)(CpDetectionResult.NegativeValue == 0 ? 0 : HTK_GetNegFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue)) * 100);
  2170. #else
  2171. //transfer_float = (uint16_t)((float)(((((3.3*CpDetectionResult.NegativeValue)/4095)-1.59131)*(475/53.6)))*100);
  2172. #endif
  2173. }
  2174. tx[11] = (transfer_float&0xff);
  2175. tx[12] = (transfer_float&0xff00)>>8;
  2176. #ifdef FUNC_GUN_LOCK
  2177. if (Charger.m_bUseGunLock)
  2178. {
  2179. tx[13] = GL_IsLock() ? 0x01 : 0x00; //Locker status
  2180. }
  2181. else
  2182. {
  2183. tx[13] = 0x00;
  2184. }
  2185. #else
  2186. tx[13] = 0x00; //Locker status
  2187. #endif
  2188. {
  2189. uint8_t val = 0;
  2190. if (Charger.Relay_Action == GPIO_RELAY_ACTION_ON)
  2191. {
  2192. //val |= 0x07; //Use different bit
  2193. val |= 0x01; //Use same bit (Fit CSU code)
  2194. }
  2195. if (Charger.SE_Relay_Action == GPIO_SE_RELAY_ACTION_ON)
  2196. {
  2197. //val |= 0x08; //Use different bit
  2198. val |= 0x01; //Use same bit (Fit CSU code)
  2199. }
  2200. tx[14] = val;
  2201. }
  2202. tx[15] = 0x00; //Shutter status
  2203. tx[16] = 0x00; //Meter status
  2204. #ifdef FUNC_DETECT_PP
  2205. tx[17] = Charger.m_PPInfo.m_StatusID; //PP status
  2206. #else
  2207. tx[17] = 0x00; //PP status
  2208. #endif //FUNC_DETECT_PP
  2209. tx[18] = Charger.maxRatingCurrent;
  2210. #ifdef ROTATE_SWITCH_HARDCODE
  2211. tmpBuf = HC_ROTARY_SWITCH_SET_VAL;
  2212. tmpBuf += (HC_SWITCH_1_CONN_TYPE_VAL?0:1)<<4;
  2213. tmpBuf += (HC_SWITCH_2_GROUND_SYS?0:1)<<5;
  2214. #else
  2215. tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set1_GPIO_Port, IN_AC_Current_Set1_Pin)?0:1)<<0;
  2216. tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set2_GPIO_Port, IN_AC_Current_Set2_Pin)?0:1)<<1;
  2217. tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set3_GPIO_Port, IN_AC_Current_Set3_Pin)?0:1)<<2;
  2218. tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set4_GPIO_Port, IN_AC_Current_Set4_Pin)?0:1)<<3;
  2219. #ifdef MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5
  2220. if ( Charger.m_bModelNameAX32_3P
  2221. #ifdef FUNC_AT32
  2222. || Charger.m_bModelNameAT32_3P
  2223. #endif
  2224. )
  2225. {
  2226. tmpBuf += (Charger.m_b3PhaseModelButUse1PhaseOnly ? 1 : 0) << 4;
  2227. }
  2228. else
  2229. {
  2230. tmpBuf += (HAL_GPIO_ReadPin(IN_GridType_Select_GPIO_Port, IN_GridType_Select_Pin)?0:1)<<4;
  2231. }
  2232. #else //MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5
  2233. tmpBuf += (HAL_GPIO_ReadPin(IN_GridType_Select_GPIO_Port, IN_GridType_Select_Pin)?0:1)<<4;
  2234. #endif //MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5
  2235. tmpBuf += (HAL_GPIO_ReadPin(IN_Grid_Groundding_GPIO_Port, IN_Grid_Groundding_Pin)?0:1)<<5;
  2236. #endif //ROTATE_SWITCH_HARDCODE
  2237. tx[19] = tmpBuf;
  2238. #ifdef FUNC_OUTP_TYPE_E
  2239. tx[20] = Charger.isOnSocketE | ((IsTypeEPlugIn() ? 1 : 0) << 1);
  2240. #else
  2241. //tx[20] = Charger.isOnSocketE | ((HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)?0:1)<<1);
  2242. #endif
  2243. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2244. {
  2245. chksum ^= tx[6 + idx];
  2246. }
  2247. tx[21] = chksum;
  2248. break;
  2249. case PROTOCOL_MESSAGE_QUERY_EVSE_ALARM:
  2250. tx_len = 11;
  2251. tx[0] = 0xaa;
  2252. tx[1] = PROTOCOL_ADDR;
  2253. tx[2] = CurRxBuf[1];
  2254. tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_ALARM;
  2255. tx[4] = 4;
  2256. tx[5] = 0x00;
  2257. #ifdef VO_SIMU_ALARMCODE
  2258. if (Charger.m_VOCode.m_EnableSimuAlarmCode)
  2259. {
  2260. HTK_U32(tx[6]) = Charger.m_SimuData.m_AlarmCode;
  2261. }
  2262. else
  2263. {
  2264. // tx[6] = (Charger.Alarm_Code&0xff);
  2265. // tx[7] = (Charger.Alarm_Code&0xff00)>>8;
  2266. // tx[8] = (Charger.Alarm_Code&0xff0000)>>16;
  2267. // tx[9] = (Charger.Alarm_Code&0xff000000)>>24;
  2268. HTK_U32(tx[6]) = Charger.Alarm_Code;
  2269. }
  2270. #else
  2271. // tx[6] = (Charger.Alarm_Code&0xff);
  2272. // tx[7] = (Charger.Alarm_Code&0xff00)>>8;
  2273. // tx[8] = (Charger.Alarm_Code&0xff0000)>>16;
  2274. // tx[9] = (Charger.Alarm_Code&0xff000000)>>24;
  2275. HTK_U32(tx[6]) = Charger.Alarm_Code;
  2276. #endif
  2277. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2278. {
  2279. chksum ^= tx[6 + idx];
  2280. }
  2281. tx[10] = chksum;
  2282. break;
  2283. case PROTOCOL_MESSAGE_QUERY_BLE_STATE:
  2284. tx_len = 10;
  2285. tx[0] = 0xaa;
  2286. tx[1] = PROTOCOL_ADDR;
  2287. tx[2] = CurRxBuf[1];
  2288. tx[3] = PROTOCOL_MESSAGE_QUERY_BLE_STATE;
  2289. tx[4] = 3;
  2290. tx[5] = 0x00;
  2291. tx[6] = 0x00 ;
  2292. tx[7] = 0x00 ;
  2293. tx[8] = 0x00 ;
  2294. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2295. {
  2296. chksum ^= tx[6 + idx];
  2297. }
  2298. tx[9] = chksum;
  2299. break;
  2300. case PROTOCOL_MESSAGE_QUERY_BLE_LOGIC_CENTRAL_ID:
  2301. tx_len = 39;
  2302. tx[0] = 0xaa;
  2303. tx[1] = PROTOCOL_ADDR;
  2304. tx[2] = CurRxBuf[1];
  2305. tx[3] = PROTOCOL_MESSAGE_QUERY_BLE_LOGIC_CENTRAL_ID;
  2306. tx[4] = 32;
  2307. tx[5] = 0x00;
  2308. tx[6] = 'P';
  2309. tx[7] = 'H';
  2310. tx[8] = 'I';
  2311. tx[9] = 'H';
  2312. tx[10] = 'O';
  2313. tx[11] = 'N';
  2314. tx[12] = 'G';
  2315. tx[13] = ' ';
  2316. tx[14] = 'A';
  2317. tx[15] = 'C';
  2318. tx[16] = '-';
  2319. tx[17] = 'S';
  2320. tx[18] = 'i';
  2321. tx[19] = 'm';
  2322. tx[20] = 'p';
  2323. tx[21] = 'l';
  2324. tx[22] = 'e';
  2325. tx[23] = ' ';
  2326. tx[24] = '1';
  2327. tx[25] = '2';
  2328. tx[26] = '3';
  2329. tx[27] = '4';
  2330. tx[28] = '5';
  2331. tx[29] = '6';
  2332. tx[30] = '7';
  2333. tx[31] = '8';
  2334. tx[32] = '9';
  2335. tx[33] = 'A';
  2336. tx[34] = 'B';
  2337. tx[35] = 'C';
  2338. tx[36] = 'D';
  2339. tx[37] = 'E';
  2340. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2341. {
  2342. chksum ^= tx[6 + idx];
  2343. }
  2344. tx[38] = chksum;
  2345. break;
  2346. case PROTOCOL_MESSAGE_QUERY_POWER_CONSUME:
  2347. #ifdef MODIFY_PROTOCOL_MESSAGE_QUERY_POWER_CONSUME_64_BIT
  2348. tx_len = 39;
  2349. #else
  2350. tx_len = 23;
  2351. #endif
  2352. tx[0] = 0xaa;
  2353. tx[1] = PROTOCOL_ADDR;
  2354. tx[2] = CurRxBuf[1];
  2355. tx[3] = PROTOCOL_MESSAGE_QUERY_POWER_CONSUME;
  2356. #ifdef MODIFY_PROTOCOL_MESSAGE_QUERY_POWER_CONSUME_64_BIT
  2357. tx[4] = 32;
  2358. #else
  2359. tx[4] = 16;
  2360. #endif
  2361. tx[5] = 0x00;
  2362. #ifdef MODIFY_PROTOCOL_MESSAGE_QUERY_POWER_CONSUME_64_BIT
  2363. {
  2364. memcpy(&tx[6], &Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total, sizeof(uint64_t) * 4);
  2365. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2366. {
  2367. chksum ^= tx[6 + idx];
  2368. }
  2369. tx[38] = chksum;
  2370. }
  2371. #else
  2372. HTK_U32(tx[6]) = (uint32_t)(HTK_ROUND_U64((double)Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total / 100));
  2373. HTK_U32(tx[10]) = (uint32_t)(HTK_ROUND_U64((double)Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 / 100));
  2374. HTK_U32(tx[14]) = (uint32_t)(HTK_ROUND_U64((double)Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 / 100));
  2375. HTK_U32(tx[18]) = (uint32_t)(HTK_ROUND_U64((double)Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 / 100));
  2376. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2377. {
  2378. chksum ^= tx[6 + idx];
  2379. }
  2380. tx[22] = chksum;
  2381. #endif //MODIFY_PROTOCOL_MESSAGE_QUERY_POWER_CONSUME_64_BIT
  2382. break;
  2383. case PROTOCOL_MESSAGE_QUERY_GUN_PLUGIN_TIMES:
  2384. tx_len = 11;
  2385. tx[0] = 0xaa;
  2386. tx[1] = PROTOCOL_ADDR;
  2387. tx[2] = CurRxBuf[1];
  2388. tx[3] = PROTOCOL_MESSAGE_QUERY_GUN_PLUGIN_TIMES;
  2389. tx[4] = 4;
  2390. tx[5] = 0x00;
  2391. tx[6] = (Charger.memory.EVSE_Config.data.item.AcPlugInTimes&0xff);
  2392. tx[7] = (Charger.memory.EVSE_Config.data.item.AcPlugInTimes&0xff00)>>8;
  2393. tx[8] = (Charger.memory.EVSE_Config.data.item.AcPlugInTimes&0xff0000)>>16;
  2394. tx[9] = (Charger.memory.EVSE_Config.data.item.AcPlugInTimes&0xff000000)>>24;
  2395. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2396. {
  2397. chksum ^= tx[6 + idx];
  2398. }
  2399. tx[10] = chksum;
  2400. break;
  2401. case PROTOCOL_MESSAGE_QUERY_EVSE_AUTH_MODE:
  2402. tx_len = 9;
  2403. tx[0] = 0xaa;
  2404. tx[1] = PROTOCOL_ADDR;
  2405. tx[2] = CurRxBuf[1];
  2406. tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_AUTH_MODE;
  2407. tx[4] = 2;
  2408. tx[5] = 0x00;
  2409. tx[6] = Charger.memory.EVSE_Config.data.item.AuthMode;
  2410. tx[7] = Charger.memory.EVSE_Config.data.item.OfflinePolicy;
  2411. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2412. {
  2413. chksum ^= tx[6 + idx];
  2414. }
  2415. tx[8] = chksum;
  2416. break;
  2417. case PROTOCOL_MESSAGE_QUERY_PRESENT_LEAK_CURRENT:
  2418. tx_len = 9;
  2419. tx[0] = 0xaa;
  2420. tx[1] = PROTOCOL_ADDR;
  2421. tx[2] = CurRxBuf[1];
  2422. tx[3] = PROTOCOL_MESSAGE_QUERY_PRESENT_LEAK_CURRENT;
  2423. tx[4] = 2;
  2424. tx[5] = 0x00;
  2425. tx[6] = Charger.Leak_Current/100;
  2426. tx[7] = 0;
  2427. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2428. {
  2429. chksum ^= tx[6 + idx];
  2430. }
  2431. tx[8] = chksum;
  2432. break;
  2433. #ifdef FUNC_METER_IC_ADE7858A
  2434. case PROTOCOL_MESSAGE_QUERY_METER_IC_MEAS_PARAMETER:
  2435. tx_len = 6 + sizeof(MeterIC_MeasVals) + 1;
  2436. tx[0] = 0xaa;
  2437. tx[1] = PROTOCOL_ADDR;
  2438. tx[2] = CurRxBuf[1];
  2439. tx[3] = PROTOCOL_MESSAGE_QUERY_METER_IC_MEAS_PARAMETER;
  2440. memcpy(&tx[6], &Charger.m_MeterIC_MeasVals, sizeof(MeterIC_MeasVals));
  2441. UpdateCheckSum(tx, tx_len);
  2442. break;
  2443. case PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_PARAMETER:
  2444. tx_len = 6 + (5) + 1;
  2445. tx[0] = 0xaa;
  2446. tx[1] = PROTOCOL_ADDR;
  2447. tx[2] = CurRxBuf[1];
  2448. tx[3] = PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_PARAMETER;
  2449. #ifdef FUNC_METER_IC_CALI_FLAG
  2450. if (CurRxBuf[6] == MICC_READ_METER_IC_CALI_FLAG)
  2451. {
  2452. tx[6] = CurRxBuf[6];
  2453. uint32_t tmp = Charger.memory.EVSE_Config.data.item.m_MeterIC_CaliFlag.m_Data;
  2454. tmp |= (Charger.m_bMeterIC_CaliValIsDefault << 31);
  2455. HTK_U32(tx[7]) = tmp;
  2456. }
  2457. else
  2458. #endif //FUNC_METER_IC_CALI_FLAG
  2459. #ifdef FUNC_QUERY_METER_IC_DIE_VERSION
  2460. if (CurRxBuf[6] == MICC_GET_DIE_VERSION)
  2461. {
  2462. tx[6] = CurRxBuf[6];
  2463. //#ifdef FUNC_FORCE_QUERY_METER_IC_DIE_VERSION_2
  2464. // HTK_U32(tx[7]) = 0x02;
  2465. //#else
  2466. HTK_U32(tx[7]) = Charger.m_MeterIcEx.m_DieVersion;
  2467. //#endif
  2468. }
  2469. else
  2470. #endif
  2471. #ifdef VO_GET_VO_CODE
  2472. if (CurRxBuf[6] == MICC_GET_VO_CODE)
  2473. {
  2474. tx[6] = CurRxBuf[6];
  2475. HTK_U32(tx[7]) = Charger.m_VOCode.m_Value;
  2476. }
  2477. else
  2478. #endif //VO_GET_VO_CODE
  2479. {
  2480. MeterIC_CaliValType type = (MeterIC_CaliValType)CurRxBuf[6];
  2481. int32_t *p = MeterIC_GetCaliValPtr(type, NULL);
  2482. if (p != NULL)
  2483. {
  2484. tx[6] = (uint8_t)type;
  2485. HTK_U32(tx[7]) = (uint32_t)*p; //7-10
  2486. }
  2487. else
  2488. {
  2489. tx[6] = (uint8_t)MICC_UNDEFINED;
  2490. HTK_U32(tx[7]) = HTK_U32_MAX;
  2491. }
  2492. }
  2493. UpdateCheckSum(tx, tx_len);
  2494. break;
  2495. #ifdef FUNC_METER_IC_HISTORY_IMCP_CMD
  2496. case PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_HISTORY:
  2497. tx_len = 6 + (5) + 1;
  2498. tx[0] = 0xaa;
  2499. tx[1] = PROTOCOL_ADDR;
  2500. tx[2] = CurRxBuf[1];
  2501. tx[3] = PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_HISTORY;
  2502. {
  2503. uint8_t area = CurRxBuf[6];
  2504. uint16_t idx = HTK_U16(CurRxBuf[7]);
  2505. tx[6] = HTK_U16_BYTE(idx, 0);
  2506. tx[7] = HTK_U16_BYTE(idx, 1);
  2507. if (area > 1 || idx > 0xFF)
  2508. {
  2509. DT* pDT = &Charger.memory.hisMeterIC.data.item[idx].DateTime;
  2510. tx[8] = HTK_U16_BYTE(pDT->year, 0);
  2511. tx[9] = HTK_U16_BYTE(pDT->year, 1);
  2512. tx[10] = pDT->month;
  2513. tx[11] = pDT->day;
  2514. tx[12] = pDT->hour;
  2515. tx[13] = pDT->min;
  2516. tx[14] = pDT->sec;
  2517. tx[15] = (uint8_t)Charger.memory.hisMeterIC.data.item[idx].m_CaliValType;
  2518. HTK_U32(tx[16]) = Charger.memory.hisMeterIC.data.item[idx].m_CaliVal; //16~19
  2519. }
  2520. else
  2521. {
  2522. memset(&tx[8], 0xFF, 12);
  2523. }
  2524. }
  2525. UpdateCheckSum(tx, tx_len);
  2526. break;
  2527. #endif //FUNC_METER_IC_HISTORY_IMCP_CMD
  2528. #endif //FUNC_METER_IC_ADE7858A
  2529. #ifdef FUNC_PTB_METER_WM3M4C
  2530. case PROTOCOL_MESSAGE_QUERY_PTB_METER_WM3M4C:
  2531. {
  2532. tx[0] = 0xaa;
  2533. tx[1] = PROTOCOL_ADDR;
  2534. tx[2] = CurRxBuf[1];
  2535. tx[3] = PROTOCOL_MESSAGE_QUERY_PTB_METER_WM3M4C;
  2536. PWM3M4C p = Charger.m_pWM3M4C;
  2537. byte SubCmd = CurRxBuf[6];
  2538. #ifdef FUNC_CSU_CMD_DEBUG
  2539. char* s = "#CSU_WM3M4C_Get: ";
  2540. XP("%s0x%02X%s\r\n", s, SubCmd, (Charger.m_bUseExtMeter_WM3M4C && p ? "" : " (NOT SUPPORTED)"));
  2541. #endif
  2542. tx[6] = SubCmd;
  2543. if (Charger.m_bUseExtMeter_WM3M4C && p)
  2544. {
  2545. if (SubCmd == WM3M4C_GCMD_OUTP_OCMF_MSG_SIG_LEN)
  2546. {
  2547. tx_len = IMCP_TX_LEN(1 + 2);
  2548. HTK_U16(tx[7]) = p->m_OutpMsgSigLen;
  2549. }
  2550. else if (SubCmd == WM3M4C_GCMD_OUTP_OCMF_MSG_SIG)
  2551. {
  2552. tx_len = IMCP_TX_LEN(1 + p->m_OutpMsgSigLen);
  2553. memcpy(&tx[7], p->m_OutpMsgSig, p->m_OutpMsgSigLen);
  2554. }
  2555. else if (SubCmd == WM3M4C_GCMD_HEADER_PKEY_LEN)
  2556. {
  2557. tx_len = IMCP_TX_LEN(1 + 2);
  2558. HTK_U16(tx[7]) = p->m_HPKeyLen;
  2559. }
  2560. else if (SubCmd == WM3M4C_GCMD_HEADER_PKEY)
  2561. {
  2562. tx_len = IMCP_TX_LEN(1 + p->m_HPKeyLen);
  2563. memcpy(&tx[7], p->m_HPKey, p->m_HPKeyLen);
  2564. }
  2565. else if (SubCmd == WM3M4C_GCMD_OUTP_MSG_FMT_ID)
  2566. {
  2567. u8 n = strlen(p->m_OutpMsgFmtStr);
  2568. tx_len = IMCP_TX_LEN(1 + 1 + n);
  2569. tx[7] = p->m_OutpMsgFmtID;
  2570. memcpy(&tx[8], p->m_OutpMsgFmtStr, n) ;
  2571. }
  2572. else if (SubCmd == WM3M4C_GCMD_OUTP_MSG_LEN)
  2573. {
  2574. tx_len = IMCP_TX_LEN(1 + 2);
  2575. HTK_U16(tx[7]) = p->m_OutpMsgLen.m_Val;
  2576. }
  2577. else if (SubCmd == WM3M4C_GCMD_OUTP_MSG)
  2578. {
  2579. tx_len = IMCP_TX_LEN(1 + p->m_OutpMsgLen.m_Val);
  2580. memcpy(&tx[7], p->m_OutpMsg.m_Buf, p->m_OutpMsgLen.m_Val);
  2581. }
  2582. else if (SubCmd == WM3M4C_GCMD_OUTP_SIG_LEN)
  2583. {
  2584. tx_len = IMCP_TX_LEN(1 + 2);
  2585. HTK_U16(tx[7]) = p->m_OutpSigLen.m_Val * 2; //Byte to ASCII String
  2586. }
  2587. else if (SubCmd == WM3M4C_GCMD_OUTP_SIG)
  2588. {
  2589. tx_len = IMCP_TX_LEN(1 + p->m_OutpSigLen.m_Val * 2);
  2590. memcpy(&tx[7], p->m_OutpSig.m_Str, p->m_OutpSigLen.m_Val * 2);
  2591. }
  2592. else if (SubCmd == WM3M4C_GCMD_PKEYHEADER_LEN)
  2593. {
  2594. tx_len = IMCP_TX_LEN(1 + 2);
  2595. HTK_U16(tx[7]) = WM3M3C_PUBLIC_KEY_H_LEN * 2;
  2596. }
  2597. else if (SubCmd == WM3M4C_GCMD_PKEYHEADER)
  2598. {
  2599. tx_len = IMCP_TX_LEN(1 + WM3M3C_PUBLIC_KEY_H_LEN * 2);
  2600. memcpy(&tx[7], p->m_PublicKeyHStr, WM3M3C_PUBLIC_KEY_H_LEN * 2);
  2601. }
  2602. else if (SubCmd == WM3M4C_GCMD_PKEY_LEN)
  2603. {
  2604. tx_len = IMCP_TX_LEN(1 + 2);
  2605. HTK_U16(tx[7]) = p->m_PublicKeyStrLen;
  2606. }
  2607. else if (SubCmd == WM3M4C_GCMD_PKEY)
  2608. {
  2609. tx_len = IMCP_TX_LEN(1 + p->m_PublicKeyStrLen);
  2610. memcpy(&tx[7], p->m_PublicKey.m_Str, p->m_PublicKeyStrLen);
  2611. }
  2612. else
  2613. {
  2614. tx_len = IMCP_TX_LEN(1);
  2615. tx[6] = 0; //NG
  2616. }
  2617. }
  2618. else
  2619. {
  2620. tx_len = IMCP_TX_LEN(1);
  2621. tx[6] = 0; //NG
  2622. }
  2623. UpdateCheckSum(tx, tx_len);
  2624. }
  2625. break;
  2626. #endif //FUNC_PTB_METER_WM3M4C
  2627. #ifdef FUNC_EKM_OMNIMETER
  2628. case PROTOCOL_MESSAGE_QUERY_EKM_OMNIMETER:
  2629. {
  2630. tx[0] = 0xaa;
  2631. tx[1] = PROTOCOL_ADDR;
  2632. tx[2] = CurRxBuf[1];
  2633. tx[3] = PROTOCOL_MESSAGE_QUERY_EKM_OMNIMETER;
  2634. PEKM_Omnimeter p = Charger.m_pEKM_Omnimeter;
  2635. byte SubCmd = CurRxBuf[6];
  2636. //#ifdef FUNC_CSU_CMD_DEBUG
  2637. // char* s = "#CSU_EKM_Omnimeter_Get: ";
  2638. // XP("%s0x%02X%s\r\n", s, SubCmd, (Charger.m_bUseExtMeter_OMNIMETER && p ? "" : " (NOT SUPPORTED)"));
  2639. //#endif
  2640. tx[6] = SubCmd;
  2641. if (Charger.m_bUseExtMeter_OMNIMETER && p)
  2642. {
  2643. if (SubCmd == EKM_OMNIMETER_GCMD_POWER_CURRENT)
  2644. {
  2645. // tx_len = IMCP_TX_LEN(1 + (sizeof(u32) * 4)); //(u32) m_RMS_Watts_Ln_(1~3), m_RMS_Watts_Tot
  2646. // memcpy(&tx[7], &p->m_RMS_Watts_Ln_1, sizeof(u32) * 4);
  2647. tx_len = IMCP_TX_LEN(1 + (sizeof(u32) * 7)); //(u32) m_RMS_Watts_Ln_(1~3), m_RMS_Watts_Tot, Amps_Ln_(1~3)
  2648. memcpy(&tx[7], &p->m_RMS_Watts_Ln_1, sizeof(u32) * 4);//7-10, 11-14, 15-18, 19-22 /// 23-26, 27-30, 31-34
  2649. u32 vTemp[3] = {
  2650. (u32)(p->m_Amps_Ln_1 * 10),
  2651. (u32)(p->m_Amps_Ln_2 * 10),
  2652. (u32)(p->m_Amps_Ln_3 * 10)};
  2653. memcpy(&tx[23], vTemp, sizeof(u32) * 3);
  2654. }
  2655. else
  2656. {
  2657. tx_len = IMCP_TX_LEN(1);
  2658. tx[6] = 0; //NG
  2659. }
  2660. }
  2661. else
  2662. {
  2663. tx_len = IMCP_TX_LEN(1);
  2664. tx[6] = 0; //NG
  2665. }
  2666. UpdateCheckSum(tx, tx_len);
  2667. }
  2668. break;
  2669. #endif //FUNC_EKM_OMNIMETER
  2670. #ifdef FUNC_WARNING_CODE
  2671. case PROTOCOL_MESSAGE_QUERY_EVSE_WARNING:
  2672. tx_len = 11;
  2673. tx[0] = 0xaa;
  2674. tx[1] = PROTOCOL_ADDR;
  2675. tx[2] = CurRxBuf[1];
  2676. tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_WARNING;
  2677. tx[4] = 4;
  2678. tx[5] = 0x00;
  2679. HTK_U32(tx[6]) = Charger.Warning_Code;
  2680. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2681. {
  2682. chksum ^= tx[6 + idx];
  2683. }
  2684. tx[10] = chksum;
  2685. break;
  2686. #endif //FUNC_WARNING_CODE
  2687. #ifdef FUNC_CSU_PUBLIC_KEY_OPERATION
  2688. case PROTOCOL_MESSAGE_QUERY_EVSE_PUBLIC_KEY:
  2689. {
  2690. enum
  2691. {
  2692. DATA_LEN = 64,
  2693. SALT_LEN = 64,
  2694. MIXTURE_LEN = DATA_LEN + SALT_LEN,
  2695. SALTMAP_LEN = GET_BOX_NUM(MIXTURE_LEN, 8),
  2696. ALL_LEN = MIXTURE_LEN + SALTMAP_LEN,
  2697. };
  2698. tx_len = IMCP_TX_LEN(ALL_LEN);
  2699. tx[0] = 0xaa;
  2700. tx[1] = PROTOCOL_ADDR;
  2701. tx[2] = CurRxBuf[1];
  2702. tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_PUBLIC_KEY;
  2703. HTK_U16(tx[4]) = ALL_LEN;
  2704. //XP("\r\n[PROTOCOL_MESSAGE_QUERY_EVSE_PUBLIC_KEY]\r\n\r\n");
  2705. #ifdef FUNC_ENABLE_CSU_SIGN_IN_WHEN_MCU_HAVE_NG_MODELNAME
  2706. if (!Charger.m_bCsuSignInMustVerify)
  2707. {
  2708. Charger.m_bCsuSignInMustVerify = HTK_TRUE;
  2709. }
  2710. #endif
  2711. if (Charger.m_bCsuSignInMustVerify)
  2712. {
  2713. if (DataEncryption(Charger.memory.EVSE_Config.data.item.m_CsuPublicKey, DATA_LEN, &tx[6], ALL_LEN, 0) == PASS)
  2714. {
  2715. #ifdef FUNC_SECURITY_DEBUG_INFO
  2716. HTK_ByteArray2HexStr_XP("#CSU_GetPublicKey", Charger.memory.EVSE_Config.data.item.m_CsuPublicKey, 0, DATA_LEN);
  2717. #endif
  2718. XP("#CSU_GetPublicKey: OK\r\n");
  2719. }
  2720. else
  2721. {
  2722. memset(&tx[6], 0, ALL_LEN);
  2723. XP("#CSU_GetPublicKey: [NG]\r\n");
  2724. }
  2725. }
  2726. else
  2727. {
  2728. memset(&tx[6], 0, ALL_LEN);
  2729. XP("#CSU_GetPublicKey: [NG]\r\n");
  2730. }
  2731. UpdateCheckSum(tx, tx_len);
  2732. }
  2733. break;
  2734. #endif //FUNC_CSU_PUBLIC_KEY_OPERATION
  2735. /*
  2736. Config message
  2737. */
  2738. case PROTOCOL_MESSAGE_CONFIG_FAN_SPEED:
  2739. tx_len = 8;
  2740. tx[0] = 0xaa;
  2741. tx[1] = PROTOCOL_ADDR;
  2742. tx[2] = CurRxBuf[1];
  2743. tx[3] = PROTOCOL_MESSAGE_CONFIG_FAN_SPEED;
  2744. tx[4] = 0x01;
  2745. tx[5] = 0x00;
  2746. tx[6] = 0x01;
  2747. tx[7] = 0x01;
  2748. break;
  2749. case PROTOCOL_MESSAGE_CONFIG_SN:
  2750. tx_len = 8;
  2751. tx[0] = 0xaa;
  2752. tx[1] = PROTOCOL_ADDR;
  2753. tx[2] = CurRxBuf[1];
  2754. tx[3] = PROTOCOL_MESSAGE_CONFIG_SN;
  2755. tx[4] = 0x01;
  2756. tx[5] = 0x00;
  2757. #ifdef MODIFY_CONFIG_SN
  2758. {
  2759. uint16_t len = HTK_U16(CurRxBuf[4]);
  2760. if (len < sizeof(Charger.memory.EVSE_Config.data.item.SerialNumber) && HTK_IS_DISP_CHAR(CurRxBuf[14]))
  2761. {
  2762. //OK
  2763. tx[6] = 0x01;
  2764. tx[7] = 0x01;
  2765. memset(Charger.memory.EVSE_Config.data.item.SerialNumber, 0, ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.SerialNumber));
  2766. memset(Charger.memory.EVSE_Config.data.item.System_ID, 0, ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.System_ID));
  2767. for(uint16_t idx=0;idx<(len-8);idx++)
  2768. {
  2769. Charger.memory.EVSE_Config.data.item.SerialNumber[idx] = CurRxBuf[14+idx];
  2770. }
  2771. Charger.memory.EVSE_Config.data.item.SerialNumber[len-8] = '\0';
  2772. memcpy(Charger.memory.EVSE_Config.data.item.System_ID, Charger.memory.EVSE_Config.data.item.ModelName, strlen(Charger.memory.EVSE_Config.data.item.ModelName));
  2773. memcpy(&Charger.memory.EVSE_Config.data.item.System_ID[strlen(Charger.memory.EVSE_Config.data.item.ModelName)], Charger.memory.EVSE_Config.data.item.SerialNumber, len);
  2774. XP("#CONFIG_SN: %s\r\n", Charger.memory.EVSE_Config.data.item.SerialNumber);
  2775. //parseVersionInfoFromModelname() ;
  2776. Charger.memory.EVSE_Config.op_bits.update = ON;
  2777. break;
  2778. }
  2779. else
  2780. {
  2781. //NG
  2782. tx[6] = 0x00;
  2783. tx[7] = 0x00;
  2784. break;
  2785. }
  2786. }
  2787. #else //MODIFY_CONFIG_SN
  2788. // tx[6] = 0x01;
  2789. // tx[7] = 0x01;
  2790. //
  2791. // memset(Charger.memory.EVSE_Config.data.item.SerialNumber, 0x00, sizeof(Charger.memory.EVSE_Config.data.item.SerialNumber)/sizeof(Charger.memory.EVSE_Config.data.item.SerialNumber[0]));
  2792. // memset(Charger.memory.EVSE_Config.data.item.System_ID, 0x00, sizeof(Charger.memory.EVSE_Config.data.item.System_ID)/sizeof(Charger.memory.EVSE_Config.data.item.System_ID[0]));
  2793. // for(uint16_t idx=0;idx<((CurRxBuf[4] | (CurRxBuf[5]<<8))-8);idx++)
  2794. // {
  2795. // Charger.memory.EVSE_Config.data.item.SerialNumber[idx] = CurRxBuf[14+idx];
  2796. // }
  2797. // Charger.memory.EVSE_Config.data.item.SerialNumber[(CurRxBuf[4] | (CurRxBuf[5]<<8))-8] = '\0';
  2798. // memcpy(Charger.memory.EVSE_Config.data.item.System_ID, Charger.memory.EVSE_Config.data.item.ModelName, strlen(Charger.memory.EVSE_Config.data.item.ModelName));
  2799. // memcpy(&Charger.memory.EVSE_Config.data.item.System_ID[strlen(Charger.memory.EVSE_Config.data.item.ModelName)], Charger.memory.EVSE_Config.data.item.SerialNumber, (CurRxBuf[4] | (CurRxBuf[5]<<8)));
  2800. //
  2801. // parseVersionInfoFromModelname() ;
  2802. // Charger.memory.EVSE_Config.op_bits.update = ON;
  2803. // break;
  2804. #endif //MODIFY_CONFIG_SN
  2805. case PROTOCOL_MESSAGE_CONFIG_MODEL_NAME:
  2806. tx_len = 8;
  2807. tx[0] = 0xaa;
  2808. tx[1] = PROTOCOL_ADDR;
  2809. tx[2] = CurRxBuf[1];
  2810. tx[3] = PROTOCOL_MESSAGE_CONFIG_MODEL_NAME;
  2811. tx[4] = 0x01;
  2812. tx[5] = 0x00;
  2813. #ifdef MODIFY_CONFIG_MODEL_NAME
  2814. {
  2815. uint16_t len = HTK_U16(CurRxBuf[4]);
  2816. if (len < sizeof(Charger.memory.EVSE_Config.data.item.ModelName) && HTK_IS_DISP_CHAR(CurRxBuf[6]))
  2817. {
  2818. #ifdef FUNC_IGNORE_ILLEGAL_MODEL_NAME
  2819. if (CurRxBuf[6] != 'A' && CurRxBuf[6] != 'D')
  2820. {
  2821. CurRxBuf[6+14] = '\0';
  2822. XP("#CONFIG_ILLEGAL_MODEL_NAME: %s\r\n", (char*)&CurRxBuf[6]);
  2823. //NG
  2824. tx[6] = 0x00;
  2825. tx[7] = 0x00;
  2826. break;
  2827. }
  2828. #endif
  2829. //OK
  2830. tx[6] = 0x01;
  2831. tx[7] = 0x01;
  2832. memset(Charger.memory.EVSE_Config.data.item.ModelName, 0, ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.ModelName));
  2833. memset(Charger.memory.EVSE_Config.data.item.System_ID, 0, ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.System_ID));
  2834. for(uint16_t idx=0;idx<len;idx++)
  2835. {
  2836. Charger.memory.EVSE_Config.data.item.ModelName[idx] = CurRxBuf[6+idx];
  2837. }
  2838. Charger.memory.EVSE_Config.data.item.ModelName[len] = '\0';
  2839. memcpy(Charger.memory.EVSE_Config.data.item.System_ID, Charger.memory.EVSE_Config.data.item.ModelName, strlen(Charger.memory.EVSE_Config.data.item.ModelName));
  2840. memcpy(&Charger.memory.EVSE_Config.data.item.System_ID[strlen(Charger.memory.EVSE_Config.data.item.ModelName)], Charger.memory.EVSE_Config.data.item.SerialNumber, len);
  2841. XP("#CONFIG_MODEL_NAME: %s\r\n", Charger.memory.EVSE_Config.data.item.ModelName);
  2842. #ifdef FUNC_AUTO_MODIFY_CCID_MODULE
  2843. Charger.m_bCCID_MustModify = HTK_TRUE;
  2844. #endif
  2845. parseVersionInfoFromModelname() ;
  2846. Charger.memory.EVSE_Config.op_bits.update = ON;
  2847. #ifdef FUNC_RESET_DATA_AFTER_WRITE_NEW_MODELNAME
  2848. if (Charger.Alarm_Code != 0)
  2849. {
  2850. Charger.m_bTrigToClearAlarmCode = HTK_TRUE;
  2851. Charger.m_bTrigToRefreshMeterIcCaliVal = HTK_TRUE;
  2852. setChargerMode(MODE_INITIAL);
  2853. }
  2854. #endif
  2855. break;
  2856. }
  2857. else
  2858. {
  2859. //NG
  2860. tx[6] = 0x00;
  2861. tx[7] = 0x00;
  2862. break;
  2863. }
  2864. }
  2865. #else //MODIFY_CONFIG_MODEL_NAME
  2866. // tx[6] = 0x01;
  2867. // tx[7] = 0x01;
  2868. //
  2869. // memset(Charger.memory.EVSE_Config.data.item.ModelName, 0x00, sizeof(Charger.memory.EVSE_Config.data.item.ModelName)/sizeof(Charger.memory.EVSE_Config.data.item.ModelName[0]));
  2870. // memset(Charger.memory.EVSE_Config.data.item.System_ID, 0x00, sizeof(Charger.memory.EVSE_Config.data.item.System_ID)/sizeof(Charger.memory.EVSE_Config.data.item.System_ID[0]));
  2871. // for(uint16_t idx=0;idx<(CurRxBuf[4] | (CurRxBuf[5]<<8));idx++)
  2872. // {
  2873. // Charger.memory.EVSE_Config.data.item.ModelName[idx] = CurRxBuf[6+idx];
  2874. // }
  2875. // Charger.memory.EVSE_Config.data.item.ModelName[(CurRxBuf[4] | (CurRxBuf[5]<<8))] = '\0';
  2876. // memcpy(Charger.memory.EVSE_Config.data.item.System_ID, Charger.memory.EVSE_Config.data.item.ModelName, strlen(Charger.memory.EVSE_Config.data.item.ModelName));
  2877. // memcpy(&Charger.memory.EVSE_Config.data.item.System_ID[strlen(Charger.memory.EVSE_Config.data.item.ModelName)], Charger.memory.EVSE_Config.data.item.SerialNumber, (CurRxBuf[4] | (CurRxBuf[5]<<8)));
  2878. //
  2879. // parseVersionInfoFromModelname() ;
  2880. // Charger.memory.EVSE_Config.op_bits.update = ON;
  2881. // break;
  2882. #endif //MODIFY_CONFIG_MODEL_NAME
  2883. case PROTOCOL_MESSAGE_CONFIG_PARAMETER:
  2884. tx_len = 8;
  2885. tx[0] = 0xaa;
  2886. tx[1] = PROTOCOL_ADDR;
  2887. tx[2] = CurRxBuf[1];
  2888. tx[3] = PROTOCOL_MESSAGE_CONFIG_PARAMETER;
  2889. tx[4] = 0x01;
  2890. tx[5] = 0x00;
  2891. tx[6] = 0x01;
  2892. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2893. {
  2894. chksum ^= tx[6 + idx];
  2895. }
  2896. tx[7] = chksum; //checksum
  2897. switch(CurRxBuf[6])
  2898. {
  2899. case INPUT_L1_AC_VOLTAGE:
  2900. Charger.memory.EVSE_Config.data.item.Correction_VL1[CurRxBuf[7]][0] = adc_value.ADC3_IN9_Voltage_L1.value/10;
  2901. Charger.memory.EVSE_Config.data.item.Correction_VL1[CurRxBuf[7]][1] = CurRxBuf[8] | (CurRxBuf[9]<<8);
  2902. break;
  2903. case INPUT_L2_AC_VOLTAGE:
  2904. Charger.memory.EVSE_Config.data.item.Correction_VL2[CurRxBuf[7]][0] = adc_value.ADC3_IN8_Voltage_L2.value/10;;
  2905. Charger.memory.EVSE_Config.data.item.Correction_VL2[CurRxBuf[7]][1] = CurRxBuf[8] | (CurRxBuf[9]<<8);
  2906. break;
  2907. case INPUT_L3_AC_VOLTAGE:
  2908. Charger.memory.EVSE_Config.data.item.Correction_VL3[CurRxBuf[7]][0] = adc_value.ADC3_IN10_Voltage_L3.value/10;;
  2909. Charger.memory.EVSE_Config.data.item.Correction_VL3[CurRxBuf[7]][1] = CurRxBuf[8] | (CurRxBuf[9]<<8);
  2910. break;
  2911. case OUTPUT_L1_CURRENT:
  2912. Charger.memory.EVSE_Config.data.item.Correction_CL1[CurRxBuf[7]][0] = adc_value.ADC3_IN7_Current_L1.value/10;
  2913. Charger.memory.EVSE_Config.data.item.Correction_CL1[CurRxBuf[7]][1] = CurRxBuf[8] | (CurRxBuf[9]<<8);
  2914. break;
  2915. case OUTPUT_L2_CURRENT:
  2916. Charger.memory.EVSE_Config.data.item.Correction_CL2[CurRxBuf[7]][0] = adc_value.ADC3_IN5_Current_L2.value/10;
  2917. Charger.memory.EVSE_Config.data.item.Correction_CL2[CurRxBuf[7]][1] = CurRxBuf[8] | (CurRxBuf[9]<<8);
  2918. break;
  2919. case OUTPUT_L3_CURRENT:
  2920. Charger.memory.EVSE_Config.data.item.Correction_CL3[CurRxBuf[7]][0] = adc_value.ADC3_IN11_Current_L3.value/10;
  2921. Charger.memory.EVSE_Config.data.item.Correction_CL3[CurRxBuf[7]][1] = CurRxBuf[8] | (CurRxBuf[9]<<8);
  2922. break;
  2923. case LEAK_CURRENT:
  2924. Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][0] = adc_value.ADC2_IN6_GF.value; // 2500->25mA
  2925. Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][1] = ((CurRxBuf[8] | (CurRxBuf[9]<<8))*100); // mA
  2926. DEBUG_INFO("Charger.memory.EVSE_Config.data.item.Correction_Leak[[0] = %d\r\n",Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][0]);
  2927. DEBUG_INFO("Charger.memory.EVSE_Config.data.item.Correction_Leak[[1] = %d\r\n",Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][1]);
  2928. break;
  2929. case GROUND_FAULT_VOLTAGE: //max 3.3V
  2930. Charger.memory.EVSE_Config.data.item.Correction_GMI[CurRxBuf[7]][0] = (uint16_t)(adc_value.ADC3_IN4_GMI_VL1.value*10*3.3/4095) ;
  2931. Charger.memory.EVSE_Config.data.item.Correction_GMI[CurRxBuf[7]][1] = CurRxBuf[8] | (CurRxBuf[9]<<8);
  2932. break;
  2933. }
  2934. Charger.memory.EVSE_Config.op_bits.update = ON;
  2935. break;
  2936. case PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT:
  2937. tx_len = 8;
  2938. tx[0] = 0xaa;
  2939. tx[1] = PROTOCOL_ADDR;
  2940. tx[2] = CurRxBuf[1];
  2941. tx[3] = PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT;
  2942. tx[4] = 0x01;
  2943. tx[5] = 0x00;
  2944. tx[6] = 0x01;
  2945. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  2946. {
  2947. chksum ^= tx[6 + idx];
  2948. }
  2949. tx[7] = chksum;
  2950. #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS
  2951. Charger.m_bPassGotCsuCpDutyCmd =
  2952. (Charger.am3352.isRequestOn &&
  2953. Charger.Alarm_Code == 0 &&
  2954. (
  2955. (Charger.CP_State == SYSTEM_STATE_C && CurRxBuf[9] == 0x07) ||
  2956. (Charger.m_bEnableTypeE && IsTypeEPlugIn() && CurRxBuf[9] == 0x08)
  2957. )
  2958. );
  2959. #endif
  2960. if (
  2961. #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_LEGACY_REQUEST
  2962. Charger.am3352.isRequestOn &&
  2963. #endif
  2964. #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_ALARM_CODE
  2965. Charger.Alarm_Code == 0 &&
  2966. #endif
  2967. #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_MODE_CHARGING
  2968. Charger.Mode == MODE_CHARGING &&
  2969. #endif
  2970. #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_CP_PWM
  2971. Charger.m_CP_CurPWM != PWM_DUTY_FULL &&
  2972. #endif
  2973. Charger.CP_State == SYSTEM_STATE_C &&
  2974. CurRxBuf[9] == 0x07 //Main relay (0111b)
  2975. )
  2976. {
  2977. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  2978. #ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
  2979. CsuSetRelayOffCount = 0;
  2980. #endif
  2981. }
  2982. else if
  2983. (
  2984. #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_LEGACY_REQUEST
  2985. Charger.am3352.isRequestOn &&
  2986. #endif
  2987. #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_ALARM_CODE
  2988. Charger.Alarm_Code == 0 &&
  2989. #endif
  2990. #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_MODE_CHARGING
  2991. Charger.Mode == MODE_CHARGING &&
  2992. #endif
  2993. Charger.m_bEnableTypeE &&
  2994. IsTypeEPlugIn() &&
  2995. CurRxBuf[9] == 0x08 //Type E socket relay (1000b)
  2996. )
  2997. {
  2998. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_ON;
  2999. #ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
  3000. CsuSetRelayOffCount = 0;
  3001. #endif
  3002. }
  3003. else
  3004. {
  3005. #ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
  3006. if (++CsuSetRelayOffCount >= 2)
  3007. {
  3008. CsuSetRelayOffCount = 0;
  3009. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  3010. if (Charger.Mode != MODE_DEBUG)
  3011. {
  3012. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ;
  3013. }
  3014. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  3015. #else
  3016. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ;
  3017. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  3018. #endif
  3019. }
  3020. #else //FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
  3021. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  3022. if (Charger.Mode != MODE_DEBUG)
  3023. {
  3024. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ;
  3025. }
  3026. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  3027. #else
  3028. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ;
  3029. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  3030. #endif
  3031. #endif //FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
  3032. }
  3033. #ifdef FUNC_CSU_CMD_DEBUG
  3034. XP("#CSU_SetRelay: %d\r\n", CurRxBuf[9]);
  3035. #endif
  3036. DEBUG_INFO("Set Relay Action By CSU: %d => Main(%d), TypeE(%d)\r\n",
  3037. CurRxBuf[9],
  3038. Charger.Relay_Action,
  3039. Charger.SE_Relay_Action);
  3040. break;
  3041. case PROTOCOL_MESSAGE_CONFIG_GPIO_OUTPUT:
  3042. tx_len = 8;
  3043. tx[0] = 0xaa;
  3044. tx[1] = PROTOCOL_ADDR;
  3045. tx[2] = CurRxBuf[1];
  3046. tx[3] = PROTOCOL_MESSAGE_CONFIG_GPIO_OUTPUT;
  3047. tx[4] = 0x01;
  3048. tx[5] = 0x00;
  3049. tx[6] = CurRxBuf[6];
  3050. tx[7] = 0x00 ^ CurRxBuf[6];
  3051. break;
  3052. case PROTOCOL_MESSAGE_CONFIG_RTC:
  3053. tx_len = 8;
  3054. tx[0] = 0xaa;
  3055. tx[1] = PROTOCOL_ADDR;
  3056. tx[2] = CurRxBuf[1];
  3057. tx[3] = PROTOCOL_MESSAGE_CONFIG_RTC;
  3058. tx[4] = 0x01;
  3059. tx[5] = 0x00;
  3060. tx[6] = 0x01;
  3061. tx[7] = 0x01;
  3062. setTime.Hours = (CurRxBuf[14]-'0')*10 + (CurRxBuf[15]-'0');
  3063. setTime.Minutes = (CurRxBuf[16]-'0')*10 + (CurRxBuf[17]-'0');
  3064. setTime.Seconds = (CurRxBuf[18]-'0')*10 + (CurRxBuf[19]-'0');
  3065. setTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  3066. setTime.StoreOperation = RTC_STOREOPERATION_RESET;
  3067. if (HAL_RTC_SetTime(&hrtc, &setTime, RTC_FORMAT_BIN) != HAL_OK)
  3068. {
  3069. Error_Handler();
  3070. }
  3071. setDate.Year = (CurRxBuf[6]-'0')*1000 + (CurRxBuf[7]-'0')*100 + (CurRxBuf[8]-'0')*10 + (CurRxBuf[9]-'0') - 2000;
  3072. setDate.Month = (CurRxBuf[10]-'0')*10+ (CurRxBuf[11]-'0');
  3073. setDate.Date = (CurRxBuf[12]-'0')*10 + (CurRxBuf[13]-'0');
  3074. if (HAL_RTC_SetDate(&hrtc, &setDate, RTC_FORMAT_BIN) != HAL_OK)
  3075. {
  3076. Error_Handler();
  3077. }
  3078. #ifdef FUNC_CSU_CMD_DEBUG
  3079. XP("#CSU_SetRTC: %04d/%02d/%02d %02d:%02d:%02d\r\n",
  3080. setDate.Year + 2000, setDate.Month, setDate.Date,
  3081. setTime.Hours, setTime.Minutes, setTime.Seconds);
  3082. #endif
  3083. break;
  3084. case PROTOCOL_MESSAGE_CONFIG_LED_ACTION_ALARM:
  3085. #ifdef VO_BLOCK_CSU_LED_ACTION_CMD
  3086. if (Charger.m_VOCode.m_EnableBlockCsuLedCmd)
  3087. {
  3088. if (CurRxBuf == UART_IAP_rx_buffer) //CSU or Debug Port
  3089. {
  3090. tx_len = 8;
  3091. tx[0] = 0xaa;
  3092. tx[1] = PROTOCOL_ADDR;
  3093. tx[2] = CurRxBuf[1];
  3094. tx[3] = PROTOCOL_MESSAGE_CONFIG_LED_ACTION_ALARM;
  3095. tx[4] = 0x01;
  3096. tx[5] = 0x00;
  3097. tx[6] = 0x01;
  3098. tx[7] = 0x01;
  3099. break;
  3100. }
  3101. }
  3102. #endif
  3103. #ifdef FUNC_CUSTOMIZED_LED_MODE_FROM_CSU
  3104. if((Charger.am3352.LedActionState != CurRxBuf[6])||(Charger.am3352.LedAlarmState != HTK_U32(CurRxBuf[7]))||CurRxBuf[6]==LED_ACTION_CUSTOMIZED_MODE)
  3105. {
  3106. Charger.am3352.LedActionState = CurRxBuf[6];
  3107. Charger.am3352.LedAlarmState = HTK_U32(CurRxBuf[7]);
  3108. #else
  3109. if((Charger.am3352.LedActionState != CurRxBuf[6])||(Charger.am3352.LedAlarmState != (CurRxBuf[7]|(CurRxBuf[8]<<8)|(CurRxBuf[9]<<16)|(CurRxBuf[10]<<24))))
  3110. {
  3111. Charger.am3352.LedActionState = CurRxBuf[6];
  3112. Charger.am3352.LedAlarmState = (CurRxBuf[7]|(CurRxBuf[8]<<8)|(CurRxBuf[9]<<16)|(CurRxBuf[10]<<24));
  3113. #endif
  3114. #ifdef FUNC_SHOW_CSU_CONFIG_LED_ACTION_INFO
  3115. XP("#CSU_SetLed (%d, %d)\r\n", Charger.am3352.LedActionState, Charger.am3352.LedAlarmState);
  3116. #endif
  3117. switch(Charger.am3352.LedActionState)
  3118. {
  3119. case LED_ACTION_INIT:
  3120. setLedMotion(LED_ACTION_INIT);
  3121. break;
  3122. case LED_ACTION_IDLE:
  3123. setLedMotion(LED_ACTION_IDLE);
  3124. break;
  3125. case LED_ACTION_AUTHED:
  3126. setLedMotion(LED_ACTION_AUTHED);
  3127. break;
  3128. case LED_ACTION_CONNECTED:
  3129. setLedMotion(LED_ACTION_CONNECTED);
  3130. break;
  3131. case LED_ACTION_CHARGING:
  3132. setLedMotion(LED_ACTION_CHARGING);
  3133. break;
  3134. case LED_ACTION_STOP:
  3135. setLedMotion(LED_ACTION_STOP);
  3136. break;
  3137. case LED_ACTION_ALARM:
  3138. setLedMotion(LED_ACTION_ALARM);
  3139. break;
  3140. case LED_ACTION_MAINTAIN:
  3141. setLedMotion(LED_ACTION_MAINTAIN);
  3142. break;
  3143. case LED_ACTION_RFID_PASS:
  3144. setLedMotion(LED_ACTION_RFID_PASS);
  3145. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  3146. break;
  3147. case LED_ACTION_RFID_FAIL:
  3148. setLedMotion(LED_ACTION_RFID_FAIL);
  3149. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  3150. break;
  3151. case LED_ACTION_BLE_CONNECT:
  3152. setLedMotion(LED_ACTION_BLE_CONNECT);
  3153. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  3154. break;
  3155. case LED_ACTION_BLE_DISABLE:
  3156. setLedMotion(LED_ACTION_BLE_DISABLE);
  3157. break;
  3158. case LED_ACTION_ALL_OFF:
  3159. setLedMotion(LED_ACTION_ALL_OFF);
  3160. break;
  3161. case LED_ACTION_INTERNET_DISCONNECT:
  3162. setLedMotion(LED_ACTION_INTERNET_DISCONNECT);
  3163. break;
  3164. case LED_ACTION_HANDSHAKE_FAIL:
  3165. setLedMotion(LED_ACTION_HANDSHAKE_FAIL);
  3166. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  3167. break;
  3168. case LED_ACTION_RESTORE_SETTING:
  3169. setLedMotion(LED_ACTION_RESTORE_SETTING);
  3170. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  3171. break;
  3172. #ifdef MODIFY_LED_STATUS_202108
  3173. case LED_ACTION_IDLE_BACKEND_CONNECTED:
  3174. setLedMotion(LED_ACTION_IDLE_BACKEND_CONNECTED);
  3175. break;
  3176. case LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP:
  3177. setLedMotion(LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP);
  3178. break;
  3179. case LED_ACTION_IDLE_BACKEND_DISCONNECTED:
  3180. setLedMotion(LED_ACTION_IDLE_BACKEND_DISCONNECTED);
  3181. break;
  3182. case LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP:
  3183. setLedMotion(LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP);
  3184. break;
  3185. case LED_ACTION_RESERVATION_MODE:
  3186. setLedMotion(LED_ACTION_RESERVATION_MODE);
  3187. break;
  3188. #endif //MODIFY_LED_STATUS_202108
  3189. #ifdef FUNC_CUSTOMIZED_LED_MODE_FROM_CSU
  3190. case LED_ACTION_CUSTOMIZED_MODE:
  3191. {
  3192. LED_UserCfg o = { 0 };
  3193. o.m_Mode = CurRxBuf[11];
  3194. o.m_AutoRepeat = CurRxBuf[12];
  3195. o.m_Brightness = CurRxBuf[13];
  3196. o.m_R = HTK_U16(CurRxBuf[14]);
  3197. o.m_G = HTK_U16(CurRxBuf[16]);
  3198. o.m_B = HTK_U16(CurRxBuf[18]);
  3199. HTK_BOOL bCfgOK = HTK_TRUE;
  3200. if (o.m_Mode == LED_USER_MODE_SOLID)
  3201. {
  3202. //Do nothing
  3203. }
  3204. else if (o.m_Mode == LED_USER_MODE_BLINK)
  3205. {
  3206. o.Blink.m_On_ms = HTK_U16(CurRxBuf[20]);
  3207. o.Blink.m_Off_ms = HTK_U16(CurRxBuf[22]);
  3208. o.Blink.m_Rest_ms = HTK_U16(CurRxBuf[24]);
  3209. o.Blink.m_Count = HTK_U16(CurRxBuf[26]);
  3210. }
  3211. else if (o.m_Mode == LED_USER_MODE_BREATH)
  3212. {
  3213. o.Breath.m_Up_ms = HTK_U16(CurRxBuf[20]);
  3214. o.Breath.m_Down_ms = HTK_U16(CurRxBuf[22]);
  3215. }
  3216. else
  3217. {
  3218. //Wrong mode
  3219. bCfgOK = HTK_FALSE;
  3220. }
  3221. if (bCfgOK)
  3222. {
  3223. setLedMotion_User(LED_ACTION_CUSTOMIZED_MODE, &o);
  3224. }
  3225. }
  3226. break;
  3227. #endif //FUNC_CUSTOMIZED_LED_MODE_FROM_CSU
  3228. default:
  3229. break;
  3230. }
  3231. }
  3232. tx_len = 8;
  3233. tx[0] = 0xaa;
  3234. tx[1] = PROTOCOL_ADDR;
  3235. tx[2] = CurRxBuf[1];
  3236. tx[3] = PROTOCOL_MESSAGE_CONFIG_LED_ACTION_ALARM;
  3237. tx[4] = 0x01;
  3238. tx[5] = 0x00;
  3239. tx[6] = 0x01;
  3240. tx[7] = 0x01;
  3241. break;
  3242. case PROTOCOL_MESSAGE_CONFIG_MAX_CURRENT_PWM_DUTY:
  3243. tx_len = 8;
  3244. tx[0] = 0xaa;
  3245. tx[1] = PROTOCOL_ADDR;
  3246. tx[2] = CurRxBuf[1];
  3247. tx[3] = PROTOCOL_MESSAGE_CONFIG_MAX_CURRENT_PWM_DUTY;
  3248. tx[4] = 0x01;
  3249. tx[5] = 0x00;
  3250. #ifdef FUNC_CSU_CMD_DEBUG
  3251. XP("#CSU_SetCpPwmDuty: %d %s\r\n", CurRxBuf[6],
  3252. (Charger.m_bBlockCsuCpPwmDuty || Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF) ? "(Block)" : "");
  3253. #endif
  3254. if (
  3255. #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY
  3256. !Charger.m_bBlockCsuCpPwmDuty &&
  3257. #endif
  3258. #ifdef FUNC_BLOCK_CSU_CMD_SET_DUTY_WHEN_ALARM_CP_F_STATE
  3259. !Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF &&
  3260. #endif
  3261. (
  3262. #ifdef FUNC_AX80
  3263. (CurRxBuf[6] <= 80 && CurRxBuf[6] >= 6) ||
  3264. #else
  3265. (CurRxBuf[6] <= 48 && CurRxBuf[6] >= 6) ||
  3266. #endif
  3267. (CurRxBuf[6] == PWM_DUTY_OFF) ||
  3268. (CurRxBuf[6] == 1) ||
  3269. (CurRxBuf[6] == 5) ||
  3270. (CurRxBuf[6] == 100)
  3271. )
  3272. )
  3273. {
  3274. #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE
  3275. Charger.AC_MaxChargingCurrentOrDuty = CurRxBuf[6];
  3276. #endif
  3277. tx[6] = 0x00;
  3278. #ifdef FUNC_AX80
  3279. if(CurRxBuf[6] <= 80 && CurRxBuf[6] >= 6)
  3280. #else
  3281. if(CurRxBuf[6] <= 48 && CurRxBuf[6] >= 6)
  3282. #endif
  3283. {
  3284. Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = CurRxBuf[6];
  3285. #ifdef FUNC_CCS
  3286. Charger.m_bRunCCS = 0;
  3287. Charger.m_bGotCsuCpDutyCmd = 1;
  3288. #endif
  3289. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  3290. user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent));
  3291. #ifdef FUNC_SYSTEM_KEEP_INFO
  3292. g_SystemKeepInfo.m_CpPwmVal = GetCpPwmDuty(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent);
  3293. SystemKeepInfo_Update(&g_SystemKeepInfo);
  3294. #endif
  3295. #else //MODIFY_CP_TASK_CTRL_CP_PWM
  3296. //user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_651(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent));
  3297. #endif //MODIFY_CP_TASK_CTRL_CP_PWM
  3298. tx[6] = 0x01;
  3299. }
  3300. else if (CurRxBuf[6] == PWM_DUTY_OFF)
  3301. {
  3302. user_pwm_setvalue(PWM_CH_CP, 0); // State F
  3303. #ifdef FUNC_SYSTEM_KEEP_INFO
  3304. g_SystemKeepInfo.m_CpPwmVal = 0;
  3305. SystemKeepInfo_Update(&g_SystemKeepInfo);
  3306. #endif
  3307. tx[6] = 0x01;
  3308. }
  3309. else if (CurRxBuf[6] == 5)
  3310. {
  3311. #ifdef FUNC_CCS
  3312. Charger.m_bRunCCS = 1;
  3313. Charger.m_bGotCsuCpDutyCmd = 1;
  3314. #endif
  3315. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_5);
  3316. #ifdef FUNC_SYSTEM_KEEP_INFO
  3317. g_SystemKeepInfo.m_CpPwmVal = PWM_DUTY_5;
  3318. SystemKeepInfo_Update(&g_SystemKeepInfo);
  3319. #endif
  3320. tx[6] = 0x01;
  3321. }
  3322. else if (CurRxBuf[6] == 100)
  3323. {
  3324. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  3325. #ifdef FUNC_SYSTEM_KEEP_INFO
  3326. g_SystemKeepInfo.m_CpPwmVal = PWM_DUTY_FULL;
  3327. SystemKeepInfo_Update(&g_SystemKeepInfo);
  3328. #endif
  3329. tx[6] = 0x01;
  3330. }
  3331. //control pilot E
  3332. if (CurRxBuf[6] == 1)
  3333. {
  3334. HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_SET); // ON // State E
  3335. user_pwm_setvalue(PWM_CH_CP, 0); //Temporarily, wait for EE to change the hardware and delete
  3336. #ifdef FUNC_SYSTEM_KEEP_INFO
  3337. g_SystemKeepInfo.m_CpPwmVal = 0;
  3338. SystemKeepInfo_Update(&g_SystemKeepInfo);
  3339. #endif
  3340. tx[6] = 0x01;
  3341. }
  3342. else
  3343. {
  3344. HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_RESET); //OFF
  3345. }
  3346. XP("#CSU_SetCpPwmDuty_Final: %d\r\n", CurRxBuf[6]);
  3347. }
  3348. else
  3349. {
  3350. tx[6] = 0x00;
  3351. DEBUG_INFO("CSU_SetCpPwmDuty [NG] (%d) !!!!! \r\n", CurRxBuf[6]);
  3352. }
  3353. for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
  3354. {
  3355. chksum ^= tx[6 + idx];
  3356. }
  3357. tx[7] = chksum; //checksum
  3358. break;
  3359. case PROTOCOL_MESSAGE_CONFIG_LEGACY_REQUEST:
  3360. #ifdef FUNC_CSU_CMD_DEBUG
  3361. XP("#CSU_SetRequest: %d\r\n", CurRxBuf[6]);
  3362. #endif
  3363. //#ifdef FUNC_DC_AUTO_RELAY_OFF
  3364. // if (Charger.m_bModelNameDC && CurRxBuf[6] == 0)
  3365. // {
  3366. // if (Charger.Relay_Action != GPIO_RELAY_ACTION_OFF)
  3367. // {
  3368. // XP("#SET RELAY OFF\r\n");
  3369. // Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  3370. // }
  3371. // if (Charger.SE_Relay_Action != GPIO_SE_RELAY_ACTION_OFF)
  3372. // {
  3373. // XP("#SET SE_RELAY OFF\r\n");
  3374. // Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  3375. // }
  3376. // }
  3377. //#endif
  3378. if((CurRxBuf[6]&SETTING_LEGACY_REQUEST)>0)
  3379. {
  3380. //#ifdef FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD
  3381. // CsuSetRequestOffCount = 0;
  3382. //#endif
  3383. Charger.am3352.isRequestOff = OFF;
  3384. Charger.rfid.op_bits.reqStart = ON;
  3385. if(!Charger.am3352.isRequestOn)
  3386. {
  3387. DEBUG_INFO("#Request Pin On.\r\n");
  3388. Charger.am3352.isRequestOn = ON;
  3389. #ifdef FUNC_SYSTEM_KEEP_INFO
  3390. g_SystemKeepInfo.m_CsuIsRequestOn = Charger.am3352.isRequestOn;
  3391. SystemKeepInfo_Update(&g_SystemKeepInfo);
  3392. #endif
  3393. }
  3394. }
  3395. else
  3396. {
  3397. //#ifdef FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD
  3398. // if (++CsuSetRequestOffCount >= 2)
  3399. // {
  3400. // CsuSetRequestOffCount = 0;
  3401. // Charger.am3352.isRequestOn = OFF;
  3402. //#ifdef FUNC_SYSTEM_KEEP_INFO
  3403. // g_SystemKeepInfo.m_CsuIsRequestOn = Charger.am3352.isRequestOn;
  3404. // SystemKeepInfo_Update(&g_SystemKeepInfo);
  3405. //#endif
  3406. // Charger.am3352.RequestPinDebounceCnt = 0;
  3407. // Charger.rfid.op_bits.reqStart = OFF;
  3408. // if(!Charger.am3352.isRequestOff)
  3409. // {
  3410. // DEBUG_INFO("#Request Pin Off.\r\n");
  3411. // Charger.am3352.isRequestOff = ON;
  3412. // }
  3413. // }
  3414. //#else //FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD
  3415. Charger.am3352.isRequestOn = OFF;
  3416. #ifdef FUNC_SYSTEM_KEEP_INFO
  3417. g_SystemKeepInfo.m_CsuIsRequestOn = Charger.am3352.isRequestOn;
  3418. SystemKeepInfo_Update(&g_SystemKeepInfo);
  3419. #endif
  3420. Charger.am3352.RequestPinDebounceCnt = 0;
  3421. Charger.rfid.op_bits.reqStart = OFF;
  3422. if(!Charger.am3352.isRequestOff)
  3423. {
  3424. DEBUG_INFO("#Request Pin Off.\r\n");
  3425. Charger.am3352.isRequestOff = ON;
  3426. }
  3427. //#endif //FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD
  3428. }
  3429. tx_len = 8;
  3430. tx[0] = 0xaa;
  3431. tx[1] = PROTOCOL_ADDR;
  3432. tx[2] = CurRxBuf[1];
  3433. tx[3] = PROTOCOL_MESSAGE_CONFIG_LEGACY_REQUEST;
  3434. tx[4] = 0x01;
  3435. tx[5] = 0x00;
  3436. tx[6] = 0x01;
  3437. tx[7] = 0x01;
  3438. break;
  3439. case PROTOCOL_MESSAGE_CONFIG_MCU_RESET:
  3440. tx_len = 8;
  3441. tx[0] = 0xaa;
  3442. tx[1] = PROTOCOL_ADDR;
  3443. tx[2] = CurRxBuf[1];
  3444. tx[3] = PROTOCOL_MESSAGE_CONFIG_MCU_RESET;
  3445. tx[4] = 0x01;
  3446. tx[5] = 0x00;
  3447. tx[6] = 0x01;
  3448. tx[7] = 0x01;
  3449. if((CurRxBuf[6]&0x01)>0){
  3450. DEBUG_INFO("MCU reset request.\r\n");
  3451. #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE
  3452. Prefix_UartTX(tx, CurRxBuf);
  3453. HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
  3454. Postfix_UartTX(tx, CurRxBuf);
  3455. #else
  3456. HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, tx_len , 0x0ffff);
  3457. #endif
  3458. osDelay(1000);
  3459. NVIC_SystemReset();
  3460. }
  3461. else
  3462. {
  3463. tx[6] = 0x00;
  3464. tx[7] = 0x00;
  3465. }
  3466. break;
  3467. case PROTOCOL_MESSAGE_CONFIG_BREATHE_LED_TIMING:
  3468. Charger.am3352.BreatheLedConnectFadeIn = (((uint16_t)CurRxBuf[7]<<8)+(uint16_t)CurRxBuf[6]);
  3469. Charger.am3352.BreatheLedConnectFadeOut = (((uint16_t)CurRxBuf[9]<<8)+(uint16_t)CurRxBuf[8]);
  3470. DEBUG_INFO("Connect Breathe Led Fade In time: %d ms.\r\n",Charger.am3352.BreatheLedConnectFadeIn);
  3471. DEBUG_INFO("Connect Breathe Led Fade Out time: %d ms.\r\n",Charger.am3352.BreatheLedConnectFadeOut);
  3472. Charger.am3352.BreatheLedAuthdFadeIn = (((uint16_t)CurRxBuf[11]<<8)+(uint16_t)CurRxBuf[10]);
  3473. Charger.am3352.BreatheLedAuthdFadeOut = (((uint16_t)CurRxBuf[13]<<8)+(uint16_t)CurRxBuf[12]);
  3474. DEBUG_INFO("Authd Breathe Led Fade In time: %d ms.\r\n",Charger.am3352.BreatheLedAuthdFadeIn);
  3475. DEBUG_INFO("Authd Breathe Led Fade Out time: %d ms.\r\n",Charger.am3352.BreatheLedAuthdFadeOut);
  3476. Charger.am3352.BreatheLedChargeFadeIn = (((uint16_t)CurRxBuf[15]<<8)+(uint16_t)CurRxBuf[14]);
  3477. Charger.am3352.BreatheLedChargeFadeOut = (((uint16_t)CurRxBuf[17]<<8)+(uint16_t)CurRxBuf[16]);
  3478. DEBUG_INFO("Charge Breathe Led Fade In time: %d ms.\r\n",Charger.am3352.BreatheLedChargeFadeIn);
  3479. DEBUG_INFO("Charge Breathe Led Fade Out time: %d ms.\r\n",Charger.am3352.BreatheLedChargeFadeOut);
  3480. tx_len = 8;
  3481. tx[0] = 0xaa;
  3482. tx[1] = PROTOCOL_ADDR;
  3483. tx[2] = CurRxBuf[1];
  3484. tx[3] = PROTOCOL_MESSAGE_CONFIG_BREATHE_LED_TIMING;
  3485. tx[4] = 0x01;
  3486. tx[5] = 0x00;
  3487. tx[6] = 0x01;
  3488. tx[7] = 0x01;
  3489. break;
  3490. case PROTOCOL_MESSAGE_CONFIG_LED_BRIGHTNESS:
  3491. memcpy(Charger.Led_Brightness, &CurRxBuf[6], 12);
  3492. tx_len = 8;
  3493. tx[0] = 0xaa;
  3494. tx[1] = PROTOCOL_ADDR;
  3495. tx[2] = CurRxBuf[1];
  3496. tx[3] = PROTOCOL_MESSAGE_CONFIG_LED_BRIGHTNESS;
  3497. tx[4] = 0x01;
  3498. tx[5] = 0x00;
  3499. tx[6] = 0x01;
  3500. tx[7] = 0x01;
  3501. break;
  3502. case PROTOCOL_MESSAGE_CONFIG_EVSE_AUTH_MODE:
  3503. switch(CurRxBuf[6])
  3504. {
  3505. case AUTH_MODE_OCPP:
  3506. Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_OCPP ;
  3507. break;
  3508. case AUTH_MODE_FREE:
  3509. Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ;
  3510. break;
  3511. default:
  3512. Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ;
  3513. Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ;
  3514. break ;
  3515. }
  3516. switch(CurRxBuf[7])
  3517. {
  3518. case RFID_USER_AUTH_LOCAL_LIST:
  3519. Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_LOCAL_LIST ;
  3520. break;
  3521. case RFID_USER_AUTH_PH:
  3522. Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_PH ;
  3523. break;
  3524. case RFID_USER_AUTH_FREE:
  3525. Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ;
  3526. break;
  3527. case RFID_USER_AUTH_NO_CHARGING:
  3528. Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_NO_CHARGING ;
  3529. break;
  3530. default:
  3531. Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ;
  3532. Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ;
  3533. break ;
  3534. }
  3535. tx_len = 8;
  3536. tx[0] = 0xaa;
  3537. tx[1] = PROTOCOL_ADDR;
  3538. tx[2] = CurRxBuf[1];
  3539. tx[3] = PROTOCOL_MESSAGE_CONFIG_EVSE_AUTH_MODE;
  3540. tx[4] = 0x01;
  3541. tx[5] = 0x00;
  3542. tx[6] = 0x01;
  3543. tx[7] = 0x01;
  3544. Charger.memory.EVSE_Config.op_bits.update = ON;
  3545. break;
  3546. case PROTOCOL_MESSAGE_CONFIG_ERASE_MEMORY:
  3547. switch(CurRxBuf[6])
  3548. {
  3549. case 0:
  3550. Charger.memory.EVSE_Config.op_bits.clear = ON;
  3551. Charger.memory.whiteList.op_bits.clear = ON;
  3552. #ifdef FUNC_METER_IC_HISTORY
  3553. Charger.memory.hisMeterIC.op_bits.clear = ON;
  3554. #else
  3555. Charger.memory.hisCharging.op_bits.clear = ON;
  3556. #endif
  3557. Charger.memory.hisAlarm.op_bits.clear = ON;
  3558. Charger.memory.coldLoadPickUp.op_bits.clear = ON;
  3559. break;
  3560. case 1:
  3561. Charger.memory.EVSE_Config.op_bits.clear = ON;
  3562. break;
  3563. case 2:
  3564. Charger.memory.whiteList.op_bits.clear = ON;
  3565. break;
  3566. case 3:
  3567. #ifdef FUNC_METER_IC_HISTORY
  3568. Charger.memory.hisMeterIC.op_bits.clear = ON;
  3569. #else
  3570. Charger.memory.hisCharging.op_bits.clear = ON;
  3571. #endif
  3572. break;
  3573. case 4:
  3574. Charger.memory.hisAlarm.op_bits.clear = ON;
  3575. break;
  3576. case 5:
  3577. Charger.memory.coldLoadPickUp.op_bits.clear = ON;
  3578. break;
  3579. default:
  3580. break;
  3581. }
  3582. tx_len = 8;
  3583. tx[0] = 0xaa;
  3584. tx[1] = PROTOCOL_ADDR;
  3585. tx[2] = CurRxBuf[1];
  3586. tx[3] = PROTOCOL_MESSAGE_CONFIG_ERASE_MEMORY;
  3587. tx[4] = 0x01;
  3588. tx[5] = 0x00;
  3589. tx[6] = 0x01;
  3590. tx[7] = 0x01;
  3591. break;
  3592. case PROTOCOL_MESSAGE_CONFIG_AUX_POWER_SW:
  3593. switch(CurRxBuf[6])
  3594. {
  3595. case 0:
  3596. HAL_GPIO_WritePin(OUT_Meter_Power_GPIO_Port, OUT_Meter_Power_Pin, (CurRxBuf[7]?GPIO_PIN_SET:GPIO_PIN_RESET));
  3597. break;
  3598. case 1:
  3599. HAL_GPIO_WritePin(OUT_Meter_Power_GPIO_Port, OUT_Meter_Power_Pin, (CurRxBuf[7]?GPIO_PIN_SET:GPIO_PIN_RESET));
  3600. break;
  3601. default:
  3602. break;
  3603. }
  3604. tx_len = 8;
  3605. tx[0] = 0xaa;
  3606. tx[1] = PROTOCOL_ADDR;
  3607. tx[2] = CurRxBuf[1];
  3608. tx[3] = PROTOCOL_MESSAGE_CONFIG_AUX_POWER_SW;
  3609. tx[4] = 0x01;
  3610. tx[5] = 0x00;
  3611. tx[6] = 0x01;
  3612. tx[7] = 0x01;
  3613. break;
  3614. #ifdef FUNC_METER_IC_ADE7858A
  3615. case PROTOCOL_MESSAGE_CONFIG_METER_IC_CALI_PARAMETER:
  3616. tx_len = 8;
  3617. tx[0] = 0xaa;
  3618. tx[1] = PROTOCOL_ADDR;
  3619. tx[2] = CurRxBuf[1];
  3620. tx[3] = PROTOCOL_MESSAGE_CONFIG_METER_IC_CALI_PARAMETER;
  3621. tx[4] = 0x01;
  3622. tx[5] = 0x00;
  3623. {
  3624. MeterIC_CaliValType type = (MeterIC_CaliValType)CurRxBuf[6];
  3625. uint32_t nSetVal = HTK_U32(CurRxBuf[7]);
  3626. if (type == MICC_RESET_POWER_CONSUMPTION_CUMULATIVE) //0xA0: Reset power consumption cumulative
  3627. {
  3628. if (nSetVal == AUTHCODE_RESET_POWER_CONSUMPTION_CUMULATIVE)
  3629. {
  3630. tx[6] = 0x01; //Set OK
  3631. XP("#RESET_POWER_CONSUMPTION_CUMULATIVE\r\n");
  3632. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = 0;
  3633. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 = 0;
  3634. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 = 0;
  3635. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 = 0;
  3636. Charger.memory.EVSE_Config.data.item.AcPlugInTimes = 0; //Clear PlugIn counter
  3637. Charger.memory.EVSE_Config.op_bits.update = ON;
  3638. }
  3639. else
  3640. {
  3641. tx[6] = 0x00; //Set NG
  3642. }
  3643. }
  3644. //0xC0/0xC1: Reset all MeterIC calibration values to (0x00/0xFF)
  3645. else if (type == MICC_RESET_METER_IC_ALL_CALI_VAL_00 || type == MICC_RESET_METER_IC_ALL_CALI_VAL_FF)
  3646. {
  3647. if (nSetVal == AUTHCODE_RESET_METER_IC_ALL_CALI_VAL)
  3648. {
  3649. tx[6] = 0x01; //Set OK
  3650. XP("#RESET_RESET_ALL_CALI_VAL: 0x%02X\r\n", type);
  3651. memset
  3652. (&Charger.memory.EVSE_Config.data.item.m_MeterIC_CaliVals,
  3653. type == MICC_RESET_METER_IC_ALL_CALI_VAL_00 ? 0x00 : 0xFF,
  3654. sizeof(MeterIC_CaliVals));
  3655. #ifdef FUNC_METER_IC_CALI_FLAG
  3656. Charger.memory.EVSE_Config.data.item.m_MeterIC_CaliFlag.m_Data = 0;
  3657. #endif
  3658. Charger.memory.EVSE_Config.op_bits.update = ON;
  3659. Charger.m_MeterIC_TrigWriteCaliVals.m_Data = HTK_U32_MAX;
  3660. }
  3661. else
  3662. {
  3663. tx[6] = 0x00; //Set NG
  3664. }
  3665. }
  3666. #ifdef FUNC_GUN_LOCK
  3667. else if (type == MICC_SET_GUN_LOCK_STATUS && Charger.m_bUseGunLock)
  3668. {
  3669. XP("#SetGunLock: %d\r\n", nSetVal);
  3670. if (nSetVal == 0)
  3671. {
  3672. GL_Trig(GL_MODE_UNLOCK);
  3673. }
  3674. else if (nSetVal == 1)
  3675. {
  3676. GL_Trig(GL_MODE_LOCK);
  3677. }
  3678. }
  3679. #endif //FUNC_GUN_LOCK
  3680. #ifdef FUNC_VOLATILE_OPERATION
  3681. else if (type == MICC_SET_VO_CODE)
  3682. {
  3683. Charger.m_VOCode.m_Value = nSetVal;
  3684. XP("#SET VO_Code = 0x%08X\r\n", Charger.m_VOCode.m_Value);
  3685. #ifdef VO_SIMU_CP
  3686. XP("#VO: EnableSimuCP(%d)\r\n", Charger.m_VOCode.m_EnableSimuCP);
  3687. if (Charger.m_VOCode.m_EnableSimuCP)
  3688. {
  3689. Charger.m_SimuData.m_CP.m_VoltPos = (uint16_t)(CpDetectionResult.PositiveValue == 0 ? 0 : HTK_GetPosFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue)) * 1000); //V => mV
  3690. Charger.m_SimuData.m_CP.m_VoltNeg = (uint16_t)(CpDetectionResult.NegativeValue == 0 ? 0 : HTK_GetNegFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue)) * 1000); //V => mV
  3691. }
  3692. #endif //VO_SIMU_CP
  3693. #ifdef VO_SIMU_PP
  3694. XP("#VO: EnableSimuPP(%d)\r\n", Charger.m_VOCode.m_EnableSimuPP);
  3695. if (Charger.m_VOCode.m_EnableSimuPP)
  3696. {
  3697. if (!Charger.m_bDetectPP)
  3698. {
  3699. Charger.m_VOCode.m_EnableSimuPP = 0;
  3700. XP("#VO: EnableSimuPP(%d) [Detect PP Function OFF]\r\n", Charger.m_VOCode.m_EnableSimuPP);
  3701. }
  3702. }
  3703. #endif
  3704. #ifdef VO_DISABLE_RELAY_WELDING
  3705. XP("#VO: DisableRelayWelding(%d)\r\n", Charger.m_VOCode.m_DisableRelayWelding);
  3706. #endif
  3707. #ifdef VO_BLOCK_CSU_LED_ACTION_CMD
  3708. XP("#VO: EnableBlockCsuLedCmd(%d)\r\n", Charger.m_VOCode.m_EnableBlockCsuLedCmd);
  3709. #endif
  3710. #ifdef VO_SIMU_ACV
  3711. XP("#VO: EnableSimuACV(%d)\r\n", Charger.m_VOCode.m_EnableSimuACV);
  3712. if (Charger.m_VOCode.m_EnableSimuACV)
  3713. {
  3714. Charger.m_SimuData.m_AcvVolt = Charger.Voltage[0];
  3715. }
  3716. #endif
  3717. #ifdef VO_SIMU_NTC
  3718. XP("#VO: EnableSimuNTC(%d)\r\n", Charger.m_VOCode.m_EnableSimuNTC);
  3719. if (Charger.m_VOCode.m_EnableSimuNTC)
  3720. {
  3721. Charger.m_SimuData.m_NtcTemp = Charger.temperature.SystemAmbientTemp;
  3722. }
  3723. #endif
  3724. #ifdef VO_SIMU_ALARMCODE
  3725. XP("#VO: EnableSimuAlarmCode(%d)\r\n", Charger.m_VOCode.m_EnableSimuAlarmCode);
  3726. if (Charger.m_VOCode.m_EnableSimuAlarmCode)
  3727. {
  3728. Charger.m_SimuData.m_AlarmCode = Charger.Alarm_Code;
  3729. }
  3730. #endif
  3731. #ifdef VO_SIMU_ACA
  3732. XP("#VO: EnableSimuACA(%d)\r\n", Charger.m_VOCode.m_EnableSimuACA);
  3733. if (Charger.m_VOCode.m_EnableSimuACA)
  3734. {
  3735. Charger.m_SimuData.m_AcaCurr = Charger.Current[0];
  3736. }
  3737. #endif
  3738. #ifdef VO_DISABLE_DETECT_TILT_SENSOR
  3739. if (Charger.m_bModelNameAX80_1P)
  3740. {
  3741. XP("#VO: DisableDetectTiltSensor(%d)\r\n", Charger.m_VOCode.m_DisableDetectTiltSensor);
  3742. }
  3743. #endif
  3744. }
  3745. #ifdef VO_SIMU_CP
  3746. else if (type == MICC_SET_SIMU_CP_VOLT)
  3747. {
  3748. if (Charger.m_VOCode.m_EnableSimuCP)
  3749. {
  3750. Charger.m_SimuData.m_CP.m_Value = nSetVal;
  3751. XP("#SET VO_SimuCP_Volt = (+%0.3f, -%0.3f)\r\n", Charger.m_SimuData.m_CP.m_VoltPos * 0.001, Charger.m_SimuData.m_CP.m_VoltNeg * 0.001);
  3752. }
  3753. }
  3754. #endif //VO_SIMU_CP
  3755. #ifdef VO_SIMU_PP
  3756. else if (type == MICC_SET_SIMU_PP_CURR)
  3757. {
  3758. if (Charger.m_VOCode.m_EnableSimuPP)
  3759. {
  3760. if (Charger.m_bDetectPP)
  3761. {
  3762. Charger.m_SimuData.m_PPCurr = nSetVal;
  3763. XP("#SET VO_SimuPP_Curr = (%d)\r\n", Charger.m_SimuData.m_PPCurr);
  3764. }
  3765. else
  3766. {
  3767. XP("#SET VO_SimuPP_Curr = (%d) [Detect PP Function OFF]\r\n", Charger.m_SimuData.m_PPCurr);
  3768. }
  3769. }
  3770. }
  3771. #endif //VO_SIMU_PP
  3772. #ifdef VO_SIMU_ACV
  3773. else if (type == MICC_SET_SIMU_ACV_VOLT)
  3774. {
  3775. if (Charger.m_VOCode.m_EnableSimuACV)
  3776. {
  3777. Charger.m_SimuData.m_AcvVolt = (uint16_t)nSetVal;
  3778. XP("#SET VO_SimuACV_Volt = (%d)\r\n", Charger.m_SimuData.m_AcvVolt);
  3779. }
  3780. }
  3781. #endif
  3782. #ifdef VO_SIMU_NTC
  3783. else if (type == MICC_SET_SIMU_NTC_TEMP)
  3784. {
  3785. if (Charger.m_VOCode.m_EnableSimuNTC)
  3786. {
  3787. Charger.m_SimuData.m_NtcTemp = (uint8_t)nSetVal;
  3788. XP("#SET VO_SimuNTC_Temp = (%d)\r\n", Charger.m_SimuData.m_NtcTemp);
  3789. }
  3790. }
  3791. #endif
  3792. #ifdef VO_SIMU_ALARMCODE
  3793. else if (type == MICC_SET_SIMU_ALARMCIDE_VAL)
  3794. {
  3795. if (Charger.m_VOCode.m_EnableSimuAlarmCode)
  3796. {
  3797. Charger.m_SimuData.m_AlarmCode = nSetVal;
  3798. XP("#SET VO_SimuAlarmCode_Val = (0x%08X)\r\n", Charger.m_SimuData.m_AlarmCode);
  3799. }
  3800. }
  3801. #endif
  3802. #ifdef VO_SIMU_ACA
  3803. else if (type == MICC_SET_SIMU_ACA_CURR)
  3804. {
  3805. if (Charger.m_VOCode.m_EnableSimuACA)
  3806. {
  3807. Charger.m_SimuData.m_AcaCurr = (uint16_t)nSetVal;
  3808. XP("#SET VO_SimuACA_Curr = (%d)\r\n", Charger.m_SimuData.m_AcaCurr);
  3809. }
  3810. }
  3811. #endif
  3812. #endif //FUNC_VOLATILE_OPERATION
  3813. else
  3814. {
  3815. uint32_t nSetVal = HTK_U32(CurRxBuf[7]);
  3816. uint8_t Offset = 0xFF;
  3817. int32_t *p = MeterIC_GetCaliValPtr(type, &Offset);
  3818. if (p != NULL && Offset != 0xFF)
  3819. {
  3820. tx[6] = 0x01; //Set OK
  3821. *p = nSetVal;
  3822. #ifdef FUNC_METER_IC_CALI_FLAG
  3823. Charger.memory.EVSE_Config.data.item.m_MeterIC_CaliFlag.m_Data |= (((uint32_t)0x01) << Offset);
  3824. #endif
  3825. Charger.memory.EVSE_Config.op_bits.update = ON;
  3826. Charger.m_MeterIC_TrigWriteCaliVals.m_Data |= (((uint32_t)0x01) << Offset);
  3827. #ifdef FUNC_METER_IC_HISTORY
  3828. recordMeterICHis(type, *p);
  3829. #endif
  3830. }
  3831. else
  3832. {
  3833. tx[6] = 0x00; //Set NG
  3834. }
  3835. XP(" \r\nPROTOCOL_MESSAGE_CONFIG_METER_IC_CALI_PARAMETER(0x%02X, 0x%04X)\r\n\r\n", type, nSetVal);
  3836. }
  3837. }
  3838. UpdateCheckSum(tx, tx_len);
  3839. break;
  3840. #endif //FUNC_METER_IC_ADE7858A
  3841. #ifdef FUNC_PTB_METER_WM3M4C
  3842. case PROTOCOL_MESSAGE_CONFIG_PTB_METER_WM3M4C:
  3843. {
  3844. tx[0] = 0xaa;
  3845. tx[1] = PROTOCOL_ADDR;
  3846. tx[2] = CurRxBuf[1];
  3847. tx[3] = PROTOCOL_MESSAGE_CONFIG_PTB_METER_WM3M4C;
  3848. PWM3M4C p = Charger.m_pWM3M4C;
  3849. byte SubCmd = CurRxBuf[6];
  3850. tx_len = 6 + (1) + 1;
  3851. char* s = "#CSU_WM3M4C_Set: ";
  3852. #ifdef FUNC_CSU_CMD_DEBUG
  3853. XP("%s0x%02X%s\r\n", s, SubCmd, (Charger.m_bUseExtMeter_WM3M4C && p ? "" : " (NOT SUPPORTED)"));
  3854. #endif
  3855. if (Charger.m_bUseExtMeter_WM3M4C && p)
  3856. {
  3857. if (SubCmd == WM3M4C_SCMD_CHG_BEGIN) //AA 00 FF 97 01 00 01 01
  3858. {
  3859. #ifdef FUNC_CSU_CMD_DEBUG
  3860. XP("%sCHARGE BEGIN\r\n", s);
  3861. #endif
  3862. tx[6] = 1; //OK
  3863. p->m_bTrigBegCharge = HTK_TRUE;
  3864. }
  3865. else if (SubCmd == WM3M4C_SCMD_CHG_END) //AA 00 FF 97 01 00 02 02
  3866. {
  3867. #ifdef FUNC_CSU_CMD_DEBUG
  3868. XP("%sCHARGE END\r\n", s);
  3869. #endif
  3870. tx[6] = 1; //OK
  3871. p->m_bTrigEndCharge = HTK_TRUE;
  3872. }
  3873. else
  3874. {
  3875. tx[6] = 0; //NG
  3876. }
  3877. }
  3878. else
  3879. {
  3880. tx[6] = 0; //NG
  3881. }
  3882. UpdateCheckSum(tx, tx_len);
  3883. }
  3884. break;
  3885. #endif //FUNC_PTB_METER_WM3M4C
  3886. #ifdef FUNC_CSU_SIGN_IN_VERIFY
  3887. case PROTOCOL_MESSAGE_CONFIG_CSU_SIGN_IN_VERIFY:
  3888. tx_len = 8;
  3889. tx[0] = 0xaa;
  3890. tx[1] = PROTOCOL_ADDR;
  3891. tx[2] = CurRxBuf[1];
  3892. tx[3] = PROTOCOL_MESSAGE_CONFIG_CSU_SIGN_IN_VERIFY;
  3893. tx[4] = 0x01;
  3894. tx[5] = 0x00;
  3895. //XP("\r\n[PROTOCOL_MESSAGE_CONFIG_CSU_SIGN_IN_VERIFY]\r\n\r\n");
  3896. #ifdef FUNC_ENABLE_CSU_SIGN_IN_WHEN_MCU_HAVE_NG_MODELNAME
  3897. if (!Charger.m_bCsuSignInMustVerify)
  3898. {
  3899. Charger.m_bCsuSignInMustVerify = HTK_TRUE;
  3900. }
  3901. #endif
  3902. if (Charger.m_bCsuSignInMustVerify)
  3903. {
  3904. #ifdef FUNC_VERIFY_TASK
  3905. if (!Charger.m_bCsuSignInVerifyOK && !Charger.m_bRunCsuSignInVerify)
  3906. {
  3907. Charger.m_VerifyTaskRxBufDataLen = *pCurRxBuf_RxLen;
  3908. memset(Charger.m_VerifyTaskRxBuf, 0, VERIFY_TASK_RXBUF_LEN);
  3909. memcpy(Charger.m_VerifyTaskRxBuf, CurRxBuf, HTK_GET_VAL_MIN(Charger.m_VerifyTaskRxBufDataLen, VERIFY_TASK_RXBUF_LEN));
  3910. Charger.m_bRunCsuSignInVerify = HTK_TRUE;
  3911. }
  3912. #else
  3913. //Charger.m_bCsuVerifyOK = AES256_Verify(&CurRxBuf[6], 4, (u8*)AES256_KEY, &CurRxBuf[10], &CurRxBuf[26]);
  3914. #endif
  3915. if (Charger.m_bCsuSignInVerifyOK)
  3916. {
  3917. DEBUG_INFO("#CSU SignIn OK!\n\r");
  3918. tx[6] = 0x01;
  3919. tx[7] = 0x01;
  3920. }
  3921. else
  3922. {
  3923. DEBUG_INFO("#CSU SignIn [NG]!\n\r");
  3924. tx[6] = 0x00;
  3925. tx[7] = 0x00;
  3926. }
  3927. }
  3928. else
  3929. {
  3930. DEBUG_INFO("#NO need to SignIn!\n\r");
  3931. tx[6] = 0x00;
  3932. tx[7] = 0x00;
  3933. }
  3934. break;
  3935. #endif //FUNC_CSU_SIGN_IN_VERIFY
  3936. #ifdef FUNC_AW48_NET_LED
  3937. case PROTOCOL_MESSAGE_CONFIG_LED_ACTION_CONNECTIVITY_STATUS:
  3938. if (HTK_IS_BETWEEN_MINMAX(CurRxBuf[6], NET_LED_ACTION_MIN, NET_LED_ACTION_MAX)
  3939. && (CurRxBuf[6] != Charger.am3352.NetLedActionState))
  3940. {
  3941. Charger.am3352.NetLedActionState = CurRxBuf[6];
  3942. #ifdef FUNC_SHOW_CSU_CONFIG_LED_ACTION_INFO
  3943. XP("#CSU_SetNetLed(%d)\r\n", Charger.am3352.NetLedActionState);
  3944. #endif
  3945. setNetLedMotion(Charger.am3352.NetLedActionState);
  3946. }
  3947. tx_len = 8;
  3948. tx[0] = 0xaa;
  3949. tx[1] = PROTOCOL_ADDR;
  3950. tx[2] = CurRxBuf[1];
  3951. tx[3] = PROTOCOL_MESSAGE_CONFIG_LED_ACTION_CONNECTIVITY_STATUS;
  3952. tx[4] = 0x01;
  3953. tx[5] = 0x00;
  3954. tx[6] = 0x01;
  3955. tx[7] = 0x01;
  3956. break;
  3957. #endif //FUNC_AW48_NET_LED
  3958. #ifdef FUNC_CSU_PUBLIC_KEY_OPERATION
  3959. case PROTOCOL_MESSAGE_CONFIG_EVSE_PUBLIC_KEY:
  3960. {
  3961. enum
  3962. {
  3963. DATA_LEN = 64,
  3964. SALT_LEN = 64,
  3965. MIXTURE_LEN = DATA_LEN + SALT_LEN,
  3966. SALTMAP_LEN = GET_BOX_NUM(MIXTURE_LEN, 8),
  3967. ALL_LEN = MIXTURE_LEN + SALTMAP_LEN,
  3968. };
  3969. tx_len = 8;
  3970. tx[0] = 0xaa;
  3971. tx[1] = PROTOCOL_ADDR;
  3972. tx[2] = CurRxBuf[1];
  3973. tx[3] = PROTOCOL_MESSAGE_CONFIG_EVSE_PUBLIC_KEY;
  3974. tx[4] = 0x01;
  3975. tx[5] = 0x00;
  3976. //XP("\r\n[PROTOCOL_MESSAGE_CONFIG_EVSE_PUBLIC_KEY]\r\n\r\n");
  3977. #ifdef FUNC_ENABLE_CSU_SIGN_IN_WHEN_MCU_HAVE_NG_MODELNAME
  3978. if (!Charger.m_bCsuSignInMustVerify)
  3979. {
  3980. Charger.m_bCsuSignInMustVerify = HTK_TRUE;
  3981. }
  3982. #endif
  3983. if (Charger.m_bCsuSignInMustVerify)
  3984. {
  3985. enum { KEY_LEN = sizeof(Charger.memory.EVSE_Config.data.item.m_CsuPublicKey), };
  3986. u8* pKey = Charger.memory.EVSE_Config.data.item.m_CsuPublicKey;
  3987. u8 Temp[KEY_LEN] = { 0 };
  3988. memcpy(Temp, pKey, KEY_LEN);
  3989. if (DataEncryption(pKey, DATA_LEN, &CurRxBuf[6], ALL_LEN, 1) == PASS)
  3990. {
  3991. #ifdef FUNC_SECURITY_DEBUG_INFO
  3992. HTK_ByteArray2HexStr_XP("#CSU_SetPublicKey", pKey, 0, DATA_LEN);
  3993. #endif
  3994. if (memcmp(Temp, pKey, KEY_LEN) != 0)
  3995. {
  3996. Charger.memory.EVSE_Config.op_bits.update = ON;
  3997. XP("#CSU_SetPublicKey OK => MEM_ADDR_EVSE_CONFIG\r\n");
  3998. //Need to RE-SignIn
  3999. Charger.m_bCsuSignInVerifyOK = HTK_FALSE;
  4000. Charger.m_bCsuUpgradeFwVerifyOK = HTK_FALSE;
  4001. }
  4002. tx[6] = 0x01;
  4003. tx[7] = 0x01;
  4004. }
  4005. else
  4006. {
  4007. XP("#CSU_SetPublicKey: [NG]\r\n");
  4008. tx[6] = 0x00;
  4009. tx[7] = 0x00;
  4010. }
  4011. }
  4012. else
  4013. {
  4014. XP("#CSU_SetPublicKey: [NG]\r\n");
  4015. tx[6] = 0x00;
  4016. tx[7] = 0x00;
  4017. }
  4018. }
  4019. break;
  4020. #endif //FUNC_CSU_PUBLIC_KEY_OPERATION
  4021. #ifdef FUNC_RESET_CONNECTOR_PLUGIN_TIMES
  4022. case PROTOCOL_MESSAGE_CONFIG_RESET_CONNECTOR_PLUGIN_TIMES:
  4023. tx_len = 8;
  4024. tx[0] = 0xaa;
  4025. tx[1] = PROTOCOL_ADDR;
  4026. tx[2] = CurRxBuf[1];
  4027. tx[3] = PROTOCOL_MESSAGE_CONFIG_RESET_CONNECTOR_PLUGIN_TIMES;
  4028. tx[4] = 0x01;
  4029. tx[5] = 0x00;
  4030. tx[6] = 0x01;
  4031. tx[7] = 0x01;
  4032. if(CurRxBuf[6] == 0x01)
  4033. {
  4034. DEBUG_INFO("CSU reset connector plugin times.\r\n");
  4035. Charger.memory.EVSE_Config.data.item.AcPlugInTimes = 0;
  4036. Charger.memory.EVSE_Config.op_bits.update = ON;
  4037. }
  4038. else
  4039. {
  4040. tx[6] = 0x00;
  4041. tx[7] = 0x00;
  4042. }
  4043. break;
  4044. #endif //FUNC_RESET_CONNECTOR_PLUGIN_TIMES
  4045. /*
  4046. Firmware update message
  4047. */
  4048. case PROTOCOL_MESSAGE_UPGRADE_START:
  4049. tx_len = 8;
  4050. tx[0] = 0xaa;
  4051. tx[1] = PROTOCOL_ADDR;
  4052. tx[2] = CurRxBuf[1];
  4053. tx[3] = PROTOCOL_MESSAGE_UPGRADE_START;
  4054. tx[4] = 0x01;
  4055. tx[5] = 0x00;
  4056. binCRCTarget = (CurRxBuf[6] << 24) | (CurRxBuf[6] << 16) | (CurRxBuf[6] << 8) | (CurRxBuf[6] << 0);
  4057. flashdestination = NEW_CODE_ADDRESS;
  4058. #ifdef FUNC_CSU_UPGRADE_FW_VERIFY
  4059. XP("\r\n[PROTOCOL_MESSAGE_UPGRADE_START]\r\n\r\n");
  4060. #ifdef FUNC_VERIFY_TASK
  4061. if (Charger.m_bCsuUpgradeFwMustVerify)
  4062. {
  4063. if (Charger.m_bCsuUpgradeFwMustVerify && !Charger.m_bCsuUpgradeFwVerifyOK && !Charger.m_bRunCsuUpgradeFwVerify)
  4064. {
  4065. Charger.m_VerifyTaskRxBufDataLen = *pCurRxBuf_RxLen;
  4066. memset(Charger.m_VerifyTaskRxBuf, 0, VERIFY_TASK_RXBUF_LEN);
  4067. memcpy(Charger.m_VerifyTaskRxBuf, CurRxBuf, HTK_GET_VAL_MIN(Charger.m_VerifyTaskRxBufDataLen, VERIFY_TASK_RXBUF_LEN));
  4068. Charger.m_bRunCsuUpgradeFwVerify = HTK_TRUE;
  4069. #ifdef FUNC_SECURITY_DEBUG_INFO
  4070. HTK_ByteArray2HexStr_XP("PROTOCOL_MESSAGE_UPGRADE_START", Charger.m_VerifyTaskRxBuf, 0, Charger.m_VerifyTaskRxBufDataLen);
  4071. #endif
  4072. }
  4073. }
  4074. #else //FUNC_VERIFY_TASK
  4075. // taskENTER_CRITICAL();
  4076. // bFwCheckOkUseAES256 = AES256_Verify(&CurRxBuf[6], 4, (u8*)AES256_KEY, &CurRxBuf[10], &CurRxBuf[26]);
  4077. // taskEXIT_CRITICAL();
  4078. #endif //FUNC_VERIFY_TASK
  4079. #endif //FUNC_CSU_UPGRADE_FW_VERIFY
  4080. if(FLASH_If_Erase(NEW_CODE_ADDRESS, 3)== FLASHIF_OK)
  4081. {
  4082. #if defined(DEBUG) || defined(RTOS_STAT)
  4083. DEBUG_INFO("Firmware transfer start, earase flash success....\n\r");
  4084. #endif
  4085. tx[6] = 0x01;
  4086. tx[7] = 0x01;
  4087. if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  4088. {
  4089. setChargerMode(MODE_MAINTAIN);
  4090. timerEnable(TIMER_IDX_UPDATE, 10000);
  4091. }
  4092. }
  4093. else
  4094. {
  4095. #if defined(DEBUG) || defined(RTOS_STAT)
  4096. DEBUG_INFO("Firmware transfer start, earase flash fail....\n\r");
  4097. #endif
  4098. tx[6] = 0x00;
  4099. tx[7] = 0x00;
  4100. }
  4101. break;
  4102. case PROTOCOL_MESSAGE_UPGRADE_TRANS:
  4103. tx_len = 8;
  4104. tx[0] = 0xaa;
  4105. tx[1] = PROTOCOL_ADDR;
  4106. tx[2] = CurRxBuf[1];
  4107. tx[3] = PROTOCOL_MESSAGE_UPGRADE_TRANS;
  4108. tx[4] = 0x01;
  4109. tx[5] = 0x00;
  4110. flashdestination = NEW_CODE_ADDRESS + ((CurRxBuf[6]<<0) | (CurRxBuf[7]<<8) | (CurRxBuf[8]<<16) |(CurRxBuf[9]<<24));
  4111. if (FLASH_If_Write(flashdestination, (uint32_t*) &CurRxBuf[10], ((((CurRxBuf[4]) | (CurRxBuf[5])<<8)-4)>>2)) == FLASHIF_OK)
  4112. {
  4113. #if defined(DEBUG) || defined(RTOS_STAT)
  4114. //DEBUG_INFO("Firmware transfer start address: 0x%x, length: %d...Pass\n\r", flashdestination, (((CurRxBuf[4]) | (CurRxBuf[5])<<8)-4));
  4115. #endif
  4116. tx[6] = 0x01;
  4117. tx[7] = 0x01;
  4118. if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  4119. {
  4120. setLedMotion(LED_ACTION_MAINTAIN);
  4121. timerRefresh(TIMER_IDX_UPDATE);
  4122. }
  4123. }
  4124. else
  4125. {
  4126. #if defined(DEBUG) || defined(RTOS_STAT)
  4127. DEBUG_INFO("Firmware transfer start address: 0x%x, length: %d...Fail\n\r", flashdestination, (((CurRxBuf[4]) | (CurRxBuf[5])<<8)-4));
  4128. #endif
  4129. tx[6] = 0x00;
  4130. tx[7] = 0x00;
  4131. }
  4132. break;
  4133. case PROTOCOL_MESSAGE_UPGRADE_STOP:
  4134. tx_len = 8;
  4135. tx[0] = 0xaa;
  4136. tx[1] = PROTOCOL_ADDR;
  4137. tx[2] = CurRxBuf[1];
  4138. tx[3] = PROTOCOL_MESSAGE_UPGRADE_STOP;
  4139. tx[4] = 0x01;
  4140. tx[5] = 0x00;
  4141. #ifdef FUNC_USE_STM32_SBSFU
  4142. // {
  4143. // //HAL_StatusTypeDef ret = HAL_ERROR;
  4144. // //uint8_t fw_header_dwl_slot[SE_FW_HEADER_TOT_LEN];
  4145. // SFU_FwImageFlashTypeDef dw1;
  4146. //
  4147. // /* Get Info about the download area */
  4148. // SFU_APP_GetDownloadAreaInfo(SLOT_DWL_1, &dw1);
  4149. // XP("MaxSizeInBytes = %d (0x%08X)\r\n", dw1.MaxSizeInBytes, dw1.MaxSizeInBytes);
  4150. // XP("DownloadAddr = %d (0x%08X)\r\n", dw1.DownloadAddr, dw1.DownloadAddr);
  4151. // XP("ImageOffsetInBytes = %d (0x%08X)\r\n", dw1.ImageOffsetInBytes, dw1.ImageOffsetInBytes);
  4152. // XP("ExecutionAddr = %d (0x%08X)\r\n", dw1.ExecutionAddr, dw1.ExecutionAddr);
  4153. //
  4154. // }
  4155. if ((Charger.m_bCsuUpgradeFwMustVerify && Charger.m_bCsuUpgradeFwVerifyOK) || (!Charger.m_bCsuUpgradeFwMustVerify))
  4156. {
  4157. DEBUG_INFO("Firmware transfer end %s\r\n", Charger.m_bCsuUpgradeFwMustVerify ? (Charger.m_bCsuUpgradeFwVerifyOK ? "(VERIFY: OK)" : "(VERIFY: [NG])" ) : "");
  4158. tx[6] = 0x01;
  4159. tx[7] = 0x01;
  4160. if(isUSB_CDC_IAP)
  4161. {
  4162. CDC_Transmit_FS((uint8_t *)tx, tx_len);
  4163. }
  4164. else
  4165. {
  4166. #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE
  4167. Prefix_UartTX(tx, CurRxBuf);
  4168. HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
  4169. Postfix_UartTX(tx, CurRxBuf);
  4170. #else
  4171. HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, tx_len , 0x0ffff);
  4172. #endif
  4173. }
  4174. osDelay(1000);
  4175. NVIC_SystemReset();
  4176. }
  4177. else
  4178. {
  4179. DEBUG_INFO("Firmware verify fail...\n\r");
  4180. tx[6] = 0x00;
  4181. tx[7] = 0x00;
  4182. }
  4183. #else //FUNC_USE_STM32_SBSFU
  4184. flash = NEW_CODE_ADDRESS;
  4185. checksum = HAL_CRC_Calculate(&hcrc, (uint32_t *)flash, ((FLASH_AP_LENGTH-4)>>2));
  4186. flash = ((uint32_t)(NEW_CODE_ADDRESS+FLASH_AP_LENGTH-4));
  4187. #ifdef FUNC_CSU_UPGRADE_FW_VERIFY
  4188. #if defined(DEBUG) || defined(RTOS_STAT)
  4189. if (Charger.m_bCsuUpgradeFwMustVerify)
  4190. DEBUG_INFO("Firmware transfer end, AP CRC checksum, flash: 0x%x, 0x%x (VERIFY: %s)\r\n", checksum, *((uint32_t *)flash), (Charger.m_bCsuUpgradeFwVerifyOK ? "OK" : "[NG]" ));
  4191. else
  4192. DEBUG_INFO("Firmware transfer end, AP CRC checksum, flash: 0x%x, 0x%x\r\n", checksum, *((uint32_t *)flash) );
  4193. #endif
  4194. if(checksum == *((uint32_t *)flash) && ((Charger.m_bCsuUpgradeFwMustVerify && Charger.m_bCsuUpgradeFwVerifyOK) || (!Charger.m_bCsuUpgradeFwMustVerify)))
  4195. #else
  4196. #if defined(DEBUG) || defined(RTOS_STAT)
  4197. DEBUG_INFO("Firmware transfer end, AP CRC checksum, flash: 0x%x, 0x%x\r\n", checksum, *((uint32_t *)flash) );
  4198. #endif
  4199. if(checksum == *((uint32_t *)flash))
  4200. #endif //FUNC_CSU_UPGRADE_FW_VERIFY
  4201. {
  4202. if (FLASH_If_Write(UPGRADE_REQ_ADDRESS, (uint32_t *)&endFlag[0], 1) == FLASHIF_OK)
  4203. {
  4204. #if defined(DEBUG) || defined(RTOS_STAT)
  4205. DEBUG_INFO("Firmware Confirm Tag write ok..\n\r");
  4206. #endif
  4207. tx[6] = 0x01;
  4208. tx[7] = 0x01;
  4209. if(isUSB_CDC_IAP)
  4210. {
  4211. CDC_Transmit_FS((uint8_t *)tx, tx_len);
  4212. }
  4213. else
  4214. {
  4215. #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE
  4216. Prefix_UartTX(tx, CurRxBuf);
  4217. HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
  4218. Postfix_UartTX(tx, CurRxBuf);
  4219. #else
  4220. HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, tx_len , 0x0ffff);
  4221. #endif
  4222. }
  4223. osDelay(1000);
  4224. NVIC_SystemReset();
  4225. }
  4226. else
  4227. {
  4228. #if defined(DEBUG) || defined(RTOS_STAT)
  4229. DEBUG_INFO("Firmware Confirm Tag write fail...\n\r");
  4230. #endif
  4231. tx[6] = 0x00;
  4232. tx[7] = 0x00;
  4233. }
  4234. }
  4235. else
  4236. {
  4237. #if defined(DEBUG) || defined(RTOS_STAT)
  4238. DEBUG_INFO("Firmware checksum compare fail...\n\r");
  4239. #endif
  4240. tx[6] = 0x00;
  4241. tx[7] = 0x00;
  4242. }
  4243. #endif //FUNC_USE_STM32_SBSFU
  4244. if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  4245. {
  4246. timerDisable(TIMER_IDX_UPDATE);
  4247. }
  4248. break;
  4249. case PROTOCOL_MESSAGE_UPGRADE_ABOARD:
  4250. #if defined(DEBUG) || defined(RTOS_STAT)
  4251. DEBUG_INFO("Firmware update transfer aboard...\n\r");
  4252. #endif
  4253. tx_len = 8;
  4254. tx[0] = 0xaa;
  4255. tx[1] = PROTOCOL_ADDR;
  4256. tx[2] = CurRxBuf[1];
  4257. tx[3] = PROTOCOL_MESSAGE_UPGRADE_ABOARD;
  4258. tx[4] = 0x01;
  4259. tx[5] = 0x00;
  4260. tx[6] = 0x01;
  4261. tx[7] = 0x01;
  4262. break;
  4263. default:
  4264. /* Todo: bin file receive aboard */
  4265. #if defined(DEBUG) || defined(RTOS_STAT)
  4266. #ifdef FUNC_RS485_SLAVE
  4267. DEBUG_INFO("Protocol message unknow (0x%02X)\n\r", CurRxBuf[3]);
  4268. #else
  4269. DEBUG_INFO("Protocol message unknow...\n\r");
  4270. #endif
  4271. #endif
  4272. tx_len = 8;
  4273. tx[0] = 0xaa;
  4274. tx[1] = PROTOCOL_ADDR;
  4275. tx[2] = CurRxBuf[1];
  4276. tx[3] = CurRxBuf[3];
  4277. tx[4] = 0x01;
  4278. tx[5] = 0x00;
  4279. tx[6] = 0x00;
  4280. tx[7] = 0x00;
  4281. break;
  4282. }
  4283. }
  4284. else
  4285. {
  4286. #ifndef FUNC_RS485_SLAVE
  4287. #if defined(DEBUG) || defined(RTOS_STAT)
  4288. DEBUG_INFO("Protocol check sum is wrong...\n\r");
  4289. #endif
  4290. tx_len = 8;
  4291. tx[0] = 0xaa;
  4292. tx[1] = PROTOCOL_ADDR;
  4293. tx[2] = CurRxBuf[1];
  4294. tx[3] = CurRxBuf[3];
  4295. tx[4] = 0x01;
  4296. tx[5] = 0x00;
  4297. tx[6] = 0x00;
  4298. tx[7] = 0x00;
  4299. #endif //FUNC_RS485_SLAVE
  4300. }
  4301. if(isUSB_CDC_IAP)
  4302. {
  4303. CDC_Transmit_FS((uint8_t *)tx, tx_len);
  4304. }
  4305. else
  4306. {
  4307. #ifdef FUNC_RS485_SLAVE
  4308. #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE
  4309. #ifdef FUNC_CSU_SIGN_IN_VERIFY
  4310. if (CurRxBuf != NULL)
  4311. {
  4312. if (CurRxBuf == UART_IAP_rx_buffer &&
  4313. (Charger.m_bCsuSignInMustVerify && !Charger.m_bCsuSignInVerifyOK))
  4314. {
  4315. //XP("X\r\n");
  4316. //do not response
  4317. #ifdef FUNC_CSU_PUBLIC_KEY_OPERATION
  4318. if ( CurRxBuf[3] == PROTOCOL_MESSAGE_CONFIG_CSU_SIGN_IN_VERIFY
  4319. || CurRxBuf[3] == PROTOCOL_MESSAGE_QUERY_EVSE_PUBLIC_KEY
  4320. || CurRxBuf[3] == PROTOCOL_MESSAGE_CONFIG_EVSE_PUBLIC_KEY
  4321. )
  4322. {
  4323. Prefix_UartTX(tx, CurRxBuf);
  4324. HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
  4325. Postfix_UartTX(tx, CurRxBuf);
  4326. }
  4327. #endif
  4328. }
  4329. else
  4330. {
  4331. Prefix_UartTX(tx, CurRxBuf);
  4332. HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
  4333. Postfix_UartTX(tx, CurRxBuf);
  4334. }
  4335. }
  4336. #else //FUNC_CSU_SIGN_IN_VERIFY
  4337. if (CurRxBuf != NULL)
  4338. {
  4339. Prefix_UartTX(tx, CurRxBuf);
  4340. HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
  4341. Postfix_UartTX(tx, CurRxBuf);
  4342. }
  4343. #endif //FUNC_CSU_SIGN_IN_VERIFY
  4344. #else //MODIFY_DC_RS485_UPGRADE_ISSUE
  4345. if (CurRxBuf != NULL)
  4346. {
  4347. tx[1] = Charger.m_RS485SlaveAddr; //Update Slave Address
  4348. HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len, 0xffff);
  4349. }
  4350. #endif //MODIFY_DC_RS485_UPGRADE_ISSUE
  4351. #else //FUNC_RS485_SLAVE
  4352. HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, tx_len, 0xffff);
  4353. #endif //FUNC_RS485_SLAVE
  4354. }
  4355. #ifdef ENABLE_PRINT_IMCP_MSG
  4356. #ifdef FUNC_RS485_SLAVE
  4357. #ifdef PRINT_IMCP_MSG_ONLY_ON_UPDATEPORT
  4358. if (CurRxBuf == UART_IAP_rx_buffer && CheckPrintImcpMsg(CurRxBuf[3]))
  4359. {
  4360. HTK_ByteArray2HexStr_XP(NULL, tx, 0, tx_len);
  4361. }
  4362. #else
  4363. if (CheckPrintImcpMsg(CurRxBuf[3]))
  4364. {
  4365. HTK_ByteArray2HexStr_XP(NULL, tx, 0, tx_len);
  4366. }
  4367. #endif //PRINT_IMCP_MSG_ONLY_ON_UPDATEPORT
  4368. #else //FUNC_RS485_SLAVE
  4369. if (CheckPrintImcpMsg(UART_IAP_rx_buffer[3]))
  4370. {
  4371. HTK_ByteArray2HexStr_XP(NULL, tx, 0, tx_len);
  4372. }
  4373. #endif //FUNC_RS485_SLAVE
  4374. #endif //ENABLE_PRINT_IMCP_MSG
  4375. #ifdef FUNC_RS485_SLAVE
  4376. // Clear rx_buffer and related varaible
  4377. for(uint16_t i = 0; i < *pCurRxBuf_RxLen ; i++)
  4378. CurRxBuf[i]=0;
  4379. *pCurRxBuf_RxLen = 0;
  4380. *pCurRecvEndFlag = 0;
  4381. isUSB_CDC_IAP = OFF;
  4382. #else
  4383. // Clear rx_buffer and related varaible
  4384. for(uint16_t i = 0; i < UART_IAP_rx_len ; i++)
  4385. UART_IAP_rx_buffer[i]=0;
  4386. UART_IAP_rx_len=0;
  4387. UART_IAP_recv_end_flag=0;
  4388. isUSB_CDC_IAP = OFF;
  4389. #endif //FUNC_RS485_SLAVE
  4390. }
  4391. if(timer[TIMER_IDX_UPDATE].isAlarm == ON && Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  4392. {
  4393. setChargerMode(MODE_IDLE);
  4394. setLedMotion(LED_ACTION_IDLE);
  4395. timerDisable(TIMER_IDX_UPDATE);
  4396. }
  4397. #ifdef FUNC_RS485_SLAVE
  4398. HAL_UART_Receive_DMA(&IAP_USART,(uint8_t*)UART_IAP_rx_buffer, UART_BUFFER_SIZE);
  4399. HAL_UART_Receive_DMA(&RS485_USART,(uint8_t*)UART_RS485_rx_buffer, UART_BUFFER_SIZE);
  4400. #else
  4401. HAL_UART_Receive_DMA(&IAP_USART,(uint8_t*)UART_IAP_rx_buffer, UART_BUFFER_SIZE);
  4402. #endif //FUNC_RS485_SLAVE
  4403. #ifdef FUNC_DEBUG_CONSOLE
  4404. HAL_UART_Receive_DMA(&DEBUG_USART,(uint8_t*)UART_DEBUG_rx_buffer, UART_DEBUG_BUFFER_SIZE);
  4405. #endif
  4406. osDelay(1);
  4407. }
  4408. /* USER CODE END StartUartTask */
  4409. }
  4410. #ifdef FUNC_DETECT_PP
  4411. /*--------------------------------------------------------------------------------------------
  4412. Vehicle Rc Range of resistance ADC read ADC
  4413. connectors (ohm) Rc for interpretation [h](V) (count)
  4414. current by the EV supply
  4415. (A) equipment (ohm)
  4416. ----------------------------------------------------------------------------------------------
  4417. N/A Error condition >4500 >2.6 >3227
  4418. or disconnection
  4419. of plug
  4420. ----------------------------------------------------------------------------------------------
  4421. 13 1500 1100-2460 2.32~2.52 2879~3127
  4422. 20 680 400-936 1.86~2.26 2308~2805
  4423. 32 220 80-308 0.83~1.70 1031~2110
  4424. --------------------------------------------------------------------------------------------*/
  4425. void UpdatePPInfo_AdcVal(PPPInfo p, uint32_t v) //ADC value (count)
  4426. {
  4427. if (v > 3227) { p->m_CurCurr = 13; p->m_StatusID = 0x01; } //use MIN Current
  4428. else if (v >= 2879 && v <= 3127) { p->m_CurCurr = 13; p->m_StatusID = 0x01; } //MIN Current
  4429. else if (v >= 2308 && v <= 2805) { p->m_CurCurr = 20; p->m_StatusID = 0x02; }
  4430. else if (v >= 1031 && v <= 2110) { p->m_CurCurr = 32; p->m_StatusID = 0x03; }
  4431. else { p->m_CurCurr = 13; p->m_StatusID = 0x01; } //use MIN Current
  4432. }
  4433. #ifdef VO_SIMU_PP
  4434. void UpdatePPInfo_CurrVal(PPPInfo p, uint16_t v) //Current value (A)
  4435. {
  4436. if (v == 13) { p->m_CurCurr = 13; p->m_StatusID = 0x01; }
  4437. else if (v == 20) { p->m_CurCurr = 20; p->m_StatusID = 0x02; }
  4438. else if (v == 32) { p->m_CurCurr = 32; p->m_StatusID = 0x03; }
  4439. else if (v == 63) { p->m_CurCurr = 63; p->m_StatusID = 0x04; }
  4440. else { p->m_CurCurr = 13; p->m_StatusID = 0x01; }
  4441. }
  4442. #endif //VO_SIMU_PP
  4443. #endif //FUNC_DETECT_PP
  4444. /* USER CODE BEGIN Header_StartAdcTask */
  4445. /**
  4446. * @brief Function implementing the adcTask thread.
  4447. * @param argument: Not used
  4448. * @retval None
  4449. */
  4450. /* USER CODE END Header_StartAdcTask */
  4451. #ifdef FUNC_DEBUG_MSG_CP_STATE
  4452. const char *CP_STATE_TAG[7] = {"0:UNKNOW", "1:A(12V)", "2:B(9V)", "3:C(6V)", "4:D(3V)", "5:E(0V)", "6:F(-12V)"};
  4453. #endif
  4454. void StartAdcTask(void const * argument)
  4455. {
  4456. /* USER CODE BEGIN StartAdcTask */
  4457. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  4458. IdleUntilReadAllMemory();
  4459. #endif
  4460. //aadc
  4461. uint8_t previous_cp_state = SYSTEM_STATE_A;
  4462. #ifndef FUNC_POWER_CONSUMPTION_BY_METER_IC
  4463. uint8_t updateMemReq = 0;
  4464. struct TimeTick
  4465. {
  4466. uint32_t timeTick_Start;
  4467. uint32_t timeTick_End;
  4468. uint32_t timeTick_Delta;
  4469. }timeTick;
  4470. timeTick.timeTick_Start = HAL_GetTick();
  4471. #endif
  4472. #ifdef FUNC_CP_ADC_MODIFY
  4473. #ifdef NEW_CP_SPEC
  4474. while (!Charger.m_bCpDetectModuleInitOK)
  4475. {
  4476. osDelay(10);
  4477. }
  4478. #else //NEW_CP_SPEC
  4479. CpDetectModuleInitialize();
  4480. #endif //NEW_CP_SPEC
  4481. #else //FUNC_CP_ADC_MODIFY
  4482. CpDetectModuleInitialize( &CpBoundary, &SpecDefBoundary, &CpHysteresis);
  4483. #endif //FUNC_CP_ADC_MODIFY
  4484. #ifndef FUNC_POWER_CONSUMPTION_BY_METER_IC
  4485. timerEnable(TIMER_IDX_POWER, 1000);
  4486. #endif
  4487. #ifdef FUNC_GUN_LOCK
  4488. GL_Init(); //All Model
  4489. #endif
  4490. /* Infinite loop */
  4491. for(;;)
  4492. {
  4493. Relay_Control_Function() ;
  4494. #ifdef FUNC_OUTP_TYPE_E
  4495. if (Charger.m_bEnableTypeE)
  4496. {
  4497. SE_Relay_Control_Function();
  4498. }
  4499. #endif
  4500. // ADC chanel 1
  4501. if(isDMAEnd_ADC1)
  4502. {
  4503. #ifdef FUNC_TASK_MONITOR
  4504. Charger.m_TaskMonitor.m_ADC.m_ADC1_Counter[0]++;
  4505. #endif
  4506. isDMAEnd_ADC1 = OFF;
  4507. #ifdef VO_SIMU_CP
  4508. CpCalculate(ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT, &CpDetectionResult, Charger.m_VOCode.m_EnableSimuCP, &Charger.m_SimuData.m_CP);
  4509. #else
  4510. CpCalculate(ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT, &CpDetectionResult);
  4511. #endif
  4512. Charger.CP_State = CpDetectionResult.State;
  4513. // if (Charger.Mode!= MODE_DEBUG)
  4514. {
  4515. #ifdef MODIFY_ADCTASK_CP_STATE_CHANGE
  4516. if((previous_cp_state != Charger.CP_State))
  4517. #else
  4518. if((previous_cp_state != Charger.CP_State) && (Charger.CP_State !=SYSTEM_STATE_UNKNOWN ))
  4519. #endif
  4520. {
  4521. #ifdef FUNC_DEBUG_MSG_CP_STATE
  4522. XP("#CP: [%s] >>> [%s] (+%.3f, -%.3f)\r\n",
  4523. CP_STATE_TAG[previous_cp_state],
  4524. CP_STATE_TAG[Charger.CP_State],
  4525. (CpDetectionResult.PositiveValue == 0 ? 0 : HTK_GetPosFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue))),
  4526. (CpDetectionResult.NegativeValue == 0 ? 0 : HTK_GetNegFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue)))
  4527. );
  4528. #endif
  4529. previous_cp_state = Charger.CP_State;
  4530. if(Charger.CP_State == SYSTEM_STATE_A)
  4531. {
  4532. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // CP PWM duty set 100%
  4533. Charger.Relay_Action=GPIO_RELAY_ACTION_OFF;
  4534. #ifdef REDUCE_RELAY_CUT_OFF_TIME_WHEN_CP_C_TO_A
  4535. Relay_Control_Function();
  4536. #endif
  4537. if (Charger.Mode!= MODE_DEBUG)
  4538. {
  4539. Charger.memory.EVSE_Config.data.item.AcPlugInTimes++;
  4540. Charger.memory.EVSE_Config.op_bits.update = ON;
  4541. DEBUG_INFO("EVSE connector plug counts: %d\r\n", Charger.memory.EVSE_Config.data.item.AcPlugInTimes);
  4542. }
  4543. }
  4544. }
  4545. }
  4546. if(HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT)!=HAL_OK)Error_Handler();
  4547. }
  4548. // ADC chanel 2
  4549. if(isDMAEnd_ADC2)
  4550. {
  4551. #ifdef FUNC_TASK_MONITOR
  4552. Charger.m_TaskMonitor.m_ADC.m_ADC2_Counter[0]++;
  4553. #endif
  4554. isDMAEnd_ADC2 = OFF;
  4555. for(uint16_t idx=0;idx<ADC2_SAMPLE_COUNT;idx++)
  4556. {
  4557. ADC2_Buffer_Each[0][idx] = ADC2_Buffer[(idx*ADC2_CHANEL_COUNT) + 0];
  4558. ADC2_Buffer_Each[1][idx] = ADC2_Buffer[(idx*ADC2_CHANEL_COUNT) + 1];
  4559. }
  4560. if (WatchDogLeakRawDataCheck_Event()) //clear leak WatchDogcount
  4561. {
  4562. Charger.counter.WatchDogLeak = 0 ;
  4563. }
  4564. #ifdef MODIFY_ADC_WELDING_CALCULATE_METHOD
  4565. filter_move_avg(&adc_value.ADC2_IN5_Welding, avg_v_cal(ADC2_Buffer_Each[0], ADC2_SAMPLE_COUNT)); //unit: 0.01V
  4566. #else
  4567. //RlyVmax_cal
  4568. if (Charger.GroundingSystem == GROUNGING_SYSTEM_LL)
  4569. {
  4570. filter_move_avg(&adc_value.ADC2_IN5_Welding, avg_v_cal(ADC2_Buffer_Each[0], ADC2_SAMPLE_COUNT)); //unit: 0.01V
  4571. }
  4572. else
  4573. {
  4574. filter_move_avg(&adc_value.ADC2_IN5_Welding, RlyVmax_cal(ADC2_Buffer_Each[0], ADC2_SAMPLE_COUNT)); //unit: 0.01V
  4575. }
  4576. #endif //MODIFY_ADC_WELDING_CALCULATE_METHOD
  4577. //Leak
  4578. filter_move_avg(&adc_value.ADC2_IN6_GF, GFRms_cal(ADC2_Buffer_Each[1], ADC2_SAMPLE_COUNT));
  4579. if ((((adc_value.ADC2_IN6_GF.value)*Charger.coefficient.gain_leak[0])+Charger.coefficient.offset_leak[0]) <=0)
  4580. {
  4581. Charger.Leak_Current = adc_value.ADC2_IN6_GF.value;
  4582. }
  4583. else
  4584. {
  4585. Charger.Leak_Current = (uint16_t) (((adc_value.ADC2_IN6_GF.value)*Charger.coefficient.gain_leak[0])+Charger.coefficient.offset_leak[0]) ;
  4586. }
  4587. if(HAL_ADC_Start_DMA(&hadc2, (uint32_t*)&ADC2_Buffer, ADC2_CHANEL_COUNT*ADC2_SAMPLE_COUNT)!=HAL_OK)Error_Handler();
  4588. }
  4589. // ADC chanel 3
  4590. if(isDMAEnd_ADC3)
  4591. {
  4592. #ifdef FUNC_TASK_MONITOR
  4593. Charger.m_TaskMonitor.m_ADC.m_ADC3_Counter[0]++;
  4594. #endif
  4595. isDMAEnd_ADC3 = OFF;
  4596. for(uint16_t idx=0;idx<ADC3_SAMPLE_COUNT;idx++)
  4597. {
  4598. #ifdef FUNC_REPLACE_ADC_WITH_METER_IC
  4599. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  4600. if (Charger.m_bModelNameAX80_1P)
  4601. {
  4602. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  4603. if (Charger.m_bModelNameAX80_NACS_1P)
  4604. {
  4605. ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AX80_NACS => T1]
  4606. ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4)
  4607. ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5)
  4608. ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6)
  4609. ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AX80_NACS => T4]
  4610. ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC | [AX80_NACS => T5]
  4611. ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8)
  4612. ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AX80_NACS => T2]
  4613. ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AX80_NACS => T3]
  4614. ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC | [AX80_NACS => T6]
  4615. }
  4616. else
  4617. {
  4618. ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AX80 => RELAY1_Temp]
  4619. ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4)
  4620. ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5)
  4621. ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6)
  4622. ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AX80 => Input_N_L2_Temp]
  4623. //ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC
  4624. ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8)
  4625. ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AX80 => RELAY2_Temp]
  4626. ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AX80 => Input_L1_Temp]
  4627. //ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC
  4628. }
  4629. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  4630. ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AX80 => RELAY1_Temp]
  4631. ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4)
  4632. ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5)
  4633. ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6)
  4634. ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AX80 => Input_N_L2_Temp]
  4635. //ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC
  4636. ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8)
  4637. ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AX80 => RELAY2_Temp]
  4638. ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AX80 => Input_L1_Temp]
  4639. //ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC
  4640. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  4641. }
  4642. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  4643. else if (Charger.m_bModelNameAW48_1P)
  4644. {
  4645. ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AW48 => T1]
  4646. ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4)
  4647. ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5)
  4648. ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6)
  4649. ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AW48 => T4]
  4650. ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC | [AW48 => T5]
  4651. ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8)
  4652. ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AW48 => T2]
  4653. ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AW48 => T3]
  4654. ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC | [AW48 => T6]
  4655. }
  4656. #endif //FUNC_AW48_ADD_6_TEMP_SENEOR
  4657. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  4658. else if (Charger.m_bModelNameAX48_NACS_1P)
  4659. {
  4660. ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AX48_NACS => T1]
  4661. ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4)
  4662. ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5)
  4663. ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6)
  4664. ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AX48_NACS => T4]
  4665. ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC | [AX48_NACS => T5]
  4666. ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8)
  4667. ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AX48_NACS => T2]
  4668. ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AX48_NACS => T3]
  4669. ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC | [AX48_NACS => T6]
  4670. }
  4671. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  4672. else //AX48 / AX32
  4673. {
  4674. //ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC
  4675. ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4)
  4676. ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5)
  4677. ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6)
  4678. //ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC
  4679. //ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC
  4680. ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8)
  4681. //ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC
  4682. //ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC
  4683. //ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC
  4684. }
  4685. #else //FUNC_AX80_ADD_4_TEMP_SENEOR
  4686. //ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC
  4687. ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4)
  4688. ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5)
  4689. ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6)
  4690. //ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC
  4691. //ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC
  4692. ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8)
  4693. //ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC
  4694. //ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC
  4695. //ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC
  4696. #endif //FUNC_AX80_ADD_4_TEMP_SENEOR
  4697. #else //FUNC_REPLACE_ADC_WITH_METER_IC
  4698. ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3)
  4699. ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4)
  4700. ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5)
  4701. ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6)
  4702. ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9)
  4703. ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7)
  4704. ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8)
  4705. ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10)
  4706. ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0)
  4707. ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1)
  4708. #endif //FUNC_REPLACE_ADC_WITH_METER_IC
  4709. }
  4710. //VT
  4711. #ifndef FUNC_REPLACE_ADC_WITH_METER_IC
  4712. filter_move_avg(&adc_value.ADC3_IN9_Voltage_L1, vRms_cal2(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT)); //L1
  4713. filter_move_avg(&adc_value.ADC3_IN8_Voltage_L2, vRms_cal2(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT)); //L2
  4714. filter_move_avg(&adc_value.ADC3_IN10_Voltage_L3, vRms_cal2(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT)); //L3
  4715. #endif
  4716. //MCU VDD
  4717. filter_move_avg(&adc_value.ADC3_IN14_UL_1998, avg_cal(ADC3_Buffer_Each[1], ADC3_SAMPLE_COUNT));
  4718. //TEMP
  4719. filter_move_avg(&adc_value.ADC3_IN15_Temp, avg_cal(ADC3_Buffer_Each[2], ADC3_SAMPLE_COUNT));
  4720. #ifdef VO_SIMU_NTC
  4721. if (Charger.m_VOCode.m_EnableSimuNTC)
  4722. {
  4723. Charger.temperature.SystemAmbientTemp = Charger.m_SimuData.m_NtcTemp;
  4724. }
  4725. else
  4726. {
  4727. Charger.temperature.SystemAmbientTemp = getTemperature(adc_value.ADC3_IN15_Temp.value);
  4728. }
  4729. #else
  4730. Charger.temperature.SystemAmbientTemp = getTemperature(adc_value.ADC3_IN15_Temp.value);
  4731. #endif
  4732. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  4733. if (Charger.m_bModelNameAX80_1P)
  4734. {
  4735. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  4736. if (Charger.m_bModelNameAX80_NACS_1P)
  4737. {
  4738. filter_move_avg(&adc_value.ADC3_IN9_AX80_NACS_T1, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT));
  4739. filter_move_avg(&adc_value.ADC3_IN8_AX80_NACS_T2, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT));
  4740. filter_move_avg(&adc_value.ADC3_IN10_AX80_NACS_T3, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT));
  4741. filter_move_avg(&adc_value.ADC3_IN7_AX80_NACS_T4, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT));
  4742. filter_move_avg(&adc_value.ADC3_IN5_AX80_NACS_T5, avg_cal(ADC3_Buffer_Each[5], ADC3_SAMPLE_COUNT));
  4743. filter_move_avg(&adc_value.ADC3_IN11_AX80_NACS_T6, avg_cal(ADC3_Buffer_Each[9], ADC3_SAMPLE_COUNT));
  4744. #ifdef FUNC_AX80_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214
  4745. #ifdef FUNC_AX80_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240903
  4746. #ifdef FUNC_AX80_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240906
  4747. double v = 0;
  4748. double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0);
  4749. double pow80 = 80 * 80;
  4750. Charger.temperature.SystemAmbientTemp += 0;
  4751. v = powCurr * (10.29 / pow80);
  4752. Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value) + HTK_ROUND_U16(v);
  4753. v = powCurr * (11.40 / pow80);
  4754. Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value) + HTK_ROUND_U16(v);
  4755. v = powCurr * (10.12 / pow80);
  4756. Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value) + HTK_ROUND_U16(v);
  4757. v = powCurr * (9.75 / pow80);
  4758. Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value) + HTK_ROUND_U16(v);
  4759. Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value) + 0;
  4760. Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value) + 0;
  4761. #else //FUNC_AX80_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240906
  4762. {
  4763. Charger.temperature.SystemAmbientTemp += 0;
  4764. Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value) + 0;
  4765. Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value) + 0;
  4766. Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value) + 0;
  4767. Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value) + 0;
  4768. Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value) + 0;
  4769. Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value) + 0;
  4770. }
  4771. #endif //FUNC_AX80_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240906
  4772. #else //FUNC_AX80_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240903
  4773. {
  4774. double v = 0;
  4775. v = 2.38333 + (-1.7);
  4776. Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v);
  4777. v = 23.8667 + (-4.73333);
  4778. Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value) + HTK_ROUND_U16(v);
  4779. v = 25.45 + (-5.71667);
  4780. Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value) + HTK_ROUND_U16(v);
  4781. v = 28.2833 + (-3.43333);
  4782. Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value) + HTK_ROUND_U16(v);
  4783. v = 29.5333 + (-3.56667);
  4784. Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value) + HTK_ROUND_U16(v);
  4785. Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value) + 0;
  4786. Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value) + 0;
  4787. }
  4788. #endif //FUNC_AX80_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240903
  4789. #else //FUNC_AX80_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214
  4790. #ifdef FUNC_AX80_NACS_NEW_TEMP_SENSOR_COMPENSATION
  4791. Charger.temperature.SystemAmbientTemp += 3;
  4792. Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value) + 24;
  4793. Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value) + 26;
  4794. Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value) + 29;
  4795. Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value) + 30;
  4796. Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value) + 0;
  4797. Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value) + 0;
  4798. #else
  4799. Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value);
  4800. Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value);
  4801. Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value);
  4802. Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value);
  4803. Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value);
  4804. Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value);
  4805. #endif
  4806. #endif //FUNC_AX80_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214
  4807. {
  4808. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  4809. int16_t v = 0;
  4810. #else
  4811. uint8_t v = 0;
  4812. #endif
  4813. if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp;
  4814. if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp;
  4815. Charger.temperature.Group1_MaxTemp = v;
  4816. }
  4817. {
  4818. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  4819. int16_t v = 0;
  4820. #else
  4821. uint8_t v = 0;
  4822. #endif
  4823. #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  4824. if (Charger.temperature.AX80_NACS_T1_L1_IN > v) v = Charger.temperature.AX80_NACS_T1_L1_IN;
  4825. if (Charger.temperature.AX80_NACS_T2_L2_IN > v) v = Charger.temperature.AX80_NACS_T2_L2_IN;
  4826. Charger.temperature.Group2_MaxTemp = v;
  4827. v = 0;
  4828. if (Charger.temperature.AX80_NACS_T3_L1_OUT > v) v = Charger.temperature.AX80_NACS_T3_L1_OUT;
  4829. if (Charger.temperature.AX80_NACS_T4_L2_OUT > v) v = Charger.temperature.AX80_NACS_T4_L2_OUT;
  4830. Charger.temperature.Group3_MaxTemp = v;
  4831. v = 0;
  4832. if (Charger.temperature.AX80_NACS_T5_L1_GUN > v) v = Charger.temperature.AX80_NACS_T5_L1_GUN;
  4833. if (Charger.temperature.AX80_NACS_T6_L2_GUN > v) v = Charger.temperature.AX80_NACS_T6_L2_GUN;
  4834. Charger.temperature.Group4_MaxTemp = v;
  4835. #else //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  4836. if (Charger.temperature.AX80_NACS_T1_L1_IN > v) v = Charger.temperature.AX80_NACS_T1_L1_IN;
  4837. if (Charger.temperature.AX80_NACS_T2_L2_IN > v) v = Charger.temperature.AX80_NACS_T2_L2_IN;
  4838. if (Charger.temperature.AX80_NACS_T3_L1_OUT > v) v = Charger.temperature.AX80_NACS_T3_L1_OUT;
  4839. if (Charger.temperature.AX80_NACS_T4_L2_OUT > v) v = Charger.temperature.AX80_NACS_T4_L2_OUT;
  4840. if (Charger.temperature.AX80_NACS_T5_L1_GUN > v) v = Charger.temperature.AX80_NACS_T5_L1_GUN;
  4841. if (Charger.temperature.AX80_NACS_T6_L2_GUN > v) v = Charger.temperature.AX80_NACS_T6_L2_GUN;
  4842. Charger.temperature.Group2_MaxTemp = v;
  4843. #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  4844. }
  4845. }
  4846. else
  4847. {
  4848. filter_move_avg(&adc_value.ADC3_IN9_Relay1_Temp, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT));
  4849. filter_move_avg(&adc_value.ADC3_IN8_Relay2_Temp, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT));
  4850. filter_move_avg(&adc_value.ADC3_IN10_Input_L1_Temp, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT));
  4851. filter_move_avg(&adc_value.ADC3_IN7_Input_N_L2_Temp, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT));
  4852. #ifdef FUNC_AX80_NEW_TEMP_SENSOR_COMPENSATION
  4853. Charger.temperature.AX80_Relay1Temp = getTemperature(adc_value.ADC3_IN9_Relay1_Temp.value) + 17; //16.95
  4854. Charger.temperature.AX80_Relay2Temp = getTemperature(adc_value.ADC3_IN8_Relay2_Temp.value) + 18; //17.55
  4855. Charger.temperature.AX80_Input_L1_Temp = getTemperature(adc_value.ADC3_IN10_Input_L1_Temp.value) + 13; //12.575
  4856. Charger.temperature.AX80_Input_N_L2_Temp = getTemperature(adc_value.ADC3_IN7_Input_N_L2_Temp.value) + 18; //17.9
  4857. #else
  4858. Charger.temperature.AX80_Relay1Temp = getTemperature(adc_value.ADC3_IN9_Relay1_Temp.value);
  4859. Charger.temperature.AX80_Relay2Temp = getTemperature(adc_value.ADC3_IN8_Relay2_Temp.value);
  4860. Charger.temperature.AX80_Input_L1_Temp = getTemperature(adc_value.ADC3_IN10_Input_L1_Temp.value);
  4861. Charger.temperature.AX80_Input_N_L2_Temp = getTemperature(adc_value.ADC3_IN7_Input_N_L2_Temp.value);
  4862. #endif
  4863. {
  4864. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  4865. int16_t v = 0;
  4866. #else
  4867. uint8_t v = 0;
  4868. #endif
  4869. if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp;
  4870. if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp;
  4871. Charger.temperature.Group1_MaxTemp = v;
  4872. }
  4873. {
  4874. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  4875. int16_t v = 0;
  4876. #else
  4877. uint8_t v = 0;
  4878. #endif
  4879. if (Charger.temperature.AX80_Relay1Temp > v) v = Charger.temperature.AX80_Relay1Temp;
  4880. if (Charger.temperature.AX80_Relay2Temp > v) v = Charger.temperature.AX80_Relay2Temp;
  4881. if (Charger.temperature.AX80_Input_L1_Temp > v) v = Charger.temperature.AX80_Input_L1_Temp;
  4882. if (Charger.temperature.AX80_Input_N_L2_Temp > v) v = Charger.temperature.AX80_Input_N_L2_Temp;
  4883. Charger.temperature.Group2_MaxTemp = v;
  4884. }
  4885. }
  4886. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  4887. filter_move_avg(&adc_value.ADC3_IN9_Relay1_Temp, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT));
  4888. filter_move_avg(&adc_value.ADC3_IN8_Relay2_Temp, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT));
  4889. filter_move_avg(&adc_value.ADC3_IN10_Input_L1_Temp, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT));
  4890. filter_move_avg(&adc_value.ADC3_IN7_Input_N_L2_Temp, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT));
  4891. #ifdef FUNC_AX80_NEW_TEMP_SENSOR_COMPENSATION
  4892. Charger.temperature.AX80_Relay1Temp = getTemperature(adc_value.ADC3_IN9_Relay1_Temp.value) + 17; //16.95
  4893. Charger.temperature.AX80_Relay2Temp = getTemperature(adc_value.ADC3_IN8_Relay2_Temp.value) + 18; //17.55
  4894. Charger.temperature.AX80_Input_L1_Temp = getTemperature(adc_value.ADC3_IN10_Input_L1_Temp.value) + 13; //12.575
  4895. Charger.temperature.AX80_Input_N_L2_Temp = getTemperature(adc_value.ADC3_IN7_Input_N_L2_Temp.value) + 18; //17.9
  4896. #else
  4897. Charger.temperature.AX80_Relay1Temp = getTemperature(adc_value.ADC3_IN9_Relay1_Temp.value);
  4898. Charger.temperature.AX80_Relay2Temp = getTemperature(adc_value.ADC3_IN8_Relay2_Temp.value);
  4899. Charger.temperature.AX80_Input_L1_Temp = getTemperature(adc_value.ADC3_IN10_Input_L1_Temp.value);
  4900. Charger.temperature.AX80_Input_N_L2_Temp = getTemperature(adc_value.ADC3_IN7_Input_N_L2_Temp.value);
  4901. #endif
  4902. {
  4903. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  4904. int16_t v = 0;
  4905. #else
  4906. uint8_t v = 0;
  4907. #endif
  4908. if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp;
  4909. if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp;
  4910. Charger.temperature.Group1_MaxTemp = v;
  4911. }
  4912. {
  4913. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  4914. int16_t v = 0;
  4915. #else
  4916. uint8_t v = 0;
  4917. #endif
  4918. if (Charger.temperature.AX80_Relay1Temp > v) v = Charger.temperature.AX80_Relay1Temp;
  4919. if (Charger.temperature.AX80_Relay2Temp > v) v = Charger.temperature.AX80_Relay2Temp;
  4920. if (Charger.temperature.AX80_Input_L1_Temp > v) v = Charger.temperature.AX80_Input_L1_Temp;
  4921. if (Charger.temperature.AX80_Input_N_L2_Temp > v) v = Charger.temperature.AX80_Input_N_L2_Temp;
  4922. Charger.temperature.Group2_MaxTemp = v;
  4923. }
  4924. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  4925. }
  4926. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  4927. else if (Charger.m_bModelNameAW48_1P)
  4928. {
  4929. filter_move_avg(&adc_value.ADC3_IN9_AW48_T1, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT));
  4930. filter_move_avg(&adc_value.ADC3_IN8_AW48_T2, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT));
  4931. filter_move_avg(&adc_value.ADC3_IN10_AW48_T3, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT));
  4932. filter_move_avg(&adc_value.ADC3_IN7_AW48_T4, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT));
  4933. filter_move_avg(&adc_value.ADC3_IN5_AW48_T5, avg_cal(ADC3_Buffer_Each[5], ADC3_SAMPLE_COUNT));
  4934. filter_move_avg(&adc_value.ADC3_IN11_AW48_T6, avg_cal(ADC3_Buffer_Each[9], ADC3_SAMPLE_COUNT));
  4935. #ifdef FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20231214
  4936. #ifdef FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20240508
  4937. #ifdef FUNC_AW48_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521
  4938. #ifdef FUNC_AW48_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522
  4939. {
  4940. // Charger.temperature.SystemAmbientTemp += 0;
  4941. // Charger.temperature.AW48_T1_L1_IN = getTemperature_NACS(adc_value.ADC3_IN9_AW48_T1.value) + 6;
  4942. // Charger.temperature.AW48_T2_L2_IN = getTemperature_NACS(adc_value.ADC3_IN8_AW48_T2.value) + 6;
  4943. // Charger.temperature.AW48_T3_L1_OUT = getTemperature_NACS(adc_value.ADC3_IN10_AW48_T3.value) + 7;
  4944. // Charger.temperature.AW48_T4_L2_OUT = getTemperature_NACS(adc_value.ADC3_IN7_AW48_T4.value) + 7;
  4945. // Charger.temperature.AW48_T5_L1_GUN = getTemperature_NACS(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  4946. // Charger.temperature.AW48_T6_L2_GUN = getTemperature_NACS(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  4947. //
  4948. #ifdef FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523
  4949. //#ifdef TEST_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523_REMOVE_COMPENSATION
  4950. // Charger.temperature.SystemAmbientTemp += 0;
  4951. // Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + 0;
  4952. // Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + 0;
  4953. // Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + 0;
  4954. // Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + 0;
  4955. // Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  4956. // Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  4957. //#else //TEST_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523_REMOVE_COMPENSATION
  4958. #ifdef FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240729
  4959. #ifdef FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20241007
  4960. double v = 0;
  4961. double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0);
  4962. double pow48 = 48 * 48;
  4963. Charger.temperature.SystemAmbientTemp += 0;
  4964. v = powCurr * (17.28 / pow48);
  4965. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v);
  4966. v = powCurr * (18.34 / pow48);
  4967. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v);
  4968. v = powCurr * (20.64 / pow48);
  4969. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v);
  4970. v = powCurr * (22.00 / pow48);
  4971. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v);
  4972. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  4973. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  4974. #else //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20241007
  4975. double v = 0;
  4976. double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0);
  4977. double pow48 = 48 * 48;
  4978. Charger.temperature.SystemAmbientTemp += 0;
  4979. v = powCurr * (20.53 / pow48);
  4980. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v);
  4981. v = powCurr * (22.03 / pow48);
  4982. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v);
  4983. v = powCurr * (24.39 / pow48);
  4984. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v);
  4985. v = powCurr * (23.39 / pow48);
  4986. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v);
  4987. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  4988. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  4989. #endif //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20241007
  4990. #else //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240729
  4991. double v = 0;
  4992. double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0);
  4993. double pow48 = 48 * 48;
  4994. Charger.temperature.SystemAmbientTemp += 0;
  4995. v = powCurr * (11.97 / pow48);
  4996. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v);
  4997. v = powCurr * (14.98 / pow48);
  4998. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v);
  4999. v = powCurr * (28.55 / pow48);
  5000. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v);
  5001. v = powCurr * (26.91 / pow48);
  5002. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v);
  5003. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  5004. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  5005. #endif //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240729
  5006. //#endif //TEST_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523_REMOVE_COMPENSATION
  5007. #else //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523
  5008. Charger.temperature.SystemAmbientTemp += 0;
  5009. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + 6;
  5010. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + 6;
  5011. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + 7;
  5012. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + 7;
  5013. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  5014. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  5015. #endif //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523
  5016. }
  5017. #else //FUNC_AW48_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522
  5018. {
  5019. double v = 0;
  5020. Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v);
  5021. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v);
  5022. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v);
  5023. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v);
  5024. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v);
  5025. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  5026. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  5027. }
  5028. #endif //FUNC_AW48_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522
  5029. #else //FUNC_AW48_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521
  5030. {
  5031. double v = 0;
  5032. v = 2.38333 + (-1.7);
  5033. Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v);
  5034. v = 23.8667 + (-4.73333) + (-6.25);
  5035. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v);
  5036. v = 25.45 + (-5.71667) + (-6.5);
  5037. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v);
  5038. v = 28.2833 + (-3.43333);
  5039. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v);
  5040. v = 29.5333 + (-3.56667);
  5041. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v);
  5042. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  5043. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  5044. }
  5045. #endif //FUNC_AW48_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521
  5046. #else //FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20240508
  5047. {
  5048. double v = 0;
  5049. v = 2.38333 + (-1.7);
  5050. Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v);
  5051. v = 23.8667 + (-4.73333);
  5052. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v);
  5053. v = 25.45 + (-5.71667);
  5054. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v);
  5055. v = 28.2833 + (-3.43333);
  5056. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v);
  5057. v = 29.5333 + (-3.56667);
  5058. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v);
  5059. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  5060. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  5061. }
  5062. #endif //FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20240508
  5063. #else //FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20231214
  5064. #ifdef FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION
  5065. Charger.temperature.SystemAmbientTemp += 3;
  5066. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + 24;
  5067. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + 26;
  5068. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + 29;
  5069. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + 30;
  5070. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0;
  5071. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0;
  5072. #else
  5073. Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value);
  5074. Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value);
  5075. Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value);
  5076. Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value);
  5077. Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value);
  5078. Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value);
  5079. #endif
  5080. #endif //FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20231214
  5081. {
  5082. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  5083. int16_t v = 0;
  5084. #else
  5085. uint8_t v = 0;
  5086. #endif
  5087. if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp;
  5088. if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp;
  5089. Charger.temperature.Group1_MaxTemp = v;
  5090. }
  5091. {
  5092. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  5093. int16_t v = 0;
  5094. #else
  5095. uint8_t v = 0;
  5096. #endif
  5097. #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  5098. #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  5099. if (Charger.temperature.AW48_T1_L1_IN > v) v = Charger.temperature.AW48_T1_L1_IN;
  5100. if (Charger.temperature.AW48_T2_L2_IN > v) v = Charger.temperature.AW48_T2_L2_IN;
  5101. Charger.temperature.Group2_MaxTemp = v;
  5102. v = 0;
  5103. if (Charger.temperature.AW48_T3_L1_OUT > v) v = Charger.temperature.AW48_T3_L1_OUT;
  5104. if (Charger.temperature.AW48_T4_L2_OUT > v) v = Charger.temperature.AW48_T4_L2_OUT;
  5105. Charger.temperature.Group3_MaxTemp = v;
  5106. v = 0;
  5107. if (Charger.temperature.AW48_T5_L1_GUN > v) v = Charger.temperature.AW48_T5_L1_GUN;
  5108. if (Charger.temperature.AW48_T6_L2_GUN > v) v = Charger.temperature.AW48_T6_L2_GUN;
  5109. Charger.temperature.Group4_MaxTemp = v;
  5110. #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  5111. if (Charger.temperature.AW48_T1_L1_IN > v) v = Charger.temperature.AW48_T1_L1_IN;
  5112. if (Charger.temperature.AW48_T2_L2_IN > v) v = Charger.temperature.AW48_T2_L2_IN;
  5113. if (Charger.temperature.AW48_T5_L1_GUN > v) v = Charger.temperature.AW48_T5_L1_GUN;
  5114. if (Charger.temperature.AW48_T6_L2_GUN > v) v = Charger.temperature.AW48_T6_L2_GUN;
  5115. Charger.temperature.Group2_MaxTemp = v;
  5116. v = 0;
  5117. if (Charger.temperature.AW48_T3_L1_OUT > v) v = Charger.temperature.AW48_T3_L1_OUT;
  5118. if (Charger.temperature.AW48_T4_L2_OUT > v) v = Charger.temperature.AW48_T4_L2_OUT;
  5119. Charger.temperature.Group3_MaxTemp = v;
  5120. #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  5121. #else //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  5122. if (Charger.temperature.AW48_T1_L1_IN > v) v = Charger.temperature.AW48_T1_L1_IN;
  5123. if (Charger.temperature.AW48_T2_L2_IN > v) v = Charger.temperature.AW48_T2_L2_IN;
  5124. if (Charger.temperature.AW48_T3_L1_OUT > v) v = Charger.temperature.AW48_T3_L1_OUT;
  5125. if (Charger.temperature.AW48_T4_L2_OUT > v) v = Charger.temperature.AW48_T4_L2_OUT;
  5126. if (Charger.temperature.AW48_T5_L1_GUN > v) v = Charger.temperature.AW48_T5_L1_GUN;
  5127. if (Charger.temperature.AW48_T6_L2_GUN > v) v = Charger.temperature.AW48_T6_L2_GUN;
  5128. Charger.temperature.Group2_MaxTemp = v;
  5129. #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  5130. }
  5131. }
  5132. #endif //FUNC_AW48_ADD_6_TEMP_SENEOR
  5133. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  5134. else if (Charger.m_bModelNameAX48_NACS_1P)
  5135. {
  5136. filter_move_avg(&adc_value.ADC3_IN9_AX48_NACS_T1, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT));
  5137. filter_move_avg(&adc_value.ADC3_IN8_AX48_NACS_T2, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT));
  5138. filter_move_avg(&adc_value.ADC3_IN10_AX48_NACS_T3, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT));
  5139. filter_move_avg(&adc_value.ADC3_IN7_AX48_NACS_T4, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT));
  5140. filter_move_avg(&adc_value.ADC3_IN5_AX48_NACS_T5, avg_cal(ADC3_Buffer_Each[5], ADC3_SAMPLE_COUNT));
  5141. filter_move_avg(&adc_value.ADC3_IN11_AX48_NACS_T6, avg_cal(ADC3_Buffer_Each[9], ADC3_SAMPLE_COUNT));
  5142. #ifdef FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214
  5143. #ifdef FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20240415
  5144. #ifdef FUNC_AX48_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521
  5145. #ifdef FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522
  5146. {
  5147. // Charger.temperature.SystemAmbientTemp += 0;
  5148. // Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature_NACS(adc_value.ADC3_IN9_AX48_NACS_T1.value) + 6;
  5149. // Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature_NACS(adc_value.ADC3_IN8_AX48_NACS_T2.value) + 6;
  5150. // Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature_NACS(adc_value.ADC3_IN10_AX48_NACS_T3.value) + 7;
  5151. // Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature_NACS(adc_value.ADC3_IN7_AX48_NACS_T4.value) + 7;
  5152. // Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature_NACS(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0;
  5153. // Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature_NACS(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0;
  5154. //
  5155. #ifdef FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523
  5156. double v = 0;
  5157. double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0);
  5158. double pow48 = 48 * 48;
  5159. Charger.temperature.SystemAmbientTemp += 0;
  5160. v = powCurr * (6 / pow48);
  5161. Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + HTK_ROUND_U16(v);
  5162. v = powCurr * (6 / pow48);
  5163. Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + HTK_ROUND_U16(v);
  5164. v = powCurr * (7 / pow48);
  5165. Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + HTK_ROUND_U16(v);
  5166. v = powCurr * (12 / pow48);
  5167. Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + HTK_ROUND_U16(v);
  5168. Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0;
  5169. Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0;
  5170. #else //FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523
  5171. Charger.temperature.SystemAmbientTemp += 0;
  5172. Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + 6;
  5173. Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + 6;
  5174. Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + 7;
  5175. Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + 7;
  5176. Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0;
  5177. Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0;
  5178. #endif //FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523
  5179. }
  5180. #else //FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522
  5181. {
  5182. Charger.temperature.SystemAmbientTemp += 0;
  5183. Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + 0;
  5184. Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + 0;
  5185. Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + 0;
  5186. Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + 0;
  5187. Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0;
  5188. Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0;
  5189. }
  5190. #endif //FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522
  5191. #else //FUNC_AX48_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521
  5192. {
  5193. double v = 0;
  5194. v = 2.38333 + (-1.7);
  5195. Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v);
  5196. v = 23.8667 + (-4.73333) + (-3.7667) + (3);
  5197. Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + HTK_ROUND_U16(v);
  5198. v = 25.45 + (-5.71667) + (-4.6833) + (3);
  5199. Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + HTK_ROUND_U16(v);
  5200. v = 28.2833 + (-3.43333) + (-7.0333) + (7);
  5201. Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + HTK_ROUND_U16(v);
  5202. v = 29.5333 + (-3.56667) + (-4.3333) + (4);
  5203. Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + HTK_ROUND_U16(v);
  5204. Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0;
  5205. Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0;
  5206. }
  5207. #endif //FUNC_AX48_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521
  5208. #else //FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20240415
  5209. {
  5210. double v = 0;
  5211. v = 2.38333 + (-1.7);
  5212. Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v);
  5213. v = 23.8667 + (-4.73333);
  5214. Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + HTK_ROUND_U16(v);
  5215. v = 25.45 + (-5.71667);
  5216. Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + HTK_ROUND_U16(v);
  5217. v = 28.2833 + (-3.43333);
  5218. Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + HTK_ROUND_U16(v);
  5219. v = 29.5333 + (-3.56667);
  5220. Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + HTK_ROUND_U16(v);
  5221. Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0;
  5222. Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0;
  5223. }
  5224. #endif //FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20240415
  5225. #else //FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214
  5226. #ifdef FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION
  5227. Charger.temperature.SystemAmbientTemp += 3;
  5228. Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + 24;
  5229. Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + 26;
  5230. Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + 29;
  5231. Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + 30;
  5232. Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0;
  5233. Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0;
  5234. #else
  5235. Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value);
  5236. Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value);
  5237. Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value);
  5238. Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value);
  5239. Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value);
  5240. Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value);
  5241. #endif
  5242. #endif //FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214
  5243. {
  5244. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  5245. int16_t v = 0;
  5246. #else
  5247. uint8_t v = 0;
  5248. #endif
  5249. if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp;
  5250. if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp;
  5251. Charger.temperature.Group1_MaxTemp = v;
  5252. }
  5253. {
  5254. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  5255. int16_t v = 0;
  5256. #else
  5257. uint8_t v = 0;
  5258. #endif
  5259. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  5260. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  5261. if (Charger.temperature.AX48_NACS_T1_L1_IN > v) v = Charger.temperature.AX48_NACS_T1_L1_IN;
  5262. if (Charger.temperature.AX48_NACS_T2_L2_IN > v) v = Charger.temperature.AX48_NACS_T2_L2_IN;
  5263. Charger.temperature.Group2_MaxTemp = v;
  5264. v = 0;
  5265. if (Charger.temperature.AX48_NACS_T3_L1_OUT > v) v = Charger.temperature.AX48_NACS_T3_L1_OUT;
  5266. if (Charger.temperature.AX48_NACS_T4_L2_OUT > v) v = Charger.temperature.AX48_NACS_T4_L2_OUT;
  5267. Charger.temperature.Group3_MaxTemp = v;
  5268. v = 0;
  5269. if (Charger.temperature.AX48_NACS_T5_L1_GUN > v) v = Charger.temperature.AX48_NACS_T5_L1_GUN;
  5270. if (Charger.temperature.AX48_NACS_T6_L2_GUN > v) v = Charger.temperature.AX48_NACS_T6_L2_GUN;
  5271. Charger.temperature.Group4_MaxTemp = v;
  5272. #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  5273. if (Charger.temperature.AX48_NACS_T1_L1_IN > v) v = Charger.temperature.AX48_NACS_T1_L1_IN;
  5274. if (Charger.temperature.AX48_NACS_T2_L2_IN > v) v = Charger.temperature.AX48_NACS_T2_L2_IN;
  5275. if (Charger.temperature.AX48_NACS_T5_L1_GUN > v) v = Charger.temperature.AX48_NACS_T5_L1_GUN;
  5276. if (Charger.temperature.AX48_NACS_T6_L2_GUN > v) v = Charger.temperature.AX48_NACS_T6_L2_GUN;
  5277. Charger.temperature.Group2_MaxTemp = v;
  5278. v = 0;
  5279. if (Charger.temperature.AX48_NACS_T3_L1_OUT > v) v = Charger.temperature.AX48_NACS_T3_L1_OUT;
  5280. if (Charger.temperature.AX48_NACS_T4_L2_OUT > v) v = Charger.temperature.AX48_NACS_T4_L2_OUT;
  5281. Charger.temperature.Group3_MaxTemp = v;
  5282. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  5283. #else //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  5284. if (Charger.temperature.AX48_NACS_T1_L1_IN > v) v = Charger.temperature.AX48_NACS_T1_L1_IN;
  5285. if (Charger.temperature.AX48_NACS_T2_L2_IN > v) v = Charger.temperature.AX48_NACS_T2_L2_IN;
  5286. if (Charger.temperature.AX48_NACS_T3_L1_OUT > v) v = Charger.temperature.AX48_NACS_T3_L1_OUT;
  5287. if (Charger.temperature.AX48_NACS_T4_L2_OUT > v) v = Charger.temperature.AX48_NACS_T4_L2_OUT;
  5288. if (Charger.temperature.AX48_NACS_T5_L1_GUN > v) v = Charger.temperature.AX48_NACS_T5_L1_GUN;
  5289. if (Charger.temperature.AX48_NACS_T6_L2_GUN > v) v = Charger.temperature.AX48_NACS_T6_L2_GUN;
  5290. Charger.temperature.Group2_MaxTemp = v;
  5291. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  5292. }
  5293. }
  5294. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  5295. else
  5296. {
  5297. #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE
  5298. int16_t v = 0;
  5299. #else
  5300. uint8_t v = 0;
  5301. #endif
  5302. if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp;
  5303. if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp;
  5304. Charger.temperature.Group1_MaxTemp = v;
  5305. }
  5306. #endif
  5307. //PE
  5308. filter_move_avg(&adc_value.ADC3_IN4_GMI_VL1, avg_cal(ADC3_Buffer_Each[3], ADC3_SAMPLE_COUNT));
  5309. #ifdef FUNC_AW48_KENNY_TEST_DOUBLE_GF_ADC_VAL
  5310. if (Charger.m_bModelNameAW48_1P)
  5311. {
  5312. adc_value.ADC3_IN4_GMI_VL1.value *= 2;
  5313. }
  5314. #endif
  5315. //CT
  5316. #ifndef FUNC_REPLACE_ADC_WITH_METER_IC
  5317. Current_filter_move_avg(&adc_value.ADC3_IN7_Current_L1, cRms_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT));
  5318. Current_filter_move_avg(&adc_value.ADC3_IN5_Current_L2, cRms_cal(ADC3_Buffer_Each[5], ADC3_SAMPLE_COUNT));
  5319. Current_filter_move_avg(&adc_value.ADC3_IN11_Current_L3, cRms_cal(ADC3_Buffer_Each[9], ADC3_SAMPLE_COUNT));
  5320. #endif
  5321. #ifdef FUNC_DETECT_PP
  5322. if (Charger.m_bDetectPP)
  5323. {
  5324. filter_move_avg(&adc_value.ADC3_IN6_Gun_Detec, avg_cal(ADC3_Buffer_Each[6], ADC3_SAMPLE_COUNT));
  5325. {
  5326. #ifdef VO_SIMU_PP
  5327. if (Charger.m_VOCode.m_EnableSimuPP)
  5328. {
  5329. UpdatePPInfo_CurrVal(&Charger.m_PPInfo, Charger.m_SimuData.m_PPCurr);
  5330. }
  5331. else
  5332. {
  5333. UpdatePPInfo_AdcVal(&Charger.m_PPInfo, adc_value.ADC3_IN6_Gun_Detec.value);
  5334. }
  5335. #else //VO_SIMU_PP
  5336. UpdatePPInfo_AdcVal(&Charger.m_PPInfo, adc_value.ADC3_IN6_Gun_Detec.value);
  5337. #endif //VO_SIMU_PP
  5338. }
  5339. }
  5340. #endif //FUNC_DETECT_PP
  5341. #ifdef FUNC_DETECT_PP_NACS
  5342. if (Charger.m_bDetectPP_NACS)
  5343. {
  5344. filter_move_avg(&adc_value.ADC3_IN6_Gun_Detec, avg_cal(ADC3_Buffer_Each[6], ADC3_SAMPLE_COUNT));
  5345. {
  5346. //#ifdef VO_SIMU_PP
  5347. // if (Charger.m_VOCode.m_EnableSimuPP)
  5348. // {
  5349. // UpdatePPInfo_CurrVal(&Charger.m_PPInfo, Charger.m_SimuData.m_PPCurr);
  5350. // }
  5351. // else
  5352. // {
  5353. // UpdatePPInfo_AdcVal(&Charger.m_PPInfo, adc_value.ADC3_IN6_Gun_Detec.value);
  5354. // }
  5355. //#else //VO_SIMU_PP
  5356. // UpdatePPInfo_AdcVal(&Charger.m_PPInfo, adc_value.ADC3_IN6_Gun_Detec.value);
  5357. //#endif //VO_SIMU_PP
  5358. }
  5359. }
  5360. #endif //FUNC_DETECT_PP_NACS
  5361. //Correction
  5362. //VT
  5363. #ifdef TEST_ACXXX_FAKEDATA
  5364. #ifdef TEST_AC110_FAKEDATA
  5365. Charger.Voltage[0] = rand() % 50 + 11000;
  5366. Charger.Voltage[1] = rand() % 50 + 11000;
  5367. Charger.Voltage[2] = rand() % 50 + 11000;
  5368. #endif
  5369. #ifdef TEST_AC220_FAKEDATA
  5370. Charger.Voltage[0] = rand() % 50 + 22000;
  5371. Charger.Voltage[1] = rand() % 50 + 22000;
  5372. Charger.Voltage[2] = rand() % 50 + 22000;
  5373. #endif
  5374. #else //TEST_ACXXX_FAKEDATA
  5375. #ifndef FUNC_REPLACE_ADC_WITH_METER_IC
  5376. Charger.Voltage[0] = (uint16_t) (((adc_value.ADC3_IN9_Voltage_L1.value)*Charger.coefficient.gain_v[0])+Charger.coefficient.offset_v[0]) ;
  5377. Charger.Voltage[1] = (uint16_t) (((adc_value.ADC3_IN8_Voltage_L2.value)*Charger.coefficient.gain_v[1])+Charger.coefficient.offset_v[1]) ;
  5378. Charger.Voltage[2] = (uint16_t) (((adc_value.ADC3_IN10_Voltage_L3.value)*Charger.coefficient.gain_v[2])+Charger.coefficient.offset_v[2]) ;
  5379. #endif
  5380. #endif //TEST_ACXXX_FAKEDATA
  5381. #ifndef FUNC_REPLACE_ADC_WITH_METER_IC
  5382. //CT
  5383. Charger.Current[0] = (uint16_t)((adc_value.ADC3_IN7_Current_L1.value*Charger.coefficient.gain_c[0])+Charger.coefficient.offset_c[0]);
  5384. Charger.Current[1] = (uint16_t)((adc_value.ADC3_IN5_Current_L2.value*Charger.coefficient.gain_c[1])+Charger.coefficient.offset_c[1]);
  5385. Charger.Current[2] = (uint16_t)((adc_value.ADC3_IN11_Current_L3.value*Charger.coefficient.gain_c[2])+Charger.coefficient.offset_c[2]);
  5386. #endif
  5387. //GMI
  5388. Charger.Gmi_Voltage = (uint16_t) (((adc_value.ADC3_IN4_GMI_VL1.value)*Charger.coefficient.gain_gmi[0])+Charger.coefficient.offset_gmi[0]) ;
  5389. #ifdef COLD_LOAD_PICKUP
  5390. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  5391. // check Power drop is not alarm
  5392. // Power drop detection
  5393. #ifdef FUNC_REPLACE_ADC_WITH_METER_IC
  5394. if((Charger.Voltage[0] <= ALARM_SPEC_POWER_DROP) && (!Charger.AC_DripisTure) && (Charger.Mode != MODE_INITIAL))
  5395. #else
  5396. if((vRms_cal2(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT) <= ALARM_SPEC_POWER_DROP) && (!Charger.AC_DripisTure) && (Charger.Mode != MODE_INITIAL))
  5397. #endif
  5398. {
  5399. if(Charger.counter.AC_Drip.fail > 1000)
  5400. {
  5401. //Charger.memory.EVSE_Config.data.item.isDispDebug = OFF;
  5402. if((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))
  5403. {
  5404. Charger.memory.coldLoadPickUp.data.item.isEnable = ON;
  5405. Charger.memory.coldLoadPickUp.data.item.DateTime.year = Charger.cycle_info.startDateTime.year;
  5406. Charger.memory.coldLoadPickUp.data.item.DateTime.month = Charger.cycle_info.startDateTime.month;
  5407. Charger.memory.coldLoadPickUp.data.item.DateTime.day = Charger.cycle_info.startDateTime.day;
  5408. Charger.memory.coldLoadPickUp.data.item.DateTime.hour = Charger.cycle_info.startDateTime.hour;
  5409. Charger.memory.coldLoadPickUp.data.item.DateTime.min = Charger.cycle_info.startDateTime.min;
  5410. Charger.memory.coldLoadPickUp.data.item.DateTime.sec = Charger.cycle_info.startDateTime.sec;
  5411. Charger.memory.coldLoadPickUp.data.item.Duration = Charger.cycle_info.Duration;
  5412. sprintf(Charger.memory.coldLoadPickUp.data.item.PlugType, EVSE_CONNECTOR_TYPE);
  5413. Charger.memory.coldLoadPickUp.data.item.powerSum = Charger.cycle_info.Power_Consumption;
  5414. Charger.memory.coldLoadPickUp.data.item.startType = Charger.cycle_info.StartType;
  5415. //memcpy(Charger.memory.coldLoadPickUp.data.item.user, Charger.rfid.currentCard, 16);
  5416. Charger.memory.coldLoadPickUp.op_bits.update = ON;
  5417. }
  5418. Charger.AC_DripisTure = ON ;
  5419. }
  5420. else
  5421. Charger.counter.AC_Drip.fail ++ ;
  5422. }
  5423. #ifdef FUNC_REPLACE_ADC_WITH_METER_IC
  5424. else if((Charger.Voltage[0] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS)))
  5425. #else
  5426. else if((vRms_cal2(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT) > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS)))
  5427. #endif
  5428. {
  5429. Charger.counter.AC_Drip.fail = 0 ;
  5430. if(Charger.AC_DripisTure)
  5431. {
  5432. Charger.AC_DripisTure = OFF ;
  5433. DEBUG_INFO("Alarm AC Drip recover.\r\n");
  5434. }
  5435. }
  5436. }
  5437. #endif //COLD_LOAD_PICKUP
  5438. #ifndef FUNC_POWER_CONSUMPTION_BY_METER_IC
  5439. // Power accumulate calculation
  5440. if(timer[TIMER_IDX_POWER].isAlarm)
  5441. {
  5442. timeTick.timeTick_End = HAL_GetTick();
  5443. timeTick.timeTick_Delta = timeTick.timeTick_End - timeTick.timeTick_Start;
  5444. timeTick.timeTick_Start = timeTick.timeTick_End;
  5445. //L1 Power Consumption
  5446. if(Charger.memory.EVSE_Config.data.item.Power_Consumption_L1_Cumulative >= 0xFFFFFFFF)
  5447. {
  5448. Charger.memory.EVSE_Config.data.item.Power_Consumption_L1_Cumulative = 0;
  5449. }
  5450. else
  5451. { //unit : 0.0001kW , 0.1W *10 = W
  5452. Charger.memory.EVSE_Config.data.item.Power_Consumption_L1_Cumulative += (uint32_t)((Charger.Voltage[0]/100.0)*(Charger.Current[0]/100.0)*(timeTick.timeTick_Delta/3600000.0)*10.0);
  5453. }
  5454. //L2 Power Consumption
  5455. if(Charger.memory.EVSE_Config.data.item.Power_Consumption_L2_Cumulative >= 0xFFFFFFFF)
  5456. {
  5457. Charger.memory.EVSE_Config.data.item.Power_Consumption_L2_Cumulative = 0;
  5458. }
  5459. else
  5460. { //unit : 0.0001kW , 0.1W *10 = W
  5461. Charger.memory.EVSE_Config.data.item.Power_Consumption_L2_Cumulative += (uint32_t)((Charger.Voltage[1]/100.0)*(Charger.Current[1]/100.0)*(timeTick.timeTick_Delta/3600000.0)*10.0);
  5462. }
  5463. //L3 Power Consumption
  5464. if(Charger.memory.EVSE_Config.data.item.Power_Consumption_L3_Cumulative >= 0xFFFFFFFF)
  5465. {
  5466. Charger.memory.EVSE_Config.data.item.Power_Consumption_L3_Cumulative = 0;
  5467. }
  5468. else
  5469. { //unit : 0.0001kW , 0.1W *10 = W
  5470. Charger.memory.EVSE_Config.data.item.Power_Consumption_L3_Cumulative += (uint32_t)((Charger.Voltage[2]/100.0)*(Charger.Current[2]/100.0)*(timeTick.timeTick_Delta/3600000.0)*10.0);
  5471. }
  5472. //totle Power Consumption
  5473. if(Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative >= 0xFFFFFFFF)
  5474. {
  5475. Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative = 0;
  5476. }
  5477. else
  5478. { //unit : 0.0001kW , 0.1W *10 = W
  5479. Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative = (Charger.memory.EVSE_Config.data.item.Power_Consumption_L1_Cumulative +
  5480. Charger.memory.EVSE_Config.data.item.Power_Consumption_L2_Cumulative +
  5481. Charger.memory.EVSE_Config.data.item.Power_Consumption_L3_Cumulative) ;
  5482. }
  5483. if(++updateMemReq>180)
  5484. {
  5485. Charger.memory.EVSE_Config.op_bits.update = ON;
  5486. updateMemReq = 0;
  5487. }
  5488. timerRefresh(TIMER_IDX_POWER);
  5489. }
  5490. #endif //FUNC_POWER_CONSUMPTION_BY_METER_IC
  5491. if(HAL_ADC_Start_DMA(&hadc3, (uint32_t*)&ADC3_Buffer, ADC3_CHANEL_COUNT*ADC3_SAMPLE_COUNT)!=HAL_OK)Error_Handler();
  5492. }
  5493. osDelay(1);
  5494. }
  5495. /* USER CODE END StartAdcTask */
  5496. }
  5497. /* USER CODE BEGIN Header_StartTimeoutTask */
  5498. /**
  5499. * @brief Function implementing the timeoutTask thread.
  5500. * @param argument: Not used
  5501. * @retval None
  5502. */
  5503. /* USER CODE END Header_StartTimeoutTask */
  5504. void StartTimeoutTask(void const * argument)
  5505. {
  5506. /* USER CODE BEGIN StartTimeoutTask */
  5507. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  5508. IdleUntilReadAllMemory();
  5509. #endif
  5510. breathe.isUp = ON;
  5511. for(int idx=0;idx<BLINKER_COUNT;idx++)
  5512. blinker[idx].blinkCount = 0;
  5513. flickerTimeSet(FLICKER_IDX_BREATHE, 500, 500);
  5514. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  5515. #ifdef MODIFY_BREATHE_LED
  5516. //breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, 500, 500, 500, 0 );
  5517. breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, 1000, 1000, 1000, 0 );
  5518. #else
  5519. breatheTimeSet(1000, 1000, 1000, 1000, 1000, 0 );
  5520. #endif
  5521. Charger.am3352.BreatheLedChargeFadeIn = 2500;
  5522. Charger.am3352.BreatheLedChargeFadeOut = 2500;
  5523. Charger.am3352.BreatheLedConnectFadeIn = 1000;
  5524. Charger.am3352.BreatheLedConnectFadeOut = 1000;
  5525. Charger.am3352.BreatheLedAuthdFadeIn = 1000;
  5526. Charger.am3352.BreatheLedAuthdFadeOut = 1000;
  5527. /* Infinite loop */
  5528. for(;;)
  5529. {
  5530. if(Charger.Mode != MODE_INITIAL)
  5531. {
  5532. HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BIN);
  5533. HAL_RTC_GetDate(&hrtc, &currentDate, RTC_FORMAT_BIN);
  5534. Charger.memory.EVSE_Config.data.item.SystemDateTime.year = currentDate.Year + 2000;
  5535. Charger.memory.EVSE_Config.data.item.SystemDateTime.month = currentDate.Month;
  5536. Charger.memory.EVSE_Config.data.item.SystemDateTime.day = currentDate.Date;
  5537. Charger.memory.EVSE_Config.data.item.SystemDateTime.hour = currentTime.Hours;
  5538. Charger.memory.EVSE_Config.data.item.SystemDateTime.min = currentTime.Minutes;
  5539. Charger.memory.EVSE_Config.data.item.SystemDateTime.sec = currentTime.Seconds;
  5540. }
  5541. /*
  5542. Timer check process
  5543. */
  5544. for(int idx=0;idx<TIMER_COUNT;idx++)
  5545. {
  5546. if(timer[idx].isEnable)
  5547. {
  5548. if((HAL_GetTick() - timer[idx].startTime) > timer[idx].timeoutSpec)
  5549. {
  5550. timer[idx].isAlarm = ON;
  5551. }
  5552. else
  5553. {
  5554. timer[idx].isAlarm = OFF;
  5555. }
  5556. }
  5557. else
  5558. {
  5559. timer[idx].startTime = HAL_GetTick();
  5560. timer[idx].isAlarm = OFF;
  5561. }
  5562. }
  5563. #ifdef FUNC_GUN_LOCK
  5564. if (Charger.m_bUseGunLock)
  5565. {
  5566. GL_Proc();
  5567. }
  5568. #endif //FUNC_GUN_LOCK
  5569. /*
  5570. Blink timer process
  5571. */
  5572. for(int idx=0;idx<BLINKER_COUNT;idx++)
  5573. {
  5574. if((HAL_GetTick() - blinker[idx].blinkStartTime) > (blinker[idx].isOn ? blinker[idx].blinkOnSpec : blinker[idx].blinkOffSpec))
  5575. {
  5576. if(blinker[idx].blinkCount >= blinker[idx].blinkCountSpec)
  5577. {
  5578. if((HAL_GetTick() - blinker[idx].resetStartTime) > blinker[idx].blinkRestSpec)
  5579. {
  5580. if(!blinker[idx].blinkRestSpec) //no rest case
  5581. blinker[idx].blinkisFinish = ON ;
  5582. blinker[idx].blinkCount = 0;
  5583. #ifdef FUNC_AW48_NET_LED
  5584. if (Charger.m_bModelNameAW48_1P)
  5585. {
  5586. if (idx == BLINKER_IDX_LED_NET)
  5587. {
  5588. Proc_NetLedActionSubState();
  5589. }
  5590. }
  5591. #endif
  5592. }
  5593. else
  5594. {
  5595. blinker[idx].isOn= OFF;
  5596. blinker[idx].blinkisFinish = ON ;
  5597. }
  5598. }
  5599. else
  5600. {
  5601. if(blinker[idx].isOn)
  5602. blinker[idx].blinkCount++;
  5603. blinker[idx].blinkStartTime = HAL_GetTick();
  5604. blinker[idx].resetStartTime = HAL_GetTick();
  5605. blinker[idx].isOn ^= ON;
  5606. if(blinker[idx].blinkRestSpec > 0) //had rest case
  5607. blinker[idx].blinkisFinish = OFF ;
  5608. }
  5609. }
  5610. }
  5611. /*
  5612. Flick timer process
  5613. */
  5614. for(int idx=0;idx<FLICKER_COUNT;idx++)
  5615. {
  5616. if((HAL_GetTick() - flicker[idx].StartTime) > (flicker[idx].isOn ? flicker[idx].OnSpec : flicker[idx].OffSpec))
  5617. {
  5618. flicker[idx].StartTime = HAL_GetTick();
  5619. flicker[idx].isOn ^= ON;
  5620. }
  5621. }
  5622. /*
  5623. Breathe timer process
  5624. */
  5625. if(breathe.isUp)
  5626. {
  5627. breathe.countPause = 0;
  5628. breathe.countDown = breathe.timeDown;
  5629. if(++breathe.countUp >= breathe.timeUp)
  5630. breathe.isUp = OFF;
  5631. breathe.duty[0] = breathe.RGB[0]*breathe.countUp/breathe.timeUp;
  5632. breathe.duty[1] = breathe.RGB[1]*breathe.countUp/breathe.timeUp;
  5633. breathe.duty[2] = breathe.RGB[2]*breathe.countUp/breathe.timeUp;
  5634. breathe.duty[3] = breathe.RGB[3]*breathe.countUp/breathe.timeUp;
  5635. }
  5636. else
  5637. {
  5638. breathe.countUp = 1000*BREATHE_LED_LOW_BOUNDARY/breathe.timeDown;
  5639. if(breathe.countDown <= 1000*BREATHE_LED_LOW_BOUNDARY/breathe.timeDown)
  5640. {
  5641. //if(++breathe.countPause>250) //breathe ON->oFF need delay nedd Uncomment annotations
  5642. breathe.isUp = ON;
  5643. }
  5644. else
  5645. {
  5646. if(breathe.countDown > 1000*BREATHE_LED_LOW_BOUNDARY/breathe.timeDown)
  5647. breathe.countDown -=1;
  5648. }
  5649. breathe.duty[0] = breathe.RGB[0]*breathe.countDown/breathe.timeDown;
  5650. breathe.duty[1] = breathe.RGB[1]*breathe.countDown/breathe.timeDown;
  5651. breathe.duty[2] = breathe.RGB[2]*breathe.countDown/breathe.timeDown;
  5652. breathe.duty[3] = breathe.RGB[3]*breathe.countDown/breathe.timeDown;
  5653. }
  5654. osDelay(1);
  5655. }
  5656. /* USER CODE END StartTimeoutTask */
  5657. }
  5658. #ifdef FUNC_ENABLE_USART1_RFID
  5659. /* USER CODE BEGIN Header_StartRfidTask */
  5660. /**
  5661. * @brief Function implementing the rfidTask thread.
  5662. * @param argument: Not used
  5663. * @retval None
  5664. */
  5665. /* USER CODE END Header_StartRfidTask */
  5666. void StartRfidTask(void const * argument)
  5667. {
  5668. /* USER CODE BEGIN StartRfidTask */
  5669. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  5670. IdleUntilReadAllMemory();
  5671. #endif
  5672. //rrfid
  5673. uint8_t cardType = 0;
  5674. uint8_t tmpBuf[32];
  5675. uint8_t tx[UART_BUFFER_SIZE>>4];
  5676. uint8_t tx_len;
  5677. HAL_GPIO_WritePin(OUT_RFID_Reset_GPIO_Port, OUT_RFID_Reset_Pin, GPIO_PIN_SET);
  5678. /* Infinite loop */
  5679. for(;;)
  5680. {
  5681. // Read card SN
  5682. if(!Charger.rfid.op_bits.reqHalt && !Charger.rfid.op_bits.reqBlockRead)
  5683. {
  5684. switch(cardType)
  5685. {
  5686. case 0x00:
  5687. tx_len = 4;
  5688. tx[0] = tx_len - 0x01;
  5689. tx[1] = RFID_CMD_REQUEST_SN_14443A;
  5690. tx[2] = 0x01;
  5691. tx[3] = rfidCheckSumCal(tx, tx_len-1);
  5692. cardType++;
  5693. break;
  5694. case 0x01:
  5695. tx_len = 5;
  5696. tx[0] = tx_len - 0x01;
  5697. tx[1] = RFID_CMD_REQUEST_SN_14443B;
  5698. tx[2] = 0x00;
  5699. tx[3] = 0x00;
  5700. tx[4] = rfidCheckSumCal(tx, tx_len-1);
  5701. cardType++;
  5702. break;
  5703. case 0x02:
  5704. tx_len = 9;
  5705. tx[0] = tx_len - 0x01;
  5706. tx[1] = RFID_CMD_REQUEST_SN_FELICA;
  5707. tx[2] = 0x06;
  5708. tx[3] = 0x00;
  5709. tx[4] = 0xff;
  5710. tx[5] = 0xff;
  5711. tx[6] = 0x01;
  5712. tx[7] = 0x00;
  5713. tx[8] = rfidCheckSumCal(tx, tx_len-1);
  5714. cardType++;
  5715. break;
  5716. default:
  5717. cardType = 0;
  5718. break;
  5719. }
  5720. HAL_UART_Transmit(&RFID_USART, (uint8_t *)tx, tx_len, 0xffff);
  5721. osDelay(100);
  5722. }
  5723. if(Charger.rfid.op_bits.reqHalt)
  5724. {
  5725. tx_len = 3;
  5726. tx[0] = tx_len - 0x01;
  5727. tx[1] = RFID_CMD_HALT_14443A;
  5728. tx[2] = rfidCheckSumCal(tx, tx_len-1);
  5729. HAL_UART_Transmit(&RFID_USART, (uint8_t *)tx, tx_len, 0xffff);
  5730. osDelay(100);
  5731. }
  5732. if(Charger.rfid.op_bits.reqBlockRead)
  5733. {
  5734. tx_len = 0x0b;
  5735. tx[0] = tx_len - 0x01;
  5736. tx[1] = RFID_CMD_BLOCK_READ;
  5737. tx[2] = Charger.rfid.keyType;
  5738. tx[3] = Charger.rfid.targetBlock;
  5739. tx[4] = Charger.rfid.key[0];
  5740. tx[5] = Charger.rfid.key[1];
  5741. tx[6] = Charger.rfid.key[2];
  5742. tx[7] = Charger.rfid.key[3];
  5743. tx[8] = Charger.rfid.key[4];
  5744. tx[9] = Charger.rfid.key[5];
  5745. tx[10] = rfidCheckSumCal(tx, tx_len-1);
  5746. HAL_UART_Transmit(&RFID_USART, (uint8_t *)tx, tx_len, 0xffff);
  5747. osDelay(100);
  5748. }
  5749. // RFID module feedback process
  5750. if(UART_RFID_recv_end_flag == ON)
  5751. {
  5752. if((rfidCheckSumCal(UART_RFID_rx_buffer, UART_RFID_rx_buffer[0]) == UART_RFID_rx_buffer[UART_RFID_rx_buffer[0]]) && (Charger.Mode != MODE_INITIAL) && (Charger.Mode != MODE_ALARM))
  5753. {
  5754. switch(UART_RFID_rx_buffer[1])
  5755. {
  5756. case RFID_CMD_LED:
  5757. break;
  5758. case RFID_CMD_REQUEST_SN_14443A:
  5759. if(UART_RFID_rx_buffer[0] == 9)
  5760. {
  5761. Charger.rfid.snType = RFID_SN_TYPE_4BYTE;
  5762. memset(&Charger.rfid.data_Sn[0], 0x00, ARRAY_SIZE(Charger.rfid.data_Sn));
  5763. for(uint8_t idx=0;idx<16;idx++)
  5764. {
  5765. if(idx<4)
  5766. {
  5767. Charger.rfid.data_Sn[idx] = UART_RFID_rx_buffer[idx+2];
  5768. }
  5769. else
  5770. {
  5771. Charger.rfid.data_Sn[idx] = 0x00;
  5772. }
  5773. }
  5774. if(isMode(MODE_IDLE))
  5775. {
  5776. memset(&Charger.rfid.currentCard[0], 0x00, ARRAY_SIZE(Charger.rfid.currentCard));
  5777. }
  5778. if(Charger.memory.EVSE_Config.data.item.RFID_SN_Endian)
  5779. {
  5780. DEBUG_INFO("RFID SN: %02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]);
  5781. sprintf((char *)tmpBuf, "%02X%02X%02X%02X", Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]);
  5782. memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard));
  5783. }
  5784. else
  5785. {
  5786. DEBUG_INFO("RFID SN: %02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3]);
  5787. sprintf((char *)tmpBuf, "%02X%02X%02X%02X", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3]);
  5788. memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard));
  5789. }
  5790. }
  5791. else if(UART_RFID_rx_buffer[0] == 0x0c)
  5792. {
  5793. Charger.rfid.snType = RFID_SN_TYPE_7BYTE;
  5794. memset(&Charger.rfid.data_Sn[0], 0x00, ARRAY_SIZE(Charger.rfid.data_Sn));
  5795. for(uint8_t idx=0;idx<16;idx++)
  5796. {
  5797. if(idx<7)
  5798. {
  5799. Charger.rfid.data_Sn[idx] = UART_RFID_rx_buffer[idx+2];
  5800. }
  5801. else
  5802. {
  5803. Charger.rfid.data_Sn[idx] = 0x00;
  5804. }
  5805. }
  5806. if(isMode(MODE_IDLE))
  5807. {
  5808. memset(&Charger.rfid.currentCard[0], 0x00, ARRAY_SIZE(Charger.rfid.currentCard));
  5809. }
  5810. if(Charger.memory.EVSE_Config.data.item.RFID_SN_Endian)
  5811. {
  5812. DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]);
  5813. sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]);
  5814. memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard));
  5815. }
  5816. else
  5817. {
  5818. DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[6]);
  5819. sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[6]);
  5820. memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard));
  5821. }
  5822. }
  5823. //PH
  5824. if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_PH )
  5825. {
  5826. if(UART_RFID_rx_buffer[0] >= 9)
  5827. {
  5828. if(isMode(MODE_IDLE))
  5829. {
  5830. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  5831. {
  5832. Charger.rfid.targetBlock = 0x02;
  5833. Charger.rfid.keyType = 0x00;
  5834. memset(&Charger.rfid.key[0], 0xff, 6);
  5835. Charger.rfid.op_bits.reqBlockRead = ON;
  5836. //control in RFID_CMD_BLOCK_READ to Valid_RFID_SN
  5837. }
  5838. }
  5839. else if(isMode(MODE_CHARGING) || isMode(MODE_STOP))
  5840. {
  5841. if ((Array_data_Check(Charger.rfid.currentCard,Charger.rfid.nowCard))&&(Charger.cycle_info.StartType != START_METHOD_BLE))
  5842. {
  5843. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  5844. {
  5845. Charger.rfid.op_bits.reqStop = ON;
  5846. setLedMotion(LED_ACTION_RFID_PASS);
  5847. Charger.speaker.motion = SPEAKER_SHORT;
  5848. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  5849. }
  5850. DEBUG_WARN("reqStop = ON.\r\n");
  5851. }
  5852. else
  5853. {
  5854. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  5855. {
  5856. setLedMotion(LED_ACTION_RFID_FAIL);
  5857. Charger.speaker.motion = SPEAKER_BLINK;
  5858. blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating
  5859. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  5860. }
  5861. DEBUG_WARN("reqStop = Fail\r\n");
  5862. }
  5863. Charger.rfid.op_bits.reqHalt = ON;
  5864. Charger.rfid.op_bits.reqBlockRead = OFF;
  5865. }
  5866. }
  5867. }
  5868. //White List
  5869. else if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_LOCAL_LIST)
  5870. {
  5871. DEBUG_WARN("OfflinePolicy is White List\r\n");
  5872. }
  5873. //Free
  5874. else if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_FREE)
  5875. {
  5876. Charger.rfid.op_bits.reqHalt = ON;
  5877. Charger.rfid.op_bits.reqBlockRead = OFF;
  5878. if(isMode(MODE_IDLE))
  5879. {
  5880. for(uint8_t idx=0;idx<16;idx++)
  5881. {
  5882. Charger.rfid.currentCard[idx] = Charger.rfid.data_Sn[idx];
  5883. }
  5884. Charger.rfid.op_bits.reqStart = ON;
  5885. memcpy(&Charger.rfid.currentCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard));
  5886. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  5887. setLedMotion(LED_ACTION_RFID_PASS);
  5888. Charger.speaker.motion = SPEAKER_SHORT;
  5889. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  5890. }
  5891. DEBUG_WARN("RFID authorize pass.\r\n");
  5892. }
  5893. else if(isMode(MODE_CHARGING) || isMode(MODE_STOP))
  5894. {
  5895. DEBUG_WARN("RFID authorize pass.\r\n");
  5896. if (Array_data_Check(Charger.rfid.currentCard,Charger.rfid.nowCard))
  5897. {
  5898. Charger.rfid.op_bits.reqStop = ON;
  5899. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  5900. setLedMotion(LED_ACTION_RFID_PASS);
  5901. Charger.speaker.motion = SPEAKER_SHORT;
  5902. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  5903. }
  5904. DEBUG_WARN("reqStop = ON.\r\n");
  5905. }
  5906. else
  5907. {
  5908. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  5909. setLedMotion(LED_ACTION_RFID_FAIL);
  5910. Charger.speaker.motion = SPEAKER_BLINK;
  5911. blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating
  5912. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  5913. }
  5914. DEBUG_WARN("reqStop = Fail\r\n");
  5915. }
  5916. }
  5917. }
  5918. //NO charger
  5919. else // Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_NO_CHARGING
  5920. {
  5921. setLedMotion(LED_ACTION_RFID_FAIL);
  5922. Charger.speaker.motion = SPEAKER_BLINK;
  5923. blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating
  5924. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  5925. Charger.rfid.op_bits.reqHalt = ON;
  5926. Charger.rfid.op_bits.reqBlockRead = OFF;
  5927. DEBUG_WARN("It is RFID NO charger mode \r\n");
  5928. }
  5929. break;
  5930. case RFID_CMD_REQUEST_SN_14443B:
  5931. if(UART_RFID_rx_buffer[1] == RFID_CMD_REQUEST_SN_14443B)
  5932. {
  5933. Charger.rfid.snType = RFID_SN_TYPE_14443B;
  5934. memset(&Charger.rfid.data_Sn[0], 0x00, ARRAY_SIZE(Charger.rfid.data_Sn));
  5935. for(uint8_t idx=0;idx<16;idx++)
  5936. {
  5937. if(idx<13)
  5938. {
  5939. Charger.rfid.data_Sn[idx] = UART_RFID_rx_buffer[idx+2];
  5940. }
  5941. }
  5942. if(isMode(MODE_IDLE))
  5943. memset(&Charger.rfid.nowCard[0], 0x00, ARRAY_SIZE(Charger.rfid.nowCard));
  5944. if(Charger.memory.EVSE_Config.data.item.RFID_SN_Endian)
  5945. {
  5946. DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[12], Charger.rfid.data_Sn[11], Charger.rfid.data_Sn[10], Charger.rfid.data_Sn[9], Charger.rfid.data_Sn[8], Charger.rfid.data_Sn[7], Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]);
  5947. sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[12], Charger.rfid.data_Sn[11], Charger.rfid.data_Sn[10], Charger.rfid.data_Sn[9], Charger.rfid.data_Sn[8], Charger.rfid.data_Sn[7], Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]);
  5948. memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.nowCard));
  5949. }
  5950. else
  5951. {
  5952. DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[7], Charger.rfid.data_Sn[8], Charger.rfid.data_Sn[9], Charger.rfid.data_Sn[10], Charger.rfid.data_Sn[11], Charger.rfid.data_Sn[12]);
  5953. sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[7], Charger.rfid.data_Sn[8], Charger.rfid.data_Sn[9], Charger.rfid.data_Sn[10], Charger.rfid.data_Sn[11], Charger.rfid.data_Sn[12]);
  5954. memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.nowCard));
  5955. }
  5956. }
  5957. //White List
  5958. if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_LOCAL_LIST)
  5959. {
  5960. DEBUG_WARN("OfflinePolicy is White List\r\n");
  5961. }
  5962. //Free
  5963. else if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_FREE)
  5964. {
  5965. Charger.rfid.op_bits.reqHalt = ON;
  5966. Charger.rfid.op_bits.reqBlockRead = OFF;
  5967. if(isMode(MODE_IDLE))
  5968. {
  5969. for(uint8_t idx=0;idx<16;idx++)
  5970. {
  5971. Charger.rfid.currentCard[idx] = Charger.rfid.data_Sn[idx];
  5972. }
  5973. Charger.rfid.op_bits.reqStart = ON;
  5974. memcpy(&Charger.rfid.currentCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard));
  5975. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  5976. setLedMotion(LED_ACTION_RFID_PASS);
  5977. Charger.speaker.motion = SPEAKER_SHORT;
  5978. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  5979. }
  5980. DEBUG_WARN("RFID authorize pass.\r\n");
  5981. }
  5982. else if(isMode(MODE_CHARGING) || isMode(MODE_STOP))
  5983. {
  5984. DEBUG_WARN("RFID authorize pass.\r\n");
  5985. if (Array_data_Check(Charger.rfid.currentCard,Charger.rfid.nowCard))
  5986. {
  5987. Charger.rfid.op_bits.reqStop = ON;
  5988. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  5989. setLedMotion(LED_ACTION_RFID_PASS);
  5990. Charger.speaker.motion = SPEAKER_SHORT;
  5991. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  5992. }
  5993. DEBUG_WARN("reqStop = ON.\r\n");
  5994. }
  5995. else
  5996. {
  5997. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  5998. setLedMotion(LED_ACTION_RFID_FAIL);
  5999. Charger.speaker.motion = SPEAKER_BLINK;
  6000. blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating
  6001. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  6002. }
  6003. DEBUG_WARN("reqStop = Fail\r\n");
  6004. }
  6005. }
  6006. }
  6007. //NO charger
  6008. else // Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_NO_CHARGING
  6009. {
  6010. setLedMotion(LED_ACTION_RFID_FAIL);
  6011. Charger.speaker.motion = SPEAKER_BLINK;
  6012. blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating
  6013. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  6014. Charger.rfid.op_bits.reqHalt = ON;
  6015. Charger.rfid.op_bits.reqBlockRead = OFF;
  6016. DEBUG_WARN("It is RFID NO charger mode \r\n");
  6017. }
  6018. break;
  6019. case RFID_CMD_REQUEST_SN_FELICA:
  6020. if(UART_RFID_rx_buffer[1] == RFID_CMD_REQUEST_SN_FELICA)
  6021. {
  6022. Charger.rfid.snType = RFID_SN_TYPE_FELICA;
  6023. memset(&Charger.rfid.data_Sn[0], 0x00, ARRAY_SIZE(Charger.rfid.data_Sn));
  6024. for(uint8_t idx=0;idx<16;idx++)
  6025. {
  6026. if(idx<6)
  6027. {
  6028. Charger.rfid.data_Sn[idx] = UART_RFID_rx_buffer[idx+6];
  6029. }
  6030. }
  6031. if(isMode(MODE_IDLE))
  6032. memset(&Charger.rfid.nowCard[0], 0x00, ARRAY_SIZE(Charger.rfid.nowCard));
  6033. if(Charger.memory.EVSE_Config.data.item.RFID_SN_Endian)
  6034. {
  6035. DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]);
  6036. sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]);
  6037. memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.nowCard));
  6038. }
  6039. else
  6040. {
  6041. DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5]);
  6042. sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5]);
  6043. memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.nowCard));
  6044. }
  6045. }
  6046. //White List
  6047. if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_LOCAL_LIST)
  6048. {
  6049. DEBUG_WARN("OfflinePolicy is White List\r\n");
  6050. }
  6051. //Free
  6052. else if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_FREE)
  6053. {
  6054. Charger.rfid.op_bits.reqHalt = ON;
  6055. Charger.rfid.op_bits.reqBlockRead = OFF;
  6056. if(isMode(MODE_IDLE))
  6057. {
  6058. for(uint8_t idx=0;idx<16;idx++)
  6059. {
  6060. Charger.rfid.currentCard[idx] = Charger.rfid.data_Sn[idx];
  6061. }
  6062. Charger.rfid.op_bits.reqStart = ON;
  6063. memcpy(&Charger.rfid.currentCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard));
  6064. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  6065. setLedMotion(LED_ACTION_RFID_PASS);
  6066. Charger.speaker.motion = SPEAKER_SHORT;
  6067. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  6068. }
  6069. DEBUG_WARN("RFID authorize pass.\r\n");
  6070. }
  6071. else if(isMode(MODE_CHARGING) || isMode(MODE_STOP))
  6072. {
  6073. DEBUG_WARN("RFID authorize pass.\r\n");
  6074. if (Array_data_Check(Charger.rfid.currentCard,Charger.rfid.nowCard))
  6075. {
  6076. Charger.rfid.op_bits.reqStop = ON;
  6077. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  6078. setLedMotion(LED_ACTION_RFID_PASS);
  6079. Charger.speaker.motion = SPEAKER_SHORT;
  6080. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  6081. }
  6082. DEBUG_WARN("reqStop = ON.\r\n");
  6083. }
  6084. else
  6085. {
  6086. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  6087. setLedMotion(LED_ACTION_RFID_FAIL);
  6088. Charger.speaker.motion = SPEAKER_BLINK;
  6089. blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating
  6090. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  6091. }
  6092. DEBUG_WARN("reqStop = Fail\r\n");
  6093. }
  6094. }
  6095. }
  6096. //NO charger
  6097. else // Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_NO_CHARGING
  6098. {
  6099. setLedMotion(LED_ACTION_RFID_FAIL);
  6100. Charger.speaker.motion = SPEAKER_BLINK;
  6101. blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating
  6102. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  6103. Charger.rfid.op_bits.reqHalt = ON;
  6104. Charger.rfid.op_bits.reqBlockRead = OFF;
  6105. DEBUG_WARN("It is RFID NO charger mode \r\n");
  6106. }
  6107. osDelay(1000);
  6108. break;
  6109. case RFID_CMD_BLOCK_READ:
  6110. if(UART_RFID_rx_buffer[1] == RFID_CMD_BLOCK_READ)
  6111. {
  6112. memcpy(Charger.rfid.data_Block, &UART_RFID_rx_buffer[2], 0x10);
  6113. Charger.rfid.op_bits.reqHalt = ON;
  6114. Charger.rfid.op_bits.reqBlockRead = OFF;
  6115. //RFID_PH
  6116. if(Valid_RFID_SN())
  6117. {
  6118. if(isMode(MODE_IDLE))
  6119. {
  6120. Charger.rfid.op_bits.reqStart = ON;
  6121. setLedMotion(LED_ACTION_RFID_PASS);
  6122. Charger.speaker.motion = SPEAKER_SHORT;
  6123. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  6124. memcpy(&Charger.rfid.currentCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); }
  6125. else if(isMode(MODE_CHARGING) || isMode(MODE_STOP))
  6126. {
  6127. Charger.rfid.op_bits.reqStop = ON;
  6128. }
  6129. DEBUG_WARN("RFID authorize pass.\r\n");
  6130. }
  6131. else
  6132. {
  6133. setLedMotion(LED_ACTION_RFID_FAIL);
  6134. Charger.speaker.motion = SPEAKER_BLINK;
  6135. blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating
  6136. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  6137. DEBUG_WARN("RFID authorize fault.\r\n");
  6138. }
  6139. }
  6140. break;
  6141. case RFID_CMD_BLOCK_WRITE:
  6142. break;
  6143. case RFID_CMD_HALT_14443A:
  6144. if(UART_RFID_rx_buffer[1] == RFID_CMD_HALT_14443A)
  6145. {
  6146. Charger.rfid.op_bits.reqHalt = OFF;
  6147. DEBUG_INFO("RFID card(14443A) halt succcess.\r\n");
  6148. }
  6149. break;
  6150. case RFID_CMD_HALT_14443B:
  6151. if(UART_RFID_rx_buffer[1] == RFID_CMD_HALT_14443B)
  6152. {
  6153. Charger.rfid.op_bits.reqHalt = OFF;
  6154. DEBUG_INFO("RFID card(14443B) halt succcess.\r\n");
  6155. }
  6156. break;
  6157. case (RFID_CMD_BLOCK_READ ^ 0xff):
  6158. Charger.rfid.op_bits.reqBlockRead = OFF;
  6159. DEBUG_WARN("RFID cread block fail.\r\n");
  6160. break;
  6161. default:
  6162. break;
  6163. }
  6164. }
  6165. // Clear rx_buffer and related varaible
  6166. for(uint16_t i = 0; i < UART_RFID_rx_len ; i++)
  6167. UART_RFID_rx_buffer[i]=0;
  6168. UART_RFID_rx_len = 0;
  6169. UART_RFID_recv_end_flag = OFF;
  6170. }
  6171. HAL_UART_Receive_DMA(&RFID_USART,(uint8_t*)UART_RFID_rx_buffer, (UART_BUFFER_SIZE>>4));
  6172. osDelay(300);
  6173. }
  6174. /* USER CODE END StartRfidTask */
  6175. }
  6176. #endif //FUNC_ENABLE_USART1_RFID
  6177. /* USER CODE BEGIN Header_StartLedSpeakerTask */
  6178. /**
  6179. * @brief Function implementing the led_speakerTask thread.
  6180. * @param argument: Not used
  6181. * @retval None
  6182. */
  6183. /* USER CODE END Header_StartLedSpeakerTask */
  6184. void StartLedSpeakerTask(void const * argument)
  6185. {
  6186. /* USER CODE BEGIN StartLedSpeakerTask */
  6187. //#ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  6188. // IdleUntilReadAllMemory();
  6189. //#endif
  6190. uint16_t led_pwm_duty_now[4];
  6191. uint16_t breathe_duty_now[4];
  6192. //standard default
  6193. for(uint8_t idx=0;idx<12;idx++)
  6194. Charger.Led_Brightness[idx] = 0x33;
  6195. /*
  6196. //Night mode starndard default brightness
  6197. Charger.Led_Brightness[0] = 0x11; //00:00~ 01:59
  6198. Charger.Led_Brightness[1] = 0x11; //02:00~ 03:59
  6199. Charger.Led_Brightness[2] = 0x11; //04:00~ 05:59
  6200. Charger.Led_Brightness[3] = 0x33; //06:00~ 07:59
  6201. Charger.Led_Brightness[4] = 0x33; //08:00~ 09:59
  6202. Charger.Led_Brightness[5] = 0x33; //10:00~ 11:59
  6203. Charger.Led_Brightness[6] = 0x33; //12:00~ 13:59
  6204. Charger.Led_Brightness[7] = 0x33; //14:00~ 15:59
  6205. Charger.Led_Brightness[8] = 0x33; //16:00~ 17:59
  6206. Charger.Led_Brightness[9] = 0x11; //18:00~ 19:59
  6207. Charger.Led_Brightness[10] = 0x11; //20:00~ 21:59
  6208. Charger.Led_Brightness[11] = 0x11; //22:00~ 23:59
  6209. */
  6210. /* Infinite loop */
  6211. for(;;)
  6212. {
  6213. led_pwm_duty_now[0] = getBrightnessDuty(Charger.led_pwm_duty[0]);
  6214. led_pwm_duty_now[1] = getBrightnessDuty(Charger.led_pwm_duty[1]);
  6215. led_pwm_duty_now[2] = getBrightnessDuty(Charger.led_pwm_duty[2]);
  6216. led_pwm_duty_now[3] = getBrightnessDuty(Charger.led_pwm_duty[3]);
  6217. breathe_duty_now[0] = getBrightnessDuty(breathe.duty[0]);
  6218. breathe_duty_now[1] = getBrightnessDuty(breathe.duty[1]);
  6219. breathe_duty_now[2] = getBrightnessDuty(breathe.duty[2]);
  6220. breathe_duty_now[3] = getBrightnessDuty(breathe.duty[3]);
  6221. if(timer[TIMER_IDX_LED_TEMP].isAlarm)
  6222. {
  6223. timerDisable(TIMER_IDX_LED_TEMP);
  6224. setLedMotion(Charger.Led_Mode);
  6225. }
  6226. /*
  6227. LED red process
  6228. */
  6229. switch(Charger.led_R.motion)
  6230. {
  6231. case LED_MOTION_ON:
  6232. user_pwm_setvalue(PWM_CH_LED_R, led_pwm_duty_now[0]);
  6233. break;
  6234. case LED_MOTION_BLINK:
  6235. if(blinker[BLINKER_IDX_LED].isOn)
  6236. {
  6237. user_pwm_setvalue(PWM_CH_LED_R, led_pwm_duty_now[0]);
  6238. }
  6239. else
  6240. {
  6241. user_pwm_setvalue(PWM_CH_LED_R, PWM_DUTY_OFF);
  6242. }
  6243. break;
  6244. case LED_MOTION_BREATHE:
  6245. user_pwm_setvalue(PWM_CH_LED_R, breathe_duty_now[0]);
  6246. break;
  6247. case LED_MOTION_OFF:
  6248. default:
  6249. user_pwm_setvalue(PWM_CH_LED_R, PWM_DUTY_OFF);
  6250. break;
  6251. }
  6252. /*
  6253. LED green process
  6254. */
  6255. switch(Charger.led_G.motion)
  6256. {
  6257. case LED_MOTION_ON:
  6258. user_pwm_setvalue(PWM_CH_LED_G, led_pwm_duty_now[1]);
  6259. break;
  6260. case LED_MOTION_BLINK:
  6261. if(blinker[BLINKER_IDX_LED].isOn)
  6262. {
  6263. user_pwm_setvalue(PWM_CH_LED_G, led_pwm_duty_now[1]);
  6264. }
  6265. else
  6266. {
  6267. user_pwm_setvalue(PWM_CH_LED_G, PWM_DUTY_OFF);
  6268. }
  6269. break;
  6270. case LED_MOTION_BREATHE:
  6271. user_pwm_setvalue(PWM_CH_LED_G, breathe_duty_now[1]);
  6272. break;
  6273. case LED_MOTION_OFF:
  6274. default:
  6275. user_pwm_setvalue(PWM_CH_LED_G, PWM_DUTY_OFF);
  6276. break;
  6277. }
  6278. /*
  6279. LED blue process
  6280. */
  6281. switch(Charger.led_B.motion)
  6282. {
  6283. case LED_MOTION_ON:
  6284. user_pwm_setvalue(PWM_CH_LED_B, led_pwm_duty_now[2]);
  6285. break;
  6286. case LED_MOTION_BLINK:
  6287. if(blinker[BLINKER_IDX_LED].isOn)
  6288. {
  6289. user_pwm_setvalue(PWM_CH_LED_B, led_pwm_duty_now[2]);
  6290. }
  6291. else
  6292. {
  6293. user_pwm_setvalue(PWM_CH_LED_B, PWM_DUTY_OFF);
  6294. }
  6295. break;
  6296. case LED_MOTION_BREATHE:
  6297. user_pwm_setvalue(PWM_CH_LED_B, breathe_duty_now[2]);
  6298. break;
  6299. case LED_MOTION_OFF:
  6300. default:
  6301. user_pwm_setvalue(PWM_CH_LED_B, PWM_DUTY_OFF);
  6302. break;
  6303. }
  6304. /*
  6305. LED white process
  6306. */
  6307. switch(Charger.led_W.motion)
  6308. {
  6309. case LED_MOTION_ON:
  6310. user_pwm_setvalue(PWM_CH_LED_W, led_pwm_duty_now[3]);
  6311. break;
  6312. case LED_MOTION_BLINK:
  6313. if(blinker[BLINKER_IDX_LED].isOn)
  6314. {
  6315. user_pwm_setvalue(PWM_CH_LED_W, led_pwm_duty_now[3]);
  6316. }
  6317. else
  6318. {
  6319. user_pwm_setvalue(PWM_CH_LED_W, PWM_DUTY_OFF);
  6320. }
  6321. break;
  6322. case LED_MOTION_BREATHE:
  6323. user_pwm_setvalue(PWM_CH_LED_W, breathe_duty_now[3]);
  6324. break;
  6325. case LED_MOTION_OFF:
  6326. default:
  6327. user_pwm_setvalue(PWM_CH_LED_W, PWM_DUTY_OFF);
  6328. break;
  6329. }
  6330. #ifdef FUNC_AW48_NET_LED
  6331. if (Charger.m_bModelNameAW48_1P)
  6332. {
  6333. //Net LED: Green
  6334. switch (Charger.LedNet_G.motion)
  6335. {
  6336. case LED_MOTION_BREATHE:
  6337. case LED_MOTION_ON:
  6338. NETLED_SET_G(1);
  6339. break;
  6340. case LED_MOTION_BLINK:
  6341. if(blinker[BLINKER_IDX_LED_NET].isOn)
  6342. NETLED_SET_G(1);
  6343. else
  6344. NETLED_SET_G(0);
  6345. break;
  6346. case LED_MOTION_OFF:
  6347. default:
  6348. NETLED_SET_G(0);
  6349. break;
  6350. }
  6351. //Net LED: Blue
  6352. switch (Charger.LedNet_B.motion)
  6353. {
  6354. case LED_MOTION_BREATHE:
  6355. case LED_MOTION_ON:
  6356. NETLED_SET_B(1);
  6357. break;
  6358. case LED_MOTION_BLINK:
  6359. if(blinker[BLINKER_IDX_LED_NET].isOn)
  6360. NETLED_SET_B(1);
  6361. else
  6362. NETLED_SET_B(0);
  6363. break;
  6364. case LED_MOTION_OFF:
  6365. default:
  6366. NETLED_SET_B(0);
  6367. break;
  6368. }
  6369. }
  6370. #endif //FUNC_AW48_NET_LED
  6371. /*
  6372. LED breathe process
  6373. */
  6374. if(flicker[FLICKER_IDX_BREATHE].isOn)
  6375. HAL_GPIO_WritePin(OUT_LED_Breathe_GPIO_Port, OUT_LED_Breathe_Pin, GPIO_PIN_SET);
  6376. else
  6377. HAL_GPIO_WritePin(OUT_LED_Breathe_GPIO_Port, OUT_LED_Breathe_Pin, GPIO_PIN_RESET);
  6378. /*
  6379. Spearker process
  6380. */
  6381. switch(Charger.speaker.motion)
  6382. {
  6383. case SPEAKER_LONG:
  6384. timerEnable(TIMER_IDX_SPEAKER, 600);
  6385. HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_SET);
  6386. if(timer[TIMER_IDX_SPEAKER].isAlarm)
  6387. {
  6388. timerDisable(TIMER_IDX_SPEAKER);
  6389. Charger.speaker.motion = SPEAKER_NONE;
  6390. }
  6391. break;
  6392. case SPEAKER_SHORT:
  6393. timerEnable(TIMER_IDX_SPEAKER, 200);
  6394. HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_SET);
  6395. if(timer[TIMER_IDX_SPEAKER].isAlarm)
  6396. {
  6397. timerDisable(TIMER_IDX_SPEAKER);
  6398. Charger.speaker.motion = SPEAKER_NONE;
  6399. }
  6400. break;
  6401. case SPEAKER_BLINK:
  6402. if(blinker[BLINKER_IDX_SPEAKER].isOn)
  6403. HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_SET);
  6404. else
  6405. HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_RESET);
  6406. if(blinker[BLINKER_IDX_SPEAKER].blinkisFinish)
  6407. {
  6408. disblinkerTime(BLINKER_IDX_SPEAKER);
  6409. }
  6410. break;
  6411. case SPEAKER_NONE:
  6412. default:
  6413. HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_RESET);
  6414. break;
  6415. }
  6416. osDelay(1);
  6417. }
  6418. /* USER CODE END StartLedSpeakerTask */
  6419. }
  6420. /* USER CODE BEGIN Header_StartCpTask */
  6421. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  6422. void CpTask_CtrlCpPwm_P0(void)
  6423. {
  6424. #ifdef FUNC_CCS //======================================================================
  6425. uint16_t MaxCurr = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent;
  6426. if (Charger.m_bRunCCS) //CCS Charge
  6427. {
  6428. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_5);
  6429. Charger.MaxChargingCurrent_Previous = MaxCurr;
  6430. }
  6431. else //Normal Charge
  6432. {
  6433. #ifdef FUNC_MODIFY_CP_PWM_CTRL_20231225
  6434. if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU || Charger.m_bModelNameDC)
  6435. {
  6436. if ((MaxCurr >= 6) && (MaxCurr <= Charger.maxRatingCurrent))
  6437. {
  6438. user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(MaxCurr));
  6439. Charger.MaxChargingCurrent_Previous = MaxCurr;
  6440. }
  6441. else
  6442. {
  6443. user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.maxRatingCurrent));
  6444. Charger.MaxChargingCurrent_Previous = Charger.maxRatingCurrent;
  6445. }
  6446. }
  6447. else
  6448. {
  6449. if ((Charger.AC_MaxChargingCurrentOrDuty >= 6) && (Charger.AC_MaxChargingCurrentOrDuty <= Charger.maxRatingCurrent))
  6450. {
  6451. user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.AC_MaxChargingCurrentOrDuty));
  6452. }
  6453. else
  6454. {
  6455. if (Charger.AC_MaxChargingCurrentOrDuty == 0)
  6456. {
  6457. user_pwm_setvalue(PWM_CH_CP, 0);
  6458. }
  6459. else if (Charger.AC_MaxChargingCurrentOrDuty == 1)
  6460. {
  6461. user_pwm_setvalue(PWM_CH_CP, 0);
  6462. }
  6463. else if (Charger.AC_MaxChargingCurrentOrDuty == 5)
  6464. {
  6465. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_5);
  6466. }
  6467. else if (Charger.AC_MaxChargingCurrentOrDuty == 100)
  6468. {
  6469. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  6470. }
  6471. else
  6472. {
  6473. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  6474. }
  6475. }
  6476. Charger.MaxChargingCurrent_Previous = Charger.AC_MaxChargingCurrentOrDuty;
  6477. }
  6478. #else //FUNC_MODIFY_CP_PWM_CTRL_20231225
  6479. if ((MaxCurr >= 6) && (MaxCurr <= Charger.maxRatingCurrent))
  6480. {
  6481. user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(MaxCurr));
  6482. Charger.MaxChargingCurrent_Previous = MaxCurr;
  6483. }
  6484. else
  6485. {
  6486. user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.maxRatingCurrent));
  6487. Charger.MaxChargingCurrent_Previous = Charger.maxRatingCurrent;
  6488. }
  6489. #endif //FUNC_MODIFY_CP_PWM_CTRL_20231225
  6490. }
  6491. #else //FUNC_CCS //======================================================================
  6492. // uint16_t MaxCurr = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent;
  6493. // if (MaxCurr < 6)
  6494. // {
  6495. //#ifdef MODIFY_CP_TASK_CTRL_CP_PWM_BELOW_SIX
  6496. // if (MaxCurr == 0)
  6497. // {
  6498. // user_pwm_setvalue(PWM_CH_CP, 0);
  6499. // Charger.MaxChargingCurrent_Previous = MaxCurr;
  6500. // }
  6501. // else
  6502. // {
  6503. // user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(6));
  6504. // Charger.MaxChargingCurrent_Previous = MaxCurr;
  6505. // }
  6506. //#else //MODIFY_CP_TASK_CTRL_CP_PWM_BELOW_SIX
  6507. // user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(6));
  6508. // Charger.MaxChargingCurrent_Previous = MaxCurr;
  6509. //#endif //MODIFY_CP_TASK_CTRL_CP_PWM_BELOW_SIX
  6510. // }
  6511. // else if ((MaxCurr >= 6) && (MaxCurr <= Charger.maxRatingCurrent))
  6512. // {
  6513. // user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(MaxCurr));
  6514. // Charger.MaxChargingCurrent_Previous = MaxCurr;
  6515. // }
  6516. // else
  6517. // {
  6518. // user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.maxRatingCurrent));
  6519. // Charger.MaxChargingCurrent_Previous = Charger.maxRatingCurrent;
  6520. // }
  6521. #endif //FUNC_CCS //======================================================================
  6522. }
  6523. void CpTask_CtrlCpPwm_P1(void)
  6524. {
  6525. #ifdef FUNC_DETECT_PP
  6526. if (
  6527. (Charger.m_bDetectPP && Charger.m_PPInfo.m_CurCurr != Charger.m_PPInfo.m_PreCurr)
  6528. ||
  6529. (
  6530. (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent != Charger.MaxChargingCurrent_Previous) &&
  6531. (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent <= Charger.maxRatingCurrent)
  6532. )
  6533. )
  6534. #else
  6535. if (
  6536. (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent != Charger.MaxChargingCurrent_Previous) &&
  6537. (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent <= Charger.maxRatingCurrent)
  6538. )
  6539. #endif
  6540. {
  6541. CpTask_CtrlCpPwm_P0();
  6542. }
  6543. }
  6544. #endif //MODIFY_CP_TASK_CTRL_CP_PWM
  6545. #ifdef TRIM_CCID_SELFTEST
  6546. void Proc_CCID_SelfTest(void)
  6547. {
  6548. // check Leak Module do CCID selftset.
  6549. if (Charger.CCID_Module_Type == CCID_MODULE_CORMEX)
  6550. {
  6551. Charger.Test_LeakModuleisPass = Test_LeakModule();
  6552. }
  6553. else if (Charger.CCID_Module_Type == CCID_MODULE_VAC)
  6554. {
  6555. Charger.Test_LeakModuleisPass = PASS;
  6556. }
  6557. else
  6558. {
  6559. DEBUG_INFO("Did not judge Leak module can't self test before charging.\r\n");
  6560. }
  6561. XP("Proc CCID Self-Test(%d): %s\r\n", Charger.CCID_Module_Type, Charger.Test_LeakModuleisPass == PASS ? "OK" : "[NG]");
  6562. }
  6563. #endif
  6564. #ifdef FUNC_AUTO_MODIFY_CCID_MODULE
  6565. uint8_t AutoModifyCCID(void)
  6566. {
  6567. uint8_t old = Charger.CCID_Module_Type;
  6568. if (Test_LeakModule() == PASS)
  6569. {
  6570. Charger.m_bCCID_MustModify = HTK_FALSE;
  6571. Charger.m_CCID_ModuleTestOK = Charger.CCID_Module_Type;
  6572. return PASS;
  6573. }
  6574. else
  6575. {
  6576. Charger.CCID_Module_Type = (Charger.CCID_Module_Type == CCID_MODULE_CORMEX ? CCID_MODULE_VAC : CCID_MODULE_CORMEX);
  6577. XP("#AutoModifyCCID: %s\r\n", CCID_MODULE_TYPE_STR);
  6578. if (Test_LeakModule() == PASS)
  6579. {
  6580. Charger.m_bCCID_MustModify = HTK_TRUE;
  6581. Charger.m_CCID_ModuleTestOK = Charger.CCID_Module_Type;
  6582. return PASS;
  6583. }
  6584. else
  6585. {
  6586. Charger.m_bCCID_MustModify = HTK_FALSE;
  6587. Charger.m_CCID_ModuleTestOK = CCID_MODULE_UNKNOW;
  6588. Charger.CCID_Module_Type = old;
  6589. return FAIL;
  6590. }
  6591. }
  6592. }
  6593. #endif
  6594. #ifdef FUNC_AX32_USE_AS_1P_MODEL
  6595. #ifdef MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5
  6596. HTK_BOOL AX32_Is_3PModel_Run1P(void)
  6597. {
  6598. HTK_BOOL bRtn = HTK_FALSE;
  6599. if (Charger.m_b3PhaseModel)
  6600. {
  6601. PMeterIC_ExtraInfo pEx = &Charger.m_MeterIcEx;
  6602. int MaxVoltErr = 5000; //0.01V: 50V
  6603. int MaxDegErr = 5;
  6604. HTK_BOOL bCheckVolt3P =
  6605. (
  6606. abs(Charger.Voltage[1] - Charger.Voltage[0]) < MaxVoltErr &&
  6607. abs(Charger.Voltage[2] - Charger.Voltage[0]) < MaxVoltErr &&
  6608. abs(Charger.Voltage[2] - Charger.Voltage[1]) < MaxVoltErr
  6609. );
  6610. if (bCheckVolt3P)
  6611. {
  6612. //AC_PHASE_MODE_240_120_120_SEQ_OK(NG:Happen 1 times)
  6613. if (
  6614. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[0]), 240, MaxDegErr) &&
  6615. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[1]), 120, MaxDegErr) &&
  6616. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[2]), 120, MaxDegErr)
  6617. )
  6618. {
  6619. pEx->m_AcPhaseMode = AC_PHASE_MODE_240_120_120_SEQ_OK;
  6620. }
  6621. //AC_PHASE_MODE_120_120_240_SEQ_NG
  6622. else if (
  6623. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[0]), 120, MaxDegErr) &&
  6624. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[1]), 120, MaxDegErr) &&
  6625. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[2]), 240, MaxDegErr)
  6626. )
  6627. {
  6628. pEx->m_AcPhaseMode = AC_PHASE_MODE_120_120_240_SEQ_NG;
  6629. }
  6630. //AC_PHASE_MODE_360_360_360 (for RD test - L => L1, L2, L3)
  6631. else if (
  6632. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[0]), 360, MaxDegErr) &&
  6633. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[1]), 360, MaxDegErr) &&
  6634. HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[2]), 360, MaxDegErr)
  6635. )
  6636. {
  6637. pEx->m_AcPhaseMode = AC_PHASE_MODE_360_360_360;
  6638. }
  6639. else
  6640. {
  6641. pEx->m_AcPhaseMode = AC_PHASE_MODE_UNKNOW;
  6642. }
  6643. }
  6644. if (!bCheckVolt3P || pEx->m_AcPhaseMode == AC_PHASE_MODE_UNKNOW)
  6645. {
  6646. if (
  6647. (abs(Charger.Voltage[1] - Charger.Voltage[0]) < MaxVoltErr && abs(Charger.Voltage[2] - Charger.Voltage[0]) > MaxVoltErr)
  6648. ||
  6649. (abs(Charger.Voltage[1] - Charger.Voltage[0]) > MaxVoltErr && abs(Charger.Voltage[2] - Charger.Voltage[0]) < MaxVoltErr)
  6650. )
  6651. {
  6652. //Conntect L1, L2 or L1, L3 ==> RUN 3P
  6653. pEx->m_AcPhaseMode = AC_PHASE_MODE_UNKNOW;
  6654. }
  6655. else
  6656. {
  6657. pEx->m_AcPhaseMode = AC_PHASE_MODE_1P;
  6658. }
  6659. }
  6660. if (
  6661. Charger.m_bModelNameAX32_3P
  6662. #ifdef FUNC_AT32
  6663. || Charger.m_bModelNameAT32_3P
  6664. #endif
  6665. )
  6666. {
  6667. #ifdef FUNC_AX32_AUTO_PHASE_WITHOUT_GENERATION_CODE
  6668. if (pEx->m_AcPhaseMode == AC_PHASE_MODE_1P)
  6669. {
  6670. DEBUG_INFO("3P MODEL RUN 1P PROC <AUTO>\r\n");
  6671. bRtn = HTK_TRUE;
  6672. }
  6673. else
  6674. {
  6675. DEBUG_INFO("3P MODEL RUN 3P PROC <AUTO>\r\n");
  6676. }
  6677. #else //FUNC_AX32_AUTO_PHASE_WITHOUT_GENERATION_CODE
  6678. if (Charger.memory.EVSE_Config.data.item.ModelName[11] >= '0' &&
  6679. Charger.memory.EVSE_Config.data.item.ModelName[11] <= '4')
  6680. {
  6681. DEBUG_INFO("3P MODEL RUN 3P PROC (GEN_CODE == 0-4)\r\n");
  6682. }
  6683. else
  6684. {
  6685. if (pEx->m_AcPhaseMode == AC_PHASE_MODE_1P)
  6686. {
  6687. DEBUG_INFO("3P MODEL RUN 1P PROC (GEN_CODE != 0-4 <AUTO>)\r\n");
  6688. bRtn = HTK_TRUE;
  6689. }
  6690. else
  6691. {
  6692. DEBUG_INFO("3P MODEL RUN 3P PROC (GEN_CODE != 0-4 <AUTO>)\r\n");
  6693. }
  6694. }
  6695. #endif //FUNC_AX32_AUTO_PHASE_WITHOUT_GENERATION_CODE
  6696. }
  6697. else if (Charger.m_bModelNameDC)
  6698. {
  6699. DEBUG_INFO("3P MODEL RUN 3P PROC (DC Model)\r\n");
  6700. }
  6701. else
  6702. {
  6703. DEBUG_INFO("3P MODEL RUN 3P PROC\r\n");
  6704. }
  6705. }
  6706. return bRtn;
  6707. }
  6708. #endif //MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5
  6709. #endif //FUNC_AX32_USE_AS_1P_MODEL
  6710. //#ifdef FIXHW_AW48_CSU_EXIST_DELAY_CHECK
  6711. //void AW48_CheckCSU(void)
  6712. //{
  6713. // if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  6714. // {
  6715. // if (IS_CSU_MOUNTED)
  6716. // {
  6717. // parseVersionInfoFromModelname(); //Update_McuCtrlMode() included
  6718. // if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU)
  6719. // {
  6720. // XP("\r\nAW48_CheckCSU() >>> MCU_CONTROL_MODE_CSU (%d sec)\r\n", (HAL_GetTick() - Charger.m_BootTick) / 1000 );
  6721. // setChargerMode(MODE_INITIAL);
  6722. // }
  6723. // }
  6724. // }
  6725. //}
  6726. //
  6727. //void AW48_WaitCSU(u32 MaxTick)
  6728. //{
  6729. // XP("AW48_WaitCSU(): Begin\r\n");
  6730. // u32 TickBeg = HAL_GetTick();
  6731. // while (1)
  6732. // {
  6733. // HAL_IWDG_Refresh(&hiwdg);
  6734. // osDelay(100);
  6735. // if (IS_CSU_MOUNTED)
  6736. // {
  6737. // XP("AW48_WaitCSU(): End <PinLO> <Tick: %d sec>\r\n", (HAL_GetTick() - TickBeg) / 1000); //Test: 27s
  6738. // AW48_CheckCSU();
  6739. // return;
  6740. // }
  6741. //
  6742. // if (HTK_IsTimeout(TickBeg, MaxTick))
  6743. // {
  6744. // XP("AW48_WaitCSU(): End <Timeout: %d sec>\r\n", MaxTick / 1000);
  6745. // return;
  6746. // }
  6747. // }
  6748. //}
  6749. //
  6750. //#endif //FIXHW_AW48_CSU_EXIST_DELAY_CHECK
  6751. /**
  6752. * @brief Function implementing the cpTask thread.
  6753. * @param argument: Not used
  6754. * @retval None
  6755. */
  6756. /* USER CODE END Header_StartCpTask */
  6757. void StartCpTask(void const * argument)
  6758. {
  6759. /* USER CODE BEGIN StartCpTask */
  6760. //ccp
  6761. uint32_t duration_delta;
  6762. Charger.Mode = MODE_INITIAL;
  6763. Charger.Relay_Action=GPIO_RELAY_ACTION_OFF;
  6764. setLedMotion(LED_ACTION_INIT);
  6765. #ifdef FUNC_AW48_NET_LED
  6766. if (Charger.m_bModelNameAW48_1P)
  6767. {
  6768. setNetLedMotion(Charger.am3352.NetLedActionState = NET_LED_ACTION_OFF);
  6769. }
  6770. #endif
  6771. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  6772. IdleUntilReadAllMemory();
  6773. #endif
  6774. //Check MCU control mode depend on GPIO state
  6775. #ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME
  6776. Update_McuCtrlMode();
  6777. #endif
  6778. HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_RESET);
  6779. #ifdef FUNC_AX32_TRIG_LEAKAGE
  6780. if (Charger.m_b3PhaseModel)
  6781. {
  6782. TrigLeakage_Init();
  6783. }
  6784. #endif
  6785. #ifdef FUNC_AX80_ADD_TILT_SENSOR
  6786. #ifdef FUNC_ADD_TILT_SENSOR_MODEL
  6787. if (Charger.m_bUseTiltSensor)
  6788. #else
  6789. if (Charger.m_bModelNameAX80_1P)
  6790. #endif
  6791. {
  6792. TILT_TrigLeakage_Init();
  6793. }
  6794. #endif //FUNC_AX80_ADD_TILT_SENSOR
  6795. /* Infinite loop */
  6796. for(;;)
  6797. {
  6798. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  6799. {
  6800. //=============================( MODIFY_CPTASK_TYPE_E )==============================[ NO CSU ]
  6801. #ifdef MODIFY_CPTASK_HEAD
  6802. Proc_CpTaskHead(HTK_FALSE);
  6803. #endif
  6804. switch(Charger.Mode)
  6805. {
  6806. case MODE_INITIAL:
  6807. //=============================( MODIFY_CPTASK_TYPE_E / MODE_INITIAL )
  6808. setLedMotion(LED_ACTION_INIT);
  6809. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  6810. HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port, OUT_Leak_Test_Pin, GPIO_PIN_SET); // for VAC LeakModule use
  6811. if (Charger.ModelReadisOK ==PASS)
  6812. {
  6813. getRotarySwitchSetting( );
  6814. getGridTypeSwitchSetting( );
  6815. Charger.isTestLeakModule = ON ;
  6816. #ifdef FUNC_AUTO_MODIFY_CCID_MODULE
  6817. if (AutoModifyCCID() == PASS)
  6818. #else
  6819. if(Test_LeakModule() == PASS)
  6820. #endif
  6821. {
  6822. DEBUG_INFO("Leak module self test pass when initial.\r\n");
  6823. osDelay(1000);
  6824. if(Charger.isDebugEnable)
  6825. setChargerMode(MODE_DEBUG);
  6826. else
  6827. {
  6828. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  6829. // Cold load pick up check
  6830. if((Charger.CP_State == SYSTEM_STATE_A) && Charger.memory.coldLoadPickUp.data.item.isEnable)
  6831. {
  6832. #ifndef FUNC_METER_IC_HISTORY
  6833. recordChargingHis(OFF, END_STATUS_CODE_DROP);
  6834. #endif
  6835. Charger.memory.coldLoadPickUp.data.item.isEnable = OFF;
  6836. Charger.memory.coldLoadPickUp.op_bits.update = ON;
  6837. }
  6838. }
  6839. osDelay(5000) ; //wait hardware PE feedback data so delay some time
  6840. //#ifdef FIXHW_AW48_CSU_EXIST_DELAY_CHECK
  6841. // if (Charger.m_bModelNameAW48_1P)
  6842. // {
  6843. // AW48_WaitCSU(1000 * 30);
  6844. // }
  6845. //#endif
  6846. setChargerMode(MODE_IDLE);
  6847. }
  6848. }
  6849. else
  6850. {
  6851. Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL;
  6852. DEBUG_INFO("Leak module self test fail when initial.\r\n");
  6853. Charger.counter.LEAK_MODULE.isLatch = ON ;
  6854. }
  6855. Charger.isTestLeakModule = OFF ;
  6856. }
  6857. break;
  6858. case MODE_IDLE:
  6859. //=============================( MODIFY_CPTASK_TYPE_E / MODE_IDLE )
  6860. if(isModeChange())
  6861. {
  6862. setLedMotion(LED_ACTION_IDLE);
  6863. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  6864. #ifdef MODIFY_CPTASK_TYPE_E
  6865. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  6866. Charger.m_OutpMode = OUTPMODE_NONE;
  6867. #endif
  6868. Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent;
  6869. #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE
  6870. Charger.AC_MaxChargingCurrentOrDuty = Charger.maxRatingCurrent;
  6871. #endif
  6872. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  6873. Charger.isSetStartTime = ON ;
  6874. Charger.isOnSocketE = OFF;
  6875. #ifdef FUNC_CCS
  6876. Charger.m_bRunCCS = 0;
  6877. Charger.m_bGotCsuCpDutyCmd = 0;
  6878. #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS
  6879. Charger.m_bPassGotCsuCpDutyCmd = 0;
  6880. #endif
  6881. #endif //FUNC_CCS
  6882. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  6883. if (Charger.m_bUseGunLock)
  6884. {
  6885. Charger.m_GunLock_Counter = 0;
  6886. Charger.m_GunUnlock_Counter = 0;
  6887. }
  6888. #endif
  6889. #ifdef FUNC_PTB_METER_WM3M4C
  6890. if (Charger.m_pWM3M4C != NULL)
  6891. {
  6892. if (Charger.m_pWM3M4C->m_bCharging)
  6893. {
  6894. Charger.m_pWM3M4C->m_bTrigEndCharge = HTK_TRUE;
  6895. }
  6896. }
  6897. #endif
  6898. #ifdef FUNC_AX32_USE_AS_1P_MODEL
  6899. Charger.m_b3PhaseModelButUse1PhaseOnly = AX32_Is_3PModel_Run1P();
  6900. #endif
  6901. }
  6902. if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP)
  6903. {
  6904. if( Charger.memory.coldLoadPickUp.data.item.isEnable || Charger.rfid.op_bits.reqStart)
  6905. {
  6906. osDelay(LED_RFID_TIME); // for Buzzer and RFID /Fail LED use
  6907. setLedMotion(LED_ACTION_AUTHED);
  6908. // Check start method type
  6909. memset(&Charger.cycle_info.userId[0], 0x00, ARRAY_SIZE(Charger.cycle_info.userId));
  6910. if(Charger.rfid.op_bits.reqStart)
  6911. {
  6912. Charger.cycle_info.StartType = START_METHOD_RFID;
  6913. memcpy(&Charger.cycle_info.userId[0], &Charger.rfid.currentCard[0], ARRAY_SIZE(Charger.rfid.currentCard));
  6914. Charger.istoHandShakeMode = ON ;
  6915. }
  6916. Charger.rfid.op_bits.reqStart = OFF;
  6917. if(Charger.memory.coldLoadPickUp.data.item.isEnable)
  6918. {
  6919. Charger.memory.coldLoadPickUp.data.item.isEnable = OFF;
  6920. Charger.memory.coldLoadPickUp.op_bits.update = ON;
  6921. DEBUG_INFO("coldLoadPickUp ON to rand wait sec.\r\n");
  6922. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  6923. ColdLoadPickup_Delay("coldLoadPickUp ON to rand wait sec.");
  6924. #else
  6925. osDelay((rand()%175000)+5000);
  6926. //osDelay((rand()%5000)+5000);
  6927. #endif
  6928. Charger.istoHandShakeMode = ON ;
  6929. }
  6930. }
  6931. if (Charger.istoHandShakeMode == ON) //charger can to HandShakeMode
  6932. {
  6933. if (
  6934. (Charger.CP_State == SYSTEM_STATE_B) ||
  6935. (Charger.CP_State == SYSTEM_STATE_C) ||
  6936. #ifdef MODIFY_CPTASK_TYPE_E
  6937. ((Charger.CP_State == SYSTEM_STATE_A) || IsTypeEPlugIn())
  6938. #else
  6939. //HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)
  6940. #endif
  6941. )
  6942. {
  6943. #ifdef MODIFY_CPTASK_TYPE_E
  6944. if (Charger.CP_State == SYSTEM_STATE_B || Charger.CP_State == SYSTEM_STATE_C)
  6945. {
  6946. Charger.m_OutpMode = OUTPMODE_CPGUN;
  6947. }
  6948. else if ((Charger.CP_State == SYSTEM_STATE_A) || IsTypeEPlugIn())
  6949. {
  6950. Charger.m_OutpMode = OUTPMODE_TYPEE;
  6951. }
  6952. #endif
  6953. timerDisable(TIMER_IDX_CP);
  6954. Charger.istoHandShakeMode = OFF ;
  6955. setChargerMode(MODE_HANDSHAKE);
  6956. }
  6957. else
  6958. {
  6959. timerEnable(TIMER_IDX_CP, 180000);
  6960. }
  6961. }
  6962. }
  6963. else if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_FREE)
  6964. {
  6965. if (
  6966. (Charger.CP_State == SYSTEM_STATE_B) ||
  6967. (Charger.CP_State == SYSTEM_STATE_C) ||
  6968. #ifdef MODIFY_CPTASK_TYPE_E
  6969. (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn()) ||
  6970. #endif
  6971. Charger.memory.coldLoadPickUp.data.item.isEnable )
  6972. {
  6973. setLedMotion(LED_ACTION_AUTHED);
  6974. // Check start method type
  6975. memset(&Charger.cycle_info.userId[0], 0x00, ARRAY_SIZE(Charger.cycle_info.userId));
  6976. if(Charger.rfid.op_bits.reqStart)
  6977. {
  6978. Charger.cycle_info.StartType = START_METHOD_RFID;
  6979. memcpy(&Charger.cycle_info.userId[0], &Charger.rfid.currentCard[0], ARRAY_SIZE(Charger.rfid.currentCard));
  6980. }
  6981. else
  6982. {
  6983. #ifdef MODIFY_CPTASK_TYPE_E
  6984. if (Charger.CP_State == SYSTEM_STATE_B ||
  6985. Charger.CP_State == SYSTEM_STATE_C ||
  6986. Charger.memory.coldLoadPickUp.data.item.isEnable)
  6987. {
  6988. Charger.cycle_info.StartType = START_METHOD_CP;
  6989. Charger.m_OutpMode = OUTPMODE_CPGUN;
  6990. }
  6991. else if (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn())
  6992. {
  6993. Charger.cycle_info.StartType = START_METHOD_TYPEE;
  6994. Charger.m_OutpMode = OUTPMODE_TYPEE;
  6995. }
  6996. #else
  6997. Charger.cycle_info.StartType = START_METHOD_CP;
  6998. #endif //MODIFY_CPTASK_TYPE_E
  6999. }
  7000. Charger.ble.isRequestOn = OFF;
  7001. Charger.rfid.op_bits.reqStart = OFF;
  7002. if(Charger.memory.coldLoadPickUp.data.item.isEnable)
  7003. {
  7004. Charger.memory.coldLoadPickUp.data.item.isEnable = OFF;
  7005. Charger.memory.coldLoadPickUp.op_bits.update = ON;
  7006. DEBUG_INFO("coldLoadPickUp ON to rand wait sec.\r\n");
  7007. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  7008. ColdLoadPickup_Delay("coldLoadPickUp ON to rand wait sec.");
  7009. #else
  7010. osDelay((rand()%175000)+5000);
  7011. #endif
  7012. }
  7013. setChargerMode(MODE_HANDSHAKE);
  7014. }
  7015. }
  7016. break;
  7017. case MODE_HANDSHAKE:
  7018. //=============================( MODIFY_CPTASK_TYPE_E / MODE_HANDSHAKE )
  7019. if(isModeChange())
  7020. {
  7021. Charger.isCP_in_B = OFF ;
  7022. Charger.isTestLeakModule = ON ;
  7023. #ifdef TRIM_CCID_SELFTEST
  7024. Proc_CCID_SelfTest();
  7025. #endif
  7026. //check Leak test pass
  7027. if (Charger.Test_LeakModuleisPass)
  7028. {
  7029. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  7030. CpTask_CtrlCpPwm_P0();
  7031. #endif
  7032. DEBUG_INFO("Leak module self test pass before charging.\r\n");
  7033. }
  7034. else
  7035. {
  7036. Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL;
  7037. DEBUG_INFO("Leak module self test fail before charging.\r\n");
  7038. Charger.counter.LEAK_MODULE.retry ++ ;
  7039. if (Charger.counter.LEAK_MODULE.retry >=2)
  7040. {
  7041. Charger.counter.LEAK_MODULE.isLatch = ON ;
  7042. }
  7043. }
  7044. osDelay(300);
  7045. Charger.isTestLeakModule = OFF ;
  7046. }
  7047. // to chaging moder
  7048. if(Charger.CP_State == SYSTEM_STATE_C)
  7049. {
  7050. #ifdef MODIFY_CPTASK_TYPE_E
  7051. Charger.m_OutpMode = OUTPMODE_CPGUN;
  7052. #endif
  7053. setChargerMode(MODE_CHARGING);
  7054. if (Charger.isSetStartTime == ON)
  7055. {
  7056. Charger.cycle_info.startTimeTick = HAL_GetTick();
  7057. Charger.cycle_info.startDateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year;
  7058. Charger.cycle_info.startDateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month;
  7059. Charger.cycle_info.startDateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day;
  7060. Charger.cycle_info.startDateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour;
  7061. Charger.cycle_info.startDateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min;
  7062. Charger.cycle_info.startDateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec;
  7063. Charger.cycle_info.meterStart = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total;
  7064. }
  7065. }
  7066. /*
  7067. * TODO:
  7068. * 1. Check socket-E detect pin to determine charging mdoe
  7069. */
  7070. #ifdef MODIFY_CPTASK_TYPE_E
  7071. if (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn())
  7072. #else
  7073. //if((Charger.CP_State == SYSTEM_STATE_A) && HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin))
  7074. #endif
  7075. {
  7076. Charger.isOnSocketE = ON;
  7077. #ifdef MODIFY_CPTASK_TYPE_E
  7078. Charger.m_OutpMode = OUTPMODE_TYPEE;
  7079. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  7080. #endif
  7081. setChargerMode(MODE_CHARGING);
  7082. if (Charger.isSetStartTime == ON)
  7083. {
  7084. Charger.cycle_info.startTimeTick = HAL_GetTick();
  7085. Charger.cycle_info.startDateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year;
  7086. Charger.cycle_info.startDateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month;
  7087. Charger.cycle_info.startDateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day;
  7088. Charger.cycle_info.startDateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour;
  7089. Charger.cycle_info.startDateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min;
  7090. Charger.cycle_info.startDateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec;
  7091. Charger.cycle_info.meterStart = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total;
  7092. }
  7093. }
  7094. if(Charger.CP_State == SYSTEM_STATE_B)
  7095. {
  7096. Charger.isCP_in_B = ON ;
  7097. setLedMotion(LED_ACTION_CONNECTED);
  7098. }
  7099. //RFID remove gun
  7100. if ((Charger.cycle_info.StartType == START_METHOD_RFID) && (Charger.CP_State == SYSTEM_STATE_A) && (Charger.isCP_in_B == ON))
  7101. {
  7102. Charger.isCP_in_B = OFF ;
  7103. setChargerMode(MODE_IDLE);
  7104. }
  7105. //FREE remove gun
  7106. if ((Charger.cycle_info.StartType == START_METHOD_CP) && Charger.CP_State == SYSTEM_STATE_A)
  7107. {
  7108. setChargerMode(MODE_IDLE);
  7109. }
  7110. #ifdef MODIFY_CPTASK_TYPE_E
  7111. //Type E remove plug
  7112. if ((Charger.cycle_info.StartType == START_METHOD_TYPEE) && !IsTypeEPlugIn())
  7113. {
  7114. setChargerMode(MODE_IDLE);
  7115. }
  7116. #endif
  7117. break;
  7118. case MODE_CHARGING:
  7119. //=============================( MODIFY_CPTASK_TYPE_E / MODE_CHARGING )
  7120. if(isModeChange())
  7121. {
  7122. #ifdef MODIFY_CPTASK_CSU_0_1_CHARGE_MODE
  7123. CpTask_CtrlCpPwm_P0();
  7124. #endif
  7125. setLedMotion(LED_ACTION_CHARGING);
  7126. #ifdef FUNC_PTB_METER_WM3M4C
  7127. if (Charger.m_pWM3M4C != NULL)
  7128. {
  7129. Charger.m_pWM3M4C->m_bTrigBegCharge = HTK_TRUE;
  7130. }
  7131. #endif
  7132. }
  7133. if (
  7134. #ifdef MODIFY_AW_CP_TASK_CSU_0_1_CHARGING_MODE_STOP_WITHOUT_STATE_C
  7135. (!Charger.isOnSocketE && Charger.CP_State!=SYSTEM_STATE_C) ||
  7136. #else
  7137. ((!Charger.isOnSocketE && Charger.CP_State!=SYSTEM_STATE_C) && (Charger.CP_State != SYSTEM_STATE_UNKNOWN)) ||
  7138. #endif
  7139. #ifdef MODIFY_CPTASK_TYPE_E
  7140. ((Charger.isOnSocketE) && !IsTypeEPlugIn()) ||
  7141. #else
  7142. //((Charger.isOnSocketE) && !HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)) ||
  7143. #endif
  7144. ((Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP)?Charger.rfid.op_bits.reqStop:0)
  7145. )
  7146. {
  7147. setChargerMode(MODE_STOP);
  7148. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7149. #ifdef MODIFY_CPTASK_TYPE_E
  7150. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7151. #endif
  7152. }
  7153. else
  7154. {
  7155. #ifdef MODIFY_CPTASK_TYPE_E
  7156. if (Charger.m_OutpMode == OUTPMODE_CPGUN && Charger.CP_State == SYSTEM_STATE_C)
  7157. {
  7158. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  7159. }
  7160. else if (Charger.m_OutpMode == OUTPMODE_TYPEE && Charger.isOnSocketE && IsTypeEPlugIn())
  7161. {
  7162. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_ON;
  7163. }
  7164. #else
  7165. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  7166. #endif
  7167. duration_delta = (HAL_GetTick() - Charger.cycle_info.startTimeTick);
  7168. Charger.cycle_info.Duration = duration_delta;
  7169. Charger.cycle_info.Power_Consumption = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total - Charger.cycle_info.meterStart;
  7170. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  7171. CpTask_CtrlCpPwm_P1();
  7172. #endif
  7173. }
  7174. break;
  7175. case MODE_STOP:
  7176. //=============================( MODIFY_CPTASK_TYPE_E / MODE_STOP )
  7177. if(isModeChange())
  7178. {
  7179. if ((Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP) && Charger.rfid.op_bits.reqStop)
  7180. {
  7181. osDelay(LED_RFID_TIME); // for Buzzer and RFID /Fail LED use
  7182. }
  7183. setLedMotion(LED_ACTION_STOP);
  7184. Charger.isCP_in_B = OFF ;
  7185. Charger.is_RFIDKeepCharger = ON ;
  7186. Charger.isSetStartTime = OFF ;
  7187. }
  7188. if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP)
  7189. {
  7190. //GB
  7191. if(Charger.CP_State == SYSTEM_STATE_A)
  7192. {
  7193. Charger.cycle_info.endTimeTick = HAL_GetTick();
  7194. #ifndef FUNC_METER_IC_HISTORY
  7195. recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
  7196. #endif
  7197. Charger.rfid.op_bits.reqStop = OFF;
  7198. setChargerMode(MODE_IDLE);
  7199. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7200. timerDisable(TIMER_IDX_RFID_RELAY_OFF);
  7201. Charger.isCP_in_B = OFF ;
  7202. Charger.is_RFIDKeepCharger = OFF ;
  7203. Charger.cycle_info.StartType = START_METHOD_NONE;
  7204. }
  7205. else
  7206. {
  7207. //rfid close PWM and relay
  7208. if ((Charger.rfid.op_bits.reqStop == ON)&&Charger.cycle_info.StartType == START_METHOD_RFID)
  7209. {
  7210. Charger.rfid.op_bits.reqStop = OFF;
  7211. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm
  7212. timerEnable( TIMER_IDX_RFID_RELAY_OFF, 3000); //is set wait 3 sec
  7213. Charger.is_RFIDKeepCharger = OFF ;
  7214. }
  7215. if (timer[TIMER_IDX_RFID_RELAY_OFF].isAlarm == ON) //is wait 3 sec
  7216. {
  7217. timerDisable(TIMER_IDX_RFID_RELAY_OFF);
  7218. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7219. #ifdef MODIFY_CPTASK_TYPE_E
  7220. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7221. #endif
  7222. setChargerMode(MODE_IDLE);
  7223. Charger.cycle_info.StartType = START_METHOD_NONE;
  7224. }
  7225. //cp close or open PWM
  7226. if((Charger.CP_State == SYSTEM_STATE_B))
  7227. {
  7228. timerDisable(TIMER_IDX_RFID_RELAY_OFF);
  7229. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7230. #ifdef MODIFY_CPTASK_TYPE_E
  7231. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7232. #endif
  7233. Charger.isCP_in_B = ON ;
  7234. }
  7235. else if (Charger.CP_State == SYSTEM_STATE_C )
  7236. {
  7237. if ( Charger.isCP_in_B == ON && Charger.is_RFIDKeepCharger == ON)
  7238. {
  7239. Charger.is_RFIDKeepCharger = OFF ;
  7240. Charger.isCP_in_B = OFF ;
  7241. Charger.isTestLeakModule = ON ;
  7242. #ifdef TRIM_CCID_SELFTEST
  7243. Proc_CCID_SelfTest();
  7244. #endif
  7245. //check Leak test pass
  7246. if (Charger.Test_LeakModuleisPass)
  7247. {
  7248. timerEnable(TIMER_IDX_CP, 180000);
  7249. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  7250. CpTask_CtrlCpPwm_P0();
  7251. #endif
  7252. setChargerMode(MODE_CHARGING);
  7253. DEBUG_INFO("Leak module self test pass before charging.\r\n");
  7254. }
  7255. else
  7256. {
  7257. Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL;
  7258. DEBUG_INFO("Leak module self test fail before charging.\r\n");
  7259. Charger.counter.LEAK_MODULE.retry ++ ;
  7260. if (Charger.counter.LEAK_MODULE.retry >=2)
  7261. {
  7262. Charger.counter.LEAK_MODULE.isLatch = ON ;
  7263. }
  7264. }
  7265. osDelay(300);
  7266. Charger.isTestLeakModule = OFF ;
  7267. }
  7268. }
  7269. }
  7270. }
  7271. else if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_FREE)
  7272. {
  7273. if (Charger.CP_State == SYSTEM_STATE_A)
  7274. {
  7275. Charger.cycle_info.endTimeTick = HAL_GetTick();
  7276. #ifndef FUNC_METER_IC_HISTORY
  7277. recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
  7278. #endif
  7279. Charger.ble.isRequestOff = OFF;
  7280. Charger.rfid.op_bits.reqStop = OFF;
  7281. setChargerMode(MODE_IDLE);
  7282. }
  7283. else
  7284. {
  7285. if (Charger.CP_State == SYSTEM_STATE_B)
  7286. {
  7287. Charger.isCP_in_B = ON ;
  7288. }
  7289. if((Charger.CP_State == SYSTEM_STATE_C))
  7290. {
  7291. setChargerMode(MODE_CHARGING);
  7292. }
  7293. }
  7294. }
  7295. break;
  7296. case MODE_ALARM:
  7297. //=============================( MODIFY_CPTASK_TYPE_E / MODE_ALARM )
  7298. if(isModeChange())
  7299. {
  7300. Charger.isSetStartTime = OFF ;
  7301. //clear blink time , Prevent red light from being snatched by others
  7302. disblinkerTime (BLINKER_IDX_LED) ;
  7303. }
  7304. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7305. #ifdef MODIFY_CPTASK_TYPE_E
  7306. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7307. #endif
  7308. //Set alarm led
  7309. if ((Charger.Alarm_Code != Charger.Alarm_Code_before) && (blinker[BLINKER_IDX_LED].blinkisFinish))
  7310. {
  7311. setLedMotion(LED_ACTION_ALARM);
  7312. Charger.Alarm_Code_before = Charger.Alarm_Code ;
  7313. }
  7314. #ifdef FUNC_MODE_ALARM_TO_MODE_DEBUG
  7315. if (Charger.isDebugEnable && Charger.Alarm_Code == 0)
  7316. {
  7317. setChargerMode(MODE_DEBUG);
  7318. }
  7319. else
  7320. #endif
  7321. if(Charger.Alarm_Code == 0x00)
  7322. {
  7323. Charger.Alarm_Code_before = Charger.Alarm_Code ;
  7324. if (Charger.Mode_Before_Alarm == MODE_CHARGING) // in charging mode
  7325. {
  7326. if(Charger.CP_State == SYSTEM_STATE_A) // to idle
  7327. {
  7328. Charger.cycle_info.endTimeTick = HAL_GetTick();
  7329. #ifndef FUNC_METER_IC_HISTORY
  7330. recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
  7331. #endif
  7332. Charger.rfid.op_bits.reqStop = OFF;
  7333. Charger.ble.isRequestOff = OFF;
  7334. setChargerMode(MODE_IDLE);
  7335. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7336. #ifdef MODIFY_CPTASK_TYPE_E
  7337. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7338. #endif
  7339. timerDisable(TIMER_IDX_RFID_RELAY_OFF);
  7340. Charger.isCP_in_B = OFF ;
  7341. Charger.is_RFIDKeepCharger = OFF ;
  7342. Charger.cycle_info.StartType = START_METHOD_NONE;
  7343. }
  7344. else // to handshake
  7345. {
  7346. setChargerMode(MODE_HANDSHAKE);
  7347. Charger.isCP_in_B = ON ;
  7348. setLedMotion(LED_ACTION_CONNECTED);
  7349. }
  7350. }
  7351. else if(Charger.Mode_Before_Alarm == MODE_STOP) // in stop mode
  7352. {
  7353. if(Charger.CP_State == SYSTEM_STATE_A) // to idle
  7354. {
  7355. Charger.cycle_info.endTimeTick = HAL_GetTick();
  7356. #ifndef FUNC_METER_IC_HISTORY
  7357. recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
  7358. #endif
  7359. Charger.rfid.op_bits.reqStop = OFF;
  7360. setChargerMode(MODE_IDLE);
  7361. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7362. #ifdef MODIFY_CPTASK_TYPE_E
  7363. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7364. #endif
  7365. timerDisable(TIMER_IDX_RFID_RELAY_OFF);
  7366. Charger.isCP_in_B = OFF ;
  7367. Charger.is_RFIDKeepCharger = OFF ;
  7368. Charger.cycle_info.StartType = START_METHOD_NONE;
  7369. }
  7370. else if ((Charger.CP_State == SYSTEM_STATE_B) && (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP)) // OCPP
  7371. {
  7372. if ( ( ((Charger.cycle_info.StartType == START_METHOD_BLE) && (Charger.is_BLEKeepCharger == ON))|| // to handshake
  7373. ((Charger.cycle_info.StartType == START_METHOD_RFID) && (Charger.is_RFIDKeepCharger == ON)) ) &&
  7374. ( Charger.isCP_in_B == ON ) )
  7375. {
  7376. setChargerMode(MODE_HANDSHAKE);
  7377. setLedMotion(LED_ACTION_CONNECTED);
  7378. }
  7379. else //to stop
  7380. {
  7381. setChargerMode(MODE_STOP);
  7382. }
  7383. }
  7384. else if ((Charger.CP_State == SYSTEM_STATE_B) && (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_FREE)) //Free
  7385. {
  7386. if ( Charger.isCP_in_B == ON ) // to handshake
  7387. {
  7388. setChargerMode(MODE_HANDSHAKE);
  7389. setLedMotion(LED_ACTION_CONNECTED);
  7390. }
  7391. else //to stop
  7392. {
  7393. setChargerMode(MODE_STOP);
  7394. }
  7395. }
  7396. else //to stop
  7397. {
  7398. setChargerMode(MODE_STOP);
  7399. }
  7400. }
  7401. else // idle
  7402. {
  7403. if(timer[TIMER_IDX_STATE_E].isAlarm == ON)
  7404. {
  7405. setChargerMode(MODE_IDLE);
  7406. }
  7407. }
  7408. }
  7409. break;
  7410. case MODE_MAINTAIN:
  7411. //=============================( MODIFY_CPTASK_TYPE_E / MODE_MAINTAIN )
  7412. if(isModeChange())
  7413. {}
  7414. break;
  7415. case MODE_DEBUG:
  7416. //=============================( MODIFY_CPTASK_TYPE_E / MODE_DEBUG )
  7417. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  7418. if(isModeChange())
  7419. {
  7420. setLedMotion(LED_ACTION_DEBUG);
  7421. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC
  7422. timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_ON_SEC * 1000);
  7423. #else
  7424. timerEnable(TIMER_IDX_DEBUG, 2000);
  7425. #endif
  7426. }
  7427. if (timer[TIMER_IDX_DEBUG].isAlarm &&
  7428. Charger.Alarm_Code == 0 &&
  7429. Charger.CP_State == SYSTEM_STATE_C)
  7430. {
  7431. if (Charger.Relay_Action == GPIO_RELAY_ACTION_ON)
  7432. {
  7433. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7434. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC
  7435. timerRefresh(TIMER_IDX_DEBUG);
  7436. timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_OFF_SEC * 1000);
  7437. #else
  7438. timerRefresh(TIMER_IDX_DEBUG);
  7439. #endif
  7440. }
  7441. else if (Charger.Relay_Action == GPIO_RELAY_ACTION_OFF)
  7442. {
  7443. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  7444. #ifdef FUNC_MODE_DEBUG_REC_RELAY_ON_TIMES
  7445. Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes++;
  7446. Charger.memory.EVSE_Config.op_bits.update = ON;
  7447. #endif
  7448. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC
  7449. timerRefresh(TIMER_IDX_DEBUG);
  7450. timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_ON_SEC * 1000);
  7451. #else
  7452. timerRefresh(TIMER_IDX_DEBUG);
  7453. #endif
  7454. }
  7455. }
  7456. #else //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  7457. if(isModeChange())
  7458. {
  7459. setLedMotion(LED_ACTION_DEBUG);
  7460. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  7461. timerEnable(TIMER_IDX_DEBUG, 1000);
  7462. }
  7463. if(timer[TIMER_IDX_DEBUG].isAlarm || (Charger.Alarm_Code>0))
  7464. {
  7465. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7466. #ifdef MODIFY_CPTASK_TYPE_E
  7467. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7468. #endif
  7469. Charger.isDebugModeCPtest = ON;
  7470. }
  7471. if(Charger.isDebugModeCPtest)
  7472. {
  7473. if(Charger.CP_State == SYSTEM_STATE_A)
  7474. {
  7475. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7476. #ifdef MODIFY_CPTASK_TYPE_E
  7477. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7478. #endif
  7479. Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent;
  7480. #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE
  7481. Charger.AC_MaxChargingCurrentOrDuty = Charger.maxRatingCurrent;
  7482. #endif
  7483. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  7484. }
  7485. else if (Charger.CP_State == SYSTEM_STATE_B)
  7486. {
  7487. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7488. #ifdef MODIFY_CPTASK_TYPE_E
  7489. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7490. #endif
  7491. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  7492. CpTask_CtrlCpPwm_P1();
  7493. #endif
  7494. }
  7495. else if (Charger.CP_State == SYSTEM_STATE_C)
  7496. {
  7497. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  7498. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  7499. CpTask_CtrlCpPwm_P1();
  7500. #endif
  7501. }
  7502. }
  7503. #endif //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  7504. break;
  7505. }
  7506. }
  7507. else if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU)
  7508. {
  7509. //=============================( MODIFY_CPTASK_TYPE_E )==============================[ WITH CSU ]
  7510. /*
  7511. MCU control mdoe with CSU
  7512. */
  7513. if (!Charger.am3352.isRequestOn)
  7514. {
  7515. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  7516. if (Charger.Mode != MODE_DEBUG)
  7517. {
  7518. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7519. }
  7520. #else
  7521. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7522. #endif //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  7523. }
  7524. #ifdef MODIFY_CPTASK_HEAD
  7525. Proc_CpTaskHead(HTK_TRUE);
  7526. #endif
  7527. switch(Charger.Mode)
  7528. {
  7529. case MODE_INITIAL:
  7530. //=============================( MODIFY_CPTASK_TYPE_E / MODE_INITIAL )
  7531. setLedMotion(LED_ACTION_INIT);
  7532. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  7533. HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port, OUT_Leak_Test_Pin, GPIO_PIN_SET); // for VAC LeakModule use
  7534. #ifdef FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT
  7535. Charger.m_CSU_RxTick = HAL_GetTick();
  7536. #endif
  7537. if (Charger.ModelReadisOK ==PASS)
  7538. {
  7539. getRotarySwitchSetting( );
  7540. getGridTypeSwitchSetting( );
  7541. Charger.isTestLeakModule = ON ;
  7542. #ifdef FUNC_AUTO_MODIFY_CCID_MODULE
  7543. if (AutoModifyCCID() == PASS)
  7544. #else
  7545. if(Test_LeakModule() == PASS)
  7546. #endif
  7547. {
  7548. DEBUG_INFO("Leak module self test pass when initial.\r\n");
  7549. osDelay(1000);
  7550. if(Charger.isDebugEnable)
  7551. setChargerMode(MODE_DEBUG);
  7552. else
  7553. {
  7554. setChargerMode(MODE_IDLE);
  7555. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  7556. // Cold load pick up check
  7557. if((Charger.CP_State == SYSTEM_STATE_A) && Charger.memory.coldLoadPickUp.data.item.isEnable)
  7558. {
  7559. #ifndef FUNC_METER_IC_HISTORY
  7560. recordChargingHis(OFF, END_STATUS_CODE_DROP);
  7561. #endif
  7562. Charger.memory.coldLoadPickUp.data.item.isEnable = OFF;
  7563. Charger.memory.coldLoadPickUp.op_bits.update = ON;
  7564. }
  7565. }
  7566. }
  7567. }
  7568. else
  7569. {
  7570. Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL;
  7571. DEBUG_INFO("Leak module self test fail when initial.\r\n");
  7572. Charger.counter.LEAK_MODULE.isLatch = ON ;
  7573. }
  7574. Charger.isTestLeakModule = OFF ;
  7575. }
  7576. break;
  7577. case MODE_IDLE:
  7578. //=============================( MODIFY_CPTASK_TYPE_E / MODE_IDLE )
  7579. if(isModeChange())
  7580. {
  7581. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7582. #ifdef MODIFY_SOCKET_E_OCP_USE_MAX_CHARGING_CURRENT
  7583. Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent;
  7584. #else
  7585. //Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent; //need CSU command change
  7586. #endif
  7587. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  7588. Charger.isSetStartTime = ON ;
  7589. Charger.isOnSocketE = OFF;
  7590. #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY
  7591. Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE;
  7592. #endif
  7593. #ifdef FUNC_CCS
  7594. Charger.m_bRunCCS = 0;
  7595. Charger.m_bGotCsuCpDutyCmd = 0;
  7596. #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS
  7597. Charger.m_bPassGotCsuCpDutyCmd = 0;
  7598. #endif
  7599. #endif //FUNC_CCS
  7600. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  7601. if (Charger.m_bUseGunLock)
  7602. {
  7603. Charger.m_GunLock_Counter = 0;
  7604. Charger.m_GunUnlock_Counter = 0;
  7605. }
  7606. #endif
  7607. #ifdef FUNC_AX32_USE_AS_1P_MODEL
  7608. Charger.m_b3PhaseModelButUse1PhaseOnly = AX32_Is_3PModel_Run1P();
  7609. #endif
  7610. #ifdef FUNC_SYSTEM_KEEP_INFO
  7611. if (g_SystemKeepInfo.m_bUsed == HTK_TRUE)
  7612. {
  7613. g_SystemKeepInfo.m_bUsed = HTK_FALSE;
  7614. }
  7615. #endif
  7616. }
  7617. #ifdef FUNC_SYSTEM_KEEP_INFO
  7618. if (
  7619. (Charger.CP_State != SYSTEM_STATE_A) ||
  7620. (
  7621. (Charger.CP_State == SYSTEM_STATE_A) && IsTypeEPlugIn()
  7622. )
  7623. )
  7624. {
  7625. if (g_SystemKeepInfo.m_bUsed == HTK_FALSE)
  7626. {
  7627. g_SystemKeepInfo.m_bUsed = HTK_TRUE;
  7628. if (SystemKeepInfo_Check(&g_SystemKeepInfo))
  7629. {
  7630. if (g_SystemKeepInfo.m_CsuIsRequestOn)
  7631. {
  7632. Charger.am3352.isRequestOn = g_SystemKeepInfo.m_CsuIsRequestOn;
  7633. user_pwm_setvalue(PWM_CH_CP, g_SystemKeepInfo.m_CpPwmVal);
  7634. Charger.m_bGotCsuCpDutyCmd = 1;
  7635. DEBUG_INFO("#<RESET_TO_CHARGE> CP_PWM => %d\r\n", g_SystemKeepInfo.m_CpPwmVal);
  7636. SystemKeepInfo_Display(&g_SystemKeepInfo);
  7637. }
  7638. }
  7639. }
  7640. }
  7641. #endif //FUNC_SYSTEM_KEEP_INFO
  7642. if (Charger.am3352.isRequestOn &&
  7643. #ifdef FUNC_CCS
  7644. #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS
  7645. (Charger.m_bGotCsuCpDutyCmd == 1 || Charger.m_bPassGotCsuCpDutyCmd == 1) &&
  7646. #else
  7647. Charger.m_bGotCsuCpDutyCmd == 1 &&
  7648. #endif
  7649. #endif //FUNC_CCS
  7650. (Charger.CP_State != SYSTEM_STATE_A))
  7651. {
  7652. setChargerMode(MODE_HANDSHAKE);
  7653. }
  7654. #ifdef MODIFY_CPTASK_TYPE_E
  7655. if (
  7656. (Charger.am3352.isRequestOn) &&
  7657. (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn())
  7658. )
  7659. {
  7660. setChargerMode(MODE_HANDSHAKE);
  7661. }
  7662. #endif
  7663. break;
  7664. case MODE_HANDSHAKE:
  7665. //=============================( MODIFY_CPTASK_TYPE_E / MODE_HANDSHAKE )
  7666. if(isModeChange())
  7667. {
  7668. Charger.isCP_in_B = OFF ;
  7669. Charger.isTestLeakModule = ON ;
  7670. #ifdef TRIM_CCID_SELFTEST
  7671. Proc_CCID_SelfTest();
  7672. #endif
  7673. //check Leak test pass
  7674. if (Charger.Test_LeakModuleisPass)
  7675. {
  7676. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  7677. #ifdef MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE
  7678. if (Charger.m_bSafetyRegulationGB)
  7679. {
  7680. if(Charger.CP_State == SYSTEM_STATE_B || Charger.CP_State == SYSTEM_STATE_C)
  7681. {
  7682. CpTask_CtrlCpPwm_P0();
  7683. }
  7684. }
  7685. else
  7686. {
  7687. CpTask_CtrlCpPwm_P0();
  7688. }
  7689. #endif //MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE
  7690. #else //MODIFY_CP_TASK_CTRL_CP_PWM
  7691. CpTask_CtrlCpPwm_P0();
  7692. #endif //MODIFY_CP_TASK_CTRL_CP_PWM
  7693. osDelay(300);
  7694. DEBUG_INFO("Leak module self test pass before charging.\r\n");
  7695. }
  7696. else
  7697. {
  7698. Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL;
  7699. DEBUG_INFO("Leak module self test fail before charging.\r\n");
  7700. }
  7701. Charger.isTestLeakModule = OFF ;
  7702. }
  7703. if(Charger.CP_State == SYSTEM_STATE_C)
  7704. {
  7705. #ifdef MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE
  7706. if (Charger.m_bSafetyRegulationGB)
  7707. {
  7708. Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE;
  7709. if (Charger.m_CP_CurPWM == PWM_DUTY_FULL)
  7710. {
  7711. CpTask_CtrlCpPwm_P0();
  7712. }
  7713. }
  7714. #endif
  7715. setChargerMode(MODE_CHARGING);
  7716. timerDisable(TIMER_IDX_CP);
  7717. if (Charger.isSetStartTime == ON)
  7718. {
  7719. Charger.cycle_info.startTimeTick = HAL_GetTick();
  7720. Charger.cycle_info.startDateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year;
  7721. Charger.cycle_info.startDateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month;
  7722. Charger.cycle_info.startDateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day;
  7723. Charger.cycle_info.startDateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour;
  7724. Charger.cycle_info.startDateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min;
  7725. Charger.cycle_info.startDateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec;
  7726. Charger.cycle_info.meterStart = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total;
  7727. }
  7728. }
  7729. if (Charger.CP_State == SYSTEM_STATE_B)
  7730. {
  7731. #ifdef MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE
  7732. if (Charger.m_bSafetyRegulationGB)
  7733. {
  7734. Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE;
  7735. if (Charger.m_CP_CurPWM == PWM_DUTY_FULL)
  7736. {
  7737. CpTask_CtrlCpPwm_P0();
  7738. }
  7739. }
  7740. #endif
  7741. Charger.isCP_in_B = ON ;
  7742. }
  7743. #ifdef MODIFY_CPTASK_TYPE_E
  7744. if (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn())
  7745. #else
  7746. //if((Charger.CP_State == SYSTEM_STATE_A) && HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin))
  7747. #endif
  7748. {
  7749. Charger.isOnSocketE = ON;
  7750. setChargerMode(MODE_CHARGING);
  7751. timerDisable(TIMER_IDX_CP);
  7752. if (Charger.isSetStartTime == ON)
  7753. {
  7754. Charger.cycle_info.startTimeTick = HAL_GetTick();
  7755. Charger.cycle_info.startDateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year;
  7756. Charger.cycle_info.startDateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month;
  7757. Charger.cycle_info.startDateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day;
  7758. Charger.cycle_info.startDateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour;
  7759. Charger.cycle_info.startDateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min;
  7760. Charger.cycle_info.startDateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec;
  7761. Charger.cycle_info.meterStart = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total;
  7762. }
  7763. }
  7764. if(((Charger.CP_State == SYSTEM_STATE_A) && Charger.isCP_in_B) || !Charger.am3352.isRequestOn)
  7765. {
  7766. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm
  7767. setChargerMode(MODE_IDLE);
  7768. timerDisable(TIMER_IDX_CP);
  7769. }
  7770. #ifdef MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE
  7771. if (Charger.m_bSafetyRegulationGB)
  7772. {
  7773. if (
  7774. (Charger.CP_State == SYSTEM_STATE_D || Charger.CP_State == SYSTEM_STATE_E) &&
  7775. (Charger.am3352.isRequestOn)
  7776. )
  7777. {
  7778. Charger.m_bBlockCsuCpPwmDuty = HTK_ENABLE;
  7779. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  7780. }
  7781. }
  7782. #endif
  7783. break;
  7784. case MODE_CHARGING:
  7785. //=============================( MODIFY_CPTASK_TYPE_E / MODE_CHARGING )
  7786. if(isModeChange())
  7787. {
  7788. #ifdef MODIFY_CPTASK_CSU_0_1_CHARGE_MODE
  7789. CpTask_CtrlCpPwm_P0();
  7790. #endif
  7791. }
  7792. if (
  7793. #ifdef MODIFY_AW_CP_TASK_CSU_0_1_CHARGING_MODE_STOP_WITHOUT_STATE_C
  7794. (!Charger.isOnSocketE && Charger.CP_State != SYSTEM_STATE_C) ||
  7795. #else
  7796. ((!Charger.isOnSocketE) && (Charger.CP_State != SYSTEM_STATE_C) && (Charger.CP_State != SYSTEM_STATE_UNKNOWN)) ||
  7797. #endif
  7798. #ifdef MODIFY_CPTASK_TYPE_E
  7799. (Charger.isOnSocketE && !IsTypeEPlugIn()) ||
  7800. #else
  7801. //((Charger.isOnSocketE) && !HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)) ||
  7802. #endif
  7803. !Charger.am3352.isRequestOn
  7804. )
  7805. {
  7806. setChargerMode(MODE_STOP);
  7807. if (Charger.CP_State != SYSTEM_STATE_C)
  7808. {
  7809. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7810. #ifdef MODIFY_MODE_CHARGING_STOP_PWM_WITHOUT_OK_STATE
  7811. if (Charger.m_bSafetyRegulationGB)
  7812. {
  7813. if (
  7814. (Charger.CP_State == SYSTEM_STATE_D || Charger.CP_State == SYSTEM_STATE_E) &&
  7815. (Charger.am3352.isRequestOn)
  7816. )
  7817. {
  7818. Charger.m_bBlockCsuCpPwmDuty = HTK_ENABLE;
  7819. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  7820. }
  7821. }
  7822. #endif //MODIFY_MODE_CHARGING_STOP_PWM_WITHOUT_OK_STATE
  7823. }
  7824. }
  7825. #ifdef FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT
  7826. else if (HTK_IsTimeout(Charger.m_CSU_RxTick, CSU_CMD_TIMEOUT_SEC * 1000))
  7827. {
  7828. if (Charger.Relay_Action != GPIO_RELAY_ACTION_OFF)
  7829. {
  7830. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7831. XP("#<CSU_TIMEOUT> RELAY => OFF\r\n");
  7832. }
  7833. if (Charger.SE_Relay_Action != GPIO_SE_RELAY_ACTION_OFF)
  7834. {
  7835. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7836. XP("#<CSU_TIMEOUT> RELAY_SE => OFF\r\n");
  7837. }
  7838. #ifdef FUNC_REQUEST_OFF_WHEN_CSU_CMD_TIMEOUT
  7839. if (Charger.am3352.isRequestOn != OFF)
  7840. {
  7841. Charger.am3352.isRequestOn = OFF;
  7842. XP("#<CSU_TIMEOUT> REQUEST => OFF\r\n");
  7843. }
  7844. #endif
  7845. }
  7846. #endif //FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT
  7847. else
  7848. {
  7849. duration_delta = (HAL_GetTick() - Charger.cycle_info.startTimeTick);
  7850. Charger.cycle_info.Duration = duration_delta;
  7851. Charger.cycle_info.Power_Consumption = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total - Charger.cycle_info.meterStart;
  7852. }
  7853. break;
  7854. case MODE_STOP:
  7855. //=============================( MODIFY_CPTASK_TYPE_E / MODE_STOP )
  7856. if(isModeChange())
  7857. {
  7858. Charger.isSetStartTime = OFF ;
  7859. Charger.isCP_in_B = OFF ;
  7860. if (!Charger.am3352.isRequestOn) //represent swip card stop charge in 6V
  7861. {
  7862. Charger.rfid.op_bits.reqStop = ON ;
  7863. }
  7864. }
  7865. if(!Charger.am3352.isRequestOn)
  7866. {
  7867. if (Charger.rfid.op_bits.reqStop == ON || (Charger.CP_State == SYSTEM_STATE_B)) //1. swip card stop charge in 6V. , 2.cp-> B then swip card stop charge
  7868. {
  7869. if(Charger.CP_State == SYSTEM_STATE_B)
  7870. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7871. Charger.rfid.op_bits.reqStop = OFF;
  7872. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm
  7873. timerEnable( TIMER_IDX_RFID_RELAY_OFF, 3000); //is set wait 3 sec
  7874. Charger.cycle_info.endTimeTick = HAL_GetTick();
  7875. #ifndef FUNC_METER_IC_HISTORY
  7876. recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
  7877. #endif
  7878. Charger.isCP_in_B = OFF ;
  7879. }
  7880. if (timer[TIMER_IDX_RFID_RELAY_OFF].isAlarm == ON ) //is wait 3 sec
  7881. {
  7882. timerDisable(TIMER_IDX_RFID_RELAY_OFF);
  7883. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7884. #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY
  7885. Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE;
  7886. #endif
  7887. setChargerMode(MODE_IDLE);
  7888. Charger.cycle_info.StartType = START_METHOD_NONE;
  7889. }
  7890. }
  7891. else if
  7892. (
  7893. (!Charger.isOnSocketE && Charger.CP_State == SYSTEM_STATE_A) ||
  7894. #ifdef MODIFY_CPTASK_TYPE_E
  7895. (Charger.isOnSocketE && !IsTypeEPlugIn())
  7896. #else
  7897. //(Charger.isOnSocketE && !HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin))
  7898. #endif
  7899. )
  7900. {
  7901. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm
  7902. Charger.cycle_info.endTimeTick = HAL_GetTick();
  7903. #ifndef FUNC_METER_IC_HISTORY
  7904. recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
  7905. #endif
  7906. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7907. #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY
  7908. Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE;
  7909. #endif
  7910. setChargerMode(MODE_IDLE);
  7911. Charger.isCP_in_B = OFF ;
  7912. }
  7913. else // Charger.am3352.isRequestOn == 1
  7914. {
  7915. if((Charger.CP_State == SYSTEM_STATE_B))
  7916. {
  7917. timerDisable(TIMER_IDX_RFID_RELAY_OFF);
  7918. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7919. Charger.isCP_in_B = ON ;
  7920. }
  7921. if((Charger.CP_State == SYSTEM_STATE_C) && (!Charger.am3352.isRequestOff) )
  7922. {
  7923. #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY
  7924. Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE;
  7925. #endif
  7926. setChargerMode(MODE_HANDSHAKE);
  7927. }
  7928. #ifdef MODIFY_MODE_STOP_STOP_PWM_WITHOUT_OK_STATE
  7929. if (Charger.m_bSafetyRegulationGB)
  7930. {
  7931. if (
  7932. (Charger.CP_State == SYSTEM_STATE_D || Charger.CP_State == SYSTEM_STATE_E) &&
  7933. (Charger.am3352.isRequestOn)
  7934. )
  7935. {
  7936. Charger.m_bBlockCsuCpPwmDuty = HTK_ENABLE;
  7937. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  7938. }
  7939. if ((Charger.CP_State == SYSTEM_STATE_B) && (Charger.am3352.isRequestOn))
  7940. {
  7941. Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE;
  7942. if (Charger.m_CP_CurPWM == PWM_DUTY_FULL)
  7943. {
  7944. CpTask_CtrlCpPwm_P0();
  7945. }
  7946. }
  7947. }
  7948. #endif //MODIFY_MODE_STOP_STOP_PWM_WITHOUT_OK_STATE
  7949. }
  7950. break;
  7951. case MODE_ALARM:
  7952. //=============================( MODIFY_CPTASK_TYPE_E / MODE_ALARM )
  7953. if(isModeChange())
  7954. {
  7955. Charger.isSetStartTime = OFF ;
  7956. if (Charger.CSUisReady == ON )
  7957. {
  7958. //clear blink time , Prevent red light from being snatched by others
  7959. disblinkerTime (BLINKER_IDX_LED) ;
  7960. //clear led Action
  7961. Charger.am3352.LedActionState = 0 ;
  7962. }
  7963. }
  7964. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  7965. #ifdef MODIFY_CPTASK_TYPE_E_CSU_SE_RELAY_AUTO_OFF
  7966. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  7967. #endif
  7968. #ifdef FUNC_MODE_ALARM_TO_MODE_DEBUG
  7969. if (Charger.isDebugEnable && Charger.Alarm_Code == 0)
  7970. {
  7971. setChargerMode(MODE_DEBUG);
  7972. }
  7973. else
  7974. #endif
  7975. if(Charger.Alarm_Code == 0x00)
  7976. {
  7977. Charger.am3352.LedActionState = 0 ;
  7978. if (Charger.Mode_Before_Alarm == MODE_CHARGING) // in charging mode
  7979. {
  7980. #ifdef FUNC_CCS
  7981. #ifdef MODIFY_CPTASK_CSU_MODE_ALARM_GO_HANDSHAKE_WITH_NEW_CONDITION
  7982. if(Charger.CP_State != SYSTEM_STATE_A && Charger.am3352.isRequestOn)
  7983. #else
  7984. if(Charger.CP_State == SYSTEM_STATE_B || Charger.CP_State == SYSTEM_STATE_C)
  7985. #endif
  7986. #else //FUNC_CCS
  7987. if(Charger.CP_State == SYSTEM_STATE_B ) // to handshake
  7988. #endif //FUNC_CCS
  7989. {
  7990. setChargerMode(MODE_HANDSHAKE);
  7991. }
  7992. else // to idle //SYSTEM_STATE_A
  7993. {
  7994. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  7995. setChargerMode(MODE_IDLE);
  7996. }
  7997. }
  7998. else if(Charger.Mode_Before_Alarm == MODE_STOP)
  7999. {
  8000. if (Charger.isCP_in_B == ON) // to handshake
  8001. {
  8002. setChargerMode(MODE_HANDSHAKE);
  8003. }
  8004. else // to stop
  8005. {
  8006. setChargerMode(MODE_STOP);
  8007. }
  8008. }
  8009. else // to idle
  8010. {
  8011. if(timer[TIMER_IDX_STATE_E].isAlarm == ON)
  8012. {
  8013. setChargerMode(MODE_IDLE);
  8014. }
  8015. }
  8016. }
  8017. break;
  8018. case MODE_DEBUG:
  8019. //=============================( MODIFY_CPTASK_TYPE_E / MODE_DEBUG )
  8020. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  8021. if(isModeChange())
  8022. {
  8023. setLedMotion(LED_ACTION_DEBUG);
  8024. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC
  8025. timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_ON_SEC * 1000);
  8026. #else
  8027. timerEnable(TIMER_IDX_DEBUG, 2000);
  8028. #endif
  8029. }
  8030. if (timer[TIMER_IDX_DEBUG].isAlarm &&
  8031. Charger.Alarm_Code == 0 &&
  8032. Charger.CP_State == SYSTEM_STATE_C)
  8033. {
  8034. if (Charger.Relay_Action == GPIO_RELAY_ACTION_ON)
  8035. {
  8036. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  8037. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC
  8038. timerRefresh(TIMER_IDX_DEBUG);
  8039. timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_OFF_SEC * 1000);
  8040. #else
  8041. timerRefresh(TIMER_IDX_DEBUG);
  8042. #endif
  8043. }
  8044. else if (Charger.Relay_Action == GPIO_RELAY_ACTION_OFF)
  8045. {
  8046. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  8047. #ifdef FUNC_MODE_DEBUG_REC_RELAY_ON_TIMES
  8048. Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes++;
  8049. Charger.memory.EVSE_Config.op_bits.update = ON;
  8050. #endif
  8051. #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC
  8052. timerRefresh(TIMER_IDX_DEBUG);
  8053. timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_ON_SEC * 1000);
  8054. #else
  8055. timerRefresh(TIMER_IDX_DEBUG);
  8056. #endif
  8057. }
  8058. }
  8059. #else //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  8060. if(isModeChange())
  8061. {
  8062. setLedMotion(LED_ACTION_DEBUG);
  8063. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  8064. timerEnable(TIMER_IDX_DEBUG, 1000);
  8065. }
  8066. if(timer[TIMER_IDX_DEBUG].isAlarm || (Charger.Alarm_Code>0))
  8067. {
  8068. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  8069. #ifdef MODIFY_CPTASK_TYPE_E
  8070. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  8071. #endif
  8072. Charger.isDebugModeCPtest = ON;
  8073. }
  8074. if(Charger.isDebugModeCPtest)
  8075. {
  8076. if(Charger.CP_State == SYSTEM_STATE_A)
  8077. {
  8078. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  8079. #ifdef MODIFY_CPTASK_TYPE_E
  8080. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  8081. #endif
  8082. Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent;
  8083. #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE
  8084. Charger.AC_MaxChargingCurrentOrDuty = Charger.maxRatingCurrent;
  8085. #endif
  8086. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  8087. }
  8088. else if (Charger.CP_State == SYSTEM_STATE_B)
  8089. {
  8090. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
  8091. #ifdef MODIFY_CPTASK_TYPE_E
  8092. Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF;
  8093. #endif
  8094. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  8095. CpTask_CtrlCpPwm_P1();
  8096. #endif
  8097. }
  8098. else if (Charger.CP_State == SYSTEM_STATE_C)
  8099. {
  8100. Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
  8101. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  8102. CpTask_CtrlCpPwm_P1();
  8103. #endif
  8104. }
  8105. }
  8106. #endif //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE
  8107. break;
  8108. default:
  8109. setChargerMode(MODE_IDLE);
  8110. break;
  8111. }
  8112. }
  8113. else
  8114. {
  8115. /*By Pass Mode*/
  8116. }
  8117. osDelay(1);
  8118. }
  8119. /* USER CODE END StartCpTask */
  8120. }
  8121. /* USER CODE BEGIN Header_StartAlarmTask */
  8122. /**
  8123. * @brief Function implementing the alarmTask thread.
  8124. * @param argument: Not used
  8125. * @retval None
  8126. */
  8127. /* USER CODE END Header_StartAlarmTask */
  8128. void StartAlarmTask(void const * argument)
  8129. {
  8130. /* USER CODE BEGIN StartAlarmTask */
  8131. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  8132. IdleUntilReadAllMemory();
  8133. #endif
  8134. //aalarm
  8135. //timerEnable(TIMER_IDX_PE_DETECT, 30000);
  8136. timerEnable(TIMER_IDX_PE_DETECT, 40000);
  8137. #ifndef RECODE_METER_PRO380
  8138. #ifdef MODIFY_METER_EXT_PRO380
  8139. Charger.m_MeterPRO380.m_LastUpdateTick = HAL_GetTick();
  8140. #endif
  8141. #endif //!RECODE_METER_PRO380
  8142. /* Infinite loop */
  8143. for(;;)
  8144. {
  8145. #ifdef FUNC_MODE_DEBUG_WITH_NORMAL_ALARM_DETECTE
  8146. if(Charger.Mode != MODE_INITIAL)
  8147. #else
  8148. if(Charger.Mode != MODE_INITIAL && Charger.Mode != MODE_DEBUG)
  8149. #endif
  8150. {
  8151. recordAlarmHis();
  8152. #ifdef FUNC_AX32_TRIG_LEAKAGE
  8153. if (Charger.m_b3PhaseModel)
  8154. {
  8155. if (Charger.Alarm_Code & ALARM_RELAY_STATUS && //Relay Welding
  8156. (!HTK_IsInTime(Charger.AlarmRelayWeldingOccurTick, 1000))
  8157. )
  8158. {
  8159. TrigLeakage_Trig();
  8160. TrigLeakage_Proc();
  8161. }
  8162. }
  8163. #endif
  8164. #ifdef FUNC_AX80_ADD_TILT_SENSOR
  8165. #ifdef FUNC_ADD_TILT_SENSOR_MODEL
  8166. if (Charger.m_bUseTiltSensor)
  8167. #else
  8168. if (Charger.m_bModelNameAX80_1P)
  8169. #endif
  8170. {
  8171. if (Charger.Alarm_Code & ALARM_TILT_SENSOR &&
  8172. (!HTK_IsInTime(Charger.AlarmTiltSensorOccurTick, 1000))
  8173. )
  8174. {
  8175. #ifdef FUNC_DISABLE_TILT_SENSOR_FOR_TEST
  8176. if (HTK_IsInTime(Charger.m_BootTick, 1000 * 30))
  8177. {
  8178. Charger.m_bDisableTiltSensorForTest = 1;
  8179. Charger.Alarm_Code &= ~ALARM_TILT_SENSOR;
  8180. DEBUG_ERROR("Alarm tilt sensor fault recover. [TEST MODE WITHOUT TILT SENSOR ALARM]\r\n");
  8181. Charger.counter.TiltSensor.fail = 0;
  8182. }
  8183. else
  8184. {
  8185. TILT_TrigLeakage_Trig();
  8186. TILT_TrigLeakage_Proc();
  8187. }
  8188. #else
  8189. TILT_TrigLeakage_Trig();
  8190. TILT_TrigLeakage_Proc();
  8191. #endif
  8192. }
  8193. }
  8194. #endif //FUNC_AX80_ADD_TILT_SENSOR
  8195. //================================
  8196. // CP fail alarm detect
  8197. //================================
  8198. #ifdef CP_ALARM_PROTECT
  8199. if ((Charger.CP_State == SYSTEM_STATE_UNKNOWN)&&(!(Charger.Alarm_Code & ALARM_MCU_TESTFAIL)))
  8200. {
  8201. #ifdef MODIFY_ALARM_CP_ERROR_RECOVER_USE_RESTORE
  8202. if(!(Charger.Alarm_Code & ALARM_CP_ERROR))
  8203. {
  8204. if (Charger.counter.CP.fail > 1000)
  8205. {
  8206. Charger.counter.CP.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8207. Charger.Alarm_Code |= ALARM_CP_ERROR;
  8208. DEBUG_ERROR("Alarm CP occur.\r\n");
  8209. Charger.counter.CP.restore = 0;
  8210. }
  8211. else
  8212. {
  8213. Charger.counter.CP.fail++;
  8214. }
  8215. }
  8216. #endif //MODIFY_ALARM_CP_ERROR_RECOVER_USE_RESTORE
  8217. }
  8218. #ifdef MODIFY_ALARMTASK_CP_ERROR_RECOVER
  8219. else if (Charger.CP_State != SYSTEM_STATE_UNKNOWN)
  8220. #else
  8221. else if ((Charger.CP_State != SYSTEM_STATE_UNKNOWN)&&(Charger.CP_State!=SYSTEM_STATE_D)&&
  8222. (Charger.CP_State != SYSTEM_STATE_E)&&(Charger.CP_State != SYSTEM_STATE_F))
  8223. #endif
  8224. {
  8225. #ifdef MODIFY_ALARM_CP_ERROR_RECOVER_USE_RESTORE
  8226. if (Charger.Alarm_Code & ALARM_CP_ERROR)
  8227. {
  8228. if (Charger.counter.CP.restore > 1000)
  8229. {
  8230. Charger.Alarm_Code &= ~ALARM_CP_ERROR;
  8231. DEBUG_INFO("Alarm CP recover.\r\n");
  8232. Charger.counter.CP.fail = 0;
  8233. }
  8234. else
  8235. {
  8236. Charger.counter.CP.restore++;
  8237. }
  8238. }
  8239. #endif //MODIFY_ALARM_CP_ERROR_RECOVER_USE_RESTORE
  8240. }
  8241. #ifdef FUNC_ALARM_CP_NEG_ERROR
  8242. if ((!CP_IsInSpec_N12V(&CpDetectionResult))&&(!(Charger.Alarm_Code & ALARM_MCU_TESTFAIL)))
  8243. {
  8244. #ifdef MODIFY_ALARM_CP_NEG_ERROR_RECOVER_USE_RESTORE
  8245. if (!(Charger.Alarm_Code & ALARM_CP_NEG_ERROR))
  8246. {
  8247. if (Charger.counter.CP_Neg.fail > 1000)
  8248. {
  8249. Charger.counter.CP_Neg.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8250. Charger.Alarm_Code |= ALARM_CP_NEG_ERROR;
  8251. DEBUG_ERROR("Alarm CP_NEG occur.\r\n");
  8252. Charger.counter.CP_Neg.restore = 0;
  8253. }
  8254. else
  8255. {
  8256. Charger.counter.CP_Neg.fail++;
  8257. }
  8258. }
  8259. #endif //MODIFY_ALARM_CP_NEG_ERROR_RECOVER_USE_RESTORE
  8260. }
  8261. else
  8262. {
  8263. #ifdef MODIFY_ALARM_CP_NEG_ERROR_RECOVER_USE_RESTORE
  8264. if (Charger.Alarm_Code & ALARM_CP_NEG_ERROR)
  8265. {
  8266. if (Charger.counter.CP_Neg.restore > 1000)
  8267. {
  8268. Charger.Alarm_Code &= ~ALARM_CP_NEG_ERROR;
  8269. DEBUG_INFO("Alarm CP_NEG recover.\r\n");
  8270. Charger.counter.CP_Neg.fail = 0;
  8271. }
  8272. else
  8273. {
  8274. Charger.counter.CP_Neg.restore++;
  8275. }
  8276. }
  8277. #endif //MODIFY_ALARM_CP_NEG_ERROR_RECOVER_USE_RESTORE
  8278. }
  8279. #endif //FUNC_ALARM_CP_NEG_ERROR
  8280. #endif //CP_ALARM_PROTECT
  8281. //================================
  8282. // Over voltage alarm detect
  8283. //================================
  8284. #ifdef OVP_PROTECT
  8285. //--------------------------------
  8286. // L1 Over voltage
  8287. if(Charger.Voltage[0] > ALARM_SPEC_OV)
  8288. {
  8289. if(Charger.counter.L1_OV.fail > 1000)
  8290. {
  8291. Charger.counter.L1_OV.restore = 0 ;
  8292. if(!(Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE))
  8293. {
  8294. Charger.Alarm_Code |= ALARM_L1_OVER_VOLTAGE;
  8295. DEBUG_ERROR("Alarm L1_OV occur.\r\n");
  8296. }
  8297. }
  8298. else
  8299. Charger.counter.L1_OV.fail++;
  8300. }
  8301. else if(Charger.Voltage[0] < (ALARM_SPEC_OV-ALARM_SPEC_OUV_HYSTERESIS))
  8302. {
  8303. if((Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE))
  8304. {
  8305. if (Charger.counter.L1_OV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish)
  8306. {
  8307. Charger.counter.L1_OV.fail = 0 ;
  8308. DEBUG_INFO("Alarm L1_OV is coldpickup ing..... \r\n");
  8309. Charger.counter.L1_OV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF);
  8310. if (Charger.counter.L1_OV.isOccurInCharging)
  8311. {
  8312. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  8313. ColdLoadPickup_Delay("Alarm L1_OV is coldpickup ing..... ");
  8314. #else
  8315. osDelay((rand()%175000)+5000);
  8316. #endif
  8317. }
  8318. Charger.Alarm_Code &= ~ALARM_L1_OVER_VOLTAGE;
  8319. DEBUG_INFO("Alarm L1_OV recover.\r\n");
  8320. }
  8321. else
  8322. {
  8323. Charger.counter.L1_OV.restore++;
  8324. }
  8325. }
  8326. else
  8327. {
  8328. Charger.counter.L1_OV.fail = 0 ;
  8329. Charger.counter.L1_OV.restore = 0 ;
  8330. }
  8331. }
  8332. #ifdef FUNC_AUTO_IGNORE_AC_PHASE
  8333. #ifdef FUNC_AX32_USE_AS_1P_MODEL
  8334. if (Charger.m_b3PhaseModel && !Charger.m_b3PhaseModelButUse1PhaseOnly)
  8335. #else
  8336. if (Charger.m_b3PhaseModel)
  8337. #endif
  8338. {
  8339. #endif
  8340. //--------------------------------
  8341. // L2 Over voltage
  8342. if(Charger.Voltage[1] > ALARM_SPEC_OV)
  8343. {
  8344. if(Charger.counter.L2_OV.fail > 1000)
  8345. {
  8346. Charger.counter.L2_OV.restore = 0 ;
  8347. if(!(Charger.Alarm_Code & ALARM_L2_OVER_VOLTAGE))
  8348. {
  8349. Charger.Alarm_Code |= ALARM_L2_OVER_VOLTAGE;
  8350. DEBUG_ERROR("Alarm L2_OV occur.\r\n");
  8351. }
  8352. }
  8353. else
  8354. Charger.counter.L2_OV.fail++;
  8355. }
  8356. else if(Charger.Voltage[1] < (ALARM_SPEC_OV-ALARM_SPEC_OUV_HYSTERESIS))
  8357. {
  8358. if((Charger.Alarm_Code & ALARM_L2_OVER_VOLTAGE))
  8359. {
  8360. if (Charger.counter.L2_OV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish)
  8361. {
  8362. Charger.counter.L2_OV.fail = 0 ;
  8363. DEBUG_INFO("Alarm L2_OV is coldpickup ing..... \r\n");
  8364. Charger.counter.L2_OV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF);
  8365. if (Charger.counter.L2_OV.isOccurInCharging)
  8366. {
  8367. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  8368. ColdLoadPickup_Delay("Alarm L2_OV is coldpickup ing..... ");
  8369. #else
  8370. osDelay((rand()%175000)+5000);
  8371. #endif
  8372. }
  8373. Charger.Alarm_Code &= ~ALARM_L2_OVER_VOLTAGE;
  8374. DEBUG_INFO("Alarm L2_OV recover.\r\n");
  8375. }
  8376. else
  8377. {
  8378. Charger.counter.L2_OV.restore++;
  8379. }
  8380. }
  8381. else
  8382. {
  8383. Charger.counter.L2_OV.fail = 0 ;
  8384. Charger.counter.L2_OV.restore = 0 ;
  8385. }
  8386. }
  8387. //--------------------------------
  8388. // L3 Over voltage
  8389. if(Charger.Voltage[2] > ALARM_SPEC_OV)
  8390. {
  8391. if(Charger.counter.L3_OV.fail > 1000)
  8392. {
  8393. Charger.counter.L3_OV.restore = 0 ;
  8394. if(!(Charger.Alarm_Code & ALARM_L3_OVER_VOLTAGE))
  8395. {
  8396. Charger.Alarm_Code |= ALARM_L3_OVER_VOLTAGE;
  8397. DEBUG_ERROR("Alarm L3_OV occur.\r\n");
  8398. }
  8399. }
  8400. else
  8401. Charger.counter.L3_OV.fail++;
  8402. }
  8403. else if(Charger.Voltage[2] < (ALARM_SPEC_OV-ALARM_SPEC_OUV_HYSTERESIS))
  8404. {
  8405. if((Charger.Alarm_Code & ALARM_L3_OVER_VOLTAGE))
  8406. {
  8407. if (Charger.counter.L3_OV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish)
  8408. {
  8409. Charger.counter.L3_OV.fail = 0 ;
  8410. DEBUG_INFO("Alarm L3_OV is coldpickup ing..... \r\n");
  8411. Charger.counter.L3_OV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF);
  8412. if (Charger.counter.L3_OV.isOccurInCharging)
  8413. {
  8414. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  8415. ColdLoadPickup_Delay("Alarm L3_OV is coldpickup ing..... ");
  8416. #else
  8417. osDelay((rand()%175000)+5000);
  8418. #endif
  8419. }
  8420. Charger.Alarm_Code &= ~ALARM_L3_OVER_VOLTAGE;
  8421. DEBUG_INFO("Alarm L3_OV recover.\r\n");
  8422. }
  8423. else
  8424. {
  8425. Charger.counter.L3_OV.restore++;
  8426. }
  8427. }
  8428. else
  8429. {
  8430. Charger.counter.L3_OV.fail = 0 ;
  8431. Charger.counter.L3_OV.restore = 0 ;
  8432. }
  8433. }
  8434. #ifdef FUNC_AUTO_IGNORE_AC_PHASE
  8435. }
  8436. #endif
  8437. #endif //OVP_PROTECT
  8438. //================================
  8439. // Under voltage alarm detect
  8440. //================================
  8441. #ifdef UVP_PROTECT
  8442. //--------------------------------
  8443. // L1 Under voltage
  8444. if(Charger.Voltage[0] < ALARM_SPEC_UV)
  8445. {
  8446. if(Charger.counter.L1_UV.fail > 1000)
  8447. {
  8448. Charger.counter.L1_UV.restore = 0 ;
  8449. if(!(Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE))
  8450. {
  8451. Charger.Alarm_Code |= ALARM_L1_UNDER_VOLTAGE;
  8452. DEBUG_ERROR("Alarm L1_UV occur.\r\n");
  8453. //************************
  8454. XP("Charger.Voltage[0] = %d\r\n", Charger.Voltage[0]);
  8455. //************************
  8456. }
  8457. }
  8458. else
  8459. Charger.counter.L1_UV.fail++;
  8460. }
  8461. else if(Charger.Voltage[0] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS))
  8462. {
  8463. if(Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE)
  8464. {
  8465. if (Charger.counter.L1_UV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish)
  8466. {
  8467. Charger.counter.L1_UV.fail = 0 ;
  8468. DEBUG_INFO("Alarm L1_UV is coldpickup ing..... \r\n"); //Hao#####
  8469. Charger.counter.L1_UV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF);
  8470. if (Charger.counter.L1_UV.isOccurInCharging)
  8471. {
  8472. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  8473. ColdLoadPickup_Delay("Alarm L1_UV is coldpickup ing..... ");
  8474. #else
  8475. osDelay((rand()%175000)+5000);
  8476. #endif
  8477. }
  8478. Charger.Alarm_Code &= ~ALARM_L1_UNDER_VOLTAGE;
  8479. DEBUG_INFO("Alarm L1_UV recover.\r\n");
  8480. }
  8481. else
  8482. {
  8483. Charger.counter.L1_UV.restore++ ;
  8484. }
  8485. }
  8486. else
  8487. {
  8488. Charger.counter.L1_UV.restore = 0 ;
  8489. Charger.counter.L1_UV.fail = 0 ;
  8490. }
  8491. }
  8492. #ifdef FUNC_AUTO_IGNORE_AC_PHASE
  8493. #ifdef FUNC_AX32_USE_AS_1P_MODEL
  8494. if (Charger.m_b3PhaseModel && !Charger.m_b3PhaseModelButUse1PhaseOnly)
  8495. #else
  8496. if (Charger.m_b3PhaseModel)
  8497. #endif
  8498. {
  8499. #endif
  8500. //--------------------------------
  8501. // L2 Under voltage
  8502. if(Charger.Voltage[1] < ALARM_SPEC_UV)
  8503. {
  8504. if(Charger.counter.L2_UV.fail > 1000)
  8505. {
  8506. Charger.counter.L2_UV.restore = 0 ;
  8507. if(!(Charger.Alarm_Code & ALARM_L2_UNDER_VOLTAGE))
  8508. {
  8509. Charger.Alarm_Code |= ALARM_L2_UNDER_VOLTAGE;
  8510. DEBUG_ERROR("Alarm L2_UV occur.\r\n");
  8511. }
  8512. }
  8513. else
  8514. Charger.counter.L2_UV.fail++;
  8515. }
  8516. else if(Charger.Voltage[1] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS))
  8517. {
  8518. if(Charger.Alarm_Code & ALARM_L2_UNDER_VOLTAGE)
  8519. {
  8520. if (Charger.counter.L2_UV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish)
  8521. {
  8522. Charger.counter.L2_UV.fail = 0 ;
  8523. DEBUG_INFO("Alarm L2_UV is coldpickup ing..... \r\n");
  8524. Charger.counter.L2_UV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF);
  8525. if (Charger.counter.L2_UV.isOccurInCharging)
  8526. {
  8527. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  8528. ColdLoadPickup_Delay("Alarm L2_UV is coldpickup ing..... ");
  8529. #else
  8530. osDelay((rand()%175000)+5000);
  8531. #endif
  8532. }
  8533. Charger.Alarm_Code &= ~ALARM_L2_UNDER_VOLTAGE;
  8534. DEBUG_INFO("Alarm L2_UV recover.\r\n");
  8535. }
  8536. else
  8537. {
  8538. Charger.counter.L2_UV.restore++ ;
  8539. }
  8540. }
  8541. else
  8542. {
  8543. Charger.counter.L2_UV.restore = 0 ;
  8544. Charger.counter.L2_UV.fail = 0 ;
  8545. }
  8546. }
  8547. //--------------------------------
  8548. // L3 Under voltage
  8549. if(Charger.Voltage[2] < ALARM_SPEC_UV)
  8550. {
  8551. if(Charger.counter.L3_UV.fail > 1000)
  8552. {
  8553. Charger.counter.L3_UV.restore = 0 ;
  8554. if(!(Charger.Alarm_Code & ALARM_L3_UNDER_VOLTAGE))
  8555. {
  8556. Charger.Alarm_Code |= ALARM_L3_UNDER_VOLTAGE;
  8557. DEBUG_ERROR("Alarm L3_UV occur.\r\n");
  8558. }
  8559. }
  8560. else
  8561. Charger.counter.L3_UV.fail++;
  8562. }
  8563. else if(Charger.Voltage[2] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS))
  8564. {
  8565. if(Charger.Alarm_Code & ALARM_L3_UNDER_VOLTAGE)
  8566. {
  8567. if (Charger.counter.L3_UV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish)
  8568. {
  8569. Charger.counter.L3_UV.fail = 0 ;
  8570. DEBUG_INFO("Alarm L3_UV is coldpickup ing..... \r\n");
  8571. Charger.counter.L3_UV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF);
  8572. if (Charger.counter.L3_UV.isOccurInCharging)
  8573. {
  8574. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  8575. ColdLoadPickup_Delay("Alarm L3_UV is coldpickup ing..... ");
  8576. #else
  8577. osDelay((rand()%175000)+5000);
  8578. #endif
  8579. }
  8580. Charger.Alarm_Code &= ~ALARM_L3_UNDER_VOLTAGE;
  8581. DEBUG_INFO("Alarm L3_UV recover.\r\n");
  8582. }
  8583. else
  8584. {
  8585. Charger.counter.L3_UV.restore++ ;
  8586. }
  8587. }
  8588. else
  8589. {
  8590. Charger.counter.L3_UV.restore = 0 ;
  8591. Charger.counter.L3_UV.fail = 0 ;
  8592. }
  8593. }
  8594. #ifdef FUNC_AUTO_IGNORE_AC_PHASE
  8595. }
  8596. #endif
  8597. #endif //UVP_PROTECT
  8598. //================================
  8599. // Over current alarm detect
  8600. //================================
  8601. #ifdef OCP_PROTECT
  8602. #ifdef FUNC_OCP_WITH_PP
  8603. {
  8604. uint16_t CurMaxCurr = 0; //A
  8605. uint16_t OC_BegThreshold = 0; //Occur: 0.01A
  8606. uint16_t OC_EndThreshold = 0; //Recover: 0.01A
  8607. #ifdef FUNC_CCS
  8608. //// if (Charger.m_bRunCCS)
  8609. //// {
  8610. //// CurMaxCurr = Charger.maxRatingCurrent;
  8611. //// }
  8612. //// else
  8613. //// {
  8614. //// CurMaxCurr = HTK_GET_VAL_MIN(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent, Charger.maxRatingCurrent);
  8615. //// }
  8616. CurMaxCurr = HTK_GET_VAL_MIN(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent, Charger.maxRatingCurrent);
  8617. #else
  8618. CurMaxCurr = HTK_GET_VAL_MIN(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent, Charger.maxRatingCurrent);
  8619. #endif
  8620. if (Charger.m_bDetectPP)
  8621. {
  8622. CurMaxCurr = HTK_GET_VAL_MIN(CurMaxCurr, Charger.m_PPInfo.m_CurCurr);
  8623. }
  8624. #ifdef MODIFY_SOCKET_E_OCP_USE_MAX_CHARGING_CURRENT
  8625. if (Charger.isOnSocketE == ON)
  8626. {
  8627. CurMaxCurr = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent;
  8628. }
  8629. #endif
  8630. #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC
  8631. if (Charger.m_bModelNameWithEuroSpecOCP)
  8632. #else
  8633. if (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'E')
  8634. #endif
  8635. {
  8636. OC_BegThreshold = (CurMaxCurr * Charger.OCP_Magnification) + 0;
  8637. OC_EndThreshold = (CurMaxCurr * Charger.OCP_Magnification) - 200;
  8638. }
  8639. else
  8640. {
  8641. if (CurMaxCurr > 20)
  8642. {
  8643. OC_BegThreshold = (CurMaxCurr * Charger.OCP_Magnification) + 0;
  8644. OC_EndThreshold = (CurMaxCurr * Charger.OCP_Magnification) - 200;
  8645. }
  8646. else
  8647. {
  8648. OC_BegThreshold = (CurMaxCurr * 100) + 200;
  8649. OC_EndThreshold = (CurMaxCurr * 100) + 0;
  8650. }
  8651. }
  8652. Charger.m_OCP_CurMaxCurr = CurMaxCurr;
  8653. Charger.m_OCP_BegThreshold = OC_BegThreshold;
  8654. Charger.m_OCP_EndThreshold = OC_EndThreshold;
  8655. #ifdef FUNC_SET_AT32_MODEL_SCP_SPEC_VAL_HIGHER_TO_AVOID_SCP_ALARM
  8656. u32 CurSCP_SPEC = SCP_SPEC_VAL;
  8657. if (Charger.m_bModelNameAT)
  8658. {
  8659. CurSCP_SPEC = (u32)SCP_SPEC_VAL * 1000;
  8660. }
  8661. #endif
  8662. //--------------------------------
  8663. // L1 Over current
  8664. #ifdef FUNC_SET_AT32_MODEL_SCP_SPEC_VAL_HIGHER_TO_AVOID_SCP_ALARM
  8665. if((u32)Charger.Current[0] >= CurSCP_SPEC)
  8666. #else
  8667. if(Charger.Current[0] >= SCP_SPEC_VAL)
  8668. #endif
  8669. {
  8670. if(Charger.counter.L1_OC.fail > 5)
  8671. {
  8672. if(!(Charger.Alarm_Code & ALARM_L1_CIRCUIT_SHORT))
  8673. {
  8674. Charger.counter.L1_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8675. Charger.Alarm_Code |= ALARM_L1_CIRCUIT_SHORT;
  8676. if (Charger.counter.L1_OC.isLatch == OFF)
  8677. {
  8678. Charger.counter.L1_OC.isLatch = ON ;
  8679. setLedMotion(LED_ACTION_ALARM);
  8680. timerDisable(TIMER_IDX_RETRY_OC);
  8681. }
  8682. DEBUG_INFO("Correction Current[0]: %f\r\n", Charger.Current[0]/100.0);
  8683. DEBUG_ERROR("Alarm L1 SCP occur.\r\n");
  8684. }
  8685. }
  8686. else
  8687. Charger.counter.L1_OC.fail++;
  8688. }
  8689. //#ifdef MODIFY_OCP_SPEC
  8690. // else if(Charger.Current[0] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)):((Charger.maxRatingCurrent+2)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100))))
  8691. //#else
  8692. // else if(Charger.Current[0] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)-100):((Charger.maxRatingCurrent+1)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-100):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100))))
  8693. //#endif
  8694. else if (Charger.Current[0] > OC_BegThreshold)
  8695. {
  8696. if(Charger.counter.L1_OC.fail > 6000)
  8697. {
  8698. if(!(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT))
  8699. {
  8700. Charger.counter.L1_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8701. Charger.Alarm_Code |= ALARM_L1_OVER_CURRENT;
  8702. DEBUG_INFO("Correction Current[0]: %f\r\n", Charger.Current[0]/100.0);
  8703. DEBUG_ERROR("Alarm L1_OC occur.\r\n");
  8704. timerEnable(TIMER_IDX_RETRY_OC, ALARM_RETRY_INTERVAL_OC);
  8705. Charger.counter.L1_OC.retry++;
  8706. }
  8707. }
  8708. else
  8709. Charger.counter.L1_OC.fail++;
  8710. }
  8711. //else if((Charger.Current[0] < ((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent)?((Charger.maxRatingCurrent>20?(Charger.maxRatingCurrent*Charger.OCP_Magnification )-200:((Charger.maxRatingCurrent+2)*100)-200)):( (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-200):(((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)-200))))))
  8712. else if (Charger.Current[0] < OC_EndThreshold)
  8713. {
  8714. Charger.counter.L1_OC.fail = 0;
  8715. if (Charger.counter.L1_OC.retry> ALARM_OC_RETRY_COUNT)
  8716. {
  8717. if (Charger.counter.L1_OC.isLatch == OFF)
  8718. {
  8719. Charger.counter.L1_OC.isLatch = ON ;
  8720. setLedMotion(LED_ACTION_ALARM);
  8721. timerDisable(TIMER_IDX_RETRY_OC);
  8722. }
  8723. }
  8724. else if((Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) &&
  8725. (Charger.counter.L1_OC.retry <= ALARM_OC_RETRY_COUNT) &&
  8726. (timer[TIMER_IDX_RETRY_OC].isAlarm == ON) &&
  8727. blinker[BLINKER_IDX_LED].blinkisFinish )
  8728. {
  8729. Charger.Alarm_Code &= ~ALARM_L1_OVER_CURRENT;
  8730. Charger.Alarm_Code &= ~ALARM_L1_CIRCUIT_SHORT;
  8731. DEBUG_INFO("Alarm L1_OC recover.\r\n");
  8732. if(!(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT))
  8733. timerDisable(TIMER_IDX_RETRY_OC);
  8734. }
  8735. }
  8736. #ifdef FUNC_AUTO_IGNORE_AC_PHASE
  8737. #ifdef FUNC_AX32_USE_AS_1P_MODEL
  8738. if (Charger.m_b3PhaseModel && !Charger.m_b3PhaseModelButUse1PhaseOnly)
  8739. #else
  8740. if (Charger.m_b3PhaseModel)
  8741. #endif
  8742. {
  8743. #endif
  8744. //--------------------------------
  8745. // L2 Over current
  8746. #ifdef FUNC_SET_AT32_MODEL_SCP_SPEC_VAL_HIGHER_TO_AVOID_SCP_ALARM
  8747. if((u32)Charger.Current[1] >= CurSCP_SPEC)
  8748. #else
  8749. if(Charger.Current[1] >= SCP_SPEC_VAL)
  8750. #endif
  8751. {
  8752. if(Charger.counter.L2_OC.fail > 5)
  8753. {
  8754. if(!(Charger.Alarm_Code & ALARM_L2_CIRCUIT_SHORT))
  8755. {
  8756. Charger.counter.L2_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8757. Charger.Alarm_Code |= ALARM_L2_CIRCUIT_SHORT;
  8758. if (Charger.counter.L2_OC.isLatch == OFF)
  8759. {
  8760. Charger.counter.L2_OC.isLatch = ON ;
  8761. setLedMotion(LED_ACTION_ALARM);
  8762. timerDisable(TIMER_IDX_RETRY_OC);
  8763. }
  8764. DEBUG_INFO("Correction Current[1]: %f\r\n", Charger.Current[1]/100.0);
  8765. DEBUG_ERROR("Alarm L2 SCP occur.\r\n");
  8766. }
  8767. }
  8768. else
  8769. Charger.counter.L2_OC.fail++;
  8770. }
  8771. //#ifdef MODIFY_OCP_SPEC
  8772. // else if(Charger.Current[1] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)):((Charger.maxRatingCurrent+2)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100))))
  8773. //#else
  8774. // else if(Charger.Current[1] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)-100):((Charger.maxRatingCurrent+1)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-100):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100))))
  8775. //#endif
  8776. else if (Charger.Current[1] > OC_BegThreshold)
  8777. {
  8778. if(Charger.counter.L2_OC.fail > 6000)
  8779. {
  8780. if(!(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT))
  8781. {
  8782. Charger.counter.L2_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8783. Charger.Alarm_Code |= ALARM_L2_OVER_CURRENT;
  8784. DEBUG_INFO("Correction Current[1]: %f\r\n", Charger.Current[1]/100.0);
  8785. DEBUG_ERROR("Alarm L2_OC occur.\r\n");
  8786. timerEnable(TIMER_IDX_RETRY_OC, ALARM_RETRY_INTERVAL_OC);
  8787. Charger.counter.L2_OC.retry++;
  8788. }
  8789. }
  8790. else
  8791. Charger.counter.L2_OC.fail++;
  8792. }
  8793. //else if((Charger.Current[1] < ((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent)?((Charger.maxRatingCurrent>20?(Charger.maxRatingCurrent*Charger.OCP_Magnification )-200:((Charger.maxRatingCurrent+2)*100)-200)):( (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-200):(((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)-200))))))
  8794. else if (Charger.Current[1] < OC_EndThreshold)
  8795. {
  8796. Charger.counter.L2_OC.fail = 0;
  8797. if (Charger.counter.L2_OC.retry > ALARM_OC_RETRY_COUNT)
  8798. {
  8799. if (Charger.counter.L2_OC.isLatch == OFF)
  8800. {
  8801. Charger.counter.L2_OC.isLatch = ON ;
  8802. setLedMotion(LED_ACTION_ALARM);
  8803. timerDisable(TIMER_IDX_RETRY_OC);
  8804. }
  8805. }
  8806. else if((Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) &&
  8807. (Charger.counter.L2_OC.retry <= ALARM_OC_RETRY_COUNT) &&
  8808. (timer[TIMER_IDX_RETRY_OC].isAlarm == ON) &&
  8809. blinker[BLINKER_IDX_LED].blinkisFinish )
  8810. {
  8811. Charger.Alarm_Code &= ~ALARM_L2_OVER_CURRENT;
  8812. Charger.Alarm_Code &= ~ALARM_L2_CIRCUIT_SHORT;
  8813. DEBUG_INFO("Alarm L2_OC recover.\r\n");
  8814. if(!(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT))
  8815. timerDisable(TIMER_IDX_RETRY_OC);
  8816. }
  8817. }
  8818. //--------------------------------
  8819. // L3 Over current
  8820. #ifdef FUNC_SET_AT32_MODEL_SCP_SPEC_VAL_HIGHER_TO_AVOID_SCP_ALARM
  8821. if((u32)Charger.Current[2] >= CurSCP_SPEC)
  8822. #else
  8823. if(Charger.Current[2] >= SCP_SPEC_VAL)
  8824. #endif
  8825. {
  8826. if(Charger.counter.L3_OC.fail > 5)
  8827. {
  8828. if(!(Charger.Alarm_Code & ALARM_L3_CIRCUIT_SHORT))
  8829. {
  8830. Charger.counter.L3_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8831. Charger.Alarm_Code |= ALARM_L3_CIRCUIT_SHORT;
  8832. if (Charger.counter.L3_OC.isLatch == OFF)
  8833. {
  8834. Charger.counter.L3_OC.isLatch = ON ;
  8835. setLedMotion(LED_ACTION_ALARM);
  8836. timerDisable(TIMER_IDX_RETRY_OC);
  8837. }
  8838. DEBUG_INFO("Correction Current[2]: %f\r\n", Charger.Current[2]/100.0);
  8839. DEBUG_ERROR("Alarm L3 SCP occur.\r\n");
  8840. }
  8841. }
  8842. else
  8843. Charger.counter.L3_OC.fail++;
  8844. }
  8845. //#ifdef MODIFY_OCP_SPEC
  8846. // else if(Charger.Current[2] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)):((Charger.maxRatingCurrent+2)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100))))
  8847. //#else
  8848. // else if(Charger.Current[2] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)-100):((Charger.maxRatingCurrent+1)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-100):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100))))
  8849. //#endif
  8850. else if (Charger.Current[2] > OC_BegThreshold)
  8851. {
  8852. if(Charger.counter.L3_OC.fail > 6000)
  8853. {
  8854. if(!(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT))
  8855. {
  8856. Charger.counter.L3_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8857. Charger.Alarm_Code |= ALARM_L3_OVER_CURRENT;
  8858. DEBUG_INFO("Correction Current[2]: %f\r\n", Charger.Current[2]/100.0);
  8859. DEBUG_ERROR("Alarm L3_OC occur.\r\n");
  8860. timerEnable(TIMER_IDX_RETRY_OC, ALARM_RETRY_INTERVAL_OC);
  8861. Charger.counter.L3_OC.retry++;
  8862. }
  8863. }
  8864. else
  8865. Charger.counter.L3_OC.fail++;
  8866. }
  8867. //else if((Charger.Current[2] < ((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent)?((Charger.maxRatingCurrent>20?(Charger.maxRatingCurrent*Charger.OCP_Magnification )-200:((Charger.maxRatingCurrent+2)*100)-200)):( (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-200):(((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)-200))))))
  8868. else if (Charger.Current[2] < OC_EndThreshold)
  8869. {
  8870. Charger.counter.L3_OC.fail = 0;
  8871. if (Charger.counter.L3_OC.retry > ALARM_OC_RETRY_COUNT)
  8872. {
  8873. if (Charger.counter.L3_OC.isLatch == OFF)
  8874. {
  8875. Charger.counter.L3_OC.isLatch = ON ;
  8876. setLedMotion(LED_ACTION_ALARM);
  8877. timerDisable(TIMER_IDX_RETRY_OC);
  8878. }
  8879. }
  8880. else if((Charger.Alarm_Code & ALARM_L3_OVER_CURRENT) &&
  8881. (Charger.counter.L3_OC.retry <= ALARM_OC_RETRY_COUNT) &&
  8882. (timer[TIMER_IDX_RETRY_OC].isAlarm == ON) &&
  8883. blinker[BLINKER_IDX_LED].blinkisFinish )
  8884. {
  8885. Charger.Alarm_Code &= ~ALARM_L3_OVER_CURRENT;
  8886. Charger.Alarm_Code &= ~ALARM_L3_CIRCUIT_SHORT;
  8887. DEBUG_INFO("Alarm L3_OC recover.\r\n");
  8888. if(!(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT))
  8889. timerDisable(TIMER_IDX_RETRY_OC);
  8890. }
  8891. }
  8892. #ifdef FUNC_AUTO_IGNORE_AC_PHASE
  8893. }
  8894. #endif
  8895. }
  8896. #else //FUNC_OCP_WITH_PP
  8897. //Old Procedure (Deleted)
  8898. #endif //FUNC_OCP_WITH_PP
  8899. #endif //OCP_PROTECT
  8900. //================================
  8901. // Over temperature alarm detect
  8902. //================================
  8903. #ifdef OTP_PROTECT
  8904. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  8905. #ifdef MODIFY_OTP_SPEC
  8906. //if (Charger.temperature.MaxTemp > Charger.alarm_spec.OT_2)
  8907. if (
  8908. (Charger.temperature.Group1_MaxTemp > Charger.alarm_spec.OT_G1_2)
  8909. ||
  8910. (
  8911. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  8912. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  8913. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  8914. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P) &&
  8915. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  8916. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P) &&
  8917. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  8918. #else //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  8919. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P) &&
  8920. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  8921. #else //FUNC_AW48_ADD_6_TEMP_SENEOR
  8922. Charger.m_bModelNameAX80_1P &&
  8923. #endif //FUNC_AW48_ADD_6_TEMP_SENEOR
  8924. Charger.temperature.Group2_MaxTemp > Charger.alarm_spec.OT_G2_2
  8925. )
  8926. #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  8927. #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  8928. ||
  8929. (
  8930. (Charger.m_bModelNameAW48_1P) &&
  8931. (
  8932. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2 ||
  8933. Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_2
  8934. )
  8935. )
  8936. #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  8937. ||
  8938. (
  8939. (Charger.m_bModelNameAW48_1P) &&
  8940. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2
  8941. )
  8942. #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  8943. #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  8944. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  8945. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  8946. ||
  8947. (
  8948. (Charger.m_bModelNameAX48_NACS_1P) &&
  8949. (
  8950. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2 ||
  8951. Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_2
  8952. )
  8953. )
  8954. #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  8955. ||
  8956. (
  8957. (Charger.m_bModelNameAX48_NACS_1P) &&
  8958. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2
  8959. )
  8960. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  8961. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  8962. #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  8963. ||
  8964. (
  8965. (Charger.m_bModelNameAX80_NACS_1P) &&
  8966. (
  8967. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2 ||
  8968. Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_2
  8969. )
  8970. )
  8971. #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  8972. )
  8973. #else
  8974. if (Charger.temperature.MaxTemp > ALARM_SPEC_OT_2)
  8975. #endif
  8976. #else //FUNC_AX80_ADD_4_TEMP_SENEOR
  8977. #ifdef MODIFY_OTP_SPEC
  8978. if (Charger.temperature.SystemAmbientTemp > Charger.alarm_spec.OT_2)
  8979. #else
  8980. if (Charger.temperature.SystemAmbientTemp > ALARM_SPEC_OT_2)
  8981. #endif
  8982. #endif //FUNC_AX80_ADD_4_TEMP_SENEOR
  8983. {
  8984. if(Charger.counter.OT.fail > 2000)
  8985. {
  8986. if (Charger.counter.OT.isLatch == OFF)
  8987. {
  8988. Charger.counter.OT.isLatch = ON ;
  8989. setLedMotion(LED_ACTION_ALARM);
  8990. }
  8991. if(!(Charger.Alarm_Code & ALARM_OVER_TEMPERATURE))
  8992. {
  8993. Charger.counter.OT.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  8994. Charger.Alarm_Code |= ALARM_OVER_TEMPERATURE;
  8995. DEBUG_ERROR("Latch OT2 occur.\r\n");
  8996. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  8997. DEBUG_ERROR("OT_G1_MaxTemp = %d.\r\n",Charger.temperature.Group1_MaxTemp);
  8998. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  8999. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9000. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9001. if (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P)
  9002. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9003. if (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P)
  9004. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9005. #else //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9006. if (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P)
  9007. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9008. #else
  9009. if (Charger.m_bModelNameAX80_1P)
  9010. #endif
  9011. {
  9012. DEBUG_ERROR("OT_G2_MaxTemp = %d.\r\n",Charger.temperature.Group2_MaxTemp);
  9013. }
  9014. #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  9015. #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9016. if (Charger.m_bModelNameAW48_1P)
  9017. {
  9018. DEBUG_ERROR("OT_G3_MaxTemp = %d, OT_G4_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp);
  9019. }
  9020. #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9021. if (Charger.m_bModelNameAW48_1P)
  9022. {
  9023. DEBUG_ERROR("OT_G3_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp);
  9024. }
  9025. #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9026. #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  9027. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  9028. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9029. if (Charger.m_bModelNameAX48_NACS_1P)
  9030. {
  9031. DEBUG_ERROR("OT_G3_MaxTemp = %d, OT_G4_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp);
  9032. }
  9033. #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9034. if (Charger.m_bModelNameAX48_NACS_1P)
  9035. {
  9036. DEBUG_ERROR("OT_G3_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp);
  9037. }
  9038. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9039. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  9040. #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  9041. if (Charger.m_bModelNameAX80_NACS_1P)
  9042. {
  9043. DEBUG_ERROR("OT_G3_MaxTemp = %d, OT_G4_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp);
  9044. }
  9045. #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  9046. #else //FUNC_AX80_ADD_4_TEMP_SENEOR
  9047. DEBUG_ERROR("Tmp = %d.\r\n",Charger.temperature.SystemAmbientTemp);
  9048. #endif //FUNC_AX80_ADD_4_TEMP_SENEOR
  9049. }
  9050. }
  9051. else
  9052. Charger.counter.OT.fail++;
  9053. }
  9054. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  9055. #ifdef MODIFY_OTP_SPEC
  9056. //else if((Charger.temperature.MaxTemp > Charger.alarm_spec.OT_1) && (!Charger.counter.OT.isLatch))
  9057. else if
  9058. (
  9059. ((Charger.temperature.Group1_MaxTemp > Charger.alarm_spec.OT_G1_1) && (!Charger.counter.OT.isLatch))
  9060. ||
  9061. (
  9062. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  9063. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9064. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9065. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P) &&
  9066. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9067. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P) &&
  9068. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9069. #else //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9070. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P) &&
  9071. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9072. #else
  9073. Charger.m_bModelNameAX80_1P &&
  9074. #endif
  9075. Charger.temperature.Group2_MaxTemp > Charger.alarm_spec.OT_G2_1 &&
  9076. !Charger.counter.OT.isLatch
  9077. )
  9078. #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  9079. #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9080. ||
  9081. (
  9082. (Charger.m_bModelNameAW48_1P) &&
  9083. (
  9084. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 ||
  9085. Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_1
  9086. ) &&
  9087. !Charger.counter.OT.isLatch
  9088. )
  9089. #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9090. ||
  9091. (
  9092. (Charger.m_bModelNameAW48_1P) &&
  9093. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 &&
  9094. !Charger.counter.OT.isLatch
  9095. )
  9096. #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9097. #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  9098. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  9099. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9100. ||
  9101. (
  9102. (Charger.m_bModelNameAX48_NACS_1P) &&
  9103. (
  9104. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 ||
  9105. Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_1
  9106. ) &&
  9107. !Charger.counter.OT.isLatch
  9108. )
  9109. #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9110. ||
  9111. (
  9112. (Charger.m_bModelNameAX48_NACS_1P) &&
  9113. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 &&
  9114. !Charger.counter.OT.isLatch
  9115. )
  9116. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9117. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  9118. #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  9119. ||
  9120. (
  9121. (Charger.m_bModelNameAX80_NACS_1P) &&
  9122. (
  9123. Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 ||
  9124. Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_1
  9125. ) &&
  9126. !Charger.counter.OT.isLatch
  9127. )
  9128. #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  9129. )
  9130. #else
  9131. else if((Charger.temperature.MaxTemp > ALARM_SPEC_OT_1) && (!Charger.counter.OT.isLatch))
  9132. #endif
  9133. #else //FUNC_AX80_ADD_4_TEMP_SENEOR
  9134. #ifdef MODIFY_OTP_SPEC
  9135. else if((Charger.temperature.SystemAmbientTemp > Charger.alarm_spec.OT_1) && (!Charger.counter.OT.isLatch))
  9136. #else
  9137. else if((Charger.temperature.SystemAmbientTemp > ALARM_SPEC_OT_1) && (!Charger.counter.OT.isLatch))
  9138. #endif
  9139. #endif //FUNC_AX80_ADD_4_TEMP_SENEOR
  9140. {
  9141. if(Charger.counter.OT.fail > 1000)
  9142. {
  9143. if(!(Charger.Alarm_Code & ALARM_OVER_TEMPERATURE))
  9144. {
  9145. Charger.counter.OT.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9146. Charger.Alarm_Code |= ALARM_OVER_TEMPERATURE;
  9147. DEBUG_ERROR("Alarm OT occur.\r\n");
  9148. #ifdef FUNC_GUN_TEMP_LATCH
  9149. {
  9150. static u8 nGunOTP = 0;
  9151. u8 nTmp = nGunOTP;
  9152. if (Charger.m_bModelNameAW48_1P)
  9153. {
  9154. if (Charger.temperature.AW48_T5_L1_GUN > Charger.alarm_spec.OT_G4_1 ||
  9155. Charger.temperature.AW48_T6_L2_GUN > Charger.alarm_spec.OT_G4_1)
  9156. nGunOTP++;
  9157. }
  9158. else if (Charger.m_bModelNameAX48_NACS_1P)
  9159. {
  9160. if (Charger.temperature.AX48_NACS_T5_L1_GUN > Charger.alarm_spec.OT_G2_1 ||
  9161. Charger.temperature.AX48_NACS_T6_L2_GUN > Charger.alarm_spec.OT_G2_1)
  9162. nGunOTP++;
  9163. }
  9164. else if (Charger.m_bModelNameAX80_NACS_1P)
  9165. {
  9166. if (Charger.temperature.AX80_NACS_T5_L1_GUN > Charger.alarm_spec.OT_G2_1 ||
  9167. Charger.temperature.AX80_NACS_T6_L2_GUN > Charger.alarm_spec.OT_G2_1)
  9168. nGunOTP++;
  9169. }
  9170. if (nGunOTP >= 3)
  9171. {
  9172. Charger.counter.OT.isLatch = ON;
  9173. nGunOTP = 0;
  9174. }
  9175. if (nTmp != nGunOTP)
  9176. {
  9177. DEBUG_ERROR("Alarm GUN_OT(%d) %s\r\n", nGunOTP, Charger.counter.OT.isLatch ? "=> LATCH" : "");
  9178. //Alarm GUN_OT(3) => LATCH
  9179. }
  9180. }
  9181. #endif //FUNC_GUN_TEMP_LATCH
  9182. }
  9183. }
  9184. else
  9185. Charger.counter.OT.fail++;
  9186. }
  9187. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  9188. #ifdef MODIFY_OTP_SPEC
  9189. //else if((Charger.temperature.MaxTemp < (Charger.alarm_spec.OT_1 - Charger.alarm_spec.OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch))
  9190. else if
  9191. (
  9192. (Charger.temperature.Group1_MaxTemp < (Charger.alarm_spec.OT_G1_1 - Charger.alarm_spec.OT_G1_HYSTERESIS)) && (!Charger.counter.OT.isLatch)
  9193. #ifdef FUNC_MODIFY_OTP_RECOVER_PROCESS
  9194. &&
  9195. #else
  9196. ||
  9197. #endif
  9198. (
  9199. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  9200. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9201. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9202. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P) &&
  9203. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9204. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P) &&
  9205. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  9206. #else //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9207. (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P) &&
  9208. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  9209. #else //FUNC_AW48_ADD_6_TEMP_SENEOR
  9210. Charger.m_bModelNameAX80_1P &&
  9211. #endif //FUNC_AW48_ADD_6_TEMP_SENEOR
  9212. Charger.temperature.Group2_MaxTemp < (Charger.alarm_spec.OT_G2_1 - Charger.alarm_spec.OT_G2_HYSTERESIS) &&
  9213. !Charger.counter.OT.isLatch
  9214. )
  9215. #ifdef FUNC_MODIFY_OTP_RECOVER_PROCESS
  9216. //Do nothing
  9217. #else //FUNC_MODIFY_OTP_RECOVER_PROCESS
  9218. #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  9219. ||
  9220. (
  9221. (Charger.m_bModelNameAW48_1P) &&
  9222. Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) &&
  9223. !Charger.counter.OT.isLatch
  9224. )
  9225. #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  9226. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  9227. ||
  9228. (
  9229. (Charger.m_bModelNameAX48_NACS_1P) &&
  9230. Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) &&
  9231. !Charger.counter.OT.isLatch
  9232. )
  9233. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  9234. #endif //FUNC_MODIFY_OTP_RECOVER_PROCESS
  9235. )
  9236. #else
  9237. else if((Charger.temperature.MaxTemp < (ALARM_SPEC_OT_1-ALARM_SPEC_OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch))
  9238. #endif
  9239. #else //FUNC_AX80_ADD_4_TEMP_SENEOR
  9240. #ifdef MODIFY_OTP_SPEC
  9241. else if((Charger.temperature.SystemAmbientTemp < (Charger.alarm_spec.OT_1 - Charger.alarm_spec.OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch))
  9242. #else
  9243. else if((Charger.temperature.SystemAmbientTemp < (ALARM_SPEC_OT_1-ALARM_SPEC_OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch))
  9244. #endif
  9245. #endif //FUNC_AX80_ADD_4_TEMP_SENEOR
  9246. {
  9247. #ifdef FUNC_MODIFY_OTP_RECOVER_PROCESS
  9248. #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9249. if (Charger.m_bModelNameAW48_1P)
  9250. {
  9251. if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) &&
  9252. Charger.temperature.Group4_MaxTemp < (Charger.alarm_spec.OT_G4_1 - Charger.alarm_spec.OT_G4_HYSTERESIS) &&
  9253. !Charger.counter.OT.isLatch)
  9254. {
  9255. if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9256. {
  9257. Charger.counter.OT.retry++;
  9258. Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
  9259. DEBUG_INFO("Alarm OT recover.\r\n");
  9260. }
  9261. }
  9262. }
  9263. else if (Charger.m_bModelNameAX48_NACS_1P)
  9264. {
  9265. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9266. if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) &&
  9267. Charger.temperature.Group4_MaxTemp < (Charger.alarm_spec.OT_G4_1 - Charger.alarm_spec.OT_G4_HYSTERESIS) &&
  9268. !Charger.counter.OT.isLatch)
  9269. {
  9270. if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9271. {
  9272. Charger.counter.OT.retry++;
  9273. Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
  9274. DEBUG_INFO("Alarm OT recover.\r\n");
  9275. }
  9276. }
  9277. #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9278. if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) &&
  9279. !Charger.counter.OT.isLatch)
  9280. {
  9281. if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9282. {
  9283. Charger.counter.OT.retry++;
  9284. Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
  9285. DEBUG_INFO("Alarm OT recover.\r\n");
  9286. }
  9287. }
  9288. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  9289. }
  9290. #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  9291. else if (Charger.m_bModelNameAX80_NACS_1P)
  9292. {
  9293. if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) &&
  9294. Charger.temperature.Group4_MaxTemp < (Charger.alarm_spec.OT_G4_1 - Charger.alarm_spec.OT_G4_HYSTERESIS) &&
  9295. !Charger.counter.OT.isLatch)
  9296. {
  9297. if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9298. {
  9299. Charger.counter.OT.retry++;
  9300. Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
  9301. DEBUG_INFO("Alarm OT recover.\r\n");
  9302. }
  9303. }
  9304. }
  9305. #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  9306. else
  9307. {
  9308. Charger.counter.OT.fail = 0;
  9309. if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9310. {
  9311. Charger.counter.OT.retry++;
  9312. Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
  9313. DEBUG_INFO("Alarm OT recover.\r\n");
  9314. }
  9315. }
  9316. #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9317. if (Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P)
  9318. {
  9319. if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) &&
  9320. !Charger.counter.OT.isLatch)
  9321. {
  9322. if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9323. {
  9324. Charger.counter.OT.retry++;
  9325. Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
  9326. DEBUG_INFO("Alarm OT recover.\r\n");
  9327. }
  9328. }
  9329. }
  9330. else
  9331. {
  9332. Charger.counter.OT.fail = 0;
  9333. if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9334. {
  9335. Charger.counter.OT.retry++;
  9336. Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
  9337. DEBUG_INFO("Alarm OT recover.\r\n");
  9338. }
  9339. }
  9340. #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  9341. #else //FUNC_MODIFY_OTP_RECOVER_PROCESS
  9342. Charger.counter.OT.fail = 0;
  9343. if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9344. {
  9345. Charger.counter.OT.retry++;
  9346. Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
  9347. DEBUG_INFO("Alarm OT recover.\r\n");
  9348. }
  9349. #endif //FUNC_MODIFY_OTP_RECOVER_PROCESS
  9350. }
  9351. #endif //OTP_PROTECT
  9352. //================================
  9353. // Current leakage alarm detect
  9354. // TODO: ADC channel & spec need to check for other detection method
  9355. //================================
  9356. #ifdef CCID_PROTECT
  9357. if (Charger.CCID_Module_Type == CCID_MODULE_VAC)
  9358. {
  9359. //module test
  9360. if((HAL_GPIO_ReadPin(IN_Leak_Error_GPIO_Port, IN_Leak_Error_Pin) == GPIO_PIN_SET) && (!Charger.isTestLeakModule))
  9361. {
  9362. if(Charger.counter.LEAK.fail > 1000)
  9363. {
  9364. if(!(Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL))
  9365. {
  9366. Charger.counter.LEAK.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9367. Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL;
  9368. DEBUG_ERROR("Alarm leakage module error occur.\r\n");
  9369. timerEnable(TIMER_IDX_RETRY_LEAK, ALARM_RETRY_INTERVAL_LEAK);
  9370. }
  9371. }
  9372. else
  9373. Charger.counter.LEAK.fail++;
  9374. }
  9375. else
  9376. {
  9377. Charger.counter.LEAK.fail = 0;
  9378. if((Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL) &&
  9379. (Charger.counter.LEAK.retry < ALARM_RETRY_COUNT) &&
  9380. (timer[TIMER_IDX_RETRY_LEAK].isAlarm == ON) &&
  9381. blinker[BLINKER_IDX_LED].blinkisFinish)
  9382. {
  9383. timerDisable(TIMER_IDX_RETRY_LEAK);
  9384. Charger.Alarm_Code &= ~ALARM_LEAK_MODULE_FAIL;
  9385. osDelay(1000);
  9386. #ifdef DEBUG
  9387. DEBUG_INFO("Alarm leakage module error recover.\r\n");
  9388. #endif
  9389. }
  9390. }
  9391. //DC leakage
  9392. if((HAL_GPIO_ReadPin(IN_Leak_DC_GPIO_Port, IN_Leak_DC_Pin) == GPIO_PIN_SET) && (!Charger.isTestLeakModule))
  9393. {
  9394. if(Charger.counter.LEAK_DC.fail > 10)
  9395. {
  9396. if(!(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC))
  9397. {
  9398. Charger.counter.LEAK_DC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9399. Charger.Alarm_Code |= ALARM_CURRENT_LEAK_DC;
  9400. DEBUG_ERROR("Alarm DC leakage occur.\r\n");
  9401. timerEnable(TIMER_IDX_RETRY_LEAK_DC, ALARM_RETRY_INTERVAL_LEAK);
  9402. Charger.counter.LEAK_DC.retry++;
  9403. }
  9404. if (timer[TIMER_IDX_RETRY_LEAK_DC].isAlarm == ON || (Charger.counter.LEAK_DC.retry >ALARM_RETRY_COUNT))
  9405. {
  9406. timerDisable(TIMER_IDX_RETRY_LEAK_DC);
  9407. //Charger.counter.LEAK.isLatch = ON ;
  9408. if (Charger.counter.LEAK.isLatch == OFF)
  9409. {
  9410. Charger.counter.LEAK.isLatch = ON ;
  9411. setLedMotion(LED_ACTION_ALARM);
  9412. }
  9413. DEBUG_ERROR("Alarm leakage DC isLatch.\r\n");
  9414. }
  9415. }
  9416. else
  9417. Charger.counter.LEAK_DC.fail++;
  9418. }
  9419. else
  9420. {
  9421. Charger.counter.LEAK_DC.fail = 0;
  9422. if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC) &&
  9423. (Charger.counter.LEAK_DC.retry <= ALARM_RETRY_COUNT) &&
  9424. (timer[TIMER_IDX_RETRY_LEAK_DC].isAlarm == ON) &&
  9425. blinker[BLINKER_IDX_LED].blinkisFinish)
  9426. {
  9427. timerDisable(TIMER_IDX_RETRY_LEAK_DC);
  9428. Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_DC;
  9429. DEBUG_INFO("Alarm DC leakage recover.\r\n");
  9430. }
  9431. }
  9432. //AC leakage
  9433. if((HAL_GPIO_ReadPin(IN_Leak_AC_GPIO_Port, IN_Leak_AC_Pin) == GPIO_PIN_SET) && (!Charger.isTestLeakModule))
  9434. {
  9435. if(Charger.counter.LEAK_AC.fail > 10)
  9436. {
  9437. if(!(Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC))
  9438. {
  9439. Charger.counter.LEAK_AC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9440. Charger.Alarm_Code |= ALARM_CURRENT_LEAK_AC;
  9441. DEBUG_ERROR("Alarm AC leakage occur.\r\n");
  9442. timerEnable(TIMER_IDX_RETRY_LEAK_AC, ALARM_RETRY_INTERVAL_LEAK);
  9443. Charger.counter.LEAK_AC.retry++;
  9444. }
  9445. if (timer[TIMER_IDX_RETRY_LEAK_AC].isAlarm == ON || (Charger.counter.LEAK_AC.retry > ALARM_RETRY_COUNT))
  9446. {
  9447. timerDisable(TIMER_IDX_RETRY_LEAK_AC);
  9448. //Charger.counter.LEAK.isLatch = ON ;
  9449. if (Charger.counter.LEAK.isLatch == OFF)
  9450. {
  9451. Charger.counter.LEAK.isLatch = ON ;
  9452. setLedMotion(LED_ACTION_ALARM);
  9453. }
  9454. DEBUG_ERROR("Alarm leakage AC isLatch.\r\n");
  9455. }
  9456. }
  9457. else
  9458. Charger.counter.LEAK_AC.fail++;
  9459. }
  9460. else
  9461. {
  9462. Charger.counter.LEAK_AC.fail = 0;
  9463. if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC) &&
  9464. (Charger.counter.LEAK_AC.retry <= ALARM_RETRY_COUNT) &&
  9465. (timer[TIMER_IDX_RETRY_LEAK_AC].isAlarm == ON) &&
  9466. blinker[BLINKER_IDX_LED].blinkisFinish )
  9467. {
  9468. timerDisable(TIMER_IDX_RETRY_LEAK_AC);
  9469. Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC;
  9470. DEBUG_INFO("Alarm AC leakage recover.\r\n");
  9471. }
  9472. }
  9473. }
  9474. else // Charger.CCID_Module_Type is CCID_MODULE_CORMEX
  9475. {
  9476. if((Charger.Leak_Current >= Charger.alarm_spec.Current_LEAK_AC) && (!Charger.isTestLeakModule)) // adc correction data to check
  9477. {
  9478. if(Charger.counter.LEAK.fail >= 5)
  9479. {
  9480. if(!(Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC))
  9481. {
  9482. #ifdef FUNC_MODIFY_LEAK_AC_DISPLAY
  9483. XP("#Leak_Current (%d >= %d)\r\n", Charger.Leak_Current, Charger.alarm_spec.Current_LEAK_AC);
  9484. #else
  9485. XP("************************************************************\r\n");
  9486. XP("adc_value.ADC2_IN6_GF.value = %d\r\n", adc_value.ADC2_IN6_GF.value);
  9487. XP("Charger.Leak_Current(mA) = %d\r\n", Charger.Leak_Current);
  9488. XP("Charger.alarm_spec.Current_LEAK_AC(mA) = %d\r\n", Charger.alarm_spec.Current_LEAK_AC);
  9489. XP("Charger.isTestLeakModule = %s\r\n", Charger.isTestLeakModule ? "ON" : "OFF");
  9490. XP("************************************************************\r\n");
  9491. #endif
  9492. Charger.counter.LEAK.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9493. Charger.Alarm_Code |= ALARM_CURRENT_LEAK_AC; //Hao##### CSU Charge error here
  9494. DEBUG_ERROR("Alarm leakage occur.\r\n");
  9495. timerEnable(TIMER_IDX_RETRY_LEAK_AC, ALARM_RETRY_INTERVAL_LEAK);
  9496. Charger.counter.LEAK.retry ++ ;
  9497. }
  9498. }
  9499. else
  9500. {
  9501. Charger.counter.LEAK.fail++;
  9502. }
  9503. }
  9504. else if (Charger.Leak_Current < (Charger.alarm_spec.Current_LEAK_AC - ALARM_SPEC_CURRENT_LEAK_HYSTERESIS)) // adc correction data to check
  9505. {
  9506. Charger.counter.LEAK.fail = 0;
  9507. if (Charger.counter.LEAK.retry > ALARM_LEAK_RETRY_COUNT)
  9508. {
  9509. if (Charger.counter.LEAK.isLatch == OFF)
  9510. {
  9511. Charger.counter.LEAK.isLatch = ON ;
  9512. setLedMotion(LED_ACTION_ALARM);
  9513. }
  9514. }
  9515. else
  9516. {
  9517. if(((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)) &&
  9518. (Charger.counter.LEAK.retry <= ALARM_LEAK_RETRY_COUNT) &&
  9519. (timer[TIMER_IDX_RETRY_LEAK_AC].isAlarm == ON) &&
  9520. blinker[BLINKER_IDX_LED].blinkisFinish )
  9521. {
  9522. timerDisable(TIMER_IDX_RETRY_LEAK_AC);
  9523. osDelay(1000);
  9524. Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC;
  9525. DEBUG_INFO("Alarm leakage recover.\r\n");
  9526. }
  9527. }
  9528. }
  9529. }
  9530. #endif //CCID_PROTECT
  9531. //================================
  9532. // Ground fail alarm detect
  9533. // TODO: Spec need to check
  9534. //================================
  9535. #ifdef GROUND_FAULT_PROTECT
  9536. if(Charger.GroundingDetect==ON)
  9537. {
  9538. if (timer[TIMER_IDX_PE_DETECT].isAlarm == ON) // after 30 sec check (GMI adc_value > spec) and (GMI adc_value <= 1 )
  9539. {
  9540. if(((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) > (Charger.Voltage[0]*0.011)) || (adc_value.ADC3_IN4_GMI_VL1.value <= 1)) //Part FAIL
  9541. {
  9542. #ifdef TEST_GROUND_FAULT_PROTECT_TIME_TO_15_SEC
  9543. if(Charger.counter.GF.fail > 15000)
  9544. #else
  9545. if(Charger.counter.GF.fail > 4000)
  9546. #endif
  9547. {
  9548. if(!(Charger.Alarm_Code & ALARM_GROUND_FAIL))
  9549. {
  9550. Charger.counter.GF.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9551. Charger.Alarm_Code |= ALARM_GROUND_FAIL;
  9552. DEBUG_ERROR("Alarm GF occur.\r\n");
  9553. #ifdef MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE
  9554. Charger.counter.GF.restore = 0;
  9555. #endif
  9556. #ifdef DEBUG_ALARM_GROUND_FAIL
  9557. XP("#adc_value.ADC3_IN4_GMI_VL1.value = %d\r\n", adc_value.ADC3_IN4_GMI_VL1.value);
  9558. XP("#adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095 = %f\r\n", adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095);
  9559. XP("#Charger.Voltage[0]*0.011 = %f\r\n", Charger.Voltage[0]*0.011);
  9560. #endif
  9561. }
  9562. }
  9563. else
  9564. Charger.counter.GF.fail++;
  9565. }
  9566. else if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.00566))
  9567. {
  9568. #ifdef MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE
  9569. if((Charger.Alarm_Code & ALARM_GROUND_FAIL) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9570. {
  9571. if (Charger.counter.GF.restore > 2000)
  9572. {
  9573. Charger.Alarm_Code &= ~ALARM_GROUND_FAIL;
  9574. DEBUG_INFO("Alarm GF recover.\r\n");
  9575. Charger.counter.GF.fail = 0;
  9576. }
  9577. else
  9578. {
  9579. Charger.counter.GF.restore++;
  9580. }
  9581. }
  9582. #else //MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE
  9583. Charger.counter.GF.fail = 0;
  9584. if((Charger.Alarm_Code & ALARM_GROUND_FAIL) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9585. {
  9586. Charger.counter.GF.retry++;
  9587. Charger.Alarm_Code &= ~ALARM_GROUND_FAIL;
  9588. DEBUG_INFO("Alarm GF recover.\r\n");
  9589. }
  9590. #endif //MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE
  9591. }
  9592. }
  9593. else // before 30 sec check (GMI adc_value > spec)
  9594. {
  9595. if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) > (Charger.Voltage[0]*0.011))
  9596. {
  9597. if(Charger.counter.GF.fail > 4000)
  9598. {
  9599. if(!(Charger.Alarm_Code & ALARM_GROUND_FAIL))
  9600. {
  9601. Charger.counter.GF.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9602. Charger.Alarm_Code |= ALARM_GROUND_FAIL;
  9603. DEBUG_ERROR("Alarm GF occur.\r\n");
  9604. #ifdef MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE
  9605. Charger.counter.GF.restore = 0;
  9606. #endif
  9607. }
  9608. }
  9609. else
  9610. Charger.counter.GF.fail++;
  9611. }
  9612. else if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.00566))
  9613. {
  9614. #ifdef MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE
  9615. //Charger.counter.GF.fail = 0;
  9616. if((Charger.Alarm_Code & ALARM_GROUND_FAIL) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9617. {
  9618. if (Charger.counter.GF.restore > 2000)
  9619. {
  9620. Charger.Alarm_Code &= ~ALARM_GROUND_FAIL;
  9621. DEBUG_INFO("Alarm GF recover.\r\n");
  9622. Charger.counter.GF.fail = 0;
  9623. }
  9624. else
  9625. {
  9626. Charger.counter.GF.restore++;
  9627. }
  9628. }
  9629. #else //MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE
  9630. Charger.counter.GF.fail = 0;
  9631. if((Charger.Alarm_Code & ALARM_GROUND_FAIL) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9632. {
  9633. //osDelay(3000);
  9634. Charger.counter.GF.retry++;
  9635. Charger.Alarm_Code &= ~ALARM_GROUND_FAIL;
  9636. DEBUG_INFO("Alarm GF recover.\r\n");
  9637. }
  9638. #endif //MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE
  9639. }
  9640. }
  9641. }
  9642. #endif //GROUND_FAULT_PROTECT
  9643. //================================
  9644. // Relay status error detect
  9645. // TODO: ADC channel & spec need to check
  9646. //================================
  9647. #ifdef MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK
  9648. #ifdef FUNC_USE_RELAY_B_CONTACT
  9649. if (Charger.m_bUseRelayBContact)
  9650. AlarmDetect_RelayWelding_UseGPIO();
  9651. else
  9652. AlarmDetect_RelayWelding_UseADC();
  9653. #else
  9654. AlarmDetect_RelayWelding_UseADC();
  9655. #endif //FUNC_USE_RELAY_B_CONTACT
  9656. #endif //MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK
  9657. //================================
  9658. // Emergency stop alarm detect
  9659. //================================
  9660. #ifdef EMC_BUTTON_PROTECT
  9661. if(HAL_GPIO_ReadPin(IN_Emergency_GPIO_Port, IN_Emergency_Pin) == GPIO_PIN_RESET)
  9662. {
  9663. if(Charger.counter.EMO.fail > 100)
  9664. {
  9665. if(!(Charger.Alarm_Code & ALARM_EMERGENCY_STOP))
  9666. {
  9667. Charger.counter.EMO.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9668. Charger.Alarm_Code |= ALARM_EMERGENCY_STOP;
  9669. DEBUG_ERROR("Alarm EMO occur.\r\n");
  9670. }
  9671. }
  9672. else
  9673. Charger.counter.EMO.fail++;
  9674. }
  9675. else
  9676. {
  9677. Charger.counter.EMO.fail = 0;
  9678. if((Charger.Alarm_Code & ALARM_EMERGENCY_STOP) && blinker[BLINKER_IDX_LED].blinkisFinish)
  9679. {
  9680. Charger.counter.EMO.retry++;
  9681. Charger.Alarm_Code &= ~ALARM_EMERGENCY_STOP;
  9682. DEBUG_INFO("Alarm EMO recover.\r\n");
  9683. }
  9684. }
  9685. #endif //EMC_BUTTON_PROTECT
  9686. //================================
  9687. // Handshaking timeout detect
  9688. //================================
  9689. #ifdef HANDSHAKE_PROTECT
  9690. if(timer[TIMER_IDX_CP].isAlarm == ON)
  9691. {
  9692. if(!(Charger.Alarm_Code & ALARM_HANDSHAKE_TIMEOUT))
  9693. {
  9694. Charger.Alarm_Code |= ALARM_HANDSHAKE_TIMEOUT;
  9695. timerDisable(TIMER_IDX_CP);
  9696. Charger.rfid.op_bits.reqStart = OFF;
  9697. Charger.istoHandShakeMode = OFF ;
  9698. DEBUG_ERROR("Alarm handshake overtime occur.\r\n");
  9699. }
  9700. }
  9701. else
  9702. {
  9703. if((Charger.Alarm_Code & ALARM_HANDSHAKE_TIMEOUT))
  9704. {
  9705. osDelay(10000);
  9706. Charger.Alarm_Code &= ~ALARM_HANDSHAKE_TIMEOUT;
  9707. DEBUG_INFO("Alarm handshake overtime recover.\r\n");
  9708. }
  9709. }
  9710. #endif //HANDSHAKE_PROTECT
  9711. //================================
  9712. // Rotary Switch Maxium Current Error detect
  9713. //================================
  9714. #ifdef ROTATE_SWITCH_CHECK
  9715. if (Charger.isRotarySwitchError)
  9716. {
  9717. if(!(Charger.Alarm_Code & ALARM_ROTATORY_SWITCH_FAULT))
  9718. {
  9719. Charger.Alarm_Code |= ALARM_ROTATORY_SWITCH_FAULT;
  9720. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  9721. {
  9722. #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS
  9723. if (Charger.m_bModelNameAW48_1P)
  9724. {
  9725. blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1);
  9726. }
  9727. else
  9728. {
  9729. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  9730. }
  9731. #else
  9732. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  9733. #endif
  9734. }
  9735. DEBUG_INFO("Rotary Switch Maxium Current Error occur.\r\n");
  9736. }
  9737. }
  9738. #endif //ROTATE_SWITCH_CHECK
  9739. //================================
  9740. // Meter communication timeout
  9741. //================================
  9742. #ifdef METER_TIMEOUT_CHECK
  9743. #ifdef FUNC_PTB_METER_WM3M4C
  9744. if (Charger.m_bUseExtMeter_PRO380 || Charger.m_bUseExtMeter_WM3M4C)
  9745. #else
  9746. if (Charger.m_bUseExtMeter_PRO380)
  9747. #endif
  9748. {
  9749. #ifdef RECODE_METER_PRO380
  9750. if (Charger.m_bUseExtMeter_PRO380 && Charger.m_pPRO380)
  9751. {
  9752. Charger.m_pPRO380->m_bCommTimeout = HTK_IsTimeout(Charger.m_pPRO380->m_LastUpdateTick, METER_EXT_COMM_TIMEOUT);
  9753. }
  9754. if (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C)
  9755. {
  9756. Charger.m_pWM3M4C->m_bCommTimeout = HTK_IsTimeout(Charger.m_pWM3M4C->m_LastUpdateTick, METER_EXT_COMM_TIMEOUT);
  9757. }
  9758. if (
  9759. (Charger.m_bUseExtMeter_PRO380 && Charger.m_pPRO380 && Charger.m_pPRO380->m_bCommTimeout) ||
  9760. (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C && Charger.m_pWM3M4C->m_bCommTimeout)
  9761. )
  9762. #else
  9763. #ifdef MODIFY_METER_EXT_PRO380
  9764. #ifdef FUNC_PTB_METER_WM3M4C
  9765. if (
  9766. (Charger.m_bUseExtMeter_PRO380 && HTK_IsTimeout(Charger.m_MeterPRO380.m_LastUpdateTick, METER_EXT_COMM_TIMEOUT)) ||
  9767. (Charger.m_bUseExtMeter_WM3M4C && HTK_IsTimeout(Charger.m_pWM3M4C->m_LastUpdateTick, METER_EXT_COMM_TIMEOUT))
  9768. )
  9769. #else //FUNC_PTB_METER_WM3M4C
  9770. if (HTK_IsTimeout(Charger.m_MeterPRO380.m_LastUpdateTick, METER_EXT_COMM_TIMEOUT))
  9771. #endif //FUNC_PTB_METER_WM3M4C
  9772. #else //MODIFY_METER_EXT_PRO380
  9773. if (Charger.counter.Meter_Timeout.fail >= ALARM_SPEC_METER_TIMEOUT)
  9774. #endif //MODIFY_METER_EXT_PRO380
  9775. #endif //RECODE_METER_PRO380
  9776. {
  9777. if (!(Charger.Alarm_Code & ALARM_METER_TIMEOUT))
  9778. {
  9779. Charger.Alarm_Code |= ALARM_METER_TIMEOUT;
  9780. if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  9781. {
  9782. #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS
  9783. if (Charger.m_bModelNameAW48_1P)
  9784. {
  9785. blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1);
  9786. }
  9787. else
  9788. {
  9789. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  9790. }
  9791. #else
  9792. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  9793. #endif
  9794. }
  9795. DEBUG_ERROR("Meter EXT COMM Timeout error occur.\r\n");
  9796. }
  9797. }
  9798. else
  9799. {
  9800. if (Charger.Alarm_Code & ALARM_METER_TIMEOUT)
  9801. {
  9802. Charger.Alarm_Code &= ~ALARM_METER_TIMEOUT;
  9803. DEBUG_INFO("Meter EXT COMM Timeout error recover.\r\n");
  9804. }
  9805. }
  9806. }
  9807. else
  9808. {
  9809. Charger.Alarm_Code &= ~ALARM_METER_TIMEOUT;
  9810. }
  9811. #endif //METER_TIMEOUT_CHECK
  9812. #ifdef FUNC_WARNING_CODE
  9813. #ifdef FUNC_EKM_OMNIMETER
  9814. {
  9815. const char s[] = "[WARN] Omnimeter timeout warning";
  9816. if (Charger.m_bUseExtMeter_OMNIMETER && Charger.m_pEKM_Omnimeter)
  9817. {
  9818. if (Charger.m_pEKM_Omnimeter->m_bCommTimeout)
  9819. {
  9820. if (!(Charger.Warning_Code & WARN_OMNIMETER_COMM_TIMEOUT))
  9821. {
  9822. Charger.Warning_Code |= WARN_OMNIMETER_COMM_TIMEOUT;
  9823. DEBUG_ERROR("%s occur.\r\n", s);
  9824. }
  9825. }
  9826. else
  9827. {
  9828. if (Charger.Warning_Code & WARN_OMNIMETER_COMM_TIMEOUT)
  9829. {
  9830. Charger.Warning_Code &= ~WARN_OMNIMETER_COMM_TIMEOUT;
  9831. DEBUG_ERROR("%s recover.\r\n", s);
  9832. }
  9833. }
  9834. }
  9835. else
  9836. {
  9837. if (Charger.Warning_Code & WARN_OMNIMETER_COMM_TIMEOUT)
  9838. {
  9839. Charger.Warning_Code &= ~WARN_OMNIMETER_COMM_TIMEOUT;
  9840. DEBUG_ERROR("%s recover.\r\n", s);
  9841. }
  9842. }
  9843. }
  9844. #endif //FUNC_EKM_OMNIMETER
  9845. #endif //FUNC_WARNING_CODE
  9846. #ifdef FUNC_METER_IC_COMM_ALARM
  9847. if (HTK_IsTimeout(Charger.m_MeterIC_LastUpdateTick, METER_IC_COMM_TIMEOUT))
  9848. {
  9849. if (!(Charger.Alarm_Code & ALARM_METER_IC_TIMEOUT))
  9850. {
  9851. Charger.Alarm_Code |= ALARM_METER_IC_TIMEOUT;
  9852. if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  9853. {
  9854. #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS
  9855. if (Charger.m_bModelNameAW48_1P)
  9856. {
  9857. blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1);
  9858. }
  9859. else
  9860. {
  9861. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  9862. }
  9863. #else
  9864. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  9865. #endif
  9866. }
  9867. DEBUG_ERROR("Meter IC COMM Timeout error occur.\r\n");
  9868. }
  9869. }
  9870. else
  9871. {
  9872. if (Charger.Alarm_Code & ALARM_METER_IC_TIMEOUT)
  9873. {
  9874. Charger.Alarm_Code &= ~ALARM_METER_IC_TIMEOUT;
  9875. DEBUG_INFO("Meter IC COMM Timeout error recover.\r\n");
  9876. }
  9877. }
  9878. #endif //FUNC_METER_IC_COMM_ALARM
  9879. #ifdef GUN_LOCK_ALARM
  9880. if (Charger.m_bUseGunLock)
  9881. {
  9882. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  9883. static uint32_t AlarmOccurTick = 0;
  9884. #endif
  9885. if (
  9886. #ifdef FUNC_GUN_LOCK_TRIG_MODE
  9887. (
  9888. Charger.m_GunLockTrigMode == GL_TRIG_MODE_RELAY &&
  9889. (
  9890. (GL_IsLock() && (Relay1_Action_Get() == GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() == GPIO_RELAY2_ACTION_OFF)) ||
  9891. (!GL_IsLock() && (Relay1_Action_Get() != GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() != GPIO_RELAY2_ACTION_OFF))
  9892. )
  9893. )
  9894. #else
  9895. (GL_IsLock() && (Relay1_Action_Get() == GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() == GPIO_RELAY2_ACTION_OFF)) ||
  9896. (!GL_IsLock() && (Relay1_Action_Get() != GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() != GPIO_RELAY2_ACTION_OFF))
  9897. #endif
  9898. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  9899. || (Charger.m_GunUnlock_Counter >= GUN_LOCK_PULSE_MAX_TIMES_CAUSE_ALARM)
  9900. || (Charger.m_GunLock_Counter >= GUN_LOCK_PULSE_MAX_TIMES_CAUSE_ALARM)
  9901. #endif
  9902. )
  9903. {
  9904. if (!(Charger.Alarm_Code & ALARM_LOCKER_FAULT))
  9905. {
  9906. if (Charger.counter.GunLock.fail > 1000)
  9907. {
  9908. Charger.counter.GunLock.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  9909. Charger.Alarm_Code |= ALARM_LOCKER_FAULT;
  9910. DEBUG_ERROR("Alarm GunLock occur.\r\n");
  9911. Charger.counter.GunLock.restore = 0;
  9912. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  9913. AlarmOccurTick = HAL_GetTick();;
  9914. #endif
  9915. }
  9916. else
  9917. {
  9918. Charger.counter.GunLock.fail++;
  9919. }
  9920. }
  9921. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  9922. if (Charger.Alarm_Code & ALARM_LOCKER_FAULT && HTK_IsTimeout(AlarmOccurTick, 1000 * 10))
  9923. {
  9924. if (
  9925. (Charger.m_GunUnlock_Counter >= GUN_LOCK_PULSE_MAX_TIMES_CAUSE_ALARM) ||
  9926. (Charger.m_GunLock_Counter >= GUN_LOCK_PULSE_MAX_TIMES_CAUSE_ALARM)
  9927. )
  9928. {
  9929. Charger.m_GunUnlock_Counter = 0;
  9930. Charger.m_GunLock_Counter = 0;
  9931. }
  9932. }
  9933. #endif
  9934. }
  9935. else
  9936. {
  9937. if (Charger.Alarm_Code & ALARM_LOCKER_FAULT)
  9938. {
  9939. if (Charger.counter.GunLock.restore > 1000)
  9940. {
  9941. Charger.Alarm_Code &= ~ALARM_LOCKER_FAULT;
  9942. DEBUG_INFO("Alarm GunLock recover.\r\n");
  9943. Charger.counter.GunLock.fail = 0;
  9944. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  9945. Charger.m_GunUnlock_Counter = 0;
  9946. Charger.m_GunLock_Counter = 0;
  9947. #endif
  9948. }
  9949. else
  9950. {
  9951. Charger.counter.GunLock.restore++;
  9952. }
  9953. }
  9954. }
  9955. }
  9956. else
  9957. {
  9958. if (Charger.Alarm_Code & ALARM_LOCKER_FAULT)
  9959. {
  9960. Charger.Alarm_Code &= ~ALARM_LOCKER_FAULT;
  9961. }
  9962. }
  9963. #endif //GUN_LOCK_ALARM
  9964. #ifdef FUNC_AX80_ADD_TILT_SENSOR
  9965. #ifdef FUNC_ADD_TILT_SENSOR_MODEL
  9966. #ifdef FUNC_DISABLE_TILT_SENSOR_FOR_TEST
  9967. if (Charger.m_bUseTiltSensor && !Charger.m_bDisableTiltSensorForTest)
  9968. #else
  9969. if (Charger.m_bUseTiltSensor)
  9970. #endif
  9971. #else //FUNC_ADD_TILT_SENSOR_MODEL
  9972. if (Charger.m_bModelNameAX80_1P)
  9973. #endif //FUNC_ADD_TILT_SENSOR_MODEL
  9974. {
  9975. AlarmDetect_TiltSensor();
  9976. }
  9977. #endif //FUNC_AX80_ADD_TILT_SENSOR
  9978. //================================
  9979. // Recover alarm info in state A
  9980. //================================
  9981. if(Charger.CP_State == SYSTEM_STATE_A)
  9982. {
  9983. //SCP Recover
  9984. if(Charger.Alarm_Code & ALARM_L1_CIRCUIT_SHORT)
  9985. {
  9986. Charger.Alarm_Code &= ~ALARM_L1_CIRCUIT_SHORT;
  9987. DEBUG_INFO("Alarm L1 SCP recover.\r\n");
  9988. }
  9989. if(Charger.Alarm_Code & ALARM_L2_CIRCUIT_SHORT)
  9990. {
  9991. Charger.Alarm_Code &= ~ALARM_L2_CIRCUIT_SHORT;
  9992. DEBUG_INFO("Alarm L2 SCP recover.\r\n");
  9993. }
  9994. if(Charger.Alarm_Code & ALARM_L3_CIRCUIT_SHORT)
  9995. {
  9996. Charger.Alarm_Code &= ~ALARM_L3_CIRCUIT_SHORT;
  9997. DEBUG_INFO("Alarm L3 SCP recover.\r\n");
  9998. }
  9999. //OCP Recover
  10000. if(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT)
  10001. {
  10002. Charger.Alarm_Code &= ~ALARM_L1_OVER_CURRENT;
  10003. DEBUG_INFO("Alarm L1 OC recover.\r\n");
  10004. }
  10005. if(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT)
  10006. {
  10007. Charger.Alarm_Code &= ~ALARM_L2_OVER_CURRENT;
  10008. DEBUG_INFO("Alarm L2 OC recover.\r\n");
  10009. }
  10010. if(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT)
  10011. {
  10012. Charger.Alarm_Code &= ~ALARM_L3_OVER_CURRENT;
  10013. DEBUG_INFO("Alarm L3 OC recover.\r\n");
  10014. }
  10015. timerDisable(TIMER_IDX_RETRY_OC);
  10016. Charger.counter.L1_OC.fail = 0 ;
  10017. Charger.counter.L1_OC.retry = 0 ; // clear retry times
  10018. Charger.counter.L1_OC.isLatch = OFF ;
  10019. Charger.counter.L2_OC.fail = 0 ;
  10020. Charger.counter.L2_OC.retry = 0 ; // clear retry times
  10021. Charger.counter.L2_OC.isLatch = OFF ;
  10022. Charger.counter.L3_OC.fail = 0 ;
  10023. Charger.counter.L3_OC.retry = 0 ; // clear retry times
  10024. Charger.counter.L3_OC.isLatch = OFF ;
  10025. //CCID Recover
  10026. if (Charger.CCID_Module_Type == CCID_MODULE_VAC)
  10027. {
  10028. if ((HAL_GPIO_ReadPin(IN_Leak_AC_GPIO_Port, IN_Leak_AC_Pin) == GPIO_PIN_RESET) && (Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC))
  10029. {
  10030. Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC;
  10031. DEBUG_INFO("Alarm leakage AC recover for VAC.\r\n");
  10032. }
  10033. if ((HAL_GPIO_ReadPin(IN_Leak_DC_GPIO_Port, IN_Leak_DC_Pin) == GPIO_PIN_RESET) && (Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC))
  10034. {
  10035. Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_DC;
  10036. DEBUG_INFO("Alarm leakage DC recover for VAC.\r\n");
  10037. }
  10038. }
  10039. else //Charger.CCID_Module_Type is CCID_MODULE_CORMEX
  10040. {
  10041. #ifdef MODIFY_ALARM_LEAKAGE_RECOVER
  10042. if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC))
  10043. {
  10044. Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC;
  10045. DEBUG_INFO("Alarm AC leakage recover.\r\n");
  10046. }
  10047. #else
  10048. if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC))
  10049. {
  10050. Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC;
  10051. DEBUG_INFO("Alarm leakage recover.\r\n");
  10052. }
  10053. #endif //MODIFY_ALARM_LEAKAGE_RECOVER
  10054. }
  10055. Charger.counter.LEAK.fail = 0;
  10056. timerDisable(TIMER_IDX_RETRY_LEAK) ;
  10057. timerDisable(TIMER_IDX_RETRY_LEAK_AC) ;
  10058. timerDisable(TIMER_IDX_RETRY_LEAK_DC) ;
  10059. Charger.counter.LEAK.retry = 0 ; // clear latch times
  10060. Charger.counter.LEAK_DC.retry = 0 ; // clear latch times
  10061. Charger.counter.LEAK_AC.retry = 0 ; // clear latch times
  10062. Charger.counter.LEAK.isLatch = OFF ;
  10063. #ifdef FUNC_UNPLUG_GUN_TO_RELEASE_TEMP_LATCH
  10064. Charger.counter.OT.isLatch = OFF;
  10065. #endif
  10066. //LEAK_MODULE selfrest Recover
  10067. if (Charger.CCID_Module_Type == CCID_MODULE_VAC)
  10068. {
  10069. if(Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL & (HAL_GPIO_ReadPin(IN_Leak_Error_GPIO_Port, IN_Leak_Error_Pin) == GPIO_PIN_RESET)) // leak module is VAC
  10070. {
  10071. if ((Charger.counter.LEAK_MODULE.retry < 2) && (!Charger.counter.LEAK_MODULE.isLatch))
  10072. {
  10073. Charger.Alarm_Code &= ~ALARM_LEAK_MODULE_FAIL;
  10074. DEBUG_INFO("Alarm leakage module recover.\r\n");
  10075. }
  10076. }
  10077. }
  10078. else //Charger.CCID_Module_Type is CCID_MODULE_CORMEX
  10079. {
  10080. if(Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL) // leak module is CORMEX
  10081. {
  10082. if ((Charger.counter.LEAK_MODULE.retry < 2) && (!Charger.counter.LEAK_MODULE.isLatch))
  10083. {
  10084. Charger.Alarm_Code &= ~ALARM_LEAK_MODULE_FAIL;
  10085. DEBUG_INFO("Alarm leakage module recover.\r\n");
  10086. }
  10087. }
  10088. }
  10089. }
  10090. }
  10091. else if (Charger.Mode == MODE_DEBUG)
  10092. {
  10093. //================================
  10094. // Relay status error detect
  10095. // TODO: ADC channel & spec need to check
  10096. //================================
  10097. #ifdef MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK
  10098. #ifdef FUNC_USE_RELAY_B_CONTACT
  10099. if (Charger.m_bUseRelayBContact)
  10100. AlarmDetect_RelayWelding_UseGPIO();
  10101. else
  10102. AlarmDetect_RelayWelding_UseADC();
  10103. #else
  10104. AlarmDetect_RelayWelding_UseADC();
  10105. #endif //FUNC_USE_RELAY_B_CONTACT
  10106. #endif //MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK
  10107. }
  10108. #ifdef FUNC_RESET_DATA_AFTER_WRITE_NEW_MODELNAME
  10109. if (Charger.m_bTrigToClearAlarmCode)
  10110. {
  10111. Charger.m_bTrigToClearAlarmCode = HTK_FALSE;
  10112. Charger.Alarm_Code = 0;
  10113. }
  10114. #endif
  10115. osDelay(1);
  10116. }
  10117. /* USER CODE END StartAlarmTask */
  10118. }
  10119. /* USER CODE BEGIN Header_StartBleTask */
  10120. /**
  10121. * @brief Function implementing the bleTask thread.
  10122. * @param argument: Not used
  10123. * @retval None
  10124. */
  10125. /* USER CODE END Header_StartBleTask */
  10126. void StartBleTask(void const * argument)
  10127. {
  10128. /* USER CODE BEGIN StartBleTask */
  10129. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  10130. IdleUntilReadAllMemory();
  10131. #endif
  10132. char tmpBuf[128];
  10133. uint8_t endFlag[4]={0x55,0xaa,0x55,0xaa};
  10134. __IO uint32_t flash;
  10135. uint32_t checksum;
  10136. uint32_t rndNumber;
  10137. //=====================================
  10138. // Module reset
  10139. //=====================================
  10140. HAL_GPIO_WritePin(OUT_BLE_RESET_GPIO_Port, OUT_BLE_RESET_Pin, GPIO_PIN_RESET);
  10141. osDelay(60);
  10142. HAL_GPIO_WritePin(OUT_BLE_RESET_GPIO_Port, OUT_BLE_RESET_Pin, GPIO_PIN_SET);
  10143. HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_SET);
  10144. Charger.ble.initSeq = 0;
  10145. Charger.ble.isDataMode = OFF;
  10146. UART_BLE_Init_OK = OFF;
  10147. osDelay(1000);
  10148. /* Infinite loop */
  10149. for(;;)
  10150. {
  10151. //=====================================
  10152. // BLE module initialization process
  10153. //=====================================
  10154. switch(Charger.ble.initSeq)
  10155. {
  10156. case 0x00:
  10157. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_RESTORE], strlen(BLE_CMD[BLE_CMD_SET_RESTORE]), 0xffff);
  10158. osDelay(BLE_INIT_DELAY);
  10159. break;
  10160. case 0x01:
  10161. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_ROLE], strlen(BLE_CMD[BLE_CMD_SET_ROLE]), 0xffff);
  10162. osDelay(BLE_INIT_DELAY);
  10163. break;
  10164. case 0x02:
  10165. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_DTR], strlen(BLE_CMD[BLE_CMD_SET_DTR]), 0xffff);
  10166. osDelay(BLE_INIT_DELAY);
  10167. break;
  10168. case 0x03:
  10169. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_DSR], strlen(BLE_CMD[BLE_CMD_SET_DSR]), 0xffff);
  10170. osDelay(BLE_INIT_DELAY);
  10171. break;
  10172. case 0x04:
  10173. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_PAIRING_MODE], strlen(BLE_CMD[BLE_CMD_SET_PAIRING_MODE]), 0xffff);
  10174. osDelay(BLE_INIT_DELAY);
  10175. break;
  10176. case 0x05:
  10177. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_SECURITY_MODE], strlen(BLE_CMD[BLE_CMD_SET_SECURITY_MODE]), 0xffff);
  10178. osDelay(BLE_INIT_DELAY);
  10179. break;
  10180. case 0x06:
  10181. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_SECURITY_TYPE], strlen(BLE_CMD[BLE_CMD_SET_SECURITY_TYPE]), 0xffff);
  10182. osDelay(BLE_INIT_DELAY);
  10183. break;
  10184. case 0x07:
  10185. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_DISCOVERABILITY], strlen(BLE_CMD[BLE_CMD_SET_DISCOVERABILITY]), 0xffff);
  10186. osDelay(BLE_INIT_DELAY);
  10187. break;
  10188. case 0x08:
  10189. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_CONNECTABILITY], strlen(BLE_CMD[BLE_CMD_SET_CONNECTABILITY]), 0xffff);
  10190. osDelay(BLE_INIT_DELAY);
  10191. break;
  10192. case 0x09:
  10193. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_GET_ADDR], strlen(BLE_CMD[BLE_CMD_GET_ADDR]), 0xffff);
  10194. osDelay(BLE_INIT_DELAY);
  10195. break;
  10196. case 0x0a:
  10197. sprintf(tmpBuf, "%s\"BYTON_EVSE_%s\"\r\n", BLE_CMD[BLE_CMD_SET_NAME], Charger.ble.peripheral_mac);
  10198. DEBUG_INFO("BLE module set name:BYTON_EVSE_%s\r\n", Charger.ble.peripheral_mac);
  10199. HAL_UART_Transmit(&BLE_USART, (uint8_t *)tmpBuf, strlen(tmpBuf), 0xffff);
  10200. osDelay(BLE_INIT_DELAY);
  10201. break;
  10202. case 0x0b:
  10203. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_MAX_POWER], strlen(BLE_CMD[BLE_CMD_SET_MAX_POWER]), 0xffff);
  10204. osDelay(BLE_INIT_DELAY);
  10205. break;
  10206. case 0x0c:
  10207. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_MIN_INTERVAL], strlen(BLE_CMD[BLE_CMD_SET_MIN_INTERVAL]), 0xffff);
  10208. osDelay(BLE_INIT_DELAY);
  10209. break;
  10210. case 0x0d:
  10211. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_MAX_INTERVAL], strlen(BLE_CMD[BLE_CMD_SET_MAX_INTERVAL]), 0xffff);
  10212. osDelay(BLE_INIT_DELAY);
  10213. break;
  10214. case 0x0e:
  10215. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_TX_PHY], strlen(BLE_CMD[BLE_CMD_SET_TX_PHY]), 0xffff);
  10216. osDelay(BLE_INIT_DELAY);
  10217. break;
  10218. case 0x0f:
  10219. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_RX_PHY], strlen(BLE_CMD[BLE_CMD_SET_RX_PHY]), 0xffff);
  10220. osDelay(BLE_INIT_DELAY);
  10221. break;
  10222. case 0x10:
  10223. HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_DATA_MODE], strlen(BLE_CMD[BLE_CMD_SET_DATA_MODE]), 0xffff);
  10224. DEBUG_INFO("BLE module switch to data mode.\r\n");
  10225. osDelay(BLE_INIT_DELAY);
  10226. default:
  10227. UART_BLE_Init_OK = ON;
  10228. break;
  10229. }
  10230. //=====================================
  10231. // BLE central device connect status
  10232. //=====================================
  10233. if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_SET) && (UART_BLE_Init_OK == ON))
  10234. {
  10235. // Device disconnect
  10236. timerRefresh(TIMER_IDX_BLE);
  10237. if(Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT || Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)
  10238. {
  10239. DEBUG_INFO("BLE central device disconnect.\r\n.");
  10240. Charger.ble.loginRole = BLE_LOGIN_ROLE_UNKOWN;
  10241. }
  10242. }
  10243. else if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_RESET) && (UART_BLE_Init_OK == ON))
  10244. {
  10245. // Device connect in
  10246. if(Charger.ble.loginRole == BLE_LOGIN_ROLE_UNKOWN)
  10247. {
  10248. DEBUG_INFO("BLE central device connect.....wait sign in.\r\n.");
  10249. osDelay(1000);
  10250. }
  10251. }
  10252. //=====================================
  10253. // Communication timeout process
  10254. //=====================================
  10255. if(timer[TIMER_IDX_BLE].isAlarm)
  10256. {
  10257. Charger.ble.loginRole = BLE_LOGIN_ROLE_UNKOWN;
  10258. DEBUG_INFO("BLE no communication over time, disconnect central device.\r\n");
  10259. timerRefresh(TIMER_IDX_BLE);
  10260. HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_RESET);
  10261. osDelay(100);
  10262. HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_SET);
  10263. }
  10264. //=====================================
  10265. // BLE uart recieve data process
  10266. //=====================================
  10267. if(UART_BLE_recv_end_flag == ON)
  10268. {
  10269. if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_SET) || !Charger.ble.isDataMode)
  10270. {
  10271. // AT command rx process
  10272. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_RESTORE])!=NULL)
  10273. {
  10274. Charger.ble.initSeq++;
  10275. }
  10276. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_ROLE])!=NULL)
  10277. {
  10278. Charger.ble.initSeq++;
  10279. }
  10280. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_DTR])!=NULL)
  10281. {
  10282. Charger.ble.initSeq++;
  10283. }
  10284. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_DSR])!=NULL)
  10285. {
  10286. Charger.ble.initSeq++;
  10287. }
  10288. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_PAIRING_MODE])!=NULL)
  10289. {
  10290. Charger.ble.initSeq++;
  10291. }
  10292. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_SECURITY_MODE])!=NULL)
  10293. {
  10294. Charger.ble.initSeq++;
  10295. }
  10296. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_SECURITY_TYPE])!=NULL)
  10297. {
  10298. Charger.ble.initSeq++;
  10299. }
  10300. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_DISCOVERABILITY])!=NULL)
  10301. {
  10302. Charger.ble.initSeq++;
  10303. }
  10304. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_CONNECTABILITY])!=NULL)
  10305. {
  10306. Charger.ble.initSeq++;
  10307. }
  10308. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_GET_ADDR])!=NULL)
  10309. {
  10310. memcpy(Charger.ble.peripheral_mac, &UART_BLE_rx_buffer[strcspn((char *)UART_BLE_rx_buffer, ":")+1], 12);
  10311. Charger.ble.peripheral_mac[12] = '\0';
  10312. DEBUG_INFO("Peripheral mac address: %s\r\n", Charger.ble.peripheral_mac);
  10313. Charger.ble.initSeq++;
  10314. }
  10315. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_NAME])!=NULL)
  10316. {
  10317. Charger.ble.initSeq++;
  10318. }
  10319. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_MAX_POWER])!=NULL)
  10320. {
  10321. Charger.ble.initSeq++;
  10322. }
  10323. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_MIN_INTERVAL])!=NULL)
  10324. {
  10325. Charger.ble.initSeq++;
  10326. }
  10327. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_MAX_INTERVAL])!=NULL)
  10328. {
  10329. Charger.ble.initSeq++;
  10330. }
  10331. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_TX_PHY])!=NULL)
  10332. {
  10333. Charger.ble.initSeq++;
  10334. }
  10335. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_RX_PHY])!=NULL)
  10336. {
  10337. Charger.ble.initSeq++;
  10338. }
  10339. if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_DATA_MODE])!=NULL)
  10340. {
  10341. Charger.ble.isDataMode = ON;
  10342. Charger.ble.initSeq++;
  10343. }
  10344. }
  10345. else
  10346. {
  10347. // Application protocol rx process
  10348. uint8_t tx[UART_BUFFER_SIZE];
  10349. uint8_t tx_len;
  10350. uint8_t chksum = 0;
  10351. uint32_t tmp;
  10352. if(isValidCheckSum_BLE() && (rndNumber != ((UART_BLE_rx_buffer[3]<<0) | (UART_BLE_rx_buffer[4]<<8) | (UART_BLE_rx_buffer[5]<<16) | (UART_BLE_rx_buffer[6]<<24))))
  10353. {
  10354. // Timer reset
  10355. timerRefresh(TIMER_IDX_BLE);
  10356. rndNumber = ((UART_BLE_rx_buffer[3]<<0) | (UART_BLE_rx_buffer[4]<<8) | (UART_BLE_rx_buffer[5]<<16) | (UART_BLE_rx_buffer[6]<<24));
  10357. switch(UART_BLE_rx_buffer[2])
  10358. {
  10359. case BLE_PROTOCOL_MESSAGE_SIGN_IN:
  10360. DEBUG_INFO("BLE device sign request...%d\r\n", UART_BLE_rx_buffer[7]);
  10361. tx_len = 5;
  10362. tx[0] = (tx_len>>8)&0xff;
  10363. tx[1] = (tx_len&0xff);
  10364. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10365. tx[3] = 0x00;
  10366. if(Charger.memory.EVSE_Config.data.item.bleConfig.isRegPuk)
  10367. {
  10368. if(UART_BLE_rx_buffer[7] == 0x00)
  10369. {
  10370. if(memcmp(&UART_BLE_rx_buffer[8], &Charger.memory.EVSE_Config.data.item.bleConfig.idRoot[0], ((UART_BLE_rx_buffer[0]<<8) | (UART_BLE_rx_buffer[1]<<0)-9)) == 0)
  10371. {
  10372. // Root sign in
  10373. tx[3] = 0x02;
  10374. Charger.ble.loginRole = BLE_LOGIN_ROLE_ROOT;
  10375. DEBUG_INFO("Sign in as root.\r\n");
  10376. }
  10377. }
  10378. else
  10379. {
  10380. if(memcmp(&UART_BLE_rx_buffer[8], &Charger.memory.whiteList.data.item[0].pin[0], ((UART_BLE_rx_buffer[0]<<8) | (UART_BLE_rx_buffer[1]<<0)-9)) == 0)
  10381. {
  10382. // User sign in
  10383. tx[3] = 0x03;
  10384. Charger.ble.loginRole = BLE_LOGIN_ROLE_USER;
  10385. DEBUG_INFO("Sign in as user.\r\n");
  10386. }
  10387. }
  10388. }
  10389. else
  10390. {
  10391. if(UART_BLE_rx_buffer[7] == 0x00)
  10392. {
  10393. // Visitor
  10394. tx[3] = 0x01;
  10395. Charger.ble.loginRole = BLE_LOGIN_ROLE_VISITOR;
  10396. memcpy(&Charger.ble.loginId[0], &UART_BLE_rx_buffer[8], ((UART_BLE_rx_buffer[0]<<8) | (UART_BLE_rx_buffer[1]<<0)-9) );
  10397. DEBUG_WARN("Sign in as visitor.\r\n");
  10398. }
  10399. }
  10400. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10401. {
  10402. chksum ^= tx[2 + idx];
  10403. }
  10404. tx[4] = chksum;
  10405. break;
  10406. case BLE_PROTOCOL_MESSAGE_PUK_REG:
  10407. DEBUG_INFO("BLE device PUK registe.%02x%02x%02x%02x%02x%02x%02x%02x\r\n", UART_BLE_rx_buffer[7], UART_BLE_rx_buffer[8], UART_BLE_rx_buffer[9], UART_BLE_rx_buffer[10], UART_BLE_rx_buffer[11], UART_BLE_rx_buffer[12], UART_BLE_rx_buffer[13], UART_BLE_rx_buffer[14]);
  10408. tx_len = 11;
  10409. tx[0] = (tx_len>>8)&0xff;
  10410. tx[1] = (tx_len&0xff);
  10411. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10412. tx[3] = 0x00;
  10413. if(Charger.memory.EVSE_Config.data.item.bleConfig.isRegPuk)
  10414. {
  10415. if(memcmp(&Charger.ble.loginId[0], &Charger.memory.EVSE_Config.data.item.bleConfig.idRoot[0], ARRAY_SIZE(Charger.ble.loginId)))
  10416. {
  10417. tx[3] = 0x02;
  10418. DEBUG_INFO("ID registered exist.\r\n");
  10419. }
  10420. }
  10421. else
  10422. {
  10423. if(Charger.ble.loginRole == BLE_LOGIN_ROLE_VISITOR)
  10424. {
  10425. if(memcmp(&UART_BLE_rx_buffer[7], &Charger.memory.EVSE_Config.data.item.bleConfig.puk[0], 8) == 0x00)
  10426. {
  10427. tx[3] = 0x01;
  10428. // PIN list generation
  10429. Charger.memory.EVSE_Config.data.item.bleConfig.isGenPin = ON;
  10430. for(uint8_t idx=0;idx<20;idx++)
  10431. {
  10432. Charger.memory.whiteList.data.item[idx].listType = WHITE_LIST_TYPE_BLE;
  10433. Charger.memory.whiteList.data.item[idx].pin[0] = (rand()%0x2b)+0x30;
  10434. Charger.memory.whiteList.data.item[idx].pin[1] = (rand()%0x2b)+0x30;
  10435. Charger.memory.whiteList.data.item[idx].pin[2] = (rand()%0x2b)+0x30;
  10436. Charger.memory.whiteList.data.item[idx].pin[3] = (rand()%0x2b)+0x30;
  10437. Charger.memory.whiteList.data.item[idx].pin[4] = (rand()%0x2b)+0x30;
  10438. Charger.memory.whiteList.data.item[idx].pin[5] = (rand()%0x2b)+0x30;
  10439. Charger.memory.whiteList.data.item[idx].isReg = OFF;
  10440. }
  10441. Charger.memory.whiteList.op_bits.update = ON;
  10442. Charger.memory.EVSE_Config.data.item.bleConfig.isRegPuk = ON;
  10443. memcpy(&Charger.memory.EVSE_Config.data.item.bleConfig.idRoot[0], &Charger.ble.loginId[0], ARRAY_SIZE(Charger.ble.loginId));
  10444. Charger.memory.EVSE_Config.op_bits.update = ON;
  10445. DEBUG_INFO("Root registered and PIN list generate success.\r\n");
  10446. }
  10447. }
  10448. }
  10449. memcpy(&tx[4], &UART_BLE_rx_buffer[7], 6);
  10450. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10451. {
  10452. chksum ^= tx[2 + idx];
  10453. }
  10454. tx[10] = chksum;
  10455. break;
  10456. case BLE_PROTOCOL_MESSAGE_PIN_GET:
  10457. DEBUG_INFO("PIN get request.\r\n");
  10458. tx_len = 11;
  10459. tx[0] = (tx_len>>8)&0xff;
  10460. tx[1] = (tx_len&0xff);
  10461. tx[2] = UART_BLE_rx_buffer[2] + 0x80;;
  10462. tx[3] = 0x00;
  10463. if(Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT)
  10464. {
  10465. tx[3] = 0x01;
  10466. memcpy(&tx[4], &Charger.memory.whiteList.data.item[0].pin[0], 6);
  10467. DEBUG_INFO("PIN: %s\r\n", Charger.memory.whiteList.data.item[0].pin);
  10468. }
  10469. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10470. {
  10471. chksum ^= tx[2 + idx];
  10472. }
  10473. tx[10] = chksum;
  10474. break;
  10475. case BLE_PROTOCOL_MESSAGE_PIN_RENEW:
  10476. DEBUG_INFO("BLE device PIN renew request.\r\n");
  10477. tx_len = 13;
  10478. tx[0] = (tx_len>>8)&0xff;
  10479. tx[1] = (tx_len&0xff);
  10480. tx[2] = UART_BLE_rx_buffer[2] + 0x80;;
  10481. tx[3] = 0x00;
  10482. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT))
  10483. {
  10484. for(uint8_t idx=0;idx<20;idx++)
  10485. {
  10486. Charger.memory.whiteList.data.item[idx].listType = WHITE_LIST_TYPE_BLE;
  10487. Charger.memory.whiteList.data.item[idx].pin[0] = (rand()%0x2b)+0x30;
  10488. Charger.memory.whiteList.data.item[idx].pin[1] = (rand()%0x2b)+0x30;
  10489. Charger.memory.whiteList.data.item[idx].pin[2] = (rand()%0x2b)+0x30;
  10490. Charger.memory.whiteList.data.item[idx].pin[3] = (rand()%0x2b)+0x30;
  10491. Charger.memory.whiteList.data.item[idx].pin[4] = (rand()%0x2b)+0x30;
  10492. Charger.memory.whiteList.data.item[idx].pin[5] = (rand()%0x2b)+0x30;
  10493. Charger.memory.whiteList.data.item[idx].isReg = OFF;
  10494. }
  10495. Charger.memory.whiteList.op_bits.update = ON;
  10496. tx[3] = 0x01;
  10497. memcpy(&tx[4], &Charger.memory.whiteList.data.item[0].pin[0], 6);
  10498. DEBUG_INFO("PIN list renew: %s.\r\n", Charger.memory.whiteList.data.item[0].pin);
  10499. }
  10500. else
  10501. DEBUG_WARN("Login id not root.\r\n");
  10502. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10503. {
  10504. chksum ^= tx[2 + idx];
  10505. }
  10506. tx[4] = chksum;
  10507. break;
  10508. case BLE_PROTOCOL_MESSAGE_CHARGING_START:
  10509. DEBUG_INFO("BLE device request charging start.\r\n");
  10510. tx_len = 0x08;
  10511. tx[0] = (tx_len>>8)&0xff;
  10512. tx[1] = (tx_len&0xff);
  10513. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10514. if(Charger.Alarm_Code>0)
  10515. {
  10516. tx[3] = 0x02;
  10517. if((Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE))
  10518. {
  10519. tx[4] = 0x01;
  10520. tx[5] = 0x22;
  10521. tx[6] = 0x00;
  10522. }
  10523. else if((Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE))
  10524. {
  10525. tx[4] = 0x01;
  10526. tx[5] = 0x22;
  10527. tx[6] = 0x03;
  10528. }
  10529. else if((Charger.Alarm_Code & ALARM_L1_OVER_CURRENT))
  10530. {
  10531. tx[4] = 0x01;
  10532. tx[5] = 0x21;
  10533. tx[6] = 0x16;
  10534. }
  10535. else if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE))
  10536. {
  10537. tx[4] = 0x01;
  10538. tx[5] = 0x22;
  10539. tx[6] = 0x23;
  10540. }
  10541. else if((Charger.Alarm_Code & ALARM_GROUND_FAIL))
  10542. {
  10543. tx[4] = 0x01;
  10544. tx[5] = 0x22;
  10545. tx[6] = 0x56;
  10546. }
  10547. else if((Charger.Alarm_Code & ALARM_CP_ERROR))
  10548. {
  10549. tx[4] = 0x02;
  10550. tx[5] = 0x37;
  10551. tx[6] = 0x03;
  10552. }
  10553. else if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC))
  10554. {
  10555. tx[4] = 0x01;
  10556. tx[5] = 0x22;
  10557. tx[6] = 0x33;
  10558. }
  10559. else if((Charger.Alarm_Code & ALARM_MCU_TESTFAIL))
  10560. {
  10561. tx[4] = 0x01;
  10562. tx[5] = 0x22;
  10563. tx[6] = 0x57;
  10564. }
  10565. else if((Charger.Alarm_Code & ALARM_EMERGENCY_STOP))
  10566. {
  10567. tx[4] = 0x01;
  10568. tx[5] = 0x22;
  10569. tx[6] = 0x51;
  10570. }
  10571. else if((Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL))
  10572. {
  10573. tx[4] = 0x01;
  10574. tx[5] = 0x10;
  10575. tx[6] = 0x04;
  10576. }
  10577. else if((Charger.Alarm_Code & ALARM_RELAY_STATUS))
  10578. {
  10579. tx[4] = 0x01;
  10580. tx[5] = 0x22;
  10581. tx[6] = 0x58;
  10582. }
  10583. DEBUG_WARN("EVSE in alarm state, can not start charging.\r\n");
  10584. }
  10585. else
  10586. {
  10587. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))
  10588. {
  10589. if(Charger.Mode == MODE_IDLE)
  10590. {
  10591. Charger.ble.isRequestOn = ON;
  10592. tx[3] = 0x01;
  10593. DEBUG_INFO("Start OK.\r\n");
  10594. }
  10595. else
  10596. {
  10597. tx[3] = 0x00;
  10598. DEBUG_WARN("EVSE not in IDLE.\r\n");
  10599. }
  10600. }
  10601. else
  10602. {
  10603. tx[3] = 0x00;
  10604. DEBUG_WARN("Login first\r\n");
  10605. }
  10606. tx[4] = 0x00;
  10607. tx[5] = 0x00;
  10608. tx[6] = 0x00;
  10609. }
  10610. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10611. {
  10612. chksum ^= tx[2 + idx];
  10613. }
  10614. tx[7] = chksum;
  10615. break;
  10616. case BLE_PROTOCOL_MESSAGE_CHARGING_STOP:
  10617. DEBUG_INFO("BLE device request charging stop.\r\n");
  10618. tx_len = 0x08;
  10619. tx[0] = (tx_len>>8)&0xff;
  10620. tx[1] = (tx_len&0xff);
  10621. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10622. if(Charger.Alarm_Code>0)
  10623. {
  10624. tx[3] = 0x02;
  10625. if((Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE))
  10626. {
  10627. tx[4] = 0x01;
  10628. tx[5] = 0x22;
  10629. tx[6] = 0x00;
  10630. }
  10631. else if((Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE))
  10632. {
  10633. tx[4] = 0x01;
  10634. tx[5] = 0x22;
  10635. tx[6] = 0x03;
  10636. }
  10637. else if((Charger.Alarm_Code & ALARM_L1_OVER_CURRENT))
  10638. {
  10639. tx[4] = 0x01;
  10640. tx[5] = 0x21;
  10641. tx[6] = 0x16;
  10642. }
  10643. else if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE))
  10644. {
  10645. tx[4] = 0x01;
  10646. tx[5] = 0x22;
  10647. tx[6] = 0x23;
  10648. }
  10649. else if((Charger.Alarm_Code & ALARM_GROUND_FAIL))
  10650. {
  10651. tx[4] = 0x01;
  10652. tx[5] = 0x22;
  10653. tx[6] = 0x56;
  10654. }
  10655. else if((Charger.Alarm_Code & ALARM_CP_ERROR))
  10656. {
  10657. tx[4] = 0x02;
  10658. tx[5] = 0x37;
  10659. tx[6] = 0x03;
  10660. }
  10661. else if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC))
  10662. {
  10663. tx[4] = 0x01;
  10664. tx[5] = 0x22;
  10665. tx[6] = 0x33;
  10666. }
  10667. else if((Charger.Alarm_Code & ALARM_MCU_TESTFAIL))
  10668. {
  10669. tx[4] = 0x01;
  10670. tx[5] = 0x22;
  10671. tx[6] = 0x57;
  10672. }
  10673. else if((Charger.Alarm_Code & ALARM_EMERGENCY_STOP))
  10674. {
  10675. tx[4] = 0x01;
  10676. tx[5] = 0x22;
  10677. tx[6] = 0x51;
  10678. }
  10679. else if((Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL))
  10680. {
  10681. tx[4] = 0x01;
  10682. tx[5] = 0x10;
  10683. tx[6] = 0x04;
  10684. }
  10685. else if((Charger.Alarm_Code & ALARM_RELAY_STATUS))
  10686. {
  10687. tx[4] = 0x01;
  10688. tx[5] = 0x22;
  10689. tx[6] = 0x58;
  10690. }
  10691. DEBUG_WARN("EVSE in alarm state, can not stop charging.\r\n");
  10692. }
  10693. else
  10694. {
  10695. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))
  10696. {
  10697. if((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))
  10698. {
  10699. Charger.ble.isRequestOff = ON;
  10700. tx[3] = 0x01;
  10701. DEBUG_INFO("Stop OK.\r\n");
  10702. }
  10703. else
  10704. {
  10705. tx[3] = 0x00;
  10706. DEBUG_WARN("EVSE not in CHARGING.\r\n");
  10707. }
  10708. }
  10709. else
  10710. {
  10711. tx[3] = 0x00;
  10712. DEBUG_WARN("Login first\r\n");
  10713. }
  10714. tx[4] = 0x00;
  10715. tx[5] = 0x00;
  10716. tx[6] = 0x00;
  10717. }
  10718. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10719. {
  10720. chksum ^= tx[2 + idx];
  10721. }
  10722. tx[7] = chksum;
  10723. break;
  10724. case BLE_PROTOCOL_MESSAGE_STATUS_QUERY:
  10725. DEBUG_INFO("BLE device query EVSE status request.\r\n");
  10726. tx_len = 0x13;
  10727. tx[0] = (tx_len>>8)&0xff;
  10728. tx[1] = (tx_len&0xff);
  10729. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10730. tx[3] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?Charger.Mode:0x00);
  10731. tx[4] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?((((uint32_t)(Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total/10000))>>0) & 0xff):0x00);
  10732. tx[5] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?((((uint32_t)(Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total/10000))>>8) & 0xff):0x00);
  10733. tx[6] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?((((uint32_t)(Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total/10000))>>16) & 0xff):0x00);
  10734. tx[7] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?((((uint32_t)(Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total/10000))>>24) & 0xff):0x00);
  10735. tx[8] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.cycle_info.Power_Consumption/10)>>0) & 0xff):0x00);
  10736. tx[9] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.cycle_info.Power_Consumption/10)>>8) & 0xff):0x00);
  10737. tx[10] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.cycle_info.Duration/60000)>>0) & 0xff):0x00);
  10738. tx[11] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.cycle_info.Duration/60000)>>8) & 0xff):0x00);
  10739. if((Charger.Alarm_Code>0) && ((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)))
  10740. {
  10741. if((Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE))
  10742. {
  10743. tx[12] = 0x01;
  10744. tx[13] = 0x22;
  10745. tx[14] = 0x00;
  10746. }
  10747. else if((Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE))
  10748. {
  10749. tx[12] = 0x01;
  10750. tx[13] = 0x22;
  10751. tx[14] = 0x03;
  10752. }
  10753. else if((Charger.Alarm_Code & ALARM_L1_OVER_CURRENT))
  10754. {
  10755. tx[12] = 0x01;
  10756. tx[13] = 0x21;
  10757. tx[14] = 0x16;
  10758. }
  10759. else if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE))
  10760. {
  10761. tx[12] = 0x01;
  10762. tx[13] = 0x22;
  10763. tx[14] = 0x23;
  10764. }
  10765. else if((Charger.Alarm_Code & ALARM_GROUND_FAIL))
  10766. {
  10767. tx[12] = 0x01;
  10768. tx[13] = 0x22;
  10769. tx[14] = 0x56;
  10770. }
  10771. else if((Charger.Alarm_Code & ALARM_CP_ERROR))
  10772. {
  10773. tx[12] = 0x02;
  10774. tx[13] = 0x37;
  10775. tx[14] = 0x03;
  10776. }
  10777. else if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC))
  10778. {
  10779. tx[12] = 0x01;
  10780. tx[13] = 0x22;
  10781. tx[14] = 0x33;
  10782. }
  10783. else if((Charger.Alarm_Code & ALARM_MCU_TESTFAIL))
  10784. {
  10785. tx[12] = 0x01;
  10786. tx[13] = 0x22;
  10787. tx[14] = 0x57;
  10788. }
  10789. else if((Charger.Alarm_Code & ALARM_EMERGENCY_STOP))
  10790. {
  10791. tx[12] = 0x01;
  10792. tx[13] = 0x22;
  10793. tx[14] = 0x51;
  10794. }
  10795. else if((Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL))
  10796. {
  10797. tx[12] = 0x01;
  10798. tx[13] = 0x10;
  10799. tx[14] = 0x04;
  10800. }
  10801. else if((Charger.Alarm_Code & ALARM_RELAY_STATUS))
  10802. {
  10803. tx[12] = 0x01;
  10804. tx[13] = 0x22;
  10805. tx[14] = 0x58;
  10806. }
  10807. }
  10808. else
  10809. {
  10810. tx[12] = 0x00;
  10811. tx[13] = 0x00;
  10812. tx[14] = 0x00;
  10813. }
  10814. tx[15] = Charger.memory.EVSE_Config.data.item.reservation.mode;
  10815. tx[16] = Charger.memory.EVSE_Config.data.item.reservation.hour;
  10816. tx[17] = Charger.memory.EVSE_Config.data.item.reservation.min;
  10817. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10818. {
  10819. chksum ^= tx[2 + idx];
  10820. }
  10821. tx[18] = chksum;
  10822. break;
  10823. case BLE_PROTOCOL_MESSAGE_RESERVATION:
  10824. switch(UART_BLE_rx_buffer[7])
  10825. {
  10826. case RESERVATION_DISABLE:
  10827. DEBUG_INFO("BLE device reservation request disable.\r\n");
  10828. break;
  10829. case RESERVATION_ONCE:
  10830. DEBUG_INFO("BLE device reservation request once on %d:%d.\r\n", UART_BLE_rx_buffer[8], UART_BLE_rx_buffer[9]);
  10831. break;
  10832. case RESERVATION_ALWAYS:
  10833. DEBUG_INFO("BLE device reservation request always on %d:%d.\r\n", UART_BLE_rx_buffer[8], UART_BLE_rx_buffer[9]);
  10834. break;
  10835. }
  10836. tx_len = 0x05;
  10837. tx[0] = (tx_len>>8)&0xff;
  10838. tx[1] = (tx_len&0xff);
  10839. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10840. Charger.memory.EVSE_Config.data.item.reservation.mode = UART_BLE_rx_buffer[7];
  10841. Charger.memory.EVSE_Config.data.item.reservation.hour = UART_BLE_rx_buffer[8];
  10842. Charger.memory.EVSE_Config.data.item.reservation.min = UART_BLE_rx_buffer[9];
  10843. Charger.memory.EVSE_Config.op_bits.update = ON;
  10844. tx[3] = 0x01;
  10845. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10846. {
  10847. chksum ^= tx[2 + idx];
  10848. }
  10849. tx[4] = chksum;
  10850. break;
  10851. case BLE_PROTOCOL_MESSAGE_TIME_QUERY:
  10852. DEBUG_INFO("BLE device query date time request.\r\n");
  10853. tx_len = 0x08;
  10854. tx[0] = (tx_len>>8)&0xff;
  10855. tx[1] = (tx_len&0xff);
  10856. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10857. struct tm gm_date;
  10858. gm_date.tm_year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year-1900;
  10859. gm_date.tm_mon = Charger.memory.EVSE_Config.data.item.SystemDateTime.month-1;
  10860. gm_date.tm_mday = Charger.memory.EVSE_Config.data.item.SystemDateTime.day;
  10861. gm_date.tm_hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour;
  10862. gm_date.tm_min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min;
  10863. gm_date.tm_sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec;
  10864. tmp = mktime(&gm_date);
  10865. tx[3] = ((tmp >> 0)&0xff);
  10866. tx[4] = ((tmp >> 8)&0xff);
  10867. tx[5] = ((tmp >> 16)&0xff);
  10868. tx[6] = ((tmp >> 24)&0xff);
  10869. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10870. {
  10871. chksum ^= tx[2 + idx];
  10872. }
  10873. tx[7] = chksum;
  10874. break;
  10875. case BLE_PROTOCOL_MESSAGE_TIME_CONFIG:
  10876. DEBUG_INFO("BLE device config date time.\r\n");
  10877. tx_len = 0x09;
  10878. tx[0] = (tx_len>>8)&0xff;
  10879. tx[1] = (tx_len&0xff);
  10880. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10881. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))
  10882. {
  10883. struct tm *sm_date;
  10884. tmp = (UART_BLE_rx_buffer[7]<<0) | (UART_BLE_rx_buffer[8]<<8) | (UART_BLE_rx_buffer[9]<<16) | (UART_BLE_rx_buffer[10]<<24);
  10885. sm_date = gmtime(&tmp) ;
  10886. setTime.Hours = sm_date->tm_hour;
  10887. setTime.Minutes = sm_date->tm_min;
  10888. setTime.Seconds = sm_date->tm_sec;
  10889. setTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  10890. setTime.StoreOperation = RTC_STOREOPERATION_RESET;
  10891. if (HAL_RTC_SetTime(&hrtc, &setTime, RTC_FORMAT_BIN) != HAL_OK)
  10892. {
  10893. Error_Handler();
  10894. }
  10895. setDate.Year = (sm_date->tm_year + 1900)-2000;
  10896. setDate.Month = sm_date->tm_mon + 1;
  10897. setDate.Date = sm_date->tm_mday;
  10898. if (HAL_RTC_SetDate(&hrtc, &setDate, RTC_FORMAT_BIN) != HAL_OK)
  10899. {
  10900. Error_Handler();
  10901. }
  10902. tx[3] = 0x01;
  10903. DEBUG_INFO("RTC config OK.\r\n");
  10904. }
  10905. else
  10906. {
  10907. tx[3] = 0x00;
  10908. DEBUG_WARN("User con not config RTC.\r\n");
  10909. }
  10910. tx[4] = UART_BLE_rx_buffer[7];
  10911. tx[5] = UART_BLE_rx_buffer[8];
  10912. tx[6] = UART_BLE_rx_buffer[9];
  10913. tx[7] = UART_BLE_rx_buffer[10];
  10914. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10915. {
  10916. chksum ^= tx[2 + idx];
  10917. }
  10918. tx[8] = chksum;
  10919. break;
  10920. case BLE_PROTOCOL_MESSAGE_LED_QUERY:
  10921. DEBUG_INFO("BLE device query led setting.\r\n");
  10922. tx_len = 0x08;
  10923. tx[0] = (tx_len>>8)&0xff;
  10924. tx[1] = (tx_len&0xff);
  10925. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10926. /*
  10927. TODO: Query led result here
  10928. */
  10929. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))
  10930. {
  10931. tx[3] = 0xff;
  10932. tx[4] = 0xff;
  10933. tx[5] = 0xff;
  10934. tx[6] = 0xff;
  10935. }
  10936. else
  10937. {
  10938. tx[3] = 0x00;
  10939. tx[4] = 0x00;
  10940. tx[5] = 0x00;
  10941. tx[6] = 0x00;
  10942. }
  10943. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10944. {
  10945. chksum ^= tx[2 + idx];
  10946. }
  10947. tx[7] = chksum;
  10948. break;
  10949. case BLE_PROTOCOL_MESSAGE_LED_CONFIG:
  10950. DEBUG_INFO("BLE device config led setting.\r\n");
  10951. tx_len = 0x09;
  10952. tx[0] = (tx_len>>8)&0xff;
  10953. tx[1] = (tx_len&0xff);
  10954. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10955. /*
  10956. TODO: Config led result here
  10957. */
  10958. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))
  10959. tx[3] = 0x01;
  10960. else
  10961. tx[3] = 0x00;
  10962. tx[4] = UART_BLE_rx_buffer[7];
  10963. tx[5] = UART_BLE_rx_buffer[8];
  10964. tx[6] = UART_BLE_rx_buffer[9];
  10965. tx[7] = UART_BLE_rx_buffer[10];
  10966. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10967. {
  10968. chksum ^= tx[2 + idx];
  10969. }
  10970. tx[8] = chksum;
  10971. break;
  10972. case BLE_PROTOCOL_MESSAGE_CURRENT_LIMIT_QUERY:
  10973. DEBUG_INFO("BLE device query current limit request.\r\n");
  10974. tx_len = 0x05;
  10975. tx[0] = (tx_len>>8)&0xff;
  10976. tx[1] = (tx_len&0xff);
  10977. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  10978. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))
  10979. {
  10980. tx[3] = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent;
  10981. DEBUG_INFO("Query current limit: %02dA.\r\n", Charger.memory.EVSE_Config.data.item.MaxChargingCurrent);
  10982. }
  10983. else
  10984. {
  10985. tx[3] = 0x00;
  10986. DEBUG_WARN("Please login first, before query current limit.\r\n");
  10987. }
  10988. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  10989. {
  10990. chksum ^= tx[2 + idx];
  10991. }
  10992. tx[8] = chksum;
  10993. break;
  10994. case BLE_PROTOCOL_MESSAGE_CURRENT_LIMIT_CONFIG:
  10995. DEBUG_INFO("BLE device config current limit.\r\n");
  10996. tx_len = 0x06;
  10997. tx[0] = (tx_len>>8)&0xff;
  10998. tx[1] = (tx_len&0xff);
  10999. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  11000. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))
  11001. {
  11002. if(UART_BLE_rx_buffer[7]>Charger.maxRatingCurrent)
  11003. {
  11004. tx[3] = 0x02;
  11005. Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent;
  11006. DEBUG_INFO("Setting value over max rating value, set as max rating .\r\n");
  11007. }
  11008. else
  11009. {
  11010. tx[3] = 0x01;
  11011. Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = UART_BLE_rx_buffer[7];
  11012. }
  11013. DEBUG_INFO("Config current limit: %02dA\r\n", Charger.memory.EVSE_Config.data.item.MaxChargingCurrent);
  11014. }
  11015. else
  11016. {
  11017. tx[3] = 0x00;
  11018. DEBUG_WARN("Please login first, before setting current limit.\r\n");
  11019. }
  11020. tx[4] = UART_BLE_rx_buffer[7];
  11021. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  11022. {
  11023. chksum ^= tx[2 + idx];
  11024. }
  11025. tx[5] = chksum;
  11026. break;
  11027. case BLE_PROTOCOL_MESSAGE_FIRMWARE_VERSION_QUERY:
  11028. DEBUG_INFO("BLE device query firmware version.\r\n");
  11029. tx_len = 4 + strlen(Charger.Ver_FW);
  11030. tx[0] = (tx_len>>8)&0xff;
  11031. tx[1] = (tx_len&0xff);
  11032. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  11033. for(uint16_t idx=0;idx<strlen(Charger.Ver_FW);idx++)
  11034. {
  11035. if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))
  11036. tx[3+idx] = Charger.Ver_FW[idx];
  11037. else
  11038. tx[3+idx] = 0x00;
  11039. }
  11040. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  11041. {
  11042. chksum ^= tx[2 + idx];
  11043. }
  11044. tx[3+strlen(Charger.Ver_FW)] = chksum;
  11045. break;
  11046. case BLE_PROTOCOL_MESSAGE_FIRMWARE_UPDATE_REQ:
  11047. tx_len = 5;
  11048. tx[0] = 0x00;
  11049. tx[1] = 0x05;
  11050. tx[2] = UART_BLE_rx_buffer[2] + 0x80;;
  11051. if(Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT)
  11052. {
  11053. binCRCTarget = (UART_BLE_rx_buffer[7] << 24) | (UART_BLE_rx_buffer[8] << 16) | (UART_BLE_rx_buffer[9] << 8) | (UART_BLE_rx_buffer[10] << 0);
  11054. flashdestination = NEW_CODE_ADDRESS;
  11055. if(FLASH_If_Erase(NEW_CODE_ADDRESS, 3)== FLASHIF_OK)
  11056. {
  11057. DEBUG_INFO("Firmware transfer start, earase flash success....\n\r");
  11058. tx[3] = 0x01;
  11059. }
  11060. else
  11061. {
  11062. DEBUG_INFO("Firmware transfer start, earase flash fail....\n\r");
  11063. tx[3] = 0x00;
  11064. }
  11065. }
  11066. else
  11067. {
  11068. tx[3] = 0x00;
  11069. DEBUG_WARN("User can not upgrade start.\r\n");
  11070. }
  11071. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  11072. {
  11073. chksum ^= tx[2 + idx];
  11074. }
  11075. tx[4] = chksum;
  11076. break;
  11077. case BLE_PROTOCOL_MESSAGE_FIRMWARE_TRANS_REQ:
  11078. tx_len = 5;
  11079. tx[0] = 0x00;
  11080. tx[1] = 0x05;
  11081. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  11082. if(Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT)
  11083. {
  11084. flashdestination = NEW_CODE_ADDRESS + ((UART_BLE_rx_buffer[7]<<24) | (UART_BLE_rx_buffer[8]<<16) | (UART_BLE_rx_buffer[9]<<8) |(UART_BLE_rx_buffer[10]<<0));
  11085. if (FLASH_If_Write(flashdestination, (uint32_t*) &UART_BLE_rx_buffer[11], ((((UART_BLE_rx_buffer[1]) | (UART_BLE_rx_buffer[0])<<8)-12)>>2)) == FLASHIF_OK)
  11086. {
  11087. DEBUG_INFO("Firmware transfer start address: 0x%x ,length: %d...Pass\n\r", flashdestination, (((UART_BLE_rx_buffer[1]) | (UART_BLE_rx_buffer[0])<<8)-12));
  11088. tx[3] = 0x01;
  11089. }
  11090. else
  11091. {
  11092. DEBUG_INFO("Firmware transfer start address: 0x%x, length: %d...Fail\n\r", flashdestination, (((UART_BLE_rx_buffer[1]) | (UART_BLE_rx_buffer[0])<<8)-12));
  11093. tx[3] = 0x00;
  11094. }
  11095. }
  11096. else
  11097. {
  11098. tx[3] = 0x00;
  11099. DEBUG_WARN("User can not upgrade transfer.\r\n");
  11100. }
  11101. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  11102. {
  11103. chksum ^= tx[2 + idx];
  11104. }
  11105. tx[4] = chksum;
  11106. break;
  11107. case BLE_PROTOCOL_MESSAGE_FIRMWARE_END_REQ:
  11108. tx_len = 5;
  11109. tx[0] = 0x00;
  11110. tx[1] = 0x05;
  11111. tx[2] = UART_BLE_rx_buffer[2] + 0x80;;
  11112. if(Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT)
  11113. {
  11114. flash = NEW_CODE_ADDRESS;
  11115. checksum = HAL_CRC_Calculate(&hcrc, (uint32_t *)flash, ((FLASH_AP_LENGTH-4)>>2));
  11116. flash = ((uint32_t)(NEW_CODE_ADDRESS+FLASH_AP_LENGTH-4));
  11117. DEBUG_INFO("Firmware transfer end, AP CRC checksum, flash: 0x%x, 0x%x\r\n", checksum, *((uint32_t *)flash) );
  11118. if(checksum == *((uint32_t *)flash))
  11119. {
  11120. if (FLASH_If_Write(UPGRADE_REQ_ADDRESS, (uint32_t *)&endFlag[0], 1) == FLASHIF_OK)
  11121. {
  11122. DEBUG_INFO("Firmware Confirm Tag write ok..\n\r");
  11123. tx[3] = 0x01;
  11124. tx[4] = 0xB5;
  11125. HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, sizeof(tx), 0xffff);
  11126. osDelay(1000);
  11127. NVIC_SystemReset();
  11128. }
  11129. else
  11130. {
  11131. DEBUG_INFO("Firmware Confirm Tag write fail...\n\r");
  11132. tx[3] = 0x00;
  11133. }
  11134. }
  11135. else
  11136. {
  11137. DEBUG_INFO("Firmware checksum compare fail...\n\r");
  11138. tx[3] = 0x00;
  11139. }
  11140. }
  11141. else
  11142. {
  11143. tx[3] = 0x00;
  11144. DEBUG_WARN("User can not upgrade stop.\r\n");
  11145. }
  11146. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  11147. {
  11148. chksum ^= tx[2 + idx];
  11149. }
  11150. tx[4] = chksum;
  11151. break;
  11152. default:
  11153. /*
  11154. TODO: Unknow command response here
  11155. */
  11156. tx_len = 5;
  11157. tx[0] = 0x00;
  11158. tx[1] = 0x05;
  11159. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  11160. tx[3] = 0x00;
  11161. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  11162. {
  11163. chksum ^= tx[2 + idx];
  11164. }
  11165. tx[4] = chksum;
  11166. DEBUG_ERROR("BLE unknow command.\r\n");
  11167. break;
  11168. }
  11169. }
  11170. else
  11171. {
  11172. /*
  11173. TODO: Protocol check sum error response here
  11174. */
  11175. tx_len = 5;
  11176. tx[0] = 0x00;
  11177. tx[1] = 0x05;
  11178. tx[2] = UART_BLE_rx_buffer[2] + 0x80;
  11179. tx[3] = 0x00;
  11180. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  11181. {
  11182. chksum ^= tx[2 + idx];
  11183. }
  11184. tx[4] = chksum;
  11185. DEBUG_ERROR("BLE check sum validation error.\r\n");
  11186. }
  11187. HAL_UART_Transmit(&BLE_USART, (uint8_t *)tx, tx_len, 0xffff);
  11188. }
  11189. UART_BLE_rx_len=0;
  11190. UART_BLE_recv_end_flag = OFF;
  11191. }
  11192. HAL_UART_Receive_DMA(&BLE_USART, (uint8_t*)UART_BLE_rx_buffer, UART_BUFFER_SIZE);
  11193. osDelay(1);
  11194. }
  11195. /* USER CODE END StartBleTask */
  11196. }
  11197. #ifdef MODIFY_FLASH_OPERATION_20241104
  11198. void Proc_EVSE_Config(void)
  11199. {
  11200. #ifdef MODIFY_UNDEFINED_MODEL_NAME_AND_SN_ISSUE
  11201. if (Charger.memory.EVSE_Config.data.item.ModelName[0] == 0xFF ||
  11202. Charger.memory.EVSE_Config.data.item.SerialNumber[0] == 0xFF)
  11203. {
  11204. Charger.memory.EVSE_Config.data.item.ModelName[MODEL_NAME_LEN - 1] = '\0';
  11205. Charger.memory.EVSE_Config.data.item.SerialNumber[SERIAL_NUM_LEN - 1] = '\0';
  11206. Charger.memory.EVSE_Config.op_bits.update = ON;
  11207. }
  11208. #endif //MODIFY_UNDEFINED_MODEL_NAME_AND_SN_ISSUE
  11209. #ifdef FUNC_ZEROING_WHEN_MEM_CLEARNED
  11210. if (Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total == HTK_U64_MAX ||
  11211. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 == HTK_U64_MAX ||
  11212. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 == HTK_U64_MAX ||
  11213. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 == HTK_U64_MAX)
  11214. {
  11215. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = 0;
  11216. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 = 0;
  11217. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 = 0;
  11218. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 = 0;
  11219. Charger.memory.EVSE_Config.op_bits.update = ON;
  11220. }
  11221. if (Charger.memory.EVSE_Config.data.item.AcPlugInTimes == HTK_U32_MAX)
  11222. {
  11223. Charger.memory.EVSE_Config.data.item.AcPlugInTimes = 0;
  11224. Charger.memory.EVSE_Config.op_bits.update = ON;
  11225. }
  11226. #ifdef FUNC_MODE_DEBUG_REC_RELAY_ON_TIMES
  11227. if (Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes == HTK_U32_MAX)
  11228. {
  11229. Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes = 0;
  11230. Charger.memory.EVSE_Config.op_bits.update = ON;
  11231. }
  11232. #endif
  11233. #endif //FUNC_ZEROING_WHEN_MEM_CLEARNED
  11234. Charger.memory.EVSE_Config.data.item.isDispDebug = ON;
  11235. sprintf(Charger.memory.EVSE_Config.data.item.System_ID, "%s%s", Charger.memory.EVSE_Config.data.item.ModelName, Charger.memory.EVSE_Config.data.item.SerialNumber);
  11236. //sprintf((char *)tmpBuf, "%08x", ~HAL_CRC_Calculate(&hcrc, (uint32_t *)&Charger.memory.EVSE_Config.data.item.System_ID[0], (ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.System_ID)>>2)));
  11237. //memcpy(&Charger.memory.EVSE_Config.data.item.bleConfig.puk[0], &tmpBuf[0], ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.bleConfig.puk));
  11238. //DEBUG_INFO("BLE PUK: %s\r\n", Charger.memory.EVSE_Config.data.item.bleConfig.puk);
  11239. srand(Charger.memory.EVSE_Config.data.item.bleConfig.puk[0] | (Charger.memory.EVSE_Config.data.item.bleConfig.puk[1]<<8));
  11240. setTime.Hours = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour;
  11241. setTime.Minutes = Charger.memory.EVSE_Config.data.item.SystemDateTime.min;
  11242. setTime.Seconds = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec;
  11243. setTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  11244. setTime.StoreOperation = RTC_STOREOPERATION_RESET;
  11245. if (HAL_RTC_SetTime(&hrtc, &setTime, RTC_FORMAT_BIN) != HAL_OK)
  11246. {
  11247. Error_Handler();
  11248. }
  11249. setDate.Year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year-2000;
  11250. setDate.Month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month;
  11251. setDate.Date = Charger.memory.EVSE_Config.data.item.SystemDateTime.day;
  11252. if (HAL_RTC_SetDate(&hrtc, &setDate, RTC_FORMAT_BIN) != HAL_OK)
  11253. {
  11254. Error_Handler();
  11255. }
  11256. //CCLC_Corr_Gain_Par
  11257. //VT
  11258. #ifdef MODIFY_CORRECTION_CHECK
  11259. if (
  11260. (Charger.memory.EVSE_Config.data.item.Correction_VL1[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL1[2][MCU_DATA]) &&
  11261. (Charger.memory.EVSE_Config.data.item.Correction_VL1[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL1[2][METER_DATA])
  11262. )
  11263. #else
  11264. if(Charger.memory.EVSE_Config.data.item.Correction_VL1[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL1[2][MCU_DATA])
  11265. #endif
  11266. {
  11267. CLC_Corr_Gain_Par( Charger.memory.EVSE_Config.data.item.Correction_VL1[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL1[2][METER_DATA] ,
  11268. Charger.memory.EVSE_Config.data.item.Correction_VL1[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL1[2][MCU_DATA] ,
  11269. &Charger.coefficient.gain_v[0], &Charger.coefficient.offset_v[0]);
  11270. }
  11271. else
  11272. {
  11273. Charger.coefficient.gain_v[0] = 1;
  11274. Charger.coefficient.offset_v[0] = 0;
  11275. }
  11276. #ifdef MODIFY_CORRECTION_CHECK
  11277. if (
  11278. (Charger.memory.EVSE_Config.data.item.Correction_VL2[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL2[2][MCU_DATA]) &&
  11279. (Charger.memory.EVSE_Config.data.item.Correction_VL2[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL2[2][METER_DATA])
  11280. )
  11281. #else
  11282. if(Charger.memory.EVSE_Config.data.item.Correction_VL2[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL2[2][MCU_DATA])
  11283. #endif
  11284. {
  11285. CLC_Corr_Gain_Par( Charger.memory.EVSE_Config.data.item.Correction_VL2[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL2[2][METER_DATA] ,
  11286. Charger.memory.EVSE_Config.data.item.Correction_VL2[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL2[2][MCU_DATA] ,
  11287. &Charger.coefficient.gain_v[1], &Charger.coefficient.offset_v[1]);
  11288. }
  11289. else
  11290. {
  11291. Charger.coefficient.gain_v[1] = 1;
  11292. Charger.coefficient.offset_v[1] = 0;
  11293. }
  11294. #ifdef MODIFY_CORRECTION_CHECK
  11295. if (
  11296. (Charger.memory.EVSE_Config.data.item.Correction_VL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL3[2][MCU_DATA]) &&
  11297. (Charger.memory.EVSE_Config.data.item.Correction_VL3[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL3[2][METER_DATA])
  11298. )
  11299. #else
  11300. if(Charger.memory.EVSE_Config.data.item.Correction_VL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL3[2][MCU_DATA])
  11301. #endif
  11302. if(Charger.memory.EVSE_Config.data.item.Correction_VL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL3[2][MCU_DATA])
  11303. {
  11304. CLC_Corr_Gain_Par( Charger.memory.EVSE_Config.data.item.Correction_VL3[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL3[2][METER_DATA] ,
  11305. Charger.memory.EVSE_Config.data.item.Correction_VL3[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL3[2][MCU_DATA] ,
  11306. &Charger.coefficient.gain_v[2], &Charger.coefficient.offset_v[2]);
  11307. }
  11308. else
  11309. {
  11310. Charger.coefficient.gain_v[2] = 1;
  11311. Charger.coefficient.offset_v[2] = 0;
  11312. }
  11313. //CT
  11314. #ifdef MODIFY_CORRECTION_CHECK
  11315. if (
  11316. (Charger.memory.EVSE_Config.data.item.Correction_CL1[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL1[2][MCU_DATA]) &&
  11317. (Charger.memory.EVSE_Config.data.item.Correction_CL1[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL1[2][METER_DATA])
  11318. )
  11319. #else
  11320. if(Charger.memory.EVSE_Config.data.item.Correction_CL1[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL1[2][MCU_DATA])
  11321. #endif
  11322. {
  11323. CLC_Corr_Gain_Par(Charger.memory.EVSE_Config.data.item.Correction_CL1[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL1[2][METER_DATA] ,
  11324. Charger.memory.EVSE_Config.data.item.Correction_CL1[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL1[2][MCU_DATA] ,
  11325. &Charger.coefficient.gain_c[0], &Charger.coefficient.offset_c[0]);
  11326. }
  11327. else
  11328. {
  11329. Charger.coefficient.gain_c[0] = 1;
  11330. Charger.coefficient.offset_c[0] = 0;
  11331. }
  11332. #ifdef MODIFY_CORRECTION_CHECK
  11333. if (
  11334. (Charger.memory.EVSE_Config.data.item.Correction_CL2[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL2[2][MCU_DATA]) &&
  11335. (Charger.memory.EVSE_Config.data.item.Correction_CL2[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL2[2][METER_DATA])
  11336. )
  11337. #else
  11338. if(Charger.memory.EVSE_Config.data.item.Correction_CL2[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL2[2][MCU_DATA])
  11339. #endif
  11340. {
  11341. CLC_Corr_Gain_Par(Charger.memory.EVSE_Config.data.item.Correction_CL2[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL2[2][METER_DATA] ,
  11342. Charger.memory.EVSE_Config.data.item.Correction_CL2[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL2[2][MCU_DATA] ,
  11343. &Charger.coefficient.gain_c[1], &Charger.coefficient.offset_c[1]);
  11344. }
  11345. else
  11346. {
  11347. Charger.coefficient.gain_c[1] = 1;
  11348. Charger.coefficient.offset_c[1] = 0;
  11349. }
  11350. #ifdef MODIFY_CORRECTION_CHECK
  11351. if (
  11352. (Charger.memory.EVSE_Config.data.item.Correction_CL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL3[2][MCU_DATA]) &&
  11353. (Charger.memory.EVSE_Config.data.item.Correction_CL3[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL3[2][METER_DATA])
  11354. )
  11355. #else
  11356. if(Charger.memory.EVSE_Config.data.item.Correction_CL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL3[2][MCU_DATA])
  11357. #endif
  11358. if(Charger.memory.EVSE_Config.data.item.Correction_CL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL3[2][MCU_DATA])
  11359. {
  11360. CLC_Corr_Gain_Par(Charger.memory.EVSE_Config.data.item.Correction_CL3[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL3[2][METER_DATA] ,
  11361. Charger.memory.EVSE_Config.data.item.Correction_CL3[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL3[2][MCU_DATA] ,
  11362. &Charger.coefficient.gain_c[2], &Charger.coefficient.offset_c[2]);
  11363. }
  11364. else
  11365. {
  11366. Charger.coefficient.gain_c[2] = 1;
  11367. Charger.coefficient.offset_c[2] = 0;
  11368. }
  11369. //LEAK
  11370. if(Charger.memory.EVSE_Config.data.item.Correction_Leak[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_Leak[2][MCU_DATA])
  11371. {
  11372. CLC_Corr_Gain_Par(Charger.memory.EVSE_Config.data.item.Correction_Leak[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_Leak[2][METER_DATA] ,
  11373. Charger.memory.EVSE_Config.data.item.Correction_Leak[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_Leak[2][MCU_DATA] ,
  11374. &Charger.coefficient.gain_leak[0], &Charger.coefficient.offset_leak[0]);
  11375. }
  11376. else
  11377. {
  11378. Charger.coefficient.gain_leak[0] = 1;
  11379. Charger.coefficient.offset_leak[0] = 0;
  11380. }
  11381. DEBUG_INFO("Charger.coefficient.gain_leak[0] = %f\r\n",Charger.coefficient.gain_leak[0]);
  11382. DEBUG_INFO("Charger.coefficient.offset_leak[0] = %f\r\n",Charger.coefficient.offset_leak[0]);
  11383. //GMI
  11384. if(Charger.memory.EVSE_Config.data.item.Correction_GMI[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_GMI[2][MCU_DATA])
  11385. {
  11386. CLC_Corr_Gain_Par2(Charger.memory.EVSE_Config.data.item.Correction_GMI[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_GMI[2][METER_DATA] ,
  11387. Charger.memory.EVSE_Config.data.item.Correction_GMI[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_GMI[2][MCU_DATA] ,
  11388. &Charger.coefficient.gain_gmi[0], &Charger.coefficient.offset_gmi[0], &Charger.coefficient.offsetisPosOrNeg_gmi[0]);
  11389. }
  11390. else
  11391. {
  11392. Charger.coefficient.gain_gmi[0] = 1;
  11393. Charger.coefficient.offset_gmi[0] = 0;
  11394. }
  11395. //DEBUG_INFO("Charger.coefficient.gain_gmi[0] = %f\r\n",Charger.coefficient.gain_gmi[0]);
  11396. //DEBUG_INFO("Charger.coefficient.offset_gmi[0] = %f\r\n",Charger.coefficient.offset_gmi[0]);
  11397. #ifdef FUNC_SHOW_CORRECTION_DATA
  11398. {
  11399. XP("[CORRECT DATA]======================\r\n");
  11400. XP("<Correction_VL1>\r\n");
  11401. for (int i = 0; i < 4; i++)
  11402. {
  11403. XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n",
  11404. i, Charger.memory.EVSE_Config.data.item.Correction_VL1[i][0],
  11405. i, Charger.memory.EVSE_Config.data.item.Correction_VL1[i][1]);
  11406. }
  11407. XP("<Correction_VL2>\r\n");
  11408. for (int i = 0; i < 4; i++)
  11409. {
  11410. XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n",
  11411. i, Charger.memory.EVSE_Config.data.item.Correction_VL2[i][0],
  11412. i, Charger.memory.EVSE_Config.data.item.Correction_VL2[i][1]);
  11413. }
  11414. XP("<Correction_VL3>\r\n");
  11415. for (int i = 0; i < 4; i++)
  11416. {
  11417. XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n",
  11418. i, Charger.memory.EVSE_Config.data.item.Correction_VL3[i][0],
  11419. i, Charger.memory.EVSE_Config.data.item.Correction_VL3[i][1]);
  11420. }
  11421. XP("<Correction_CL1>\r\n");
  11422. for (int i = 0; i < 4; i++)
  11423. {
  11424. XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n",
  11425. i, Charger.memory.EVSE_Config.data.item.Correction_CL1[i][0],
  11426. i, Charger.memory.EVSE_Config.data.item.Correction_CL1[i][1]);
  11427. }
  11428. XP("<Correction_CL2>\r\n");
  11429. for (int i = 0; i < 4; i++)
  11430. {
  11431. XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n",
  11432. i, Charger.memory.EVSE_Config.data.item.Correction_CL2[i][0],
  11433. i, Charger.memory.EVSE_Config.data.item.Correction_CL2[i][1]);
  11434. }
  11435. XP("<Correction_CL3>\r\n");
  11436. for (int i = 0; i < 4; i++)
  11437. {
  11438. XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n",
  11439. i, Charger.memory.EVSE_Config.data.item.Correction_CL3[i][0],
  11440. i, Charger.memory.EVSE_Config.data.item.Correction_CL3[i][1]);
  11441. }
  11442. XP("<Correction_Leak>\r\n");
  11443. for (int i = 0; i < 4; i++)
  11444. {
  11445. XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n",
  11446. i, Charger.memory.EVSE_Config.data.item.Correction_Leak[i][0],
  11447. i, Charger.memory.EVSE_Config.data.item.Correction_Leak[i][1]);
  11448. }
  11449. XP("<Correction_GMI>\r\n");
  11450. for (int i = 0; i < 4; i++)
  11451. {
  11452. XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n",
  11453. i, Charger.memory.EVSE_Config.data.item.Correction_GMI[i][0],
  11454. i, Charger.memory.EVSE_Config.data.item.Correction_GMI[i][1]);
  11455. }
  11456. XP("====================================\r\n");
  11457. }
  11458. #endif //FUNC_SHOW_CORRECTION_DATA
  11459. //DEBUG_INFO("Read MEM_ADDR_EVSE_CONFIG block(4k byte) pass.\r\n");
  11460. // Clean update & clear flag when model name not configured
  11461. /*
  11462. if(strlen(Charger.memory.EVSE_Config.data.item.ModelName)>20)
  11463. {
  11464. Charger.memory.EVSE_Config.op_bits.update = OFF;
  11465. Charger.memory.EVSE_Config.op_bits.clear = OFF;
  11466. Charger.memory.EVSE_Config.op_bits.backup = OFF;
  11467. Charger.memory.EVSE_Config.op_bits.restore = OFF;
  11468. }
  11469. */
  11470. parseVersionInfoFromModelname();
  11471. }
  11472. #endif //MODIFY_FLASH_OPERATION_20241104
  11473. /* USER CODE BEGIN Header_StartMemoryTask */
  11474. /**
  11475. * @brief Function implementing the memoryTask thread.
  11476. * @param argument: Not used
  11477. * @retval None
  11478. */
  11479. /* USER CODE END Header_StartMemoryTask */
  11480. void StartMemoryTask(void const * argument)
  11481. {
  11482. /* USER CODE BEGIN StartMemoryTask */
  11483. //mmemory
  11484. //uint8_t tmpBuf[64];
  11485. uint8_t isSuccess;
  11486. uint8_t ID[2];
  11487. BSP_W25Qx_Init();
  11488. BSP_W25Qx_Read_ID(ID);
  11489. DEBUG_INFO("W25Qxxx ID is : 0x%02X 0x%02X \r\n",ID[0],ID[1]);
  11490. Charger.memory.EVSE_Config.op_bits.read = ON;
  11491. Charger.memory.coldLoadPickUp.op_bits.read = ON;
  11492. Charger.memory.whiteList.op_bits.read = ON;
  11493. Charger.memory.hisAlarm.op_bits.read = ON;
  11494. #ifdef FUNC_METER_IC_HISTORY
  11495. Charger.memory.hisMeterIC.op_bits.read = ON;
  11496. #else
  11497. Charger.memory.hisCharging.op_bits.read = ON;
  11498. #endif
  11499. /*
  11500. Charger.memory.EVSE_Config.op_bits.clear = ON ;
  11501. Charger.memory.EVSE_Config.op_bits.clear = ON;
  11502. Charger.memory.coldLoadPickUp.op_bits.clear = ON;
  11503. Charger.memory.whiteList.op_bits.clear = ON;
  11504. Charger.memory.hisAlarm.op_bits.clear = ON;
  11505. Charger.memory.hisCharging.op_bits.clear = ON;
  11506. */
  11507. /* Infinite loop */
  11508. for(;;)
  11509. {
  11510. /*
  11511. EVSE config operation
  11512. */
  11513. if(Charger.memory.EVSE_Config.op_bits.read)
  11514. {
  11515. #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11516. taskENTER_CRITICAL();
  11517. #endif
  11518. #ifndef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11519. osDelay(100);
  11520. #endif
  11521. // Read data from block
  11522. if(BSP_W25Qx_Read(Charger.memory.EVSE_Config.data.value, MEM_ADDR_EVSE_CONFIG, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11523. {
  11524. #ifdef FUNC_FLASH_RESTORE_CONFIG_WHEN_PRIMARY_LOSS
  11525. #ifdef FUNC_FLASH_CONFIG_APPEND_CRC
  11526. u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)Charger.memory.EVSE_Config.data.verify.buf, ((W25Q16FV_BLOCK_SIZE-4)>>2));
  11527. if ((Charger.memory.EVSE_Config.data.verify.crc32 == crc32 /*|| Charger.memory.EVSE_Config.data.verify.crc32 == HTK_U32_MAX*/))
  11528. #else
  11529. if (1)
  11530. #endif
  11531. {
  11532. DEBUG_INFO("Read MEM_ADDR_EVSE_CONFIG block(4k byte) pass.\r\n");
  11533. Proc_EVSE_Config();
  11534. Charger.ModelReadisOK = PASS;
  11535. }
  11536. else
  11537. {
  11538. static u8 bProc = 0;
  11539. if (!bProc)
  11540. {
  11541. bProc = 1;
  11542. DEBUG_WARN("MEM_ADDR_EVSE_CONFIG data area check sum error => restore from backup area.\r\n");
  11543. Charger.memory.EVSE_Config.op_bits.restore = ON;
  11544. }
  11545. else
  11546. {
  11547. Proc_EVSE_Config();
  11548. Charger.ModelReadisOK = PASS;
  11549. }
  11550. }
  11551. #endif //FUNC_FLASH_RESTORE_CONFIG_WHEN_PRIMARY_LOSS
  11552. Charger.memory.EVSE_Config.op_bits.read = OFF;
  11553. }
  11554. else
  11555. {
  11556. DEBUG_INFO("Read MEM_ADDR_EVSE_CONFIG block(4k byte) fail.\r\n");
  11557. }
  11558. #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11559. taskEXIT_CRITICAL();
  11560. #endif
  11561. }
  11562. if(Charger.memory.EVSE_Config.op_bits.update)
  11563. {
  11564. #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11565. taskENTER_CRITICAL();
  11566. #endif
  11567. #ifdef FUNC_AUTO_MODIFY_CCID_MODULE
  11568. Charger.memory.EVSE_Config.op_bits.update = OFF;
  11569. #endif
  11570. isSuccess = PASS;
  11571. #ifdef FUNC_FLASH_CONFIG_APPEND_CRC
  11572. #ifndef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11573. osDelay(100);
  11574. #endif
  11575. Charger.memory.EVSE_Config.data.verify.crc32 = HAL_CRC_Calculate(&hcrc, (u32*)Charger.memory.EVSE_Config.data.verify.buf, ((W25Q16FV_BLOCK_SIZE-4)>>2));
  11576. #endif
  11577. // Erase block data
  11578. if(BSP_W25Qx_Erase_Block(MEM_ADDR_EVSE_CONFIG) == W25Qx_OK)
  11579. {
  11580. // Write data to block
  11581. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  11582. {
  11583. if(BSP_W25Qx_Write(&Charger.memory.EVSE_Config.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_EVSE_CONFIG+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  11584. {
  11585. isSuccess = FAIL;
  11586. }
  11587. }
  11588. if(isSuccess)
  11589. DEBUG_INFO("Update MEM_ADDR_EVSE_CONFIG success.\r\n");
  11590. else
  11591. DEBUG_WARN("Update MEM_ADDR_EVSE_CONFIG fail.\r\n");
  11592. #ifndef FUNC_AUTO_MODIFY_CCID_MODULE
  11593. Charger.memory.EVSE_Config.op_bits.update = OFF;
  11594. #endif
  11595. #ifdef FUNC_FLASH_UPDATE_CONFIG_BOTH_PRIMARY_AND_BACKUP
  11596. Charger.memory.EVSE_Config.op_bits.backup = ON;
  11597. #endif
  11598. }
  11599. else
  11600. {
  11601. DEBUG_WARN("Update MEM_ADDR_EVSE_CONFIG block(4k byte) fail.\r\n");
  11602. }
  11603. #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11604. taskEXIT_CRITICAL();
  11605. #endif
  11606. }
  11607. if(Charger.memory.EVSE_Config.op_bits.clear)
  11608. {
  11609. // Erase block data
  11610. if(BSP_W25Qx_Erase_Block(MEM_ADDR_EVSE_CONFIG) == W25Qx_OK)
  11611. {
  11612. // Read data from block
  11613. if(BSP_W25Qx_Read(Charger.memory.EVSE_Config.data.value, MEM_ADDR_EVSE_CONFIG, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11614. {
  11615. DEBUG_INFO("Erase MEM_ADDR_EVSE_CONFIG block(4k byte) pass.\r\n");
  11616. Charger.memory.EVSE_Config.op_bits.clear = OFF;
  11617. }
  11618. else
  11619. {
  11620. DEBUG_WARN("Erase MEM_ADDR_EVSE_CONFIG block(4k byte) fail.\r\n");
  11621. }
  11622. }
  11623. else
  11624. {
  11625. DEBUG_WARN("Erase MEM_ADDR_EVSE_CONFIG block(4k byte) fail.\r\n");
  11626. }
  11627. }
  11628. if(Charger.memory.EVSE_Config.op_bits.backup)
  11629. {
  11630. #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11631. taskENTER_CRITICAL();
  11632. #endif
  11633. isSuccess = PASS;
  11634. #ifndef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11635. osDelay(100);
  11636. #endif
  11637. Charger.memory.EVSE_Config.data.verify.crc32 = HAL_CRC_Calculate(&hcrc, (u32*)Charger.memory.EVSE_Config.data.verify.buf, ((W25Q16FV_BLOCK_SIZE-4)>>2));
  11638. // Erase block data
  11639. if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_EVSE_CONFIG) == W25Qx_OK)
  11640. {
  11641. // Write data to block
  11642. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  11643. {
  11644. if(BSP_W25Qx_Write(&Charger.memory.EVSE_Config.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_EVSE_CONFIG+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  11645. {
  11646. isSuccess = FAIL;
  11647. }
  11648. }
  11649. if(isSuccess)
  11650. DEBUG_INFO("Backup MEM_ADDR_BACKUP_EVSE_CONFIG success.\r\n");
  11651. else
  11652. DEBUG_WARN("Backup MEM_ADDR_BACKUP_EVSE_CONFIG fail.\r\n");
  11653. Charger.memory.EVSE_Config.op_bits.backup = OFF;
  11654. #ifndef FUNC_FLASH_UPDATE_CONFIG_BOTH_PRIMARY_AND_BACKUP
  11655. //Charger.memory.EVSE_Config.op_bits.clear = ON;
  11656. #endif
  11657. }
  11658. else
  11659. {
  11660. DEBUG_WARN("Backup MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) fail.\r\n");
  11661. }
  11662. #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL
  11663. taskEXIT_CRITICAL();
  11664. #endif
  11665. }
  11666. if(Charger.memory.EVSE_Config.op_bits.restore)
  11667. {
  11668. // Restore data from backup block
  11669. if(BSP_W25Qx_Read(Charger.memory.EVSE_Config.data.value, MEM_ADDR_BACKUP_EVSE_CONFIG, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11670. {
  11671. u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)Charger.memory.EVSE_Config.data.verify.buf, ((W25Q16FV_BLOCK_SIZE-4)>>2));
  11672. if(Charger.memory.EVSE_Config.data.verify.crc32 == crc32)
  11673. {
  11674. DEBUG_INFO("Restore MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) pass.\r\n");
  11675. // Update data to primary area
  11676. Charger.memory.EVSE_Config.op_bits.update = ON;
  11677. Proc_EVSE_Config();
  11678. Charger.ModelReadisOK = PASS;
  11679. }
  11680. else
  11681. {
  11682. DEBUG_WARN("[FLASH] MEM_ADDR_BACKUP_EVSE_CONFIG block check sum error.\r\n");
  11683. // TODO:
  11684. static u8 bProc = 0;
  11685. if (!bProc)
  11686. {
  11687. bProc = 1;
  11688. setLedMotion(LED_ACTION_ALARM);
  11689. Charger.memory.EVSE_Config.op_bits.read = ON;
  11690. }
  11691. }
  11692. Charger.memory.EVSE_Config.op_bits.restore = OFF;
  11693. }
  11694. else
  11695. {
  11696. DEBUG_WARN("Restore MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) fail.\r\n");
  11697. }
  11698. }
  11699. if((HAL_GPIO_ReadPin(IN_MEM_Erase_GPIO_Port, IN_MEM_Erase_Pin) == GPIO_PIN_RESET) && (Charger.Mode == MODE_IDLE) )
  11700. {
  11701. //prevent idiot to pree this button too long to cause watchdog reset
  11702. HAL_IWDG_Refresh(&hiwdg);
  11703. if(Charger.counter.RST_CFG>3000)
  11704. {
  11705. // Reset EVSE configuration to factory default value
  11706. Charger.memory.EVSE_Config.data.item.bleConfig.isGenPin = OFF;
  11707. Charger.memory.EVSE_Config.data.item.bleConfig.isRegPuk = OFF;
  11708. Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_OCPP;
  11709. Charger.memory.EVSE_Config.data.item.RFID_SN_Endian = RFID_ENDIAN_LITTLE;
  11710. //Charger.memory.EVSE_Config.data.item.isAuthEnable = OFF;
  11711. Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ;
  11712. //Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative = 0;
  11713. Charger.memory.EVSE_Config.data.item.reservation.mode = RESERVATION_DISABLE;
  11714. Charger.memory.EVSE_Config.op_bits.update = ON;
  11715. // Reset cold load pick up to factory default value
  11716. Charger.memory.coldLoadPickUp.data.item.isEnable = OFF;
  11717. Charger.memory.coldLoadPickUp.op_bits.update = ON;
  11718. // Reset white list to factory default value
  11719. for(uint8_t idx=0;idx<20;idx++)
  11720. {
  11721. Charger.memory.whiteList.data.item[idx].listType = 0xff;
  11722. Charger.memory.whiteList.data.item[idx].isReg = OFF;
  11723. memset(&Charger.memory.whiteList.data.item[idx].pin[0], 0x00, 6);
  11724. memset(&Charger.memory.whiteList.data.item[idx].listID[0], 0x00, 6);
  11725. }
  11726. Charger.memory.whiteList.op_bits.update = ON;
  11727. //restore led
  11728. setLedMotion(LED_ACTION_RESTORE_SETTING) ;
  11729. timerEnable(TIMER_IDX_LED_TEMP, 3000);
  11730. setChargerMode(MODE_IDLE);
  11731. osDelay(1000);
  11732. }
  11733. else
  11734. Charger.counter.RST_CFG++;
  11735. }
  11736. else
  11737. Charger.counter.RST_CFG = 0;
  11738. /*
  11739. Cold load pick up operation
  11740. */
  11741. if(Charger.memory.coldLoadPickUp.op_bits.read)
  11742. {
  11743. osDelay(100);
  11744. // Read data from block
  11745. if(BSP_W25Qx_Read(Charger.memory.coldLoadPickUp.data.value, MEM_ADDR_COLD_LOAD_PICKUP, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11746. {
  11747. DEBUG_INFO("Read MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) pass.\r\n");
  11748. Charger.memory.coldLoadPickUp.op_bits.read = OFF;
  11749. }
  11750. else
  11751. {
  11752. DEBUG_WARN("Read MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) fail.\r\n");
  11753. }
  11754. }
  11755. if(Charger.memory.coldLoadPickUp.op_bits.update)
  11756. {
  11757. isSuccess = PASS;
  11758. // Erase block data
  11759. if(BSP_W25Qx_Erase_Block(MEM_ADDR_COLD_LOAD_PICKUP) == W25Qx_OK)
  11760. {
  11761. // Write data to block
  11762. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  11763. {
  11764. if(BSP_W25Qx_Write(&Charger.memory.coldLoadPickUp.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_COLD_LOAD_PICKUP+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  11765. {
  11766. isSuccess = FAIL;
  11767. }
  11768. }
  11769. if(isSuccess)
  11770. DEBUG_INFO("Update MEM_ADDR_COLD_LOAD_PICKUP success.\r\n");
  11771. else
  11772. DEBUG_WARN("Update MEM_ADDR_COLD_LOAD_PICKUP fail.\r\n");
  11773. Charger.memory.coldLoadPickUp.op_bits.update = OFF;
  11774. }
  11775. else
  11776. {
  11777. DEBUG_WARN("Update MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) fail.\r\n");
  11778. }
  11779. }
  11780. if(Charger.memory.coldLoadPickUp.op_bits.clear)
  11781. {
  11782. // Erase block data
  11783. if(BSP_W25Qx_Erase_Block(MEM_ADDR_COLD_LOAD_PICKUP) == W25Qx_OK)
  11784. {
  11785. // Read data from block
  11786. if(BSP_W25Qx_Read(Charger.memory.coldLoadPickUp.data.value, MEM_ADDR_COLD_LOAD_PICKUP, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11787. {
  11788. DEBUG_INFO("Erase MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) pass.\r\n");
  11789. Charger.memory.coldLoadPickUp.op_bits.clear = OFF;
  11790. }
  11791. else
  11792. {
  11793. DEBUG_WARN("Erase MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) fail.\r\n");
  11794. }
  11795. }
  11796. else
  11797. {
  11798. DEBUG_WARN("Erase MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) fail.\r\n");
  11799. }
  11800. }
  11801. if(Charger.memory.coldLoadPickUp.op_bits.backup)
  11802. {
  11803. isSuccess = PASS;
  11804. // Erase block data
  11805. if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_COLD_LOAD_PICKUP) == W25Qx_OK)
  11806. {
  11807. // Write data to block
  11808. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  11809. {
  11810. if(BSP_W25Qx_Write(&Charger.memory.coldLoadPickUp.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_COLD_LOAD_PICKUP+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  11811. {
  11812. isSuccess = FAIL;
  11813. }
  11814. }
  11815. if(isSuccess)
  11816. DEBUG_INFO("Backup MEM_ADDR_BACKUP_COLD_LOAD_PICKUP success.\r\n");
  11817. else
  11818. DEBUG_WARN("Backup MEM_ADDR_BACKUP_COLD_LOAD_PICKUP fail.\r\n");
  11819. Charger.memory.coldLoadPickUp.op_bits.backup = OFF;
  11820. Charger.memory.coldLoadPickUp.op_bits.clear = ON;
  11821. }
  11822. else
  11823. {
  11824. DEBUG_WARN("Backup MEM_ADDR_BACKUP_COLD_LOAD_PICKUP block(4k byte) fail.\r\n");
  11825. }
  11826. }
  11827. if(Charger.memory.coldLoadPickUp.op_bits.restore)
  11828. {
  11829. // Restore data from backup block
  11830. if(BSP_W25Qx_Read(Charger.memory.coldLoadPickUp.data.value, MEM_ADDR_BACKUP_COLD_LOAD_PICKUP, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11831. {
  11832. DEBUG_INFO("Restore MEM_ADDR_BACKUP_COLD_LOAD_PICKUP block(4k byte) pass.\r\n");
  11833. Charger.memory.coldLoadPickUp.op_bits.restore = OFF;
  11834. }
  11835. else
  11836. {
  11837. DEBUG_WARN("Restore MEM_ADDR_BACKUP_COLD_LOAD_PICKUP block(4k byte) fail.\r\n");
  11838. }
  11839. }
  11840. /*
  11841. White list operation
  11842. */
  11843. if(Charger.memory.whiteList.op_bits.read)
  11844. {
  11845. osDelay(100);
  11846. // Read data from block
  11847. if(BSP_W25Qx_Read(Charger.memory.whiteList.data.value, MEM_ADDR_WHITE_LIST, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11848. {
  11849. DEBUG_INFO("Read MEM_ADDR_WHITE_LIST block(4k byte) pass.\r\n");
  11850. Charger.memory.whiteList.op_bits.read = OFF;
  11851. }
  11852. else
  11853. {
  11854. DEBUG_WARN("Read MEM_ADDR_WHITE_LIST block(4k byte) fail.\r\n");
  11855. }
  11856. }
  11857. if(Charger.memory.whiteList.op_bits.update)
  11858. {
  11859. isSuccess = PASS;
  11860. // Erase block data
  11861. if(BSP_W25Qx_Erase_Block(MEM_ADDR_WHITE_LIST) == W25Qx_OK)
  11862. {
  11863. // Write data to block
  11864. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  11865. {
  11866. if(BSP_W25Qx_Write(&Charger.memory.whiteList.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_WHITE_LIST+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  11867. {
  11868. isSuccess = FAIL;
  11869. }
  11870. }
  11871. if(isSuccess)
  11872. DEBUG_INFO("Update MEM_ADDR_WHITE_LIST success.\r\n");
  11873. else
  11874. DEBUG_WARN("Update MEM_ADDR_WHITE_LIST fail.\r\n");
  11875. Charger.memory.whiteList.op_bits.update = OFF;
  11876. }
  11877. else
  11878. {
  11879. DEBUG_WARN("Update MEM_ADDR_WHITE_LIST block(4k byte) fail.\r\n");
  11880. }
  11881. }
  11882. if(Charger.memory.whiteList.op_bits.clear)
  11883. {
  11884. // Erase block data
  11885. if(BSP_W25Qx_Erase_Block(MEM_ADDR_WHITE_LIST) == W25Qx_OK)
  11886. {
  11887. // Read data from block
  11888. if(BSP_W25Qx_Read(Charger.memory.whiteList.data.value, MEM_ADDR_WHITE_LIST, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11889. {
  11890. DEBUG_INFO("Erase MEM_ADDR_WHITE_LIST block(4k byte) pass.\r\n");
  11891. Charger.memory.whiteList.op_bits.clear = OFF;
  11892. }
  11893. else
  11894. {
  11895. DEBUG_WARN("Erase MEM_ADDR_WHITE_LIST block(4k byte) fail.\r\n");
  11896. }
  11897. }
  11898. else
  11899. {
  11900. DEBUG_WARN("Erase MEM_ADDR_WHITE_LIST block(4k byte) fail.\r\n");
  11901. }
  11902. }
  11903. /*
  11904. Alarm history operation
  11905. */
  11906. if(Charger.memory.hisAlarm.op_bits.read)
  11907. {
  11908. osDelay(100);
  11909. // Read data from block
  11910. if(BSP_W25Qx_Read(Charger.memory.hisAlarm.data.value, MEM_ADDR_HIS_ALARM, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11911. {
  11912. DEBUG_INFO("Read MEM_ADDR_HIS_ALARM block(4k byte) pass.\r\n");
  11913. Charger.memory.hisAlarm.op_bits.read = OFF;
  11914. }
  11915. else
  11916. {
  11917. DEBUG_WARN("Read MEM_ADDR_HIS_ALARM block(4k byte) fail.\r\n");
  11918. }
  11919. }
  11920. if(Charger.memory.hisAlarm.op_bits.update)
  11921. {
  11922. isSuccess = PASS;
  11923. // Write data to block
  11924. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  11925. {
  11926. if(BSP_W25Qx_Write(&Charger.memory.hisAlarm.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_HIS_ALARM+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  11927. {
  11928. isSuccess = FAIL;
  11929. }
  11930. }
  11931. if(isSuccess)
  11932. DEBUG_INFO("Update MEM_ADDR_HIS_ALARM success.\r\n");
  11933. else
  11934. DEBUG_WARN("Update MEM_ADDR_HIS_ALARM fail.\r\n");
  11935. Charger.memory.hisAlarm.op_bits.update = OFF;
  11936. }
  11937. if(Charger.memory.hisAlarm.op_bits.clear)
  11938. {
  11939. // Erase block data
  11940. if(BSP_W25Qx_Erase_Block(MEM_ADDR_HIS_ALARM) == W25Qx_OK)
  11941. {
  11942. // Read data from block
  11943. if(BSP_W25Qx_Read(Charger.memory.hisAlarm.data.value, MEM_ADDR_HIS_ALARM, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11944. {
  11945. DEBUG_INFO("Erase MEM_ADDR_HIS_ALARM block(4k byte) pass.\r\n");
  11946. Charger.memory.hisAlarm.op_bits.clear = OFF;
  11947. }
  11948. else
  11949. {
  11950. DEBUG_WARN("Erase MEM_ADDR_HIS_ALARM block(4k byte) fail.\r\n");
  11951. }
  11952. }
  11953. else
  11954. {
  11955. DEBUG_WARN("Erase MEM_ADDR_HIS_ALARM block(4k byte) fail.\r\n");
  11956. }
  11957. }
  11958. if(Charger.memory.hisAlarm.op_bits.backup)
  11959. {
  11960. isSuccess = PASS;
  11961. // Erase block data
  11962. if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_HIS_ALARM) == W25Qx_OK)
  11963. {
  11964. // Write data to block
  11965. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  11966. {
  11967. if(BSP_W25Qx_Write(&Charger.memory.hisAlarm.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_HIS_ALARM+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  11968. {
  11969. isSuccess = FAIL;
  11970. }
  11971. }
  11972. if(isSuccess)
  11973. DEBUG_INFO("Backup MEM_ADDR_BACKUP_HIS_ALARM success.\r\n");
  11974. else
  11975. DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_ALARM fail.\r\n");
  11976. Charger.memory.hisAlarm.op_bits.backup = OFF;
  11977. Charger.memory.hisAlarm.op_bits.clear = ON;
  11978. }
  11979. else
  11980. {
  11981. DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_ALARM block(4k byte) fail.\r\n");
  11982. }
  11983. }
  11984. if(Charger.memory.hisAlarm.op_bits.restore)
  11985. {
  11986. // Restore data from backup block
  11987. if(BSP_W25Qx_Read(Charger.memory.hisAlarm.data.value, MEM_ADDR_BACKUP_HIS_ALARM, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  11988. {
  11989. DEBUG_INFO("Restore MEM_ADDR_BACKUP_HIS_ALARM block(4k byte) pass.\r\n");
  11990. Charger.memory.hisAlarm.op_bits.restore = OFF;
  11991. }
  11992. else
  11993. {
  11994. DEBUG_WARN("Restore MEM_ADDR_BACKUP_HIS_ALARM block(4k byte) fail.\r\n");
  11995. }
  11996. }
  11997. #ifdef FUNC_METER_IC_HISTORY
  11998. /*
  11999. Meter IC calibration history operation
  12000. */
  12001. if(Charger.memory.hisMeterIC.op_bits.read)
  12002. {
  12003. osDelay(100);
  12004. // Read data from block
  12005. if(BSP_W25Qx_Read(Charger.memory.hisMeterIC.data.value, MEM_ADDR_HIS_METERIC, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  12006. {
  12007. DEBUG_INFO("Read MEM_ADDR_HIS_METERIC block(4k byte) pass.\r\n");
  12008. Charger.memory.hisMeterIC.op_bits.read = OFF;
  12009. }
  12010. else
  12011. {
  12012. DEBUG_INFO("Read MEM_ADDR_HIS_METERIC block(4k byte) fail.\r\n");
  12013. }
  12014. }
  12015. if(Charger.memory.hisMeterIC.op_bits.update)
  12016. {
  12017. isSuccess = PASS;
  12018. // Write data to block
  12019. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  12020. {
  12021. if(BSP_W25Qx_Write(&Charger.memory.hisMeterIC.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_HIS_METERIC+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  12022. {
  12023. isSuccess = FAIL;
  12024. }
  12025. }
  12026. if(isSuccess)
  12027. DEBUG_INFO("Update MEM_ADDR_HIS_METERIC success.\r\n");
  12028. else
  12029. DEBUG_WARN("Update MEM_ADDR_HIS_METERIC fail.\r\n");
  12030. Charger.memory.hisMeterIC.op_bits.update = OFF;
  12031. }
  12032. if(Charger.memory.hisMeterIC.op_bits.clear)
  12033. {
  12034. // Erase block data
  12035. if(BSP_W25Qx_Erase_Block(MEM_ADDR_HIS_METERIC) == W25Qx_OK)
  12036. {
  12037. // Read data from block
  12038. if(BSP_W25Qx_Read(Charger.memory.hisMeterIC.data.value, MEM_ADDR_HIS_METERIC, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  12039. {
  12040. DEBUG_INFO("Erase MEM_ADDR_HIS_METERIC block(4k byte) pass.\r\n");
  12041. Charger.memory.hisMeterIC.op_bits.clear = OFF;
  12042. }
  12043. else
  12044. {
  12045. DEBUG_INFO("Erase MEM_ADDR_HIS_METERIC block(4k byte) fail.\r\n");
  12046. }
  12047. }
  12048. else
  12049. {
  12050. DEBUG_INFO("Erase MEM_ADDR_HIS_METERIC block(4k byte) fail.\r\n");
  12051. }
  12052. }
  12053. if(Charger.memory.hisMeterIC.op_bits.backup)
  12054. {
  12055. isSuccess = PASS;
  12056. // Erase block data
  12057. if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_HIS_METERIC) == W25Qx_OK)
  12058. {
  12059. // Write data to block
  12060. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  12061. {
  12062. if(BSP_W25Qx_Write(&Charger.memory.hisMeterIC.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_HIS_METERIC+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  12063. {
  12064. isSuccess = FAIL;
  12065. }
  12066. }
  12067. if(isSuccess)
  12068. DEBUG_INFO("Backup MEM_ADDR_BACKUP_HIS_METERIC success.\r\n");
  12069. else
  12070. DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_METERIC fail.\r\n");
  12071. Charger.memory.hisMeterIC.op_bits.backup = OFF;
  12072. Charger.memory.hisMeterIC.op_bits.clear = ON;
  12073. }
  12074. else
  12075. {
  12076. DEBUG_INFO("Backup MEM_ADDR_BACKUP_HIS_METERIC block(4k byte) fail.\r\n");
  12077. }
  12078. }
  12079. if(Charger.memory.hisMeterIC.op_bits.restore)
  12080. {
  12081. // Restore data from backup block
  12082. if(BSP_W25Qx_Read(Charger.memory.hisMeterIC.data.value, MEM_ADDR_BACKUP_HIS_METERIC, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  12083. {
  12084. DEBUG_INFO("Restore MEM_ADDR_BACKUP_HIS_METERIC block(4k byte) pass.\r\n");
  12085. Charger.memory.hisMeterIC.op_bits.restore = OFF;
  12086. }
  12087. else
  12088. {
  12089. DEBUG_INFO("Restore MEM_ADDR_BACKUP_HIS_METERIC block(4k byte) fail.\r\n");
  12090. }
  12091. }
  12092. #else //FUNC_METER_IC_HISTORY
  12093. /*
  12094. Charging history operation
  12095. */
  12096. if(Charger.memory.hisCharging.op_bits.read)
  12097. {
  12098. osDelay(100);
  12099. // Read data from block
  12100. if(BSP_W25Qx_Read(Charger.memory.hisCharging.data.value, MEM_ADDR_HIS_CHARGING, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  12101. {
  12102. DEBUG_INFO("Read MEM_ADDR_HIS_CHARGING block(4k byte) pass.\r\n");
  12103. Charger.memory.hisCharging.op_bits.read = OFF;
  12104. }
  12105. else
  12106. {
  12107. DEBUG_WARN("Read MEM_ADDR_HIS_CHARGING block(4k byte) fail.\r\n");
  12108. }
  12109. }
  12110. if(Charger.memory.hisCharging.op_bits.update)
  12111. {
  12112. isSuccess = PASS;
  12113. // Write data to block
  12114. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  12115. {
  12116. if(BSP_W25Qx_Write(&Charger.memory.hisCharging.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_HIS_CHARGING+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  12117. {
  12118. isSuccess = FAIL;
  12119. }
  12120. }
  12121. if(isSuccess)
  12122. DEBUG_INFO("Update MEM_ADDR_HIS_CHARGING success.\r\n");
  12123. else
  12124. DEBUG_WARN("Update MEM_ADDR_HIS_CHARGING fail.\r\n");
  12125. Charger.memory.hisCharging.op_bits.update = OFF;
  12126. }
  12127. if(Charger.memory.hisCharging.op_bits.clear)
  12128. {
  12129. // Erase block data
  12130. if(BSP_W25Qx_Erase_Block(MEM_ADDR_HIS_CHARGING) == W25Qx_OK)
  12131. {
  12132. // Read data from block
  12133. if(BSP_W25Qx_Read(Charger.memory.hisCharging.data.value, MEM_ADDR_HIS_CHARGING, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  12134. {
  12135. DEBUG_INFO("Erase MEM_ADDR_HIS_CHARGING block(4k byte) pass.\r\n");
  12136. Charger.memory.hisCharging.op_bits.clear = OFF;
  12137. }
  12138. else
  12139. {
  12140. DEBUG_WARN("Erase MEM_ADDR_HIS_CHARGING block(4k byte) fail.\r\n");
  12141. }
  12142. }
  12143. else
  12144. {
  12145. DEBUG_WARN("Erase MEM_ADDR_HIS_CHARGING block(4k byte) fail.\r\n");
  12146. }
  12147. }
  12148. if(Charger.memory.hisCharging.op_bits.backup)
  12149. {
  12150. isSuccess = PASS;
  12151. // Erase block data
  12152. if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_HIS_CHARGING) == W25Qx_OK)
  12153. {
  12154. // Write data to block
  12155. for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++)
  12156. {
  12157. if(BSP_W25Qx_Write(&Charger.memory.hisCharging.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_HIS_CHARGING+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK)
  12158. {
  12159. isSuccess = FAIL;
  12160. }
  12161. }
  12162. if(isSuccess)
  12163. DEBUG_INFO("Backup MEM_ADDR_BACKUP_HIS_CHARGING success.\r\n");
  12164. else
  12165. DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_CHARGING fail.\r\n");
  12166. Charger.memory.hisCharging.op_bits.backup = OFF;
  12167. Charger.memory.hisCharging.op_bits.clear = ON;
  12168. }
  12169. else
  12170. {
  12171. DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_CHARGING block(4k byte) fail.\r\n");
  12172. }
  12173. }
  12174. if(Charger.memory.hisCharging.op_bits.restore)
  12175. {
  12176. // Restore data from backup block
  12177. if(BSP_W25Qx_Read(Charger.memory.hisCharging.data.value, MEM_ADDR_BACKUP_HIS_CHARGING, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
  12178. {
  12179. DEBUG_INFO("Restore MEM_ADDR_BACKUP_HIS_CHARGING block(4k byte) pass.\r\n");
  12180. Charger.memory.hisCharging.op_bits.restore = OFF;
  12181. }
  12182. else
  12183. {
  12184. DEBUG_WARN("Restore MEM_ADDR_BACKUP_HIS_CHARGING block(4k byte) fail.\r\n");
  12185. }
  12186. }
  12187. #endif //FUNC_METER_IC_HISTORY
  12188. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  12189. if (!Charger.m_bReadAllMemory)
  12190. {
  12191. #ifdef FUNC_METER_IC_HISTORY
  12192. MeterIC_CaliHistory_ReadAll();
  12193. #endif
  12194. Charger.m_bReadAllMemory = 1;
  12195. }
  12196. #endif
  12197. osDelay(1);
  12198. }
  12199. /* USER CODE END StartMemoryTask */
  12200. }
  12201. /* USER CODE BEGIN Header_StartWifiTask */
  12202. /**
  12203. * @brief Function implementing the wifiTask thread.
  12204. * @param argument: Not used
  12205. * @retval None
  12206. */
  12207. /* USER CODE END Header_StartWifiTask */
  12208. void StartWifiTask(void const * argument)
  12209. {
  12210. /* USER CODE BEGIN StartWifiTask */
  12211. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  12212. IdleUntilReadAllMemory();
  12213. #endif
  12214. /* Infinite loop */
  12215. char tmpBuf[128];
  12216. //uint8_t endFlag[4]={0x55,0xaa,0x55,0xaa};
  12217. __IO uint32_t flash;
  12218. //uint32_t checksum;
  12219. uint32_t rndNumber;
  12220. //=====================================
  12221. // Module reset
  12222. //=====================================
  12223. HAL_GPIO_WritePin(OUT_BLE_RESET_GPIO_Port, OUT_BLE_RESET_Pin, GPIO_PIN_RESET);
  12224. osDelay(60);
  12225. HAL_GPIO_WritePin(OUT_BLE_RESET_GPIO_Port, OUT_BLE_RESET_Pin, GPIO_PIN_SET);
  12226. HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_SET);
  12227. Charger.wifi.initSeq = 0;
  12228. Charger.wifi.isDataMode = OFF;
  12229. UART_WIFI_Init_OK = OFF;
  12230. osDelay(1000);
  12231. /* Infinite loop */
  12232. for(;;)
  12233. {
  12234. //=====================================
  12235. // WIFI module initialization process
  12236. //=====================================
  12237. switch(Charger.wifi.initSeq)
  12238. {
  12239. case 0x00:
  12240. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_RESTORE], strlen(WIFI_CMD[WIFI_CMD_SET_RESTORE]), 0xffff);
  12241. osDelay(WIFI_INIT_DELAY);
  12242. break;
  12243. case 0x01:
  12244. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_DTR], strlen(WIFI_CMD[WIFI_CMD_SET_DTR]), 0xffff);
  12245. osDelay(WIFI_INIT_DELAY);
  12246. break;
  12247. case 0x02:
  12248. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_DSR], strlen(WIFI_CMD[WIFI_CMD_SET_DSR]), 0xffff);
  12249. osDelay(WIFI_INIT_DELAY);
  12250. break;
  12251. case 0x03:
  12252. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_GET_ADDR], strlen(WIFI_CMD[WIFI_CMD_GET_ADDR]), 0xffff);
  12253. osDelay(WIFI_INIT_DELAY);
  12254. break;
  12255. case 0x04:
  12256. sprintf(tmpBuf, "%s\"EVSE_AP_%sP\"\r\n", WIFI_CMD[WIFI_CMD_SET_SSID], Charger.wifi.module_mac);
  12257. DEBUG_INFO("WIFI module set name: EVSE_AP_%s\r\n", Charger.wifi.module_mac);
  12258. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)tmpBuf, strlen(tmpBuf), 0xffff);
  12259. osDelay(WIFI_INIT_DELAY);
  12260. break;
  12261. case 0x05:
  12262. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_CHANNEL], strlen(WIFI_CMD[WIFI_CMD_SET_CHANNEL]), 0xffff);
  12263. osDelay(WIFI_INIT_DELAY);
  12264. break;
  12265. case 0x06:
  12266. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_SECURITY_MODE], strlen(WIFI_CMD[WIFI_CMD_SET_SECURITY_MODE]), 0xffff);
  12267. osDelay(WIFI_INIT_DELAY);
  12268. break;
  12269. case 0x07:
  12270. sprintf(tmpBuf, "%s\"%s\"\r\n", WIFI_CMD[WIFI_CMD_SET_PASSWORD], Charger.memory.EVSE_Config.data.item.wifiConfig.passwd);
  12271. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)tmpBuf, strlen(tmpBuf), 0xffff);
  12272. osDelay(WIFI_INIT_DELAY);
  12273. break;
  12274. case 0x08:
  12275. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_DHCPSERVER], strlen(WIFI_CMD[WIFI_CMD_SET_DHCPSERVER]), 0xffff);
  12276. osDelay(WIFI_INIT_DELAY);
  12277. break;
  12278. case 0x09:
  12279. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_TCPSETVER_CONFIG], strlen(WIFI_CMD[WIFI_CMD_SET_TCPSETVER_CONFIG]), 0xffff);
  12280. osDelay(WIFI_INIT_DELAY);
  12281. break;
  12282. case 0x0a:
  12283. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_AP_ACTIVE], strlen(WIFI_CMD[WIFI_CMD_SET_AP_ACTIVE]), 0xffff);
  12284. osDelay(WIFI_INIT_DELAY);
  12285. break;
  12286. case 0x0b:
  12287. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_DATA_MODE], strlen(WIFI_CMD[WIFI_CMD_SET_DATA_MODE]), 0xffff);
  12288. DEBUG_INFO("WIFI module switch to data mode.\r\n");
  12289. osDelay(WIFI_INIT_DELAY);
  12290. default:
  12291. UART_WIFI_Init_OK = ON;
  12292. break;
  12293. }
  12294. //=====================================
  12295. // WIFI central device connect status
  12296. //=====================================
  12297. if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_SET) && (UART_WIFI_Init_OK == ON))
  12298. {
  12299. // Device disconnect
  12300. timerRefresh(TIMER_IDX_WIFI);
  12301. if(Charger.wifi.loginRole == WIFI_LOGIN_ROLE_ROOT || Charger.wifi.loginRole == WIFI_LOGIN_ROLE_USER)
  12302. {
  12303. DEBUG_INFO("WIFI client device disconnect.\r\n.");
  12304. Charger.wifi.loginRole = WIFI_LOGIN_ROLE_UNKOWN;
  12305. }
  12306. }
  12307. else if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_RESET) && (UART_WIFI_Init_OK == ON))
  12308. {
  12309. // Device connect in
  12310. if(Charger.wifi.loginRole == WIFI_LOGIN_ROLE_UNKOWN)
  12311. {
  12312. DEBUG_INFO("WIFI client device connect.....wait sign in.\r\n.");
  12313. osDelay(1000);
  12314. }
  12315. }
  12316. //=====================================
  12317. // Communication timeout process
  12318. //=====================================
  12319. if(timer[TIMER_IDX_WIFI].isAlarm)
  12320. {
  12321. Charger.wifi.loginRole = WIFI_LOGIN_ROLE_UNKOWN;
  12322. DEBUG_INFO("WIFI no communication over time, disconnect client device.\r\n");
  12323. timerRefresh(TIMER_IDX_WIFI);
  12324. HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_RESET);
  12325. osDelay(100);
  12326. HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_SET);
  12327. }
  12328. //=====================================
  12329. // WIFI uart recieve data process
  12330. //=====================================
  12331. if(UART_WIFI_recv_end_flag == ON)
  12332. {
  12333. if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_SET) || !Charger.wifi.isDataMode)
  12334. {
  12335. // AT command rx process
  12336. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_RESTORE])!=NULL)
  12337. {
  12338. Charger.wifi.initSeq++;
  12339. }
  12340. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_DTR])!=NULL)
  12341. {
  12342. Charger.wifi.initSeq++;
  12343. }
  12344. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_DSR])!=NULL)
  12345. {
  12346. Charger.wifi.initSeq++;
  12347. }
  12348. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_GET_ADDR])!=NULL)
  12349. {
  12350. memcpy(Charger.wifi.module_mac, &UART_WIFI_rx_buffer[strcspn((char *)UART_WIFI_rx_buffer, ":")+1], 12);
  12351. Charger.wifi.module_mac[12] = '\0';
  12352. DEBUG_INFO("Wifi module mac address: %s\r\n", Charger.wifi.module_mac);
  12353. Charger.wifi.initSeq++;
  12354. }
  12355. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_SSID])!=NULL)
  12356. {
  12357. Charger.wifi.initSeq++;
  12358. }
  12359. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_CHANNEL])!=NULL)
  12360. {
  12361. Charger.wifi.initSeq++;
  12362. }
  12363. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_SECURITY_MODE])!=NULL)
  12364. {
  12365. Charger.wifi.initSeq++;
  12366. }
  12367. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_PASSWORD])!=NULL)
  12368. {
  12369. Charger.wifi.initSeq++;
  12370. }
  12371. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_DHCPSERVER])!=NULL)
  12372. {
  12373. Charger.wifi.initSeq++;
  12374. }
  12375. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_TCPSETVER_CONFIG])!=NULL)
  12376. {
  12377. Charger.wifi.initSeq++;
  12378. }
  12379. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_AP_ACTIVE])!=NULL)
  12380. {
  12381. Charger.wifi.initSeq++;
  12382. }
  12383. if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_DATA_MODE])!=NULL)
  12384. {
  12385. Charger.wifi.isDataMode = ON;
  12386. Charger.wifi.initSeq++;
  12387. }
  12388. }
  12389. else
  12390. {
  12391. // Application protocol rx process
  12392. uint8_t tx[UART_BUFFER_SIZE];
  12393. uint8_t tx_len;
  12394. uint8_t chksum = 0;
  12395. if(isValidCheckSum_WIFI() && (rndNumber != ((UART_WIFI_rx_buffer[3]<<0) | (UART_WIFI_rx_buffer[4]<<8) | (UART_WIFI_rx_buffer[5]<<16) | (UART_WIFI_rx_buffer[6]<<24))))
  12396. {
  12397. // Timer reset
  12398. timerRefresh(TIMER_IDX_WIFI);
  12399. rndNumber = ((UART_WIFI_rx_buffer[3]<<0) | (UART_WIFI_rx_buffer[4]<<8) | (UART_WIFI_rx_buffer[5]<<16) | (UART_WIFI_rx_buffer[6]<<24));
  12400. switch(UART_WIFI_rx_buffer[2])
  12401. {
  12402. case WIFI_PROTOCOL_MESSAGE_SIGN_IN:
  12403. DEBUG_INFO("WIFI device sign request...%d\r\n", UART_WIFI_rx_buffer[7]);
  12404. tx_len = 5;
  12405. tx[0] = (tx_len>>8)&0xff;
  12406. tx[1] = (tx_len&0xff);
  12407. tx[2] = UART_WIFI_rx_buffer[2] + 0x80;
  12408. tx[3] = 0x00;
  12409. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  12410. {
  12411. chksum ^= tx[2 + idx];
  12412. }
  12413. tx[4] = chksum;
  12414. break;
  12415. default:
  12416. /*
  12417. TODO: Unknow command response here
  12418. */
  12419. tx_len = 5;
  12420. tx[0] = 0x00;
  12421. tx[1] = 0x05;
  12422. tx[2] = UART_WIFI_rx_buffer[2] + 0x80;
  12423. tx[3] = 0x00;
  12424. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  12425. {
  12426. chksum ^= tx[2 + idx];
  12427. }
  12428. tx[4] = chksum;
  12429. DEBUG_ERROR("WIFI unknow command.\r\n");
  12430. break;
  12431. }
  12432. }
  12433. else
  12434. {
  12435. /*
  12436. TODO: Protocol check sum error response here
  12437. */
  12438. tx_len = 5;
  12439. tx[0] = 0x00;
  12440. tx[1] = 0x05;
  12441. tx[2] = UART_WIFI_rx_buffer[2] + 0x80;
  12442. tx[3] = 0x00;
  12443. for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++)
  12444. {
  12445. chksum ^= tx[2 + idx];
  12446. }
  12447. tx[4] = chksum;
  12448. DEBUG_ERROR("WIFI check sum validation error.\r\n");
  12449. }
  12450. HAL_UART_Transmit(&WIFI_USART, (uint8_t *)tx, tx_len, 0xffff);
  12451. }
  12452. UART_WIFI_rx_len=0;
  12453. UART_WIFI_recv_end_flag=0;
  12454. }
  12455. HAL_UART_Receive_DMA(&WIFI_USART, (uint8_t*)UART_WIFI_rx_buffer, UART_BUFFER_SIZE);
  12456. osDelay(1);
  12457. }
  12458. /* USER CODE END StartWifiTask */
  12459. }
  12460. /* USER CODE BEGIN Header_StartMeterTask */
  12461. /**
  12462. * @brief Function implementing the MeterTask thread.
  12463. * @param argument: Not used
  12464. * @retval None
  12465. */
  12466. /* USER CODE END Header_StartMeterTask */
  12467. void StartMeterTask(void const * argument)
  12468. {
  12469. /* USER CODE BEGIN StartMeterTask */
  12470. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  12471. IdleUntilReadAllMemory();
  12472. #endif
  12473. #ifdef FUNC_WAIT_METER_IC_INIT_OK
  12474. #ifdef FUNC_IDLE_UNTIL_INIT_METER_IC
  12475. IdleUntilInitMeterIC();
  12476. #endif
  12477. #endif //FUNC_WAIT_METER_IC_INIT_OK
  12478. /* Infinite loop */
  12479. #ifdef RECODE_FUNC_METER_TASK
  12480. #else
  12481. uint8_t pollingStep = 0;
  12482. uint8_t addr = 0x01;
  12483. uint8_t meter_model;
  12484. #endif
  12485. HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_RESET);
  12486. //#ifdef FUNC_TEST_PRO380_INIT_DE_HIGH_1_SEC
  12487. // HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_SET);
  12488. // osDelay(1000);
  12489. // HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_RESET);
  12490. //#endif
  12491. //#ifndef RECODE_FUNC_METER_TASK
  12492. timerEnable(TIMER_IDX_METER_POLLING, 500);
  12493. //#endif
  12494. static void* pTargetMeter = NULL;
  12495. /* Infinite loop */
  12496. for(;;)
  12497. {
  12498. #ifdef RECODE_FUNC_METER_TASK
  12499. if(timer[TIMER_IDX_METER_POLLING].isAlarm)
  12500. {
  12501. timerRefresh(TIMER_IDX_METER_POLLING);
  12502. #endif
  12503. if (Charger.m_bUseExtMeter_PRO380)
  12504. {
  12505. #ifdef RECODE_FUNC_METER_TASK
  12506. #ifdef RECODE_METER_PRO380
  12507. static PPRO380 p = NULL;
  12508. if (p == NULL)
  12509. {
  12510. p = (PPRO380)HTK_Malloc(sizeof(PRO380));
  12511. if (p != NULL)
  12512. {
  12513. Charger.m_pPRO380 = p;
  12514. PRO380_Init(p, METER_PRO380_DEV_ADDR);
  12515. }
  12516. }
  12517. else
  12518. {
  12519. if (pTargetMeter != (void*)p)
  12520. {
  12521. pTargetMeter = (void*)p;
  12522. MX_UART4_Init_For_Meter_PRO380();
  12523. __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
  12524. }
  12525. PRO380_Proc(p);
  12526. }
  12527. #endif //RECODE_METER_PRO380
  12528. #else //RECODE_FUNC_METER_TASK
  12529. {
  12530. meter_model = METER_MODEL_PRO380;
  12531. if(UART_METER_recv_end_flag != ON)
  12532. {
  12533. // Polling meter info
  12534. uint8_t tx[UART_BUFFER_SIZE];
  12535. uint8_t tx_len = 0;
  12536. if(timer[TIMER_IDX_METER_POLLING].isAlarm)
  12537. {
  12538. timerRefresh(TIMER_IDX_METER_POLLING);
  12539. switch(pollingStep)
  12540. {
  12541. case 0:
  12542. tx_len = read_Energy_tx(meter_model, addr, &tx[0]);
  12543. break;
  12544. }
  12545. HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_SET);
  12546. osDelay(5);
  12547. HAL_UART_Transmit(&METER_USART, (uint8_t *)tx, tx_len, 0xffff);
  12548. osDelay(5);
  12549. HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_RESET);
  12550. osDelay(30);
  12551. }
  12552. }
  12553. else
  12554. {
  12555. switch(pollingStep)
  12556. {
  12557. case 0:
  12558. // Total enery
  12559. if(read_Energy_rx(meter_model, addr, &UART_METER_rx_buffer[0], UART_METER_rx_len))
  12560. {
  12561. //pollingStep++; //Only process case 0 (Total Energy)
  12562. Charger.counter.Meter_Timeout.fail = 0;
  12563. Charger.m_MeterPRO380.m_LastUpdateTick = HAL_GetTick();
  12564. }
  12565. break;
  12566. }
  12567. memset(&UART_METER_rx_buffer[0], 0x00, ARRAY_SIZE(UART_METER_rx_buffer));
  12568. UART_METER_rx_len = 0;
  12569. UART_METER_recv_end_flag = OFF;
  12570. }
  12571. HAL_UART_Receive_DMA(&METER_USART,(uint8_t*)UART_METER_rx_buffer, UART_BUFFER_SIZE);
  12572. }
  12573. #endif //RECODE_FUNC_METER_TASK
  12574. }
  12575. #ifdef FUNC_PTB_METER_WM3M4C
  12576. if (Charger.m_bUseExtMeter_WM3M4C)
  12577. {
  12578. static PWM3M4C p = NULL;
  12579. if (p == NULL)
  12580. {
  12581. p = (PWM3M4C)HTK_Malloc(sizeof(WM3M4C));
  12582. if (p != NULL)
  12583. {
  12584. Charger.m_pWM3M4C = p;
  12585. WM3M4C_Init(p, METER_WM3M4C_DEV_ADDR);
  12586. }
  12587. }
  12588. else
  12589. {
  12590. if (pTargetMeter != (void*)p)
  12591. {
  12592. pTargetMeter = (void*)p;
  12593. MX_UART4_Init_For_PTB_Meter_WM3M4C();
  12594. __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
  12595. }
  12596. WM3M4C_Proc(p);
  12597. }
  12598. }
  12599. #endif //FUNC_PTB_METER_WM3M4C
  12600. #ifdef FUNC_EKM_OMNIMETER
  12601. if (Charger.m_bUseExtMeter_OMNIMETER)
  12602. {
  12603. static PEKM_Omnimeter p = NULL;
  12604. if (p == NULL)
  12605. {
  12606. p = (PEKM_Omnimeter)HTK_Malloc(sizeof(EKM_Omnimeter));
  12607. if (p != NULL)
  12608. {
  12609. Charger.m_pEKM_Omnimeter = p;
  12610. EKM_Omnimeter_Init(p);
  12611. }
  12612. }
  12613. else
  12614. {
  12615. if (pTargetMeter != (void*)p)
  12616. {
  12617. pTargetMeter = (void*)p;
  12618. MX_UART4_Init_For_EKM_Omnimeter();
  12619. __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
  12620. }
  12621. EKM_Omnimeter_Proc(p);
  12622. }
  12623. }
  12624. #endif //FUNC_EKM_OMNIMETER
  12625. #ifdef RECODE_FUNC_METER_TASK
  12626. }
  12627. #endif
  12628. osDelay(1);
  12629. }
  12630. /* USER CODE END StartMeterTask */
  12631. }
  12632. /* Private application code --------------------------------------------------*/
  12633. /* USER CODE BEGIN Application */
  12634. #ifdef RECODE_FUNC_METER_IC_TASK
  12635. void MeterIC_Proc(uint16_t* pUpdateMemReq)
  12636. {
  12637. #ifdef FUNC_METER_IC_ADE7858A
  12638. //Meter IC
  12639. {
  12640. //meter_model = METER_MODEL_IC;
  12641. #ifndef DEBUG_METER_IC
  12642. HTK_UNUSED(MeterIC_KP);
  12643. #endif
  12644. double Volt[AC_PHASE_NUM_MAX] = { 0 };
  12645. double Curr[AC_PHASE_NUM_MAX] = { 0 };
  12646. static uint32_t EngPlusRaw[AC_PHASE_NUM_MAX] = { 0 };
  12647. #ifdef FUNC_METER_IC_POWER_FADEOUT
  12648. static uint32_t ValidCurrTick = 0;
  12649. #endif
  12650. if(timer[TIMER_IDX_METER_IC_POLLING].isAlarm)
  12651. {
  12652. timerRefresh(TIMER_IDX_METER_IC_POLLING);
  12653. //Check new calibration values
  12654. if (Charger.m_MeterIC_TrigWriteCaliVals.m_Data != 0) //Find new calibration values
  12655. {
  12656. MeterIC_WriteCaliValsFromFlash(HTK_FALSE, HTK_TRUE);
  12657. }
  12658. //Read data from Meter IC and calculate
  12659. {
  12660. PMeterIC_MeasVals p = &Charger.m_MeterIC_MeasVals;
  12661. uint8_t *RxBuf = I2C_METER_rx_buffer;
  12662. ADE7858A_Get(AVRMS, RxBuf, &p->m_AVRMS, 4); //V1
  12663. ADE7858A_Get(BVRMS, RxBuf, &p->m_BVRMS, 4); //V2
  12664. ADE7858A_Get(CVRMS, RxBuf, &p->m_CVRMS, 4); //V3
  12665. #ifdef FUNC_METER_IC_READ_PHASE_ANGLE
  12666. {
  12667. PMeterIC_ExtraInfo pEx = &Charger.m_MeterIcEx;
  12668. ADE7858A_Get(MMODE, RxBuf, &pEx->m_MMODE, 1); //MMODE
  12669. ADE7858A_Get(COMPMODE, RxBuf, &pEx->m_COMPMODE, 2); //COMPMODE
  12670. ADE7858A_Get(ANGLE0, RxBuf, &pEx->m_AngleReg[0], 2); //ANGLE0
  12671. ADE7858A_Get(ANGLE1, RxBuf, &pEx->m_AngleReg[1], 2); //ANGLE1
  12672. ADE7858A_Get(ANGLE2, RxBuf, &pEx->m_AngleReg[2], 2); //ANGLE2
  12673. ADE7858A_Get(Period, RxBuf, &p->m_Period, 2); //Period
  12674. if (HTK_IS_BETWEEN_MIDDIFF(p->m_Period, 5120, 30)) //Datasheet "Period Measurement"
  12675. {
  12676. pEx->m_AcPeriodMode = AC_PERIOD_MODE_50HZ;
  12677. for (u8 i = 0; i < 3; i++)
  12678. {
  12679. if (pEx->m_AngleReg[i] != 0)
  12680. {
  12681. pEx->m_AngleDegree[i] = METER_IC_ANGLE_REG_TO_DEGREE(50, pEx->m_AngleReg[i]);
  12682. }
  12683. }
  12684. }
  12685. else if (HTK_IS_BETWEEN_MIDDIFF(p->m_Period, 4267, 30))
  12686. {
  12687. pEx->m_AcPeriodMode = AC_PERIOD_MODE_60HZ;
  12688. for (u8 i = 0; i < 3; i++)
  12689. {
  12690. if (pEx->m_AngleReg[i] != 0)
  12691. {
  12692. pEx->m_AngleDegree[i] = METER_IC_ANGLE_REG_TO_DEGREE(60, pEx->m_AngleReg[i]);
  12693. }
  12694. }
  12695. }
  12696. else
  12697. {
  12698. pEx->m_AcPeriodMode = AC_PERIOD_MODE_UNKNOW;
  12699. // for (u8 i = 0; i < 3; i++)
  12700. // {
  12701. // pEx.m_AngleDegree[i] = 0;
  12702. // }
  12703. }
  12704. ADE7858A_Get(STATUS0, RxBuf, &pEx->m_STATUS0, 4); //STATUS0
  12705. ADE7858A_Get(STATUS1, RxBuf, &pEx->m_STATUS1, 4); //STATUS1
  12706. pEx->m_bSEQERR = BIT_GET(pEx->m_STATUS1, 19); //bit19
  12707. }
  12708. #endif //FUNC_METER_IC_READ_PHASE_ANGLE
  12709. ADE7858A_Get(AIRMS, RxBuf, &p->m_AIRMS, 4); //I1
  12710. ADE7858A_Get(BIRMS, RxBuf, &p->m_BIRMS, 4); //I2
  12711. ADE7858A_Get(CIRMS, RxBuf, &p->m_CIRMS, 4); //I3
  12712. ADE7858A_Get(AVRMS_LRIP, RxBuf, &p->m_AVRMS_LRIP, 4); //V1_LRIP
  12713. ADE7858A_Get(BVRMS_LRIP, RxBuf, &p->m_BVRMS_LRIP, 4); //V2_LRIP
  12714. ADE7858A_Get(CVRMS_LRIP, RxBuf, &p->m_CVRMS_LRIP, 4); //V3_LRIP
  12715. ADE7858A_Get(AIRMS_LRIP, RxBuf, &p->m_AIRMS_LRIP, 4); //I1_LRIP
  12716. ADE7858A_Get(BIRMS_LRIP, RxBuf, &p->m_BIRMS_LRIP, 4); //I2_LRIP
  12717. ADE7858A_Get(CIRMS_LRIP, RxBuf, &p->m_CIRMS_LRIP, 4); //I3_LRIP
  12718. ADE7858A_Get(AWATT, RxBuf, &p->m_AWATT, 4); //P1
  12719. ADE7858A_Get(BWATT, RxBuf, &p->m_BWATT, 4); //P2
  12720. ADE7858A_Get(CWATT, RxBuf, &p->m_CWATT, 4); //P3
  12721. if (ADE7858A_Get(AWATTHR, RxBuf, &p->m_AWATTHR, 4)) { EngPlusRaw[0] += HTK_GET_VAL_MAX(p->m_AWATTHR, 0); } //E1, only positive energy allowed
  12722. if (ADE7858A_Get(BWATTHR, RxBuf, &p->m_BWATTHR, 4)) { EngPlusRaw[1] += HTK_GET_VAL_MAX(p->m_BWATTHR, 0); } //E2, only positive energy allowed
  12723. if (ADE7858A_Get(CWATTHR, RxBuf, &p->m_CWATTHR, 4)) { EngPlusRaw[2] += HTK_GET_VAL_MAX(p->m_CWATTHR, 0); } //E3, only positive energy allowed
  12724. Volt[0] = p->m_AVRMS * KV; //V
  12725. Volt[1] = p->m_BVRMS * KV; //V
  12726. Volt[2] = p->m_CVRMS * KV; //V
  12727. #ifdef TEST_ACXXX_FAKEDATA
  12728. HTK_UNUSED(Volt[0]);
  12729. #endif
  12730. #ifdef FUNC_METER_IC_VARIABLE_PARAM
  12731. Curr[0] = p->m_AIRMS * MeterIC_KI; //A
  12732. Curr[1] = p->m_BIRMS * MeterIC_KI; //A
  12733. Curr[2] = p->m_CIRMS * MeterIC_KI; //A
  12734. #else
  12735. Curr[0] = p->m_AIRMS * KI; //A
  12736. Curr[1] = p->m_BIRMS * KI; //A
  12737. Curr[2] = p->m_CIRMS * KI; //A
  12738. #endif
  12739. for (uint8_t i = 0; i < AC_PHASE_NUM_MAX; i++)
  12740. {
  12741. #ifndef TEST_ACXXX_FAKEDATA
  12742. #ifdef VO_SIMU_ACV
  12743. if (Charger.m_VOCode.m_EnableSimuACV)
  12744. {
  12745. Charger.Voltage[i] = Charger.m_SimuData.m_AcvVolt;
  12746. }
  12747. else
  12748. {
  12749. Charger.Voltage[i] = (uint16_t)(Volt[i] * 100); //10mV
  12750. }
  12751. #else
  12752. Charger.Voltage[i] = (uint16_t)(Volt[i] * 100); //10mV
  12753. #endif //VO_SIMU_ACV
  12754. #endif //TEST_ACXXX_FAKEDATA
  12755. #ifdef VO_SIMU_ACA
  12756. if (Charger.m_VOCode.m_EnableSimuACA)
  12757. {
  12758. if (Charger.m_b3PhaseModel || (!Charger.m_b3PhaseModel && i == 0))
  12759. {
  12760. Charger.Current[i] = Charger.m_SimuData.m_AcaCurr;
  12761. }
  12762. }
  12763. else
  12764. {
  12765. Charger.Current[i] = (uint16_t)(Curr[i] * 100); //10mA
  12766. }
  12767. #else
  12768. Charger.Current[i] = (uint16_t)(Curr[i] * 100); //10mA
  12769. #endif //VO_SIMU_ACA
  12770. }
  12771. #ifdef FUNC_METER_IC_POWER_FADEOUT
  12772. if (Curr[0] > METER_IC_POWER_CONSUMPTION_MIN_CURR ||
  12773. Curr[1] > METER_IC_POWER_CONSUMPTION_MIN_CURR ||
  12774. Curr[2] > METER_IC_POWER_CONSUMPTION_MIN_CURR)
  12775. {
  12776. //ValidCurrTick = (int64_t)HAL_GetTick();
  12777. ValidCurrTick = HAL_GetTick();
  12778. }
  12779. #endif
  12780. #ifdef DEBUG_METER_IC
  12781. XP("L1_Voltage: %f (%d)\r\n", Volt[0], p->m_AVRMS);
  12782. XP("L2_Voltage: %f (%d)\r\n", Volt[1], p->m_BVRMS);
  12783. XP("L3_Voltage: %f (%d)\r\n", Volt[2], p->m_CVRMS);
  12784. XP("L1_Current: %f (%d)\r\n", Curr[0], p->m_AIRMS);
  12785. XP("L2_Current: %f (%d)\r\n", Curr[1], p->m_BIRMS);
  12786. XP("L3_Current: %f (%d)\r\n", Curr[2], p->m_CIRMS);
  12787. double Volt_LRIP[AC_PHASE_NUM_MAX] = { 0 };
  12788. double Curr_LRIP[AC_PHASE_NUM_MAX] = { 0 };
  12789. Volt_LRIP[0] = p->m_AVRMS_LRIP * KV; //V
  12790. Volt_LRIP[1] = p->m_BVRMS_LRIP * KV; //V
  12791. Volt_LRIP[2] = p->m_CVRMS_LRIP * KV; //V
  12792. #ifdef FUNC_METER_IC_VARIABLE_PARAM
  12793. Curr_LRIP[0] = p->m_AIRMS_LRIP * MeterIC_KI ; //A
  12794. Curr_LRIP[1] = p->m_BIRMS_LRIP * MeterIC_KI ; //A
  12795. Curr_LRIP[2] = p->m_CIRMS_LRIP * MeterIC_KI ; //A
  12796. #else
  12797. Curr_LRIP[0] = p->m_AIRMS_LRIP * KI; //A
  12798. Curr_LRIP[1] = p->m_BIRMS_LRIP * KI; //A
  12799. Curr_LRIP[2] = p->m_CIRMS_LRIP * KI; //A
  12800. #endif
  12801. XP("L1_Voltage_LRIP: %f (%d)\r\n", Volt_LRIP[0], p->m_AVRMS_LRIP);
  12802. XP("L2_Voltage_LRIP: %f (%d)\r\n", Volt_LRIP[1], p->m_BVRMS_LRIP);
  12803. XP("L3_Voltage_LRIP: %f (%d)\r\n", Volt_LRIP[2], p->m_CVRMS_LRIP);
  12804. XP("L1_Current_LRIP: %f (%d)\r\n", Curr_LRIP[0], p->m_AIRMS_LRIP);
  12805. XP("L2_Current_LRIP: %f (%d)\r\n", Curr_LRIP[1], p->m_BIRMS_LRIP);
  12806. XP("L3_Current_LRIP: %f (%d)\r\n", Curr_LRIP[2], p->m_CIRMS_LRIP);
  12807. #ifdef FUNC_METER_IC_VARIABLE_PARAM
  12808. double Power1 = p->m_AWATT * MeterIC_KP; //W
  12809. double Power2 = p->m_BWATT * MeterIC_KP; //W
  12810. double Power3 = p->m_CWATT * MeterIC_KP; //W
  12811. #else
  12812. double Power1 = p->m_AWATT * KP; //W
  12813. double Power2 = p->m_BWATT * KP; //W
  12814. double Power3 = p->m_CWATT * KP; //W
  12815. #endif
  12816. XP("L1_WATT(W): %f (%d, %u)\r\n", Power1, p->m_AWATT, (uint32_t)p->m_AWATT);
  12817. XP("L2_WATT(W): %f (%d, %u)\r\n", Power2, p->m_BWATT, (uint32_t)p->m_BWATT);
  12818. XP("L3_WATT(W): %f (%d, %u)\r\n", Power3, p->m_CWATT, (uint32_t)p->m_CWATT);
  12819. #ifdef FUNC_METER_IC_VARIABLE_PARAM
  12820. double Energy1 = p->m_AWATTHR * MeterIC_KE; //Wh
  12821. double Energy2 = p->m_BWATTHR * MeterIC_KE; //Wh
  12822. double Energy3 = p->m_CWATTHR * MeterIC_KE; //Wh
  12823. #else
  12824. double Energy1 = p->m_AWATTHR * KE; //Wh
  12825. double Energy2 = p->m_BWATTHR * KE; //Wh
  12826. double Energy3 = p->m_CWATTHR * KE; //Wh
  12827. #endif
  12828. XP("L1_WATTHR(Wh): %f (%d, %u)\r\n", Energy1, p->m_AWATTHR, (uint32_t)p->m_AWATTHR);
  12829. XP("L2_WATTHR(Wh): %f (%d, %u)\r\n", Energy2, p->m_BWATTHR, (uint32_t)p->m_BWATTHR);
  12830. XP("L3_WATTHR(Wh): %f (%d, %u)\r\n", Energy3, p->m_CWATTHR, (uint32_t)p->m_CWATTHR);
  12831. #endif //DEBUG_METER_IC
  12832. }
  12833. }
  12834. #ifdef FUNC_POWER_CONSUMPTION_BY_METER_IC
  12835. if(timer[TIMER_IDX_POWER].isAlarm)
  12836. {
  12837. timerRefresh(TIMER_IDX_POWER);
  12838. if (0)
  12839. {
  12840. }
  12841. #ifdef FUNC_PTB_METER_WM3M4C
  12842. else if (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C)
  12843. {
  12844. uint64_t Eng = Charger.m_pWM3M4C->m_AccuEnergy1 / ((Charger.m_b3PhaseModel) ? 3 : 1);
  12845. if (Charger.m_b3PhaseModel)
  12846. {
  12847. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 = Eng;
  12848. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 = Eng;
  12849. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 = Eng;
  12850. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total =
  12851. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 +
  12852. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 +
  12853. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3;
  12854. }
  12855. else
  12856. {
  12857. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 = Eng;
  12858. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 = 0;
  12859. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 = 0;
  12860. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total =
  12861. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1;
  12862. }
  12863. }
  12864. #endif //FUNC_PTB_METER_WM3M4C
  12865. else if (Charger.m_bUseExtMeter_PRO380 && Charger.m_pPRO380) //Use PRO380
  12866. {
  12867. for (uint8_t i = 0; i < AC_PHASE_NUM_MAX; i++)
  12868. {
  12869. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i] =
  12870. // //round off to 2 decimal place
  12871. // //i.g. 0.53 (float: 0.52999..) => 52.999.. => 53 => 5300 (0.0001 kWh) => 0.53 kWh
  12872. // (uint64_t)(HTK_ROUND_U64(Charger.m_MeterPRO380.m_AE_Lx_Total[i] * 100) * 100);
  12873. //round off to 4 decimal place
  12874. //i.g. 0.53 (float: 0.52999..) => 52.999.. => 53 => 5300 (0.0001 kWh) => 0.53 kWh
  12875. #ifdef RECODE_METER_PRO380
  12876. ((uint64_t)(HTK_ROUND_U64(Charger.m_pPRO380->m_Lx_Total_active_energy[i].m_Val * 10000)));
  12877. #else
  12878. (uint64_t)(HTK_ROUND_U64(Charger.m_MeterPRO380.m_AE_Lx_Total[i] * 10000));
  12879. #endif
  12880. }
  12881. if (Charger.m_b3PhaseModel)
  12882. {
  12883. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total =
  12884. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 +
  12885. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 +
  12886. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3;
  12887. }
  12888. else
  12889. {
  12890. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total =
  12891. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1;
  12892. }
  12893. }
  12894. else //Use Meter IC
  12895. {
  12896. static double EngPlus[AC_PHASE_NUM_MAX] = { 0 };
  12897. static double Eng[AC_PHASE_NUM_MAX] = { 0 };
  12898. for (uint8_t i = 0; i < AC_PHASE_NUM_MAX; i++)
  12899. {
  12900. #ifdef FUNC_METER_IC_VARIABLE_PARAM
  12901. EngPlus[i] = EngPlusRaw[i] * MeterIC_KE;
  12902. #else
  12903. EngPlus[i] = EngPlusRaw[i] * KE;
  12904. #endif
  12905. EngPlusRaw[i] = 0;
  12906. #ifdef FUNC_METER_IC_POWER_FADEOUT
  12907. //Energy is calculated only when the current is greater than 0.5A and within METER_IC_POWER_FADEOUT_TIME
  12908. double PlusVal = (HTK_GET_VAL(HTK_IsInTime(ValidCurrTick, METER_IC_POWER_FADEOUT_TIME), HTK_GET_VAL_MAX(EngPlus[i], 0), 0) * 10); //Unit: 0.1 Wh
  12909. #else
  12910. //Energy is calculated only when the current is greater than 0.5A
  12911. double PlusVal = (HTK_GET_VAL(Curr[i] > METER_IC_POWER_CONSUMPTION_MIN_CURR, HTK_GET_VAL_MAX(EngPlus[i], 0), 0) * 10); //Unit: 0.1 Wh
  12912. #endif
  12913. Eng[i] += PlusVal;
  12914. #ifdef DEBUG_METER_IC
  12915. DEBUG_INFO("L%d_WATTHR(Wh): %f\r\n", i + 1, EngPlus[i]);
  12916. DEBUG_INFO("L%d += %f (%f) [%llu, %.4f kWh]\r\n", i + 1, PlusVal, Eng[i],
  12917. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i],
  12918. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i] * 0.0001);
  12919. #endif
  12920. }
  12921. #ifdef DEBUG_METER_IC
  12922. double EngTotal = (Eng[0] + Eng[1] + Eng[2]);
  12923. DEBUG_INFO("#Total Energy = %f [%llu, %.4f kWh]\r\n", EngTotal, Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total,
  12924. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total * 0.0001);
  12925. #endif
  12926. uint32_t EngIntPart[AC_PHASE_NUM_MAX] = { (uint32_t)Eng[0], (uint32_t)Eng[1], (uint32_t)Eng[2] };
  12927. if (EngIntPart[0] != 0 || EngIntPart[1] != 0 || EngIntPart[2] != 0)
  12928. {
  12929. uint32_t IntPart = 0; //Storage INTEGER part and keep the DECIMAL part
  12930. for (uint8_t i = 0; i < AC_PHASE_NUM_MAX; i++)
  12931. {
  12932. IntPart = EngIntPart[i];
  12933. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i] += IntPart;
  12934. Eng[i] -= IntPart;
  12935. #ifdef DEBUG_METER_IC
  12936. DEBUG_INFO("#PowerConsumptionCumulative_L%d = %llu (%d Added)\r\n", i + 1, Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i], IntPart);
  12937. #endif
  12938. }
  12939. if (Charger.m_b3PhaseModel)
  12940. {
  12941. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total =
  12942. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 +
  12943. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 +
  12944. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3;
  12945. }
  12946. else
  12947. {
  12948. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total =
  12949. Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1;
  12950. }
  12951. #ifdef DEBUG_METER_IC
  12952. DEBUG_INFO("#Power_Consumption_Cumulative = %llu\r\n", Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total);
  12953. #endif
  12954. }
  12955. }
  12956. //if(++updateMemReq >= METER_IC_POWER_CONSUMPTION_SAVE_MAX_COUNT)
  12957. if(++(*pUpdateMemReq) >= METER_IC_POWER_CONSUMPTION_SAVE_MAX_COUNT)
  12958. {
  12959. //updateMemReq = 0;
  12960. *pUpdateMemReq = 0;
  12961. static uint64_t PreSaveEnergy = 0;
  12962. if (PreSaveEnergy != Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total)
  12963. {
  12964. PreSaveEnergy = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total;
  12965. #ifdef DEBUG_METER_IC
  12966. DEBUG_INFO("#SAVE POWER CONSUMPTION DATA TO FLASH\r\n");
  12967. #endif
  12968. Charger.memory.EVSE_Config.op_bits.update = ON;
  12969. }
  12970. }
  12971. }
  12972. #endif //FUNC_POWER_CONSUMPTION_BY_METER_IC
  12973. }
  12974. #endif //FUNC_METER_IC_ADE7858A
  12975. }
  12976. void StartMeterIcTask(void const * argument)
  12977. {
  12978. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  12979. IdleUntilReadAllMemory();
  12980. #endif
  12981. #ifdef FUNC_METER_IC_ADE7858A
  12982. while (Charger.ModelReadisOK != PASS )
  12983. {
  12984. osDelay(100);
  12985. }
  12986. MeterIC_InitLoop(METER_IC_INIT_RETRY_NUM_MAX);
  12987. timerEnable(TIMER_IDX_METER_IC_POLLING, METER_IC_TIMER_IDX_METER_POLLING_SPEC);
  12988. #ifdef FUNC_POWER_CONSUMPTION_BY_METER_IC
  12989. timerEnable(TIMER_IDX_POWER, METER_IC_TIMER_IDX_POWER_TIMEOUT_SPEC);
  12990. //uint8_t updateMemReq = 0;
  12991. uint16_t updateMemReq = 0;
  12992. #endif
  12993. #endif //FUNC_METER_IC_ADE7858A
  12994. #ifdef FUNC_TMP100
  12995. if (Charger.m_bUseTMP100)
  12996. {
  12997. TMP100_Init();
  12998. }
  12999. #endif
  13000. while (1)
  13001. {
  13002. #ifdef FUNC_RESET_DATA_AFTER_WRITE_NEW_MODELNAME
  13003. if (Charger.m_bTrigToRefreshMeterIcCaliVal)
  13004. {
  13005. Charger.m_bTrigToRefreshMeterIcCaliVal = HTK_FALSE;
  13006. MeterIC_WriteCaliValsFromFlash(HTK_TRUE, HTK_TRUE);
  13007. osDelay(1);
  13008. }
  13009. #endif
  13010. MeterIC_Proc(&updateMemReq);
  13011. #ifdef FUNC_TMP100
  13012. if (Charger.m_bUseTMP100)
  13013. {
  13014. static u8 c = 0;
  13015. c++;
  13016. if (c >= 10)
  13017. {
  13018. c = 0;
  13019. TMP100_Proc();
  13020. osDelay(10);
  13021. }
  13022. }
  13023. #endif //FUNC_TMP100
  13024. osDelay(1);
  13025. }
  13026. }
  13027. #endif //RECODE_FUNC_METER_IC_TASK
  13028. #ifdef MODIFY_IMCP
  13029. void UpdateCheckSum(uint8_t *Buf, uint16_t Len) //Len: Total package length
  13030. {
  13031. uint16_t DataLen = Len - (IMCP_FM_HEAD_LEN + IMCP_FM_TAIL_LEN);
  13032. uint8_t CheckSum = 0;
  13033. //Update DataLen
  13034. HTK_U16(Buf[IMCP_FM_DATALEN_LSB_IDX]) = DataLen;
  13035. //Update CheckSum
  13036. for (uint16_t i = 0; i < DataLen; i++)
  13037. {
  13038. CheckSum ^= Buf[IMCP_FM_DATA_BEG_IDX + i];
  13039. }
  13040. Buf[Len - 1] = CheckSum;
  13041. }
  13042. #ifdef FUNC_RS485_SLAVE
  13043. uint8_t isValidCheckSum_IAP(uint8_t *RxBuf)
  13044. {
  13045. uint8_t result = OFF;
  13046. uint8_t chksum = 0x00;
  13047. if (
  13048. (RxBuf[IMCP_FM_FRAMEID_IDX] == PROTOCOL_HEAD) &&
  13049. (
  13050. (RxBuf[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR)
  13051. || (RxBuf[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR_AC_MAINBOARD)
  13052. || (RxBuf[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR_BROADCAST)
  13053. )
  13054. )
  13055. {
  13056. uint16_t nCheckSumIdx = IMCP_FM_DATA_BEG_IDX + HTK_U16(RxBuf[IMCP_FM_DATALEN_LSB_IDX]);
  13057. for(uint16_t i = IMCP_FM_DATA_BEG_IDX; i < nCheckSumIdx; i++)
  13058. {
  13059. chksum ^= RxBuf[i];
  13060. }
  13061. if(chksum == RxBuf[nCheckSumIdx])
  13062. result = ON;
  13063. }
  13064. return result;
  13065. }
  13066. #else //FUNC_RS485_SLAVE
  13067. uint8_t isValidCheckSum_IAP(void)
  13068. {
  13069. uint8_t result = OFF;
  13070. uint8_t chksum = 0x00;
  13071. if (
  13072. (UART_IAP_rx_buffer[IMCP_FM_FRAMEID_IDX] == PROTOCOL_HEAD) &&
  13073. (
  13074. (UART_IAP_rx_buffer[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR)
  13075. || (UART_IAP_rx_buffer[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR_BROADCAST)
  13076. )
  13077. )
  13078. {
  13079. uint16_t nCheckSumIdx = IMCP_FM_DATA_BEG_IDX + HTK_U16(UART_IAP_rx_buffer[IMCP_FM_DATALEN_LSB_IDX]);
  13080. for(uint16_t i = IMCP_FM_DATA_BEG_IDX; i < nCheckSumIdx; i++)
  13081. {
  13082. chksum ^= UART_IAP_rx_buffer[i];
  13083. }
  13084. if(chksum == UART_IAP_rx_buffer[nCheckSumIdx])
  13085. result = ON;
  13086. }
  13087. return result;
  13088. }
  13089. #endif //FUNC_RS485_SLAVE
  13090. #else //MODIFY_IMCP
  13091. uint8_t isValidCheckSum_IAP(void)
  13092. {
  13093. uint8_t result = OFF;
  13094. uint8_t chksum = 0x00;
  13095. if((UART_IAP_rx_buffer[0] == PROTOCOL_HEAD) &&
  13096. ((UART_IAP_rx_buffer[2] == PROTOCOL_ADDR) | (UART_IAP_rx_buffer[2] == PROTOCOL_ADDR_BROADCAST)))
  13097. {
  13098. for(int idx=0;idx<(UART_IAP_rx_buffer[4] | (UART_IAP_rx_buffer[5]<<8));idx++)
  13099. {
  13100. chksum ^= UART_IAP_rx_buffer[6+ idx];
  13101. }
  13102. if(chksum == UART_IAP_rx_buffer[6+(UART_IAP_rx_buffer[4] | (UART_IAP_rx_buffer[5]<<8))])
  13103. result = ON;
  13104. }
  13105. return result;
  13106. }
  13107. #endif //MODIFY_IMCP
  13108. //-------------------------------------------------------------------------------------------------
  13109. uint8_t isValidCheckSum_BLE(void)
  13110. {
  13111. uint8_t result = OFF;
  13112. uint8_t chksum = 0x00;
  13113. if(((UART_BLE_rx_buffer[1] | (UART_BLE_rx_buffer[0]<<8))-1) < UART_BUFFER_SIZE)
  13114. {
  13115. for(int idx=2;idx<((UART_BLE_rx_buffer[1] | (UART_BLE_rx_buffer[0]<<8))-1);idx++)
  13116. {
  13117. chksum ^= UART_BLE_rx_buffer[idx];
  13118. }
  13119. if(chksum == UART_BLE_rx_buffer[(UART_BLE_rx_buffer[1] | (UART_BLE_rx_buffer[0]<<8))-1])
  13120. result = ON;
  13121. }
  13122. return result;
  13123. }
  13124. //-------------------------------------------------------------------------------------------------
  13125. uint8_t isValidCheckSum_WIFI(void)
  13126. {
  13127. uint8_t result = OFF;
  13128. uint8_t chksum = 0x00;
  13129. if(((UART_WIFI_rx_buffer[1] | (UART_WIFI_rx_buffer[0]<<8))-1) < UART_BUFFER_SIZE)
  13130. {
  13131. for(int idx=2;idx<((UART_WIFI_rx_buffer[1] | (UART_WIFI_rx_buffer[0]<<8))-1);idx++)
  13132. {
  13133. chksum ^= UART_WIFI_rx_buffer[idx];
  13134. }
  13135. if(chksum == UART_WIFI_rx_buffer[(UART_WIFI_rx_buffer[1] | (UART_WIFI_rx_buffer[0]<<8))-1])
  13136. result = ON;
  13137. }
  13138. return result;
  13139. }
  13140. //-------------------------------------------------------------------------------------------------
  13141. #ifdef FUNC_DEBUG_MSG_SET_CHARGER_MODE
  13142. char* getModeName(uint8_t mode);
  13143. #endif
  13144. void setChargerMode(uint8_t mode)
  13145. {
  13146. #ifdef FUNC_DEBUG_MSG_SET_CHARGER_MODE
  13147. XP("#SET CHARGER MODE: [%s] >>> [%s]\r\n", getModeName(Charger.Mode_Previous), getModeName(mode));
  13148. #endif
  13149. Charger.Mode_Previous = Charger.Mode;
  13150. Charger.Mode = mode;
  13151. }
  13152. //-------------------------------------------------------------------------------------------------
  13153. char* getModeName(uint8_t mode)
  13154. {
  13155. switch(mode)
  13156. {
  13157. case MODE_INITIAL:
  13158. return "INITIAL";
  13159. case MODE_IDLE:
  13160. return "IDLE";
  13161. case MODE_HANDSHAKE:
  13162. return "HANDSHAKING";
  13163. case MODE_CHARGING:
  13164. return "CHARGING";
  13165. case MODE_STOP:
  13166. return "STOP";
  13167. case MODE_ALARM:
  13168. return "ALARM";
  13169. case MODE_MAINTAIN:
  13170. return "MAINTAIN";
  13171. case MODE_DEBUG:
  13172. return "DEBUG";
  13173. default:
  13174. return "UNKNOW";
  13175. }
  13176. }
  13177. //-------------------------------------------------------------------------------------------------
  13178. uint8_t isModeChange(void)
  13179. {
  13180. uint8_t result = NO;
  13181. if(!isMode(Charger.Mode_Previous))
  13182. {
  13183. DEBUG_INFO("#MODE from %s to %s\r\n", getModeName(Charger.Mode_Previous), getModeName(Charger.Mode));
  13184. result |= YES;
  13185. if(Charger.Mode == MODE_ALARM)
  13186. {
  13187. Charger.Mode_Before_Alarm = Charger.Mode_Previous;
  13188. }
  13189. Charger.Mode_Previous = Charger.Mode;
  13190. }
  13191. return result;
  13192. }
  13193. //-------------------------------------------------------------------------------------------------
  13194. uint8_t isMode(uint8_t mode)
  13195. {
  13196. return ((Charger.Mode == mode)? YES : NO);
  13197. }
  13198. //-------------------------------------------------------------------------------------------------
  13199. uint8_t rfidCheckSumCal(uint8_t *data, uint8_t length)
  13200. {
  13201. uint8_t result= 0x00;
  13202. for(uint8_t idx=0;idx<length;idx++)
  13203. result ^= data[idx];
  13204. return result;
  13205. }
  13206. //-------------------------------------------------------------------------------------------------
  13207. void HAL_PWR_PVDCallback(void)
  13208. {
  13209. HAL_Delay(100);
  13210. NVIC_SystemReset();
  13211. }
  13212. //-------------------------------------------------------------------------------------------------
  13213. uint8_t Test_LeakModule(void)
  13214. {
  13215. // uint8_t result = PASS, DC_check = false, AC_check=false;
  13216. // uint16_t time_out_count;
  13217. // uint8_t retry_cnt = 0 ;
  13218. uint8_t result = PASS;
  13219. #ifdef CCID_PROTECT
  13220. uint8_t DC_check = false;
  13221. uint8_t AC_check=false;
  13222. uint16_t time_out_count;
  13223. uint8_t retry_cnt = 0 ;
  13224. #ifdef FUNC_AUTO_MODIFY_CCID_MODULE
  13225. XP("#Test_LeakModule use CCID Module: %s\r\n", CCID_MODULE_TYPE_STR);
  13226. #endif
  13227. if (Charger.CCID_Module_Type == CCID_MODULE_VAC)
  13228. {
  13229. osDelay(500);
  13230. if(HAL_GPIO_ReadPin(IN_Leak_Error_GPIO_Port, IN_Leak_Error_Pin) == GPIO_PIN_SET)
  13231. {
  13232. DEBUG_INFO("VAC Leak Error pin ON.\r\n");
  13233. result = FAIL;
  13234. }
  13235. else
  13236. {
  13237. HAL_Delay(270);
  13238. HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port , OUT_Leak_Test_Pin , GPIO_PIN_RESET);
  13239. HAL_Delay(50); //40ms~1.2sec
  13240. HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port , OUT_Leak_Test_Pin , GPIO_PIN_SET);
  13241. //HAL_Delay(40); //36ms
  13242. time_out_count = 0;
  13243. while(1)
  13244. {
  13245. if(HAL_GPIO_ReadPin(IN_Leak_DC_GPIO_Port, IN_Leak_DC_Pin) == GPIO_PIN_SET)
  13246. {
  13247. DC_check = true;
  13248. }
  13249. if(HAL_GPIO_ReadPin(IN_Leak_AC_GPIO_Port, IN_Leak_AC_Pin) == GPIO_PIN_SET)
  13250. {
  13251. AC_check = true;
  13252. }
  13253. //if(DC_check&&AC_check)
  13254. if ((DC_check&&AC_check) && (HAL_GPIO_ReadPin(IN_Leak_AC_GPIO_Port, IN_Leak_AC_Pin) == GPIO_PIN_RESET) && (HAL_GPIO_ReadPin(IN_Leak_DC_GPIO_Port, IN_Leak_DC_Pin) == GPIO_PIN_RESET))
  13255. {
  13256. break;
  13257. }
  13258. if(time_out_count>2000)
  13259. {
  13260. //result = FAIL;
  13261. if(retry_cnt < 1 )
  13262. {
  13263. HAL_Delay(270);
  13264. HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port , OUT_Leak_Test_Pin , GPIO_PIN_RESET);
  13265. HAL_Delay(50); //40ms~1.2sec
  13266. HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port , OUT_Leak_Test_Pin , GPIO_PIN_SET);
  13267. //HAL_Delay(40); //36ms
  13268. retry_cnt ++ ;
  13269. time_out_count = 0 ;
  13270. }
  13271. else
  13272. {
  13273. DEBUG_INFO("Leak module self test Fail in timeout.\r\n");
  13274. result = FAIL;
  13275. break;
  13276. }
  13277. }
  13278. else
  13279. {
  13280. time_out_count++;
  13281. HAL_Delay(1);
  13282. }
  13283. }
  13284. }
  13285. }
  13286. else // Charger.CCID_Module_Type is CCID_MODULE_CORMEX
  13287. {
  13288. SPWM_Switch(ON);
  13289. HAL_Delay(1000);
  13290. XP("#[SPWM] adc_value.ADC2_IN6_GF.value = %d\r\n",adc_value.ADC2_IN6_GF.value);
  13291. if ((adc_value.ADC2_IN6_GF.value<3000)&&(adc_value.ADC2_IN6_GF.value>2000)) //25mA
  13292. {
  13293. DEBUG_INFO("#Test_LeakModule(): OK\r\n");
  13294. result = PASS ;
  13295. }
  13296. else
  13297. {
  13298. DEBUG_INFO("Test_LeakModule(): [NG]\r\n");
  13299. //DEBUG_INFO("adc_value.ADC2_IN6_GF.value = %d\n\r",adc_value.ADC2_IN6_GF.value);
  13300. result = FAIL;
  13301. }
  13302. SPWM_Switch(OFF);
  13303. }
  13304. #endif //CCID_PROTECT
  13305. return result;
  13306. }
  13307. //-------------------------------------------------------------------------------------------------
  13308. uint8_t Valid_RFID_SN(void)
  13309. {
  13310. /*
  13311. TODO: Validation logic check
  13312. */
  13313. uint8_t result = FAIL;
  13314. uint32_t crc_result;
  13315. uint8_t sn_len;
  13316. uint8_t *buf;
  13317. if(Charger.rfid.snType == RFID_SN_TYPE_4BYTE)
  13318. {
  13319. // SN length: 4
  13320. sn_len = 4;
  13321. }
  13322. else if(Charger.rfid.snType == RFID_SN_TYPE_7BYTE)
  13323. {
  13324. // SN length: 7
  13325. sn_len = 7;
  13326. }
  13327. else
  13328. {
  13329. // SN length: 10
  13330. sn_len = 10;
  13331. }
  13332. buf = malloc(25 + sn_len);
  13333. memcpy(buf, Charger.memory.EVSE_Config.data.item.System_ID, 25);
  13334. memcpy(&buf[25], Charger.rfid.data_Sn, sn_len);
  13335. crc_result = crc32(buf, 25 + sn_len);
  13336. if(((Charger.rfid.data_Block[0] << 8) | (Charger.rfid.data_Block[1] << 0) | (Charger.rfid.data_Block[2] << 24) | (Charger.rfid.data_Block[3] << 16)) == ~crc_result)
  13337. {
  13338. result = PASS;
  13339. }
  13340. free(buf);
  13341. return result;
  13342. }
  13343. //-------------------------------------------------------------------------------------------------
  13344. void recordAlarmHis(void)
  13345. {
  13346. uint8_t isSuccess = FAIL;
  13347. // Check record alarm request, if alarm code bit different with previous
  13348. for(uint8_t errIdx=0;errIdx<32;errIdx++)
  13349. {
  13350. if(((Charger.Alarm_Code>>errIdx)&0x01) != ((Charger.Alarm_Code_Previous>>errIdx)&0x01))
  13351. {
  13352. // Find empty memory space
  13353. for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>4);idx++)
  13354. {
  13355. if((Charger.memory.hisAlarm.data.item[idx].alarmCode == 0xffffffff) &&
  13356. (Charger.memory.hisAlarm.data.item[idx].mode == 0xff))
  13357. {
  13358. isSuccess = PASS;
  13359. Charger.memory.hisAlarm.data.item[idx].DateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year;
  13360. Charger.memory.hisAlarm.data.item[idx].DateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month;
  13361. Charger.memory.hisAlarm.data.item[idx].DateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day;
  13362. Charger.memory.hisAlarm.data.item[idx].DateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour;
  13363. Charger.memory.hisAlarm.data.item[idx].DateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min;
  13364. Charger.memory.hisAlarm.data.item[idx].DateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec;
  13365. Charger.memory.hisAlarm.data.item[idx].mode = Charger.Mode;
  13366. if((Charger.Alarm_Code>>errIdx)&0x01)
  13367. {
  13368. // Record alarm occur
  13369. Charger.memory.hisAlarm.data.item[idx].alarmCode = alarm_record_code[errIdx];
  13370. Charger.memory.hisAlarm.data.item[idx].isRecover = OFF;
  13371. Charger.Alarm_Code_Previous |= (0x00000001<<errIdx);
  13372. }
  13373. else
  13374. {
  13375. // Record alarm recover
  13376. Charger.memory.hisAlarm.data.item[idx].alarmCode = alarm_record_code[errIdx];
  13377. Charger.memory.hisAlarm.data.item[idx].isRecover = ON;
  13378. Charger.Alarm_Code_Previous &= ~(0x00000001<<errIdx);
  13379. }
  13380. Charger.memory.hisAlarm.op_bits.update = ON;
  13381. // If speace is last item, move data to backup area
  13382. if(idx == ((W25Q16FV_BLOCK_SIZE>>4)-1))
  13383. {
  13384. osDelay(500);
  13385. Charger.memory.hisAlarm.op_bits.backup = ON;
  13386. osDelay(500);
  13387. }
  13388. break;
  13389. }
  13390. }
  13391. // If there is not any free space
  13392. if(!isSuccess)
  13393. {
  13394. osDelay(500);
  13395. Charger.memory.hisAlarm.op_bits.backup = ON;
  13396. osDelay(500);
  13397. }
  13398. }
  13399. }
  13400. }
  13401. //-------------------------------------------------------------------------------------------------
  13402. #ifdef FUNC_METER_IC_HISTORY
  13403. uint8_t recordMeterICHis(MeterIC_CaliValType Type, int32_t Val)
  13404. {
  13405. uint8_t isSuccess = FAIL;
  13406. {
  13407. for(uint16_t idx=0;idx<METER_IC_HISTORY_REC_NUM;idx++)
  13408. {
  13409. if (!MeterIC_CaliHistory_IsRecordValid(idx))
  13410. {
  13411. isSuccess = PASS;
  13412. memcpy(&Charger.memory.hisMeterIC.data.item[idx].DateTime, &Charger.memory.EVSE_Config.data.item.SystemDateTime, sizeof(DT));
  13413. Charger.memory.hisMeterIC.data.item[idx].m_CaliValType = Type;
  13414. Charger.memory.hisMeterIC.data.item[idx].m_CaliVal = Val;
  13415. Charger.memory.hisMeterIC.data.item[idx].m_Reserved[0] = 0xFF;
  13416. Charger.memory.hisMeterIC.data.item[idx].m_Reserved[1] = 0xFF;
  13417. //Update CheckSum
  13418. HTK_CheckSum_Update(
  13419. (uint8_t*)&Charger.memory.hisMeterIC.data.item[idx],
  13420. (uint8_t*)&Charger.memory.hisMeterIC.data.item[idx].m_CheckSum -
  13421. (uint8_t*)&Charger.memory.hisMeterIC.data.item[idx].DateTime.year,
  13422. (uint8_t*)&Charger.memory.hisMeterIC.data.item[idx].m_CheckSum);
  13423. Charger.memory.hisMeterIC.op_bits.update = ON;
  13424. // If speace is last item, move data to backup area
  13425. if(idx == (METER_IC_HISTORY_REC_NUM-1))
  13426. {
  13427. osDelay(500);
  13428. Charger.memory.hisMeterIC.op_bits.backup = ON;
  13429. }
  13430. break;
  13431. }
  13432. }
  13433. }
  13434. // If there is not any free space
  13435. if(!isSuccess)
  13436. {
  13437. osDelay(500);
  13438. Charger.memory.hisMeterIC.op_bits.backup = ON;
  13439. }
  13440. return isSuccess;
  13441. }
  13442. #else //FUNC_METER_IC_HISTORY
  13443. uint8_t recordChargingHis(uint8_t isColdLoadPickUp, uint32_t statusCode)
  13444. {
  13445. uint8_t isSuccess = FAIL;
  13446. if(isColdLoadPickUp)
  13447. {
  13448. for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>6);idx++)
  13449. {
  13450. if((Charger.memory.hisCharging.data.item[idx].Duration == 0xffffffff) &&
  13451. (Charger.memory.hisCharging.data.item[idx].powerSum == 0xffff) &&
  13452. (Charger.memory.hisCharging.data.item[idx].stopStatusCode == 0xffffffff) )
  13453. {
  13454. isSuccess = PASS;
  13455. Charger.memory.hisCharging.data.item[idx].DateTime.year = Charger.memory.coldLoadPickUp.data.item.DateTime.year;
  13456. Charger.memory.hisCharging.data.item[idx].DateTime.month = Charger.memory.coldLoadPickUp.data.item.DateTime.month;
  13457. Charger.memory.hisCharging.data.item[idx].DateTime.day = Charger.memory.coldLoadPickUp.data.item.DateTime.day;
  13458. Charger.memory.hisCharging.data.item[idx].DateTime.hour = Charger.memory.coldLoadPickUp.data.item.DateTime.hour;
  13459. Charger.memory.hisCharging.data.item[idx].DateTime.min = Charger.memory.coldLoadPickUp.data.item.DateTime.min;
  13460. Charger.memory.hisCharging.data.item[idx].DateTime.sec = Charger.memory.coldLoadPickUp.data.item.DateTime.sec;
  13461. Charger.memory.hisCharging.data.item[idx].Duration = Charger.memory.coldLoadPickUp.data.item.Duration;
  13462. sprintf(Charger.memory.hisCharging.data.item[idx].PlugType, EVSE_CONNECTOR_TYPE);
  13463. Charger.memory.hisCharging.data.item[idx].powerSum = Charger.memory.coldLoadPickUp.data.item.powerSum;
  13464. Charger.memory.hisCharging.data.item[idx].startType = Charger.memory.coldLoadPickUp.data.item.startType;
  13465. Charger.memory.hisCharging.data.item[idx].stopStatusCode = statusCode;
  13466. memcpy(Charger.memory.hisCharging.data.item[idx].user, Charger.rfid.currentCard, 16);
  13467. Charger.memory.hisCharging.op_bits.update = ON;
  13468. // If speace is last item, move data to backup area
  13469. //if(idx == ((W25Q16FV_BLOCK_SIZE>>4)-1)) //NG
  13470. if(idx == ((W25Q16FV_BLOCK_SIZE>>6)-1))
  13471. {
  13472. osDelay(500);
  13473. Charger.memory.hisCharging.op_bits.backup = ON;
  13474. }
  13475. break;
  13476. }
  13477. }
  13478. }
  13479. else
  13480. {
  13481. for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>6);idx++)
  13482. {
  13483. if((Charger.memory.hisCharging.data.item[idx].Duration == 0xffffffff) &&
  13484. (Charger.memory.hisCharging.data.item[idx].powerSum == 0xffff) &&
  13485. (Charger.memory.hisCharging.data.item[idx].stopStatusCode == 0xffffffff) )
  13486. {
  13487. isSuccess = PASS;
  13488. Charger.memory.hisCharging.data.item[idx].DateTime.year = Charger.cycle_info.startDateTime.year;
  13489. Charger.memory.hisCharging.data.item[idx].DateTime.month = Charger.cycle_info.startDateTime.month;
  13490. Charger.memory.hisCharging.data.item[idx].DateTime.day = Charger.cycle_info.startDateTime.day;
  13491. Charger.memory.hisCharging.data.item[idx].DateTime.hour = Charger.cycle_info.startDateTime.hour;
  13492. Charger.memory.hisCharging.data.item[idx].DateTime.min = Charger.cycle_info.startDateTime.min;
  13493. Charger.memory.hisCharging.data.item[idx].DateTime.sec = Charger.cycle_info.startDateTime.sec;
  13494. Charger.memory.hisCharging.data.item[idx].Duration = Charger.cycle_info.Duration;
  13495. sprintf(Charger.memory.hisCharging.data.item[idx].PlugType, EVSE_CONNECTOR_TYPE);
  13496. Charger.memory.hisCharging.data.item[idx].powerSum = Charger.cycle_info.Power_Consumption;
  13497. Charger.memory.hisCharging.data.item[idx].startType = Charger.cycle_info.StartType;
  13498. Charger.memory.hisCharging.data.item[idx].stopStatusCode = statusCode;
  13499. memcpy(Charger.memory.hisCharging.data.item[idx].user, Charger.rfid.currentCard, 16);
  13500. Charger.memory.hisCharging.op_bits.update = ON;
  13501. // If speace is last item, move data to backup area
  13502. //if(idx == ((W25Q16FV_BLOCK_SIZE>>4)-1)) //NG
  13503. if(idx == ((W25Q16FV_BLOCK_SIZE>>6)-1))
  13504. {
  13505. osDelay(500);
  13506. Charger.memory.hisCharging.op_bits.backup = ON;
  13507. }
  13508. break;
  13509. }
  13510. }
  13511. }
  13512. // If there is not any free space
  13513. if(!isSuccess)
  13514. {
  13515. osDelay(500);
  13516. Charger.memory.hisCharging.op_bits.backup = ON;
  13517. }
  13518. return isSuccess;
  13519. }
  13520. #endif //FUNC_METER_IC_HISTORY
  13521. //-------------------------------------------------------------------------------------------------
  13522. void setLedMotion(uint8_t action)
  13523. {//ssetled
  13524. //standard
  13525. #ifdef TEST_FOR_ENERGY_STAR
  13526. if (action == LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP ||
  13527. action == LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP
  13528. )
  13529. {
  13530. #ifdef FUNC_AW48_NO_SLEEP_MODE_LED
  13531. if (Charger.m_bModelNameAW48_1P)
  13532. {
  13533. Charger.m_bLedSleepModeForceMinBrightness = 0;
  13534. }
  13535. else
  13536. {
  13537. Charger.m_bLedSleepModeForceMinBrightness = 1;
  13538. }
  13539. #else
  13540. Charger.m_bLedSleepModeForceMinBrightness = 1;
  13541. #endif
  13542. }
  13543. else
  13544. {
  13545. Charger.m_bLedSleepModeForceMinBrightness = 0;
  13546. }
  13547. #endif
  13548. switch(action)
  13549. {
  13550. case LED_ACTION_INIT:
  13551. Charger.led_R.motion = LED_MOTION_ON;
  13552. Charger.led_G.motion = LED_MOTION_ON;
  13553. Charger.led_B.motion = LED_MOTION_ON;
  13554. Charger.led_W.motion = LED_MOTION_OFF;
  13555. LedOnRGBSet(1000, 1000, 1000, 0);
  13556. break;
  13557. case LED_ACTION_IDLE:
  13558. Charger.led_R.motion = LED_MOTION_OFF;
  13559. Charger.led_G.motion = LED_MOTION_ON;
  13560. Charger.led_B.motion = LED_MOTION_OFF;
  13561. Charger.led_W.motion = LED_MOTION_OFF;
  13562. LedOnRGBSet(0, 1000, 0, 0);
  13563. break;
  13564. #ifdef MODIFY_LED_STATUS_202108
  13565. case LED_ACTION_IDLE_BACKEND_CONNECTED:
  13566. Charger.led_R.motion = LED_MOTION_OFF;
  13567. Charger.led_G.motion = LED_MOTION_ON;
  13568. Charger.led_B.motion = LED_MOTION_OFF;
  13569. Charger.led_W.motion = LED_MOTION_OFF;
  13570. LedOnRGBSet(0, 1000, 0, 0);
  13571. break;
  13572. case LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP:
  13573. #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13574. if (Charger.m_bModelNameAW48_1P)
  13575. {
  13576. Charger.led_R.motion = LED_MOTION_OFF;
  13577. Charger.led_G.motion = LED_MOTION_ON;
  13578. Charger.led_B.motion = LED_MOTION_OFF;
  13579. Charger.led_W.motion = LED_MOTION_OFF;
  13580. LedOnRGBSet(0, 1000, 0, 0);
  13581. }
  13582. else
  13583. {
  13584. Charger.led_R.motion = LED_MOTION_OFF;
  13585. Charger.led_G.motion = LED_MOTION_BREATHE;
  13586. Charger.led_B.motion = LED_MOTION_OFF;
  13587. Charger.led_W.motion = LED_MOTION_OFF;
  13588. LedOnRGBSet(0, 1000, 0, 0);
  13589. #ifdef MODIFY_BREATHE_LED
  13590. breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, 0, 1000, 0, 0 );
  13591. #endif
  13592. }
  13593. #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13594. Charger.led_R.motion = LED_MOTION_OFF;
  13595. Charger.led_G.motion = LED_MOTION_BREATHE;
  13596. Charger.led_B.motion = LED_MOTION_OFF;
  13597. Charger.led_W.motion = LED_MOTION_OFF;
  13598. LedOnRGBSet(0, 1000, 0, 0);
  13599. #ifdef MODIFY_BREATHE_LED
  13600. breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, 0, 1000, 0, 0 );
  13601. #endif
  13602. #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13603. break;
  13604. case LED_ACTION_IDLE_BACKEND_DISCONNECTED:
  13605. #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13606. if (Charger.m_bModelNameAW48_1P)
  13607. {
  13608. Charger.led_R.motion = LED_MOTION_OFF;
  13609. Charger.led_G.motion = LED_MOTION_ON;
  13610. Charger.led_B.motion = LED_MOTION_OFF;
  13611. Charger.led_W.motion = LED_MOTION_OFF;
  13612. LedOnRGBSet(0, 1000, 0, 0);
  13613. }
  13614. else
  13615. {
  13616. Charger.led_R.motion = LED_MOTION_ON;
  13617. Charger.led_G.motion = LED_MOTION_ON;
  13618. Charger.led_B.motion = LED_MOTION_OFF;
  13619. Charger.led_W.motion = LED_MOTION_OFF;
  13620. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13621. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13622. #else
  13623. LedOnRGBSet(1000, 1000, 0, 0);
  13624. #endif
  13625. }
  13626. #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13627. Charger.led_R.motion = LED_MOTION_ON;
  13628. Charger.led_G.motion = LED_MOTION_ON;
  13629. Charger.led_B.motion = LED_MOTION_OFF;
  13630. Charger.led_W.motion = LED_MOTION_OFF;
  13631. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13632. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13633. #else
  13634. LedOnRGBSet(1000, 1000, 0, 0);
  13635. #endif
  13636. #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13637. break;
  13638. case LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP:
  13639. #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13640. if (Charger.m_bModelNameAW48_1P)
  13641. {
  13642. Charger.led_R.motion = LED_MOTION_OFF;
  13643. Charger.led_G.motion = LED_MOTION_ON;
  13644. Charger.led_B.motion = LED_MOTION_OFF;
  13645. Charger.led_W.motion = LED_MOTION_OFF;
  13646. LedOnRGBSet(0, 1000, 0, 0);
  13647. }
  13648. else
  13649. {
  13650. Charger.led_R.motion = LED_MOTION_BREATHE;
  13651. Charger.led_G.motion = LED_MOTION_BREATHE;
  13652. Charger.led_B.motion = LED_MOTION_OFF;
  13653. Charger.led_W.motion = LED_MOTION_OFF;
  13654. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13655. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13656. #ifdef MODIFY_BREATHE_LED
  13657. breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0 );
  13658. #endif
  13659. #else //MODIFY_LED_YELLOW_PARAMETER
  13660. LedOnRGBSet(1000, 1000, 0, 0);
  13661. #endif //MODIFY_LED_YELLOW_PARAMETER
  13662. }
  13663. #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13664. Charger.led_R.motion = LED_MOTION_BREATHE;
  13665. Charger.led_G.motion = LED_MOTION_BREATHE;
  13666. Charger.led_B.motion = LED_MOTION_OFF;
  13667. Charger.led_W.motion = LED_MOTION_OFF;
  13668. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13669. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13670. #ifdef MODIFY_BREATHE_LED
  13671. breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0 );
  13672. #endif
  13673. #else //MODIFY_LED_YELLOW_PARAMETER
  13674. LedOnRGBSet(1000, 1000, 0, 0);
  13675. #endif //MODIFY_LED_YELLOW_PARAMETER
  13676. #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13677. break;
  13678. case LED_ACTION_RESERVATION_MODE:
  13679. Charger.led_R.motion = LED_MOTION_OFF;
  13680. Charger.led_G.motion = LED_MOTION_BLINK;
  13681. Charger.led_B.motion = LED_MOTION_OFF;
  13682. Charger.led_W.motion = LED_MOTION_OFF;
  13683. LedOnRGBSet(0, 1000, 0, 0);
  13684. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13685. break;
  13686. #endif //MODIFY_LED_STATUS_202108
  13687. case LED_ACTION_AUTHED:
  13688. Charger.led_R.motion = LED_MOTION_OFF;
  13689. Charger.led_G.motion = LED_MOTION_OFF;
  13690. Charger.led_B.motion = LED_MOTION_ON;
  13691. Charger.led_W.motion = LED_MOTION_OFF;
  13692. LedOnRGBSet(0, 0, 1000, 0);
  13693. break;
  13694. case LED_ACTION_CONNECTED:
  13695. Charger.led_R.motion = LED_MOTION_OFF;
  13696. Charger.led_G.motion = LED_MOTION_OFF;
  13697. Charger.led_B.motion = LED_MOTION_ON;
  13698. Charger.led_W.motion = LED_MOTION_OFF;
  13699. LedOnRGBSet(0, 0, 1000, 0);
  13700. break;
  13701. case LED_ACTION_CHARGING:
  13702. Charger.led_R.motion = LED_MOTION_OFF;
  13703. Charger.led_G.motion = LED_MOTION_OFF;
  13704. Charger.led_B.motion = LED_MOTION_BLINK;
  13705. Charger.led_W.motion = LED_MOTION_OFF;
  13706. LedOnRGBSet(0, 0, 1000, 0);
  13707. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13708. break;
  13709. case LED_ACTION_STOP:
  13710. #ifdef FUNC_MODIFY_AW48_LED_ACTION_TERMINATED_COMPLETE
  13711. if (Charger.m_bModelNameAW48_1P)
  13712. {
  13713. Charger.led_R.motion = LED_MOTION_OFF;
  13714. Charger.led_G.motion = LED_MOTION_BLINK;
  13715. Charger.led_B.motion = LED_MOTION_OFF;
  13716. Charger.led_W.motion = LED_MOTION_OFF;
  13717. LedOnRGBSet(0, 1000, 0, 0);
  13718. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13719. }
  13720. else
  13721. {
  13722. Charger.led_R.motion = LED_MOTION_OFF;
  13723. Charger.led_G.motion = LED_MOTION_OFF;
  13724. Charger.led_B.motion = LED_MOTION_ON;
  13725. Charger.led_W.motion = LED_MOTION_OFF;
  13726. LedOnRGBSet(0, 0, 1000, 0);
  13727. }
  13728. #else
  13729. Charger.led_R.motion = LED_MOTION_OFF;
  13730. Charger.led_G.motion = LED_MOTION_OFF;
  13731. Charger.led_B.motion = LED_MOTION_ON;
  13732. Charger.led_W.motion = LED_MOTION_OFF;
  13733. LedOnRGBSet(0, 0, 1000, 0);
  13734. #endif
  13735. break;
  13736. case LED_ACTION_ALARM:
  13737. Charger.led_R.motion = LED_MOTION_BLINK;
  13738. Charger.led_G.motion = LED_MOTION_OFF;
  13739. Charger.led_B.motion = LED_MOTION_OFF;
  13740. Charger.led_W.motion = LED_MOTION_OFF;
  13741. LedOnRGBSet(1000, 0, 0, 0);
  13742. //set alarm led blink duty
  13743. if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
  13744. Charger.Alarm_LED = Charger.Alarm_Code;
  13745. }else{
  13746. Charger.Alarm_LED = Charger.am3352.LedAlarmState;
  13747. }
  13748. if(Charger.Alarm_LED & ALARM_CP_ERROR)
  13749. blinkerTimeSet(BLINKER_IDX_LED, 500 , 500, 0, 1);
  13750. if((Charger.Alarm_LED & ALARM_L1_OVER_VOLTAGE) || (Charger.Alarm_LED & ALARM_L2_OVER_VOLTAGE) || (Charger.Alarm_LED & ALARM_L3_OVER_VOLTAGE))
  13751. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 1);
  13752. if((Charger.Alarm_LED & ALARM_L1_UNDER_VOLTAGE) || (Charger.Alarm_LED & ALARM_L2_UNDER_VOLTAGE) || (Charger.Alarm_LED & ALARM_L3_UNDER_VOLTAGE))
  13753. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 2);
  13754. if((Charger.Alarm_LED & ALARM_L1_OVER_CURRENT) || (Charger.Alarm_LED & ALARM_L2_OVER_CURRENT) || (Charger.Alarm_LED & ALARM_L3_OVER_CURRENT))
  13755. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 3);
  13756. if(Charger.Alarm_LED & ALARM_OVER_TEMPERATURE)
  13757. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 4);
  13758. if(Charger.Alarm_LED & ALARM_CURRENT_LEAK_AC)
  13759. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 5);
  13760. if(Charger.Alarm_LED & ALARM_CURRENT_LEAK_DC)
  13761. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 5);
  13762. if(Charger.Alarm_LED & ALARM_GROUND_FAIL)
  13763. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 6);
  13764. if(Charger.Alarm_LED & ALARM_HANDSHAKE_TIMEOUT)
  13765. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13766. if(Charger.Alarm_LED & ALARM_EMERGENCY_STOP)
  13767. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 7);
  13768. if(Charger.Alarm_LED & ALARM_ROTATORY_SWITCH_FAULT)
  13769. {
  13770. #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS
  13771. if (Charger.m_bModelNameAW48_1P)
  13772. {
  13773. blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1);
  13774. }
  13775. else
  13776. {
  13777. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  13778. }
  13779. #else
  13780. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  13781. #endif
  13782. }
  13783. if(Charger.Alarm_LED & ALARM_METER_TIMEOUT)
  13784. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  13785. #ifdef MODIFY_LED_ALARM_LATCH
  13786. //self test error
  13787. if ((Charger.Alarm_Code & ALARM_MCU_TESTFAIL) ||
  13788. (Charger.Alarm_Code & ALARM_RELAY_STATUS) ||
  13789. (Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT ) ||
  13790. (Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL))
  13791. {
  13792. Charger.led_R.motion = LED_MOTION_ON;
  13793. Charger.led_G.motion = LED_MOTION_OFF;
  13794. Charger.led_B.motion = LED_MOTION_OFF;
  13795. Charger.led_W.motion = LED_MOTION_OFF;
  13796. LedOnRGBSet(1000, 0, 0, 0);
  13797. }
  13798. #else //MODIFY_LED_ALARM_LATCH
  13799. //OCP Latch
  13800. if ((Charger.counter.L1_OC.isLatch == ON) || (Charger.counter.L2_OC.isLatch == ON) || (Charger.counter.L3_OC.isLatch == ON))
  13801. {
  13802. Charger.led_R.motion = LED_MOTION_ON ;
  13803. Charger.led_B.motion = LED_MOTION_ON ;
  13804. LedOnRGBSet(1000, 0, 1000, 0);
  13805. }
  13806. //CCID Latch
  13807. if (Charger.counter.LEAK.isLatch == ON)
  13808. {
  13809. Charger.led_R.motion = LED_MOTION_ON ;
  13810. Charger.led_G.motion = LED_MOTION_ON ;
  13811. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13812. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13813. #else
  13814. LedOnRGBSet(1000, 1000, 0, 0);
  13815. #endif
  13816. }
  13817. //OTP
  13818. if (Charger.counter.OT.isLatch == ON)
  13819. {
  13820. Charger.led_R.motion = LED_MOTION_ON;
  13821. Charger.led_G.motion = LED_MOTION_BLINK;
  13822. Charger.led_B.motion = LED_MOTION_BLINK;
  13823. Charger.led_W.motion = LED_MOTION_OFF;
  13824. LedOnRGBSet(1000, 1000, 1000, 0);
  13825. blinkerTimeSet(BLINKER_IDX_LED, 500 , 500, 0, 1);
  13826. }
  13827. //self test error
  13828. if ((Charger.Alarm_Code & ALARM_MCU_TESTFAIL) ||
  13829. (Charger.Alarm_Code & ALARM_RELAY_STATUS) ||
  13830. (Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT ) ||
  13831. (Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL))
  13832. {
  13833. Charger.led_R.motion = LED_MOTION_ON;
  13834. Charger.led_G.motion = LED_MOTION_OFF;
  13835. Charger.led_B.motion = LED_MOTION_OFF;
  13836. Charger.led_W.motion = LED_MOTION_OFF;
  13837. LedOnRGBSet(1000, 0, 0, 0);
  13838. }
  13839. #endif //MODIFY_LED_ALARM_LATCH
  13840. break;
  13841. case LED_ACTION_MAINTAIN:
  13842. #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13843. if (Charger.m_bModelNameAW48_1P)
  13844. {
  13845. Charger.led_R.motion = LED_MOTION_OFF;
  13846. Charger.led_G.motion = LED_MOTION_BLINK;
  13847. Charger.led_B.motion = LED_MOTION_OFF;
  13848. Charger.led_W.motion = LED_MOTION_OFF;
  13849. LedOnRGBSet(0, 1000, 0, 0);
  13850. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13851. }
  13852. else
  13853. {
  13854. #ifdef MODIFY_LED_STATUS_202108
  13855. //Yellow blink
  13856. Charger.led_R.motion = LED_MOTION_BLINK;
  13857. Charger.led_G.motion = LED_MOTION_BLINK;
  13858. Charger.led_B.motion = LED_MOTION_OFF;
  13859. Charger.led_W.motion = LED_MOTION_OFF;
  13860. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13861. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13862. #else
  13863. LedOnRGBSet(1000, 1000, 0, 0);
  13864. #endif
  13865. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13866. #else
  13867. Charger.led_R.motion = LED_MOTION_OFF;
  13868. Charger.led_G.motion = LED_MOTION_BLINK;
  13869. Charger.led_B.motion = LED_MOTION_OFF;
  13870. Charger.led_W.motion = LED_MOTION_OFF;
  13871. LedOnRGBSet(0, 1000, 0, 0);
  13872. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13873. #endif
  13874. }
  13875. #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13876. #ifdef MODIFY_LED_STATUS_202108
  13877. //Yellow blink
  13878. Charger.led_R.motion = LED_MOTION_BLINK;
  13879. Charger.led_G.motion = LED_MOTION_BLINK;
  13880. Charger.led_B.motion = LED_MOTION_OFF;
  13881. Charger.led_W.motion = LED_MOTION_OFF;
  13882. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13883. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13884. #else
  13885. LedOnRGBSet(1000, 1000, 0, 0);
  13886. #endif
  13887. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13888. #else
  13889. Charger.led_R.motion = LED_MOTION_OFF;
  13890. Charger.led_G.motion = LED_MOTION_BLINK;
  13891. Charger.led_B.motion = LED_MOTION_OFF;
  13892. Charger.led_W.motion = LED_MOTION_OFF;
  13893. LedOnRGBSet(0, 1000, 0, 0);
  13894. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13895. #endif
  13896. #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13897. break;
  13898. case LED_ACTION_RFID_PASS:
  13899. Charger.led_R.motion = LED_MOTION_OFF;
  13900. Charger.led_G.motion = LED_MOTION_BLINK;
  13901. Charger.led_B.motion = LED_MOTION_OFF;
  13902. Charger.led_W.motion = LED_MOTION_OFF;
  13903. LedOnRGBSet(0, 1000, 0, 0);
  13904. #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS
  13905. if (Charger.m_bModelNameAW48_1P)
  13906. {
  13907. blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1);
  13908. }
  13909. else
  13910. {
  13911. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  13912. }
  13913. #else
  13914. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  13915. #endif
  13916. break;
  13917. case LED_ACTION_RFID_FAIL:
  13918. Charger.led_R.motion = LED_MOTION_BLINK;
  13919. Charger.led_G.motion = LED_MOTION_OFF;
  13920. Charger.led_B.motion = LED_MOTION_OFF;
  13921. Charger.led_W.motion = LED_MOTION_OFF;
  13922. LedOnRGBSet(1000, 0, 0, 0);
  13923. #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS
  13924. if (Charger.m_bModelNameAW48_1P)
  13925. {
  13926. blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1);
  13927. }
  13928. else
  13929. {
  13930. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  13931. }
  13932. #else
  13933. blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
  13934. #endif
  13935. break;
  13936. case LED_ACTION_DEBUG:
  13937. Charger.led_R.motion = LED_MOTION_BLINK;
  13938. Charger.led_G.motion = LED_MOTION_BLINK;
  13939. Charger.led_B.motion = LED_MOTION_BLINK;
  13940. Charger.led_W.motion = LED_MOTION_BLINK;
  13941. LedOnRGBSet(1000, 1000, 1000, 1000);
  13942. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13943. break;
  13944. case LED_ACTION_ALL_OFF:
  13945. Charger.led_R.motion = LED_MOTION_OFF;
  13946. Charger.led_G.motion = LED_MOTION_OFF;
  13947. Charger.led_B.motion = LED_MOTION_OFF;
  13948. Charger.led_W.motion = LED_MOTION_OFF;
  13949. LedOnRGBSet(0, 0, 0, 0);
  13950. break ;
  13951. case LED_ACTION_HANDSHAKE_FAIL:
  13952. Charger.led_R.motion = LED_MOTION_BLINK;
  13953. Charger.led_G.motion = LED_MOTION_OFF;
  13954. Charger.led_B.motion = LED_MOTION_OFF;
  13955. Charger.led_W.motion = LED_MOTION_OFF;
  13956. LedOnRGBSet(1000, 0, 0, 0);
  13957. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  13958. break;
  13959. case LED_ACTION_INTERNET_DISCONNECT:
  13960. #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13961. if (Charger.m_bModelNameAW48_1P)
  13962. {
  13963. Charger.led_R.motion = LED_MOTION_OFF;
  13964. Charger.led_G.motion = LED_MOTION_ON;
  13965. Charger.led_B.motion = LED_MOTION_OFF;
  13966. Charger.led_W.motion = LED_MOTION_OFF;
  13967. LedOnRGBSet(0, 1000, 0, 0);
  13968. }
  13969. else
  13970. {
  13971. Charger.led_R.motion = LED_MOTION_ON;
  13972. Charger.led_G.motion = LED_MOTION_ON;
  13973. Charger.led_B.motion = LED_MOTION_OFF;
  13974. Charger.led_W.motion = LED_MOTION_OFF;
  13975. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13976. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13977. #else
  13978. LedOnRGBSet(1000, 1000, 0, 0);
  13979. #endif
  13980. }
  13981. #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13982. Charger.led_R.motion = LED_MOTION_ON;
  13983. Charger.led_G.motion = LED_MOTION_ON;
  13984. Charger.led_B.motion = LED_MOTION_OFF;
  13985. Charger.led_W.motion = LED_MOTION_OFF;
  13986. #ifdef MODIFY_LED_YELLOW_PARAMETER
  13987. LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0);
  13988. #else
  13989. LedOnRGBSet(1000, 1000, 0, 0);
  13990. #endif
  13991. #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE
  13992. break;
  13993. case LED_ACTION_RESTORE_SETTING:
  13994. Charger.led_R.motion = LED_MOTION_OFF;
  13995. Charger.led_G.motion = LED_MOTION_OFF;
  13996. Charger.led_B.motion = LED_MOTION_OFF;
  13997. Charger.led_W.motion = LED_MOTION_BLINK;
  13998. LedOnRGBSet(0, 0, 0, 1000);
  13999. blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
  14000. break;
  14001. #ifdef MODIFY_LED_STATUS_202108
  14002. #endif //MODIFY_LED_STATUS_202108
  14003. default :
  14004. Charger.led_R.motion = LED_MOTION_OFF;
  14005. Charger.led_G.motion = LED_MOTION_OFF;
  14006. Charger.led_B.motion = LED_MOTION_OFF;
  14007. Charger.led_W.motion = LED_MOTION_OFF;
  14008. LedOnRGBSet(0, 0, 0, 0);
  14009. break;
  14010. }
  14011. if((action != LED_ACTION_RFID_PASS) &&
  14012. (action != LED_ACTION_RFID_FAIL) &&
  14013. (action != LED_ACTION_BLE_CONNECT) &&
  14014. (action != LED_ACTION_BLE_DISABLE) &&
  14015. (action != LED_ACTION_HANDSHAKE_FAIL) &&
  14016. (action != LED_ACTION_RESTORE_SETTING))
  14017. {
  14018. Charger.Led_Mode = action;
  14019. }
  14020. }
  14021. //-------------------------------------------------------------------------------------------------
  14022. #ifdef FUNC_CUSTOMIZED_LED_MODE_FROM_CSU
  14023. void setLedMotion_User(uint8_t action, PLED_UserCfg p)
  14024. {
  14025. if (action != LED_ACTION_CUSTOMIZED_MODE || p == NULL)
  14026. return;
  14027. //Check data
  14028. Charger.m_bLedSleepModeForceMinBrightness = 0;
  14029. const u16 RGBMAX = 1000;
  14030. if (p->m_R > RGBMAX) p->m_R = RGBMAX;
  14031. if (p->m_G > RGBMAX) p->m_G = RGBMAX;
  14032. if (p->m_B > RGBMAX) p->m_B = RGBMAX;
  14033. if (p->m_Mode == LED_USER_MODE_SOLID)
  14034. {
  14035. Charger.led_R.motion = (p->m_R > 0 ? LED_MOTION_ON : LED_MOTION_OFF);
  14036. Charger.led_G.motion = (p->m_G > 0 ? LED_MOTION_ON : LED_MOTION_OFF);
  14037. Charger.led_B.motion = (p->m_B > 0 ? LED_MOTION_ON : LED_MOTION_OFF);
  14038. Charger.led_W.motion = LED_MOTION_OFF;
  14039. LedOnRGBSet(p->m_R, p->m_G, p->m_B, 0);
  14040. }
  14041. else if (p->m_Mode == LED_USER_MODE_BLINK)
  14042. {
  14043. Charger.led_R.motion = (p->m_R > 0 ? LED_MOTION_BLINK : LED_MOTION_OFF);
  14044. Charger.led_G.motion = (p->m_G > 0 ? LED_MOTION_BLINK : LED_MOTION_OFF);
  14045. Charger.led_B.motion = (p->m_B > 0 ? LED_MOTION_BLINK : LED_MOTION_OFF);
  14046. Charger.led_W.motion = LED_MOTION_OFF;
  14047. LedOnRGBSet(p->m_R, p->m_G, p->m_B, 0);
  14048. if (p->Blink.m_Count > HTK_U8_MAX) p->Blink.m_Count = HTK_U8_MAX;
  14049. blinkerTimeSet(BLINKER_IDX_LED, p->Blink.m_On_ms, p->Blink.m_Off_ms, p->Blink.m_Rest_ms, p->Blink.m_Count);
  14050. }
  14051. else if (p->m_Mode == LED_USER_MODE_BREATH)
  14052. {
  14053. Charger.led_R.motion = (p->m_R > 0 ? LED_MOTION_BREATHE : LED_MOTION_OFF);
  14054. Charger.led_G.motion = (p->m_G > 0 ? LED_MOTION_BREATHE : LED_MOTION_OFF);
  14055. Charger.led_B.motion = (p->m_B > 0 ? LED_MOTION_BREATHE : LED_MOTION_OFF);
  14056. Charger.led_W.motion = LED_MOTION_OFF;
  14057. LedOnRGBSet(p->m_R, p->m_G, p->m_B, 0);
  14058. breatheTimeSet(p->Breath.m_Up_ms, p->Breath.m_Down_ms, p->m_R, p->m_G, p->m_B, 0);
  14059. }
  14060. else
  14061. {
  14062. }
  14063. if (p->m_AutoRepeat)
  14064. Charger.Led_Mode = action;
  14065. }
  14066. #endif //FUNC_CUSTOMIZED_LED_MODE_FROM_CSU
  14067. //-------------------------------------------------------------------------------------------------
  14068. #ifdef FUNC_AW48_NET_LED
  14069. void setNetLedMotion(uint8_t action)
  14070. {
  14071. switch(action)
  14072. {
  14073. case NET_LED_ACTION_LTE_CONNECTING:
  14074. Charger.LedNet_G.motion = LED_MOTION_BLINK;
  14075. Charger.LedNet_B.motion = LED_MOTION_OFF;
  14076. blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 0, 1);
  14077. break;
  14078. case NET_LED_ACTION_LTE_CONNECTED:
  14079. Charger.LedNet_G.motion = LED_MOTION_ON;
  14080. Charger.LedNet_B.motion = LED_MOTION_OFF;
  14081. break;
  14082. case NET_LED_ACTION_WIFI_CONNECTING:
  14083. Charger.LedNet_G.motion = LED_MOTION_OFF;
  14084. Charger.LedNet_B.motion = LED_MOTION_BLINK;
  14085. blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 0, 1);
  14086. break;
  14087. case NET_LED_ACTION_WIFT_CONNECTED:
  14088. Charger.LedNet_G.motion = LED_MOTION_OFF;
  14089. Charger.LedNet_B.motion = LED_MOTION_ON;
  14090. break;
  14091. case NET_LED_ACTION_ETHERNET_CONNECTING:
  14092. Charger.LedNet_G.motion = LED_MOTION_OFF;
  14093. Charger.LedNet_B.motion = LED_MOTION_BLINK;
  14094. blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 0, 1);
  14095. break;
  14096. case NET_LED_ACTION_ETHERNET_CONNECTED:
  14097. Charger.LedNet_G.motion = LED_MOTION_OFF;
  14098. Charger.LedNet_B.motion = LED_MOTION_ON;
  14099. break;
  14100. case NET_LED_ACTION_ALL_CONNECTING:
  14101. Charger.am3352.NetLedActionSubState = NET_LED_ACTION_ETHERNET_CONNECTING_H;
  14102. break;
  14103. case NET_LED_ACTION_OFF:
  14104. Charger.LedNet_G.motion = LED_MOTION_OFF;
  14105. Charger.LedNet_B.motion = LED_MOTION_OFF;
  14106. break;
  14107. //(HIDE for NET_LED_ACTION_ALL_CONNECTING) ---------------
  14108. case NET_LED_ACTION_LTE_CONNECTING_H:
  14109. Charger.LedNet_G.motion = LED_MOTION_BLINK;
  14110. Charger.LedNet_B.motion = LED_MOTION_OFF;
  14111. blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 3000, 3);
  14112. break;
  14113. case NET_LED_ACTION_WIFI_CONNECTING_H:
  14114. Charger.LedNet_G.motion = LED_MOTION_OFF;
  14115. Charger.LedNet_B.motion = LED_MOTION_BLINK;
  14116. blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 3000, 3);
  14117. break;
  14118. case NET_LED_ACTION_ETHERNET_CONNECTING_H:
  14119. Charger.LedNet_G.motion = LED_MOTION_OFF;
  14120. Charger.LedNet_B.motion = LED_MOTION_BLINK;
  14121. blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 3000, 3);
  14122. break;
  14123. //---------------------------------------------------------
  14124. default:
  14125. Charger.LedNet_G.motion = LED_MOTION_OFF;
  14126. Charger.LedNet_B.motion = LED_MOTION_OFF;
  14127. break;
  14128. }
  14129. }
  14130. #endif //FUNC_AW48_NET_LED
  14131. //-------------------------------------------------------------------------------------------------
  14132. void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
  14133. {
  14134. #ifdef CCID_PROTECT
  14135. if (Charger.CCID_Module_Type == CCID_MODULE_CORMEX)
  14136. {
  14137. if(hadc->Instance == ADC2) //use watch dog to check ccid level
  14138. {
  14139. if (!Charger.isTestLeakModule)
  14140. {
  14141. if(Charger.counter.WatchDogLeak >= 5)
  14142. {
  14143. if(!(Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC))
  14144. {
  14145. DEBUG_INFO("leak adc watch happen\r\n");
  14146. Charger.counter.LEAK.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  14147. Charger.Alarm_Code |= ALARM_CURRENT_LEAK_AC;
  14148. timerEnable(TIMER_IDX_RETRY_LEAK_AC, ALARM_RETRY_INTERVAL_LEAK);
  14149. Charger.counter.LEAK.retry++ ;
  14150. Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ;
  14151. RELAY1_SET_DRIV(0);
  14152. RELAY1_SET_HOLD(0);
  14153. RELAY2_SET_DRIV(0);
  14154. RELAY2_SET_HOLD(0);
  14155. Charger.counter.WatchDogLeak = 0 ;
  14156. }
  14157. }
  14158. else
  14159. {
  14160. Charger.counter.WatchDogLeak ++ ;
  14161. }
  14162. }
  14163. }
  14164. }
  14165. #endif //CCID_PROTECT
  14166. }
  14167. //-------------------------------------------------------------------------------------------------
  14168. void vApplicationStackOverflowHook( TaskHandle_t xTask, signed char *pcTaskName )
  14169. {
  14170. DEBUG_ERROR("Stack overflow: %s\r\n", pcTaskName);
  14171. osDelay(500);
  14172. }
  14173. //-------------------------------------------------------------------------------------------------
  14174. void getlastRecord(void)
  14175. {
  14176. #ifdef FUNC_METER_IC_HISTORY
  14177. for(uint16_t idx=0;idx<METER_IC_HISTORY_REC_NUM;idx++)
  14178. {
  14179. if (!MeterIC_CaliHistory_IsRecordValid(idx))
  14180. {
  14181. DEBUG_INFO("MeterIC record last index: %d\r\n", (idx));
  14182. break;
  14183. }
  14184. }
  14185. #else //FUNC_METER_IC_HISTORY
  14186. //for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>4);idx++) //NG
  14187. for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>6);idx++)
  14188. {
  14189. if((Charger.memory.hisCharging.data.item[idx].Duration == 0xffffffff) &&
  14190. (Charger.memory.hisCharging.data.item[idx].powerSum == 0xffff) &&
  14191. (Charger.memory.hisCharging.data.item[idx].stopStatusCode == 0xffffffff) )
  14192. {
  14193. DEBUG_INFO("Charging record last index: %d\r\n", (idx));
  14194. break;
  14195. }
  14196. }
  14197. #endif //FUNC_METER_IC_HISTORY
  14198. //for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>6);idx++) //NG
  14199. for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>4);idx++)
  14200. {
  14201. if((Charger.memory.hisAlarm.data.item[idx].alarmCode == 0xffffffff) &&
  14202. (Charger.memory.hisAlarm.data.item[idx].mode == 0xff))
  14203. {
  14204. DEBUG_INFO("Alarm record last index: %d\r\n", (idx));
  14205. break;
  14206. }
  14207. }
  14208. }
  14209. //-------------------------------------------------------------------------------------------------
  14210. #ifdef FUNC_ROTARY_CURR_MAP
  14211. typedef struct _RotaryCurrItem
  14212. {
  14213. uint8_t m_nCurr; //(A)
  14214. uint8_t m_bTestMode: 1;
  14215. uint8_t m_bInvalidItem: 1;
  14216. uint8_t m_bSlaveMode: 1;
  14217. }
  14218. RotaryCurrItem, *PRotaryCurrItem;
  14219. #define ROTARY_CURR_ITEM_NUM (16)
  14220. #define AX48_DEF_CURR (48)
  14221. #define AX32_DEF_CURR (32)
  14222. #ifdef FUNC_AX80
  14223. #define AX80_DEF_CURR (80)
  14224. #endif
  14225. #ifdef FUNC_AT32
  14226. #define AT32_DEF_CURR (32)
  14227. #endif
  14228. #ifdef FUNC_AW48
  14229. #define AW48_DEF_CURR (48)
  14230. #endif
  14231. const RotaryCurrItem RotaryCurrMap_AX48[ROTARY_CURR_ITEM_NUM] =
  14232. {
  14233. { AX48_DEF_CURR, 1, 0, 0 }, //0: Test Mode ************
  14234. { 6, 0, 0, 0 }, //1: 6A 10%
  14235. { 8, 0, 0, 0 }, //2: 8A 13.33%
  14236. { 10, 0, 0, 0 }, //3: 10A 16.67%
  14237. { 13, 0, 0, 0 }, //4: 13A 21.67%
  14238. { 16, 0, 0, 0 }, //5: 16A 26.67%
  14239. { 20, 0, 0, 0 }, //6: 20A 33.33%
  14240. { 25, 0, 0, 0 }, //7: 25A 41.67%
  14241. { 30, 0, 0, 0 }, //8: 30A 50.00%
  14242. { 32, 0, 0, 0 }, //9: 32A 53.33%
  14243. { 40, 0, 0, 0 }, //A: 40A 66.67%
  14244. { AX48_DEF_CURR, 0, 0, 0 }, //B: 48A 80.00% (DEFAULT)
  14245. { AX48_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid)
  14246. { AX48_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid)
  14247. { 80, 0, 1, 0 }, //E: 80A 96.00% ????? (Invalid)
  14248. { AX48_DEF_CURR, 0, 0, 1 }, //F: Slave Mode ***********
  14249. };
  14250. #ifdef MODIFY_AX32_ROTATE_SWITCH_TABLE_20210915
  14251. const RotaryCurrItem RotaryCurrMap_AX32[ROTARY_CURR_ITEM_NUM] =
  14252. {
  14253. { AX32_DEF_CURR, 1, 0, 0 }, //0: Test Mode ************
  14254. { 6, 0, 0, 0 }, //1: 6A 10%
  14255. { 8, 0, 0, 0 }, //2: 8A 13.33%
  14256. { 10, 0, 0, 0 }, //3: 10A 16.67%
  14257. { 13, 0, 0, 0 }, //4: 13A 21.67%
  14258. { 16, 0, 0, 0 }, //5: 16A 26.67%
  14259. { 20, 0, 0, 0 }, //6: 20A 33.33%
  14260. { 25, 0, 0, 0 }, //7: 25A 41.67%
  14261. { 30, 0, 0, 0 }, //8: 30A 50.00%
  14262. { AX32_DEF_CURR, 0, 0, 0 }, //9: 32A 53.33% (DEFAULT)
  14263. { AX32_DEF_CURR, 0, 1, 0 }, //A: 40A 66.67% (Invalid)
  14264. { AX32_DEF_CURR, 0, 1, 0 }, //B: 48A 80.00% (Invalid)
  14265. { AX32_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid)
  14266. { AX32_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid)
  14267. { 80, 0, 1, 0 }, //E: 80A 96.00% ????? (Invalid)
  14268. { AX32_DEF_CURR, 0, 0, 1 }, //F: Slave Mode ***********
  14269. };
  14270. #else
  14271. // Old procedure (Deleted)
  14272. #endif //MODIFY_AX32_ROTATE_SWITCH_TABLE_20210915
  14273. #ifdef FUNC_AT32
  14274. const RotaryCurrItem RotaryCurrMap_AT32[ROTARY_CURR_ITEM_NUM] =
  14275. {
  14276. { AT32_DEF_CURR, 1, 0, 0 }, //0: Test Mode ************
  14277. { 6, 0, 0, 0 }, //1: 6A 10%
  14278. { 8, 0, 0, 0 }, //2: 8A 13.33%
  14279. { 10, 0, 0, 0 }, //3: 10A 16.67%
  14280. { 13, 0, 0, 0 }, //4: 13A 21.67%
  14281. { 16, 0, 0, 0 }, //5: 16A 26.67%
  14282. { 20, 0, 0, 0 }, //6: 20A 33.33%
  14283. { 25, 0, 0, 0 }, //7: 25A 41.67%
  14284. { 30, 0, 0, 0 }, //8: 30A 50.00%
  14285. { AT32_DEF_CURR, 0, 0, 0 }, //9: 32A 53.33% (DEFAULT)
  14286. { AT32_DEF_CURR, 0, 1, 0 }, //A: 40A 66.67% (Invalid)
  14287. { AT32_DEF_CURR, 0, 1, 0 }, //B: 48A 80.00% (Invalid)
  14288. { AT32_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid)
  14289. { AT32_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid)
  14290. { 80, 0, 1, 0 }, //E: 80A 96.00% ????? (Invalid)
  14291. { AT32_DEF_CURR, 0, 0, 1 }, //F: Slave Mode ***********
  14292. };
  14293. #endif //FUNC_AT32
  14294. #ifdef FUNC_AX80
  14295. const RotaryCurrItem RotaryCurrMap_AX80[ROTARY_CURR_ITEM_NUM] =
  14296. {
  14297. { AX80_DEF_CURR, 1, 0, 0 }, //0: Test Mode ************
  14298. { 6, 0, 0, 0 }, //1: 6A 10%
  14299. { 8, 0, 0, 0 }, //2: 8A 13.33%
  14300. { 10, 0, 0, 0 }, //3: 10A 16.67%
  14301. { 13, 0, 0, 0 }, //4: 13A 21.67%
  14302. { 16, 0, 0, 0 }, //5: 16A 26.67%
  14303. { 20, 0, 0, 0 }, //6: 20A 33.33%
  14304. { 25, 0, 0, 0 }, //7: 25A 41.67%
  14305. { 30, 0, 0, 0 }, //8: 30A 50.00%
  14306. { 32, 0, 0, 0 }, //9: 32A 53.33%
  14307. { 40, 0, 0, 0 }, //A: 40A 66.67%
  14308. { 48, 0, 0, 0 }, //B: 48A 80.00%
  14309. { AX80_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid)
  14310. { AX80_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid)
  14311. { AX80_DEF_CURR, 0, 0, 0 }, //E: 80A 96.00% (DEFAULT)
  14312. { AX80_DEF_CURR, 0, 0, 1 }, //F: Slave Mode ***********
  14313. };
  14314. #endif //FUNC_AX80
  14315. #ifdef FUNC_AW48
  14316. const RotaryCurrItem RotaryCurrMap_AW48[ROTARY_CURR_ITEM_NUM] =
  14317. {
  14318. { AW48_DEF_CURR, 1, 0, 0 }, //0: X Test Mode ************ (Invalid)
  14319. { 12, 0, 0, 0 }, //1: 12A 20.00%
  14320. { 16, 0, 0, 0 }, //2: 16A 26.67%
  14321. { 24, 0, 0, 0 }, //3: 24A 40.00%
  14322. { 32, 0, 0, 0 }, //4: 32A 53.33%
  14323. { 40, 0, 0, 0 }, //5: 40A 66.67%
  14324. { AW48_DEF_CURR, 0, 0, 0 }, //6: 48A 80.00% (DEFAULT)
  14325. { AW48_DEF_CURR, 0, 1, 0 }, //7: Reserved ************* (Invalid)
  14326. { AW48_DEF_CURR, 0, 1, 0 }, //8: Reserved ************* (Invalid)
  14327. { AW48_DEF_CURR, 0, 1, 0 }, //9: Reserved ************* (Invalid)
  14328. { AW48_DEF_CURR, 0, 1, 0 }, //A: Reserved ************* (Invalid)
  14329. { AW48_DEF_CURR, 0, 1, 0 }, //B: Reserved ************* (Invalid)
  14330. { AW48_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid)
  14331. { AW48_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid)
  14332. { AW48_DEF_CURR, 0, 1, 0 }, //E: Reserved ************* (Invalid)
  14333. { AW48_DEF_CURR, 0, 1, 0 }, //F: X Slave Mode *********** (Invalid)
  14334. };
  14335. #endif //FUNC_AW48
  14336. #endif //FUNC_ROTARY_CURR_MAP
  14337. void getRotarySwitchSetting(void)
  14338. {
  14339. uint8_t tmpBuf = 0;
  14340. #ifdef ROTATE_SWITCH_HARDCODE
  14341. tmpBuf = HC_ROTARY_SWITCH_SET_VAL;
  14342. #else
  14343. tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set1_GPIO_Port, IN_AC_Current_Set1_Pin)?0:1)<<0;
  14344. tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set2_GPIO_Port, IN_AC_Current_Set2_Pin)?0:1)<<1;
  14345. tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set3_GPIO_Port, IN_AC_Current_Set3_Pin)?0:1)<<2;
  14346. tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set4_GPIO_Port, IN_AC_Current_Set4_Pin)?0:1)<<3;
  14347. #endif //ROTATE_SWITCH_HARDCODE
  14348. #ifdef FUNC_ROTARY_CURR_MAP
  14349. #ifdef FUNC_AX80
  14350. RotaryCurrItem const *p = NULL;
  14351. if (Charger.m_bModelNameAX80_1P)
  14352. {
  14353. p = &RotaryCurrMap_AX80[tmpBuf];
  14354. }
  14355. else if (Charger.m_bModelNameAX48_1P)
  14356. {
  14357. p = &RotaryCurrMap_AX48[tmpBuf];
  14358. }
  14359. else if (Charger.m_bModelNameAX32_3P || Charger.m_bModelNameDC)
  14360. {
  14361. p = &RotaryCurrMap_AX32[tmpBuf];
  14362. }
  14363. #ifdef FUNC_AT32
  14364. else if (Charger.m_bModelNameAT32_3P)
  14365. {
  14366. p = &RotaryCurrMap_AT32[tmpBuf];
  14367. }
  14368. #endif
  14369. #ifdef FUNC_AW48
  14370. else if (Charger.m_bModelNameAW48_1P)
  14371. {
  14372. p = &RotaryCurrMap_AW48[tmpBuf];
  14373. }
  14374. #endif
  14375. else
  14376. {
  14377. p = &RotaryCurrMap_AX48[tmpBuf];
  14378. }
  14379. #else
  14380. RotaryCurrItem const *p = (Charger.m_b3PhaseModel ? &RotaryCurrMap_AX32[tmpBuf] : &RotaryCurrMap_AX48[tmpBuf]);
  14381. #endif
  14382. Charger.maxRatingCurrent = p->m_nCurr;
  14383. Charger.isDebugEnable = p->m_bTestMode;
  14384. Charger.isRotarySwitchError = p->m_bInvalidItem;
  14385. XP("#[RotarySwitch(%c)] MaxCurr(%d), TestMode(%d), SwitchError(%d), SlaveMode(%d)\r\n",
  14386. CharacterArray[tmpBuf],
  14387. Charger.maxRatingCurrent,
  14388. Charger.isDebugEnable,
  14389. Charger.isRotarySwitchError,
  14390. Charger.m_bRotarySlaveMode);
  14391. #else //FUNC_ROTARY_CURR_MAP
  14392. // Old procedure (Deleted)
  14393. #endif //FUNC_ROTARY_CURR_MAP
  14394. DEBUG_INFO("Current rating value: %d A\r\n", Charger.maxRatingCurrent);
  14395. Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent;
  14396. #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE
  14397. Charger.AC_MaxChargingCurrentOrDuty = Charger.maxRatingCurrent;
  14398. #endif
  14399. }
  14400. //------------------------------------------------------------------------------//
  14401. void CLC_Corr_Gain_Par(uint16_t SpecData_H ,uint16_t SpecData_L ,uint16_t MCUData_H , uint16_t MCUData_L , float *GainA , float *GainB )
  14402. {
  14403. *GainA = (float)((float)(SpecData_H -SpecData_L) / (float)( MCUData_H - MCUData_L)) ;
  14404. *GainB = (float)(SpecData_H - (float)(*GainA * MCUData_H)) ;
  14405. }
  14406. //------------------------------------------------------------------------------//
  14407. void CLC_Corr_Gain_Par2(uint16_t SpecData_H ,uint16_t SpecData_L ,uint16_t MCUData_H , uint16_t MCUData_L , float *GainA , float *GainB , uint8_t *PosorNeg )
  14408. {
  14409. *GainA = (float)((float)(SpecData_H -SpecData_L) / (float)( MCUData_H - MCUData_L)) ;
  14410. if (SpecData_H > (*GainA * MCUData_H))
  14411. {
  14412. *GainB = SpecData_H - (*GainA * MCUData_H) ;
  14413. *PosorNeg = ON ;
  14414. }
  14415. else
  14416. {
  14417. *GainB = (*GainA * MCUData_H) - SpecData_H ;
  14418. *PosorNeg = OFF ;
  14419. }
  14420. }
  14421. //------------------------------------------------------------------------------
  14422. uint8_t Array_data_Check ( uint8_t *s1, uint8_t *s2 )
  14423. {
  14424. uint8_t compare = 0;
  14425. uint8_t result = PASS;
  14426. for(compare=0;compare<sizeof(s1);compare++)
  14427. {
  14428. if(s1[compare]!=s2[compare])
  14429. {
  14430. result = FAIL;
  14431. break;
  14432. }
  14433. }
  14434. return result;
  14435. }
  14436. //------------------------------------------------------------------------------
  14437. void Relay_Control_Function (void)
  14438. {
  14439. #ifdef KENNY_SAFETY_TEST_RELAY_ALWAYS_ON
  14440. //Relay_Action_Set(GPIO_RELAY1_ACTION_ON);
  14441. RELAY1_SET_DRIV(1);
  14442. RELAY1_SET_HOLD(0);
  14443. //Relay_Action_Set(GPIO_RELAY2_ACTION_ON);
  14444. RELAY2_SET_DRIV(1);
  14445. RELAY2_SET_HOLD(0);
  14446. return;
  14447. #endif
  14448. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14449. static uint8_t PreRelayAction = GPIO_RELAY_ACTION_UNKNOW;
  14450. HTK_BOOL bRelayActionChange = HTK_FALSE;
  14451. if (PreRelayAction != Charger.Relay_Action)
  14452. {
  14453. PreRelayAction = Charger.Relay_Action;
  14454. bRelayActionChange = HTK_TRUE;
  14455. }
  14456. #endif
  14457. switch(Charger.Relay_Action)
  14458. {
  14459. case GPIO_RELAY_ACTION_ON:
  14460. if(Relay1_Action_Get() == GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() == GPIO_RELAY2_ACTION_OFF)
  14461. {
  14462. #ifdef FUNC_GUN_LOCK
  14463. #ifdef FUNC_GUN_LOCK_TRIG_MODE
  14464. if (Charger.m_bUseGunLock && Charger.m_GunLockTrigMode == GL_TRIG_MODE_RELAY)
  14465. #else
  14466. if (Charger.m_bUseGunLock)
  14467. #endif
  14468. {
  14469. if (GL_IsLock())
  14470. {
  14471. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14472. Charger.m_GunLock_Counter = 0;
  14473. #endif
  14474. Relay_Action_Set(GPIO_RELAY1_ACTION_ON);
  14475. Relay_Action_Set(GPIO_RELAY2_ACTION_ON);
  14476. }
  14477. else
  14478. {
  14479. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14480. if (bRelayActionChange)
  14481. {
  14482. Charger.m_GunLock_Counter = 0;
  14483. }
  14484. #endif
  14485. GL_Trig(GL_MODE_LOCK);
  14486. }
  14487. }
  14488. else
  14489. {
  14490. Relay_Action_Set(GPIO_RELAY1_ACTION_ON);
  14491. Relay_Action_Set(GPIO_RELAY2_ACTION_ON);
  14492. }
  14493. #else //FUNC_GUN_LOCK
  14494. Relay_Action_Set(GPIO_RELAY1_ACTION_ON);
  14495. Relay_Action_Set(GPIO_RELAY2_ACTION_ON);
  14496. #endif //FUNC_GUN_LOCK
  14497. }
  14498. #ifdef FUNC_GUN_LOCK
  14499. else if(Relay1_Action_Get() == GPIO_RELAY1_ACTION_ON && Relay2_Action_Get() == GPIO_RELAY2_ACTION_ON)
  14500. {
  14501. #ifdef FUNC_GUN_LOCK_TRIG_MODE
  14502. if (Charger.m_bUseGunLock && Charger.m_GunLockTrigMode == GL_TRIG_MODE_RELAY)
  14503. #else
  14504. if (Charger.m_bUseGunLock)
  14505. #endif
  14506. {
  14507. if (GL_IsLock())
  14508. {
  14509. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14510. Charger.m_GunLock_Counter = 0;
  14511. #endif
  14512. }
  14513. else
  14514. {
  14515. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14516. if (bRelayActionChange)
  14517. {
  14518. Charger.m_GunLock_Counter = 0;
  14519. }
  14520. #endif
  14521. GL_Trig(GL_MODE_LOCK);
  14522. }
  14523. }
  14524. }
  14525. #endif //FUNC_GUN_LOCK
  14526. if(timer[TIMER_IDX_RELAY_1].isAlarm == ON && timer[TIMER_IDX_RELAY_2].isAlarm == ON)
  14527. {
  14528. Relay_Action_Set(GPIO_RELAY1_ACTION_HOLD);
  14529. Relay_Action_Set(GPIO_RELAY2_ACTION_HOLD);
  14530. timerDisable(TIMER_IDX_RELAY_1);
  14531. timerDisable(TIMER_IDX_RELAY_2);
  14532. Charger.Relay_isOperationCompleted |= 0x11 ;
  14533. }
  14534. break;
  14535. case GPIO_RELAY_ACTION_OFF:
  14536. timer[TIMER_IDX_RELAY_1].isEnable = OFF;
  14537. timer[TIMER_IDX_RELAY_2].isEnable = OFF;
  14538. if(Relay1_Action_Get() != GPIO_RELAY1_ACTION_OFF)
  14539. {
  14540. Relay_Action_Set(GPIO_RELAY1_ACTION_OFF);
  14541. Relay_Action_Set(GPIO_RELAY2_ACTION_OFF);
  14542. #ifdef FUNC_GUN_LOCK
  14543. #ifdef FUNC_GUN_LOCK_TRIG_MODE
  14544. if (Charger.m_bUseGunLock && Charger.m_GunLockTrigMode == GL_TRIG_MODE_RELAY)
  14545. #else
  14546. if (Charger.m_bUseGunLock)
  14547. #endif
  14548. {
  14549. if (GL_IsLock())
  14550. {
  14551. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14552. if (bRelayActionChange)
  14553. {
  14554. Charger.m_GunUnlock_Counter = 0;
  14555. }
  14556. #endif
  14557. GL_Trig(GL_MODE_UNLOCK);
  14558. }
  14559. else
  14560. {
  14561. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14562. Charger.m_GunUnlock_Counter = 0;
  14563. #endif
  14564. }
  14565. }
  14566. #endif //FUNC_GUN_LOCK
  14567. }
  14568. #ifdef FUNC_GUN_LOCK
  14569. else if(Relay1_Action_Get() == GPIO_RELAY1_ACTION_OFF)
  14570. {
  14571. #ifdef FUNC_GUN_LOCK_TRIG_MODE
  14572. if (Charger.m_bUseGunLock && Charger.m_GunLockTrigMode == GL_TRIG_MODE_RELAY)
  14573. #else
  14574. if (Charger.m_bUseGunLock)
  14575. #endif
  14576. {
  14577. if (GL_IsLock())
  14578. {
  14579. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14580. if (bRelayActionChange)
  14581. {
  14582. Charger.m_GunUnlock_Counter = 0;
  14583. }
  14584. #endif
  14585. GL_Trig(GL_MODE_UNLOCK);
  14586. }
  14587. else
  14588. {
  14589. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  14590. Charger.m_GunUnlock_Counter = 0;
  14591. #endif
  14592. }
  14593. }
  14594. }
  14595. #endif
  14596. osDelay(10);
  14597. Charger.Relay_isOperationCompleted &= 0x00 ;
  14598. #ifdef FUNC_GET_TRIP_TIME
  14599. if (Charger.m_TripBeg > 0 && Charger.m_TripEnd == HTK_U32_MAX)
  14600. {
  14601. Charger.m_TripEnd = HAL_GetTick();
  14602. }
  14603. #endif
  14604. break;
  14605. default:
  14606. break;
  14607. }
  14608. }
  14609. //--------------------------------------------------------------------------------
  14610. #ifdef FUNC_OUTP_TYPE_E
  14611. void SE_Relay_Control_Function(void)
  14612. {
  14613. switch(Charger.SE_Relay_Action)
  14614. {
  14615. case GPIO_SE_RELAY_ACTION_ON:
  14616. if(SE_Relay1_Action_Get() == GPIO_SE_RELAY1_ACTION_OFF)
  14617. {
  14618. SE_Relay_Action_Set(GPIO_SE_RELAY1_ACTION_ON);
  14619. }
  14620. if(timer[TIMER_IDX_SE_RELAY_1].isAlarm == ON)
  14621. {
  14622. SE_Relay_Action_Set(GPIO_SE_RELAY1_ACTION_HOLD);
  14623. timerDisable(TIMER_IDX_SE_RELAY_1);
  14624. Charger.SE_Relay_isOperationCompleted |= 0x11 ;
  14625. }
  14626. break;
  14627. case GPIO_SE_RELAY_ACTION_OFF:
  14628. timer[TIMER_IDX_SE_RELAY_1].isEnable = OFF;
  14629. if(SE_Relay1_Action_Get() != GPIO_SE_RELAY1_ACTION_OFF)
  14630. {
  14631. SE_Relay_Action_Set(GPIO_SE_RELAY1_ACTION_OFF);
  14632. }
  14633. osDelay(10);
  14634. Charger.SE_Relay_isOperationCompleted &= 0x00 ;
  14635. break;
  14636. default:
  14637. break;
  14638. }
  14639. }
  14640. #endif //FUNC_OUTP_TYPE_E
  14641. //--------------------------------------------------------------------------------
  14642. uint8_t WatchDogLeakRawDataCheck_Event(void)
  14643. {
  14644. uint8_t result = PASS ;
  14645. for(uint16_t idx = 0 ; idx < ADC2_SAMPLE_COUNT; idx++)
  14646. {
  14647. if (ADC2_Buffer_Each[1][idx] >= 4000)
  14648. {
  14649. result = FAIL;
  14650. break;
  14651. }
  14652. }
  14653. return result ;
  14654. }
  14655. //--------------------------------------------------------------------------------
  14656. uint16_t getBrightnessDuty(uint16_t max_duty)
  14657. {
  14658. uint8_t Lv_Brightness = 3;
  14659. uint16_t duty = 1000;
  14660. Lv_Brightness = (Charger.Led_Brightness[(Charger.memory.EVSE_Config.data.item.SystemDateTime.hour/2)]>>(((Charger.memory.EVSE_Config.data.item.SystemDateTime.hour+1)%2)*4))&0xf;
  14661. switch(Lv_Brightness)
  14662. {
  14663. case 0:
  14664. duty = max_duty/4;
  14665. break;
  14666. case 1:
  14667. duty = max_duty/3;
  14668. break;
  14669. case 2:
  14670. duty = max_duty/2;
  14671. break;
  14672. case 3:
  14673. duty = max_duty;
  14674. break;
  14675. default:
  14676. duty = max_duty;
  14677. break;
  14678. }
  14679. #ifdef TEST_FOR_ENERGY_STAR
  14680. //return duty / 10;
  14681. //return duty / 4;
  14682. if (Charger.m_bLedSleepModeForceMinBrightness)
  14683. {
  14684. duty = max_duty/4;;
  14685. }
  14686. return duty;
  14687. #else
  14688. return duty;
  14689. #endif
  14690. }
  14691. //--------------------------------------------------------------------------------
  14692. void parseVersionInfoFromModelname(void)
  14693. {
  14694. #ifdef FUNC_XP_PARSE_VERSION_INFO_FROM_MODELNAME
  14695. XP("Parse ModelName: %s\r\n", Charger.memory.EVSE_Config.data.item.ModelName);
  14696. #endif
  14697. #ifdef FUNC_VERSION_USE_NEW_SPEC_20240926
  14698. //do nothing
  14699. #else //FUNC_VERSION_USE_NEW_SPEC_20240926
  14700. //--------------------------------------
  14701. // Version Naming Rule "tx.yz.ab.cddd.vv"
  14702. //Version Naming Rule "a"
  14703. for(uint8_t idx=0;idx<3;idx++)
  14704. {
  14705. switch(Charger.memory.EVSE_Config.data.item.ModelName[7+idx])
  14706. {
  14707. case '1':
  14708. // J1772 Plug
  14709. Charger.Ver_FW[6] = '4';
  14710. break;
  14711. case '2':
  14712. // J1772 Socket
  14713. Charger.Ver_FW[6] = '1';
  14714. break;
  14715. case '3':
  14716. // CE Plug
  14717. Charger.Ver_FW[6] = '5';
  14718. break;
  14719. case '4':
  14720. // CE Socket
  14721. Charger.Ver_FW[6] = '2';
  14722. break;
  14723. case '5':
  14724. // GB Plug
  14725. Charger.Ver_FW[6] = '6';
  14726. break;
  14727. case '6':
  14728. // GB Socket
  14729. Charger.Ver_FW[6] = '3';
  14730. break;
  14731. #ifdef FUNC_ADD_FW_VER_WITH_GUN_TYPE_NACS
  14732. case '9':
  14733. // NACS
  14734. Charger.Ver_FW[6] = '9';
  14735. break;
  14736. #endif
  14737. }
  14738. }
  14739. #endif //FUNC_VERSION_USE_NEW_SPEC_20240926
  14740. //Version Naming Rule "c"
  14741. switch(Charger.memory.EVSE_Config.data.item.ModelName[10])
  14742. {
  14743. case 'B':
  14744. case 'U':
  14745. //Blue tooth
  14746. Charger.Ver_FW[9] = '3';
  14747. break;
  14748. case 'W':
  14749. // WIFI
  14750. Charger.Ver_FW[9] = '1';
  14751. break;
  14752. case 'T':
  14753. // 3G/4G
  14754. Charger.Ver_FW[9] = '2';
  14755. break;
  14756. #ifdef FUNC_ADD_FW_VER_WITH_NET_TYPE_WIFI_AND_4G
  14757. case 'D':
  14758. Charger.Ver_FW[9] = '5';
  14759. break;
  14760. #endif
  14761. default:
  14762. // LAN
  14763. Charger.Ver_FW[9] = '0';
  14764. break;
  14765. }
  14766. //Version Naming Rule "d3" , Get rating power from model name
  14767. memcpy(&Charger.Ver_FW[10], &Charger.memory.EVSE_Config.data.item.ModelName[4], 0x03);
  14768. // Get vender code from model name
  14769. memcpy(&Charger.Ver_FW[14], &Charger.memory.EVSE_Config.data.item.ModelName[12], 0x02);
  14770. //--------------------------------------
  14771. //adc2 watchdog config data
  14772. ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};
  14773. AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
  14774. AnalogWDGConfig.HighThreshold = 3722;
  14775. AnalogWDGConfig.LowThreshold = 372;
  14776. AnalogWDGConfig.Channel = ADC_CHANNEL_6;
  14777. #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC
  14778. HTK_BOOL bModelNameWithEuroSpecOCP = HTK_FALSE;
  14779. #endif
  14780. // CCID_Module_Type check
  14781. Charger.CCID_Module_Type = CCID_MODULE_VAC ;
  14782. switch(Charger.memory.EVSE_Config.data.item.ModelName[3])
  14783. {
  14784. case 'E': //CE / European Market
  14785. case 'T': //TR25 / Singapor Market
  14786. case 'Z': //EV ready / French Market
  14787. #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC
  14788. case 'M': //E + MID Meter
  14789. case 'P': //E + PTB certification
  14790. case 'I': //Z + TIC Meter pcb
  14791. case 'F': //Z + MID Meter
  14792. bModelNameWithEuroSpecOCP = HTK_TRUE;
  14793. #endif
  14794. Charger.CCID_Module_Type = CCID_MODULE_VAC ;
  14795. AnalogWDGConfig.ITMode = DISABLE;
  14796. //#ifdef MODIFY_OCP_MAGNIFICATION
  14797. // Charger.OCP_Magnification = 125 ;
  14798. //#else
  14799. Charger.OCP_Magnification = 115 ;
  14800. //#endif
  14801. break;
  14802. case 'U':
  14803. //UL / North America Market
  14804. Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
  14805. #ifdef MODIFY_AW48_CCID_UL_SPEC_KENNY_20240401
  14806. //set at the other place
  14807. // if (Charger.m_bModelNameAW48_1P)
  14808. // {
  14809. // Charger.alarm_spec.Current_LEAK_AC = 1700 ; // unit 0.01mA
  14810. // }
  14811. // else
  14812. #endif //MODIFY_AW48_CCID_UL_SPEC_KENNY_20240401
  14813. {
  14814. Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA
  14815. }
  14816. AnalogWDGConfig.ITMode = ENABLE;
  14817. Charger.OCP_Magnification = 110 ;
  14818. break;
  14819. case 'G':
  14820. //GB / China Market
  14821. Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
  14822. Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA
  14823. AnalogWDGConfig.ITMode = ENABLE;
  14824. Charger.OCP_Magnification = 110 ;
  14825. break;
  14826. case 'C':
  14827. #ifdef FUNC_SUPPORT_MODEL_AXYC
  14828. if (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'Y')
  14829. {
  14830. bModelNameWithEuroSpecOCP = HTK_TRUE;
  14831. Charger.CCID_Module_Type = CCID_MODULE_VAC ;
  14832. AnalogWDGConfig.ITMode = DISABLE;
  14833. Charger.OCP_Magnification = 115 ;
  14834. }
  14835. else
  14836. {
  14837. Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
  14838. Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA
  14839. AnalogWDGConfig.ITMode = ENABLE;
  14840. Charger.OCP_Magnification = 110 ;
  14841. }
  14842. #else //FUNC_SUPPORT_MODEL_AXYC
  14843. //CNS / Taiwan Market
  14844. #ifdef FUNC_REPLACE_CORMEX_WITH_VAC_FOR_CNS_MODEL
  14845. Charger.CCID_Module_Type = CCID_MODULE_VAC;
  14846. #else
  14847. Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
  14848. #endif
  14849. Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA
  14850. AnalogWDGConfig.ITMode = ENABLE;
  14851. Charger.OCP_Magnification = 110 ;
  14852. #endif //FUNC_SUPPORT_MODEL_AXYC
  14853. break;
  14854. case 'J':
  14855. //JARI / Japan Market
  14856. Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
  14857. Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA
  14858. AnalogWDGConfig.ITMode = ENABLE;
  14859. Charger.OCP_Magnification = 110 ;
  14860. break;
  14861. case 'K':
  14862. //KC / Korea Market
  14863. Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
  14864. Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA
  14865. AnalogWDGConfig.ITMode = ENABLE;
  14866. Charger.OCP_Magnification = 110 ;
  14867. break;
  14868. case 'B':
  14869. //British / UK Market
  14870. Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
  14871. Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA
  14872. AnalogWDGConfig.ITMode = ENABLE;
  14873. Charger.OCP_Magnification = 110 ;
  14874. break;
  14875. default:
  14876. Charger.CCID_Module_Type = CCID_MODULE_VAC ;
  14877. AnalogWDGConfig.ITMode = DISABLE;
  14878. Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA
  14879. Charger.OCP_Magnification = 110 ;
  14880. break;
  14881. }
  14882. #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC
  14883. Charger.m_bModelNameWithEuroSpecOCP = bModelNameWithEuroSpecOCP;
  14884. XP("#Use EuropeanSpecOCP: %s\r\n", Charger.m_bModelNameWithEuroSpecOCP ? "True" : "False");
  14885. #endif
  14886. #ifdef FUNC_AUTO_MODIFY_CCID_MODULE
  14887. XP("#Use CCID Module (ModelName: %s): %s\r\n", Charger.memory.EVSE_Config.data.item.ModelName, CCID_MODULE_TYPE_STR);
  14888. if (Charger.m_bCCID_MustModify && Charger.m_CCID_ModuleTestOK != CCID_MODULE_UNKNOW)
  14889. {
  14890. Charger.CCID_Module_Type = Charger.m_CCID_ModuleTestOK;
  14891. XP("#Use CCID Module (AutoModify): %s\r\n", CCID_MODULE_TYPE_STR);
  14892. }
  14893. #endif
  14894. //adc2 watchdog config to register
  14895. if (HAL_ADC_AnalogWDGConfig(&hadc2, &AnalogWDGConfig) != HAL_OK)
  14896. {
  14897. Error_Handler();
  14898. }
  14899. #ifdef FUNC_AUTO_IGNORE_AC_PHASE
  14900. Charger.m_b3PhaseModel =
  14901. (
  14902. (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'Y')
  14903. || (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'D')
  14904. || (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'W')
  14905. ) ? 1 : 0;
  14906. XP("#ThreePhaseModel: %s\r\n", Charger.m_b3PhaseModel ? "True" : "False");
  14907. #ifdef FUNC_CHECK_MODELNAME_AX_PRIFIX
  14908. Charger.m_bModelNameAX =
  14909. (
  14910. (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'A')
  14911. && (Charger.memory.EVSE_Config.data.item.ModelName[1] == 'X')
  14912. ) ? 1 : 0;
  14913. XP("#ModelNameAX: %s\r\n", Charger.m_bModelNameAX ? "True" : "False");
  14914. #endif
  14915. #ifdef FUNC_AT32
  14916. Charger.m_bModelNameAT =
  14917. (
  14918. (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'A')
  14919. && (Charger.memory.EVSE_Config.data.item.ModelName[1] == 'T')
  14920. ) ? 1 : 0;
  14921. XP("#ModelNameAT: %s\r\n", Charger.m_bModelNameAT ? "True" : "False");
  14922. Charger.m_bModelNameAT32_3P = Charger.m_bModelNameAT &&
  14923. (
  14924. Charger.m_b3PhaseModel
  14925. // && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '2')
  14926. // && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '2')
  14927. // && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1')
  14928. ) ? 1 : 0;
  14929. XP("#ModelNameAT32_3P: %s\r\n", Charger.m_bModelNameAT32_3P ? "True" : "False");
  14930. #endif //FUNC_AT32
  14931. #ifdef FUNC_AX80
  14932. //ex: AXLU191001W1P0
  14933. Charger.m_bModelNameAX80_1P = Charger.m_bModelNameAX &&
  14934. (
  14935. !Charger.m_b3PhaseModel
  14936. && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '1')
  14937. && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '9')
  14938. && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1')
  14939. ) ? 1 : 0;
  14940. XP("#ModelNameAX80_1P: %s\r\n", Charger.m_bModelNameAX80_1P ? "True" : "False");
  14941. Charger.m_bModelNameAX48_1P = Charger.m_bModelNameAX &&
  14942. (
  14943. !Charger.m_b3PhaseModel
  14944. && !Charger.m_bModelNameAX80_1P
  14945. // && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '1')
  14946. // && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '1')
  14947. // && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1')
  14948. ) ? 1 : 0;
  14949. XP("#ModelNameAX48_1P: %s\r\n", Charger.m_bModelNameAX48_1P ? "True" : "False");
  14950. #ifdef FUNC_AXSJ_USE_NEW_NACS_PCB
  14951. Charger.m_bModelNameAXSJ =
  14952. (
  14953. (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'A')
  14954. && (Charger.memory.EVSE_Config.data.item.ModelName[1] == 'X')
  14955. && (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'S')
  14956. && (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'J')
  14957. ) ? 1 : 0;
  14958. XP("#ModelNameAXSJ: %s\r\n", Charger.m_bModelNameAXSJ ? "True" : "False");
  14959. Charger.m_bModelNameAXSJ_AX48_NACS_1P =
  14960. (
  14961. Charger.m_bModelNameAXSJ
  14962. && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '9')
  14963. && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '6')
  14964. && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '0')
  14965. ) ? 1 : 0;
  14966. XP("#ModelNameAXSJ_AX48_NACS_1P: %s\r\n", Charger.m_bModelNameAXSJ_AX48_NACS_1P ? "True" : "False");
  14967. Charger.m_bModelNameAXSJ_AX80_NACS_1P =
  14968. (
  14969. Charger.m_bModelNameAXSJ
  14970. && (Charger.memory.EVSE_Config.data.item.ModelName[4] == 'x')
  14971. && (Charger.memory.EVSE_Config.data.item.ModelName[5] == 'x')
  14972. && (Charger.memory.EVSE_Config.data.item.ModelName[6] == 'x')
  14973. ) ? 1 : 0;
  14974. XP("#ModelNameAXSJ_AX80_NACS_1P: %s\r\n", Charger.m_bModelNameAXSJ_AX80_NACS_1P ? "True" : "False");
  14975. #endif //FUNC_AXSJ_USE_NEW_NACS_PCB
  14976. #ifdef FUNC_AX48_NACS
  14977. Charger.m_bModelNameAX48_NACS_1P = Charger.m_bModelNameAX48_1P
  14978. && (Charger.memory.EVSE_Config.data.item.ModelName[7] == '0')
  14979. && (Charger.memory.EVSE_Config.data.item.ModelName[8] == '0')
  14980. && (Charger.memory.EVSE_Config.data.item.ModelName[9] == '9');
  14981. #ifdef FUNC_AXSJ_USE_NEW_NACS_PCB
  14982. Charger.m_bModelNameAX48_NACS_1P |= Charger.m_bModelNameAXSJ_AX48_NACS_1P;
  14983. #endif
  14984. #ifdef ADD_AX_NACS_PCB_USE_GEN_CODE_3
  14985. Charger.m_bModelNameAX48_NACS_1P |= (Charger.m_bModelNameAX48_1P && Charger.memory.EVSE_Config.data.item.ModelName[11] == '3');
  14986. #endif
  14987. XP("#ModelNameAX48_NACS_1P: %s\r\n", Charger.m_bModelNameAX48_NACS_1P ? "True" : "False");
  14988. #ifdef FUNC_LIN_EN_SW
  14989. if (Charger.m_bModelNameAX48_NACS_1P)
  14990. {
  14991. LIN_SW(HTK_FALSE); //PWM
  14992. }
  14993. #endif //FUNC_LIN_EN_SW
  14994. #ifdef FUNC_TMP100
  14995. if (Charger.m_bModelNameAX48_NACS_1P ||
  14996. Charger.m_bModelNameAX80_NACS_1P)
  14997. {
  14998. Charger.m_bUseTMP100 = 1;
  14999. }
  15000. else
  15001. {
  15002. Charger.m_bUseTMP100 = 0;
  15003. }
  15004. XP("#UseTMP100: %s\r\n", Charger.m_bUseTMP100 ? "True" : "False");
  15005. #endif
  15006. #endif //FUNC_AX48_NACS
  15007. #ifdef FUNC_AX80_NACS
  15008. Charger.m_bModelNameAX80_NACS_1P = Charger.m_bModelNameAX80_1P
  15009. && (Charger.memory.EVSE_Config.data.item.ModelName[7] == '0')
  15010. && (Charger.memory.EVSE_Config.data.item.ModelName[8] == '0')
  15011. && (Charger.memory.EVSE_Config.data.item.ModelName[9] == '9');
  15012. #ifdef FUNC_AXSJ_USE_NEW_NACS_PCB
  15013. Charger.m_bModelNameAX80_NACS_1P |= Charger.m_bModelNameAXSJ_AX80_NACS_1P;
  15014. #endif
  15015. #ifdef ADD_AX_NACS_PCB_USE_GEN_CODE_3
  15016. Charger.m_bModelNameAX80_NACS_1P |= (Charger.m_bModelNameAX80_1P && Charger.memory.EVSE_Config.data.item.ModelName[11] == '3');
  15017. #endif
  15018. XP("#ModelNameAX80_NACS_1P: %s\r\n", Charger.m_bModelNameAX80_NACS_1P ? "True" : "False");
  15019. #ifdef FUNC_LIN_EN_SW
  15020. if (Charger.m_bModelNameAX80_NACS_1P)
  15021. {
  15022. LIN_SW(HTK_FALSE); //PWM
  15023. }
  15024. #endif //FUNC_LIN_EN_SW
  15025. #endif //FUNC_AX80_NACS
  15026. Charger.m_bModelNameAX32_3P = Charger.m_bModelNameAX &&
  15027. (
  15028. Charger.m_b3PhaseModel
  15029. // && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '2')
  15030. // && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '2')
  15031. // && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1')
  15032. ) ? 1 : 0;
  15033. XP("#ModelNameAX32_3P: %s\r\n", Charger.m_bModelNameAX32_3P ? "True" : "False");
  15034. #ifdef FUNC_AW48
  15035. Charger.m_bModelNameAW48_1P = !Charger.m_bModelNameAX &&
  15036. (
  15037. !Charger.m_b3PhaseModel
  15038. && (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'A')
  15039. && (Charger.memory.EVSE_Config.data.item.ModelName[1] == 'W')
  15040. && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '1')
  15041. && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '1')
  15042. && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1')
  15043. ) ? 1 : 0;
  15044. XP("#ModelNameAW48_1P: %s\r\n", Charger.m_bModelNameAW48_1P ? "True" : "False");
  15045. #ifdef MODIFY_AW48_CCID_UL_SPEC_KENNY_20240401
  15046. if (Charger.m_bModelNameAW48_1P)
  15047. {
  15048. Charger.alarm_spec.Current_LEAK_AC = 1700 ; // unit 0.01mA
  15049. }
  15050. #endif //MODIFY_AW48_CCID_UL_SPEC_KENNY_20240401
  15051. #ifdef FUNC_LIN_EN_SW
  15052. if (Charger.m_bModelNameAW48_1P)
  15053. {
  15054. LIN_SW(HTK_FALSE); //PWM
  15055. }
  15056. #endif //FUNC_LIN_EN_SW
  15057. #ifdef FUNC_AW48_EXT_LED
  15058. if (Charger.m_bModelNameAW48_1P)
  15059. {
  15060. EXTLED_SET_POWER(1);
  15061. }
  15062. #endif //FUNC_AW48_EXT_LED
  15063. #endif //FUNC_AW48
  15064. #ifdef RELAY_COMMON_GPIO
  15065. if (Charger.m_bModelNameAW48_1P)
  15066. {
  15067. #ifdef AW48_NEW_PCB_WITH_CORRECT_RELAY_PIN
  15068. Charger.m_RelayMode = 0; //New PCB
  15069. #else
  15070. Charger.m_RelayMode = 1;
  15071. #endif
  15072. }
  15073. else
  15074. {
  15075. Charger.m_RelayMode = 0;
  15076. }
  15077. XP("#RelayMode: %d\r\n", Charger.m_RelayMode);
  15078. #endif
  15079. #ifdef FUNC_EKM_OMNIMETER
  15080. Charger.m_bUseExtMeter_OMNIMETER = Charger.m_bModelNameAW48_1P;
  15081. XP("#UseExtMeter_OMNIMETER: %s\r\n", Charger.m_bUseExtMeter_OMNIMETER ? "True" : "False");
  15082. #endif
  15083. #ifdef FUNC_LIN_CP
  15084. Charger.m_bUseLinCP = Charger.m_bModelNameAW48_1P;
  15085. XP("#UseLinCP: %s\r\n", Charger.m_bUseLinCP ? "True" : "False");
  15086. #endif //FUNC_AW48
  15087. #endif //FUNC_AX80
  15088. #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU
  15089. UpdateFirmwareVersion();
  15090. #endif
  15091. #ifdef FUNC_NEW_RELAY_MONITOR
  15092. if (Charger.m_b3PhaseModel == 0)
  15093. {
  15094. //AX48 (1P) LN/LL use same formula
  15095. Charger.alarm_spec.Relay_LL_DriveFault_Slop = 0.003266332;
  15096. Charger.alarm_spec.Relay_LL_DriveFault_Offs = 0.28;
  15097. #ifdef MODIFY_AW48_WELDING_THRESHOLD_KENNY_20240418
  15098. if (Charger.m_bModelNameAW48_1P)
  15099. {
  15100. Charger.alarm_spec.Relay_LL_Welding_Slop = 0.001894;
  15101. Charger.alarm_spec.Relay_LL_Welding_Offs = 0.093333333;
  15102. }
  15103. else
  15104. #endif //MODIFY_AW48_WELDING_THRESHOLD_KENNY_20240418
  15105. {
  15106. Charger.alarm_spec.Relay_LL_Welding_Slop = 0.00318258;
  15107. Charger.alarm_spec.Relay_LL_Welding_Offs = 0.093333333;
  15108. }
  15109. }
  15110. else
  15111. {
  15112. //AX32 (3P) only LL
  15113. Charger.alarm_spec.Relay_LL_DriveFault_Slop = 0.003661263;
  15114. Charger.alarm_spec.Relay_LL_DriveFault_Offs = 1.340704304;
  15115. Charger.alarm_spec.Relay_LL_Welding_Slop = 0.002794857;
  15116. Charger.alarm_spec.Relay_LL_Welding_Offs = 0.391911683;
  15117. }
  15118. #endif //FUNC_NEW_RELAY_MONITOR
  15119. #ifdef FUNC_METER_IC_VARIABLE_PARAM
  15120. #ifdef FUNC_AX80
  15121. if (Charger.m_bModelNameAX80_1P)
  15122. {
  15123. MeterIC_KI = KI_AX80;
  15124. MeterIC_KP = KP_AX80;
  15125. MeterIC_KE = KE_AX80;
  15126. }
  15127. else if (Charger.m_bModelNameAX48_1P)
  15128. {
  15129. MeterIC_KI = KI_AX48;
  15130. MeterIC_KP = KP_AX48;
  15131. MeterIC_KE = KE_AX48;
  15132. }
  15133. else if (Charger.m_bModelNameAX32_3P)
  15134. {
  15135. MeterIC_KI = KI_AX32;
  15136. MeterIC_KP = KP_AX32;
  15137. MeterIC_KE = KE_AX32;
  15138. }
  15139. #ifdef FUNC_AT32
  15140. else if (Charger.m_bModelNameAT32_3P)
  15141. {
  15142. MeterIC_KI = KI_AT32;
  15143. MeterIC_KP = KP_AT32;
  15144. MeterIC_KE = KE_AT32;
  15145. }
  15146. #endif
  15147. #ifdef FUNC_AW48
  15148. else if (Charger.m_bModelNameAW48_1P)
  15149. {
  15150. MeterIC_KI = KI_AW48;
  15151. MeterIC_KP = KP_AW48;
  15152. MeterIC_KE = KE_AW48;
  15153. }
  15154. #endif
  15155. else
  15156. {
  15157. MeterIC_KI = KI_AX48;
  15158. MeterIC_KP = KP_AX48;
  15159. MeterIC_KE = KE_AX48;
  15160. }
  15161. XP("#MeterIC KI = %.10f, KP = %.10f, KE = %.10f\r\n", MeterIC_KI, MeterIC_KP, MeterIC_KE);
  15162. #else //FUNC_AX80
  15163. if (Charger.m_b3PhaseModel == 0)
  15164. {
  15165. MeterIC_KI = KI_AX48;
  15166. MeterIC_KP = KP_AX48;
  15167. MeterIC_KE = KE_AX48;
  15168. }
  15169. else
  15170. {
  15171. MeterIC_KI = KI_AX32;
  15172. MeterIC_KP = KP_AX32;
  15173. MeterIC_KE = KE_AX32;
  15174. }
  15175. #endif //FUNC_AX80
  15176. #endif //FUNC_METER_IC_VARIABLE_PARAM
  15177. #ifdef MODIFY_OTP_SPEC
  15178. #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR
  15179. if (Charger.m_bModelNameAX80_1P)
  15180. {
  15181. #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  15182. if (Charger.m_bModelNameAX80_NACS_1P)
  15183. {
  15184. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX80_NACS;
  15185. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX80_NACS;
  15186. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX80_NACS;
  15187. Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AX80_NACS;
  15188. Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AX80_NACS;
  15189. Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AX80_NACS;
  15190. #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  15191. Charger.alarm_spec.OT_G3_1 = ALARM_SPEC_OT_G3_1_AX80_NACS;
  15192. Charger.alarm_spec.OT_G3_2 = ALARM_SPEC_OT_G3_2_AX80_NACS;
  15193. Charger.alarm_spec.OT_G3_HYSTERESIS = ALARM_SPEC_OT_G3_HYSTERESIS_AX80_NACS;
  15194. Charger.alarm_spec.OT_G4_1 = ALARM_SPEC_OT_G4_1_AX80_NACS;
  15195. Charger.alarm_spec.OT_G4_2 = ALARM_SPEC_OT_G4_2_AX80_NACS;
  15196. Charger.alarm_spec.OT_G4_HYSTERESIS = ALARM_SPEC_OT_G4_HYSTERESIS_AX80_NACS;
  15197. #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK
  15198. }
  15199. else
  15200. {
  15201. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX80;
  15202. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX80;
  15203. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX80;
  15204. Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AX80;
  15205. Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AX80;
  15206. Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AX80;
  15207. }
  15208. #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  15209. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX80;
  15210. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX80;
  15211. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX80;
  15212. Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AX80;
  15213. Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AX80;
  15214. Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AX80;
  15215. #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR
  15216. }
  15217. #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR
  15218. else if (Charger.m_bModelNameAW48_1P)
  15219. {
  15220. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AW48;
  15221. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AW48;
  15222. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AW48;
  15223. Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AW48;
  15224. Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AW48;
  15225. Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AW48;
  15226. #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  15227. Charger.alarm_spec.OT_G3_1 = ALARM_SPEC_OT_G3_1_AW48;
  15228. Charger.alarm_spec.OT_G3_2 = ALARM_SPEC_OT_G3_2_AW48;
  15229. Charger.alarm_spec.OT_G3_HYSTERESIS = ALARM_SPEC_OT_G3_HYSTERESIS_AW48;
  15230. #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN
  15231. #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  15232. Charger.alarm_spec.OT_G4_1 = ALARM_SPEC_OT_G4_1_AW48;
  15233. Charger.alarm_spec.OT_G4_2 = ALARM_SPEC_OT_G4_2_AW48;
  15234. Charger.alarm_spec.OT_G4_HYSTERESIS = ALARM_SPEC_OT_G4_HYSTERESIS_AW48;
  15235. #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN
  15236. }
  15237. #endif
  15238. #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  15239. else if (Charger.m_bModelNameAX48_NACS_1P)
  15240. {
  15241. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX48_NACS;
  15242. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX48_NACS;
  15243. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX48_NACS;
  15244. Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AX48_NACS;
  15245. Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AX48_NACS;
  15246. Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AX48_NACS;
  15247. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  15248. Charger.alarm_spec.OT_G3_1 = ALARM_SPEC_OT_G3_1_AX48_NACS;
  15249. Charger.alarm_spec.OT_G3_2 = ALARM_SPEC_OT_G3_2_AX48_NACS;
  15250. Charger.alarm_spec.OT_G3_HYSTERESIS = ALARM_SPEC_OT_G3_HYSTERESIS_AX48_NACS;
  15251. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN
  15252. #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  15253. Charger.alarm_spec.OT_G4_1 = ALARM_SPEC_OT_G4_1_AX48_NACS;
  15254. Charger.alarm_spec.OT_G4_2 = ALARM_SPEC_OT_G4_2_AX48_NACS;
  15255. Charger.alarm_spec.OT_G4_HYSTERESIS = ALARM_SPEC_OT_G4_HYSTERESIS_AX48_NACS;
  15256. #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN
  15257. }
  15258. #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR
  15259. else if (Charger.m_bModelNameAX48_1P)
  15260. {
  15261. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX48;
  15262. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX48;
  15263. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX48;
  15264. }
  15265. else if (Charger.m_bModelNameAX32_3P)
  15266. {
  15267. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX32;
  15268. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX32;
  15269. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX32;
  15270. }
  15271. #ifdef FUNC_AT32
  15272. else if (Charger.m_bModelNameAT32_3P)
  15273. {
  15274. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AT32;
  15275. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AT32;
  15276. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AT32;
  15277. }
  15278. #endif
  15279. else
  15280. {
  15281. Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX48;
  15282. Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX48;
  15283. Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX48;
  15284. }
  15285. #else //FUNC_AX80_ADD_4_TEMP_SENEOR
  15286. if (Charger.m_b3PhaseModel == 0)
  15287. {
  15288. Charger.alarm_spec.OT_1 = ALARM_SPEC_OT_1_AX48;
  15289. Charger.alarm_spec.OT_2 = ALARM_SPEC_OT_2_AX48;
  15290. Charger.alarm_spec.OT_HYSTERESIS = ALARM_SPEC_OT_HYSTERESIS_AX48;
  15291. }
  15292. else
  15293. {
  15294. Charger.alarm_spec.OT_1 = ALARM_SPEC_OT_1_AX32;
  15295. Charger.alarm_spec.OT_2 = ALARM_SPEC_OT_2_AX32;
  15296. Charger.alarm_spec.OT_HYSTERESIS = ALARM_SPEC_OT_HYSTERESIS_AX32;
  15297. }
  15298. #endif //FUNC_AX80_ADD_4_TEMP_SENEOR
  15299. #endif //MODIFY_OTP_SPEC
  15300. #endif //FUNC_AUTO_IGNORE_AC_PHASE
  15301. #ifdef FUNC_AUTO_USE_EXT_METER
  15302. #ifdef FUNC_FORCE_USE_METER_EXT_PRO380
  15303. Charger.m_bUseExtMeter_PRO380 = 1;
  15304. XP("#UseExtMeter: FORCE Enable\r\n");
  15305. #else
  15306. Charger.m_bUseExtMeter_PRO380 =
  15307. (
  15308. (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'M')
  15309. #ifndef FUNC_PTB_METER_WM3M4C
  15310. || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'P')
  15311. #endif
  15312. || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'I')
  15313. || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'F')
  15314. || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'L')
  15315. #ifdef TEST_METER_PRO380_AND_WM3M4C_AT_THE_SAME_TIME_USE_MODELNAME_IDX_3_X
  15316. || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'x')
  15317. #endif
  15318. ) ? 1 : 0;
  15319. XP("#UseExtMeter_PRO380: %s\r\n", Charger.m_bUseExtMeter_PRO380 ? "Enable" : "Disable");
  15320. #endif //FUNC_FORCE_USE_METER_EXT_PRO380
  15321. #ifdef FUNC_PTB_METER_WM3M4C
  15322. Charger.m_bUseExtMeter_WM3M4C =
  15323. (
  15324. Charger.memory.EVSE_Config.data.item.ModelName[3] == 'P'
  15325. #ifdef TEST_METER_PRO380_AND_WM3M4C_AT_THE_SAME_TIME_USE_MODELNAME_IDX_3_X
  15326. || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'x')
  15327. #endif
  15328. ) ? 1 : 0;
  15329. XP("#UseExtMeter_WM3M4C: %s\r\n", Charger.m_bUseExtMeter_WM3M4C ? "Enable" : "Disable");
  15330. #endif //FUNC_PTB_METER_WM3M4C
  15331. #ifdef FUNC_ADD_TILT_SENSOR_MODEL
  15332. {
  15333. Charger.m_bUseTiltSensor =
  15334. (
  15335. Charger.m_bModelNameAX80_1P
  15336. || Charger.m_bModelNameAX48_NACS_1P
  15337. #ifdef FUNC_AX80_NACS
  15338. || Charger.m_bModelNameAX80_NACS_1P
  15339. #endif
  15340. #ifdef FUNC_AW48
  15341. || Charger.m_bModelNameAW48_1P
  15342. #endif
  15343. ) ? 1 : 0;
  15344. XP("#UseTiltSensor: %s\r\n", Charger.m_bUseTiltSensor ? "Enable" : "Disable");
  15345. }
  15346. #endif //FUNC_ADD_TILT_SENSOR_MODEL
  15347. #endif //FUNC_AUTO_USE_EXT_METER
  15348. #ifdef FUNC_RS485_SLAVE
  15349. Charger.m_bRS485SlaveForDCModel =
  15350. (
  15351. (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'D') //response to DC Model
  15352. ) ? 1 : 0;
  15353. Charger.m_RS485SlaveAddr = (Charger.m_bRS485SlaveForDCModel ? PROTOCOL_ADDR_AC_MAINBOARD : PROTOCOL_ADDR);
  15354. #endif
  15355. #ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME
  15356. Charger.m_bModelNameDC =
  15357. (
  15358. (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'D') //response to DC Model
  15359. ) ? 1 : 0;
  15360. Charger.m_bModelNameDCReadOK = 1;
  15361. XP("#ModelNameDC: %s\r\n", Charger.m_bModelNameDC ? "True" : "False");
  15362. Update_McuCtrlMode();
  15363. #endif
  15364. #ifdef FUNC_CSU_SIGN_IN_VERIFY
  15365. Charger.m_bCsuSignInMustVerify = (Charger.m_bModelNameAW48_1P && (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU));
  15366. XP("#CsuSignInMustVerify: %s\r\n", Charger.m_bCsuSignInMustVerify ? "True" : "False");
  15367. #endif
  15368. #ifdef FUNC_CSU_UPGRADE_FW_VERIFY
  15369. Charger.m_bCsuUpgradeFwMustVerify = (Charger.m_bModelNameAW48_1P && (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU));
  15370. XP("#CsuUpgradeFwMustVerify: %s\r\n", Charger.m_bCsuUpgradeFwMustVerify ? "True" : "False");
  15371. #endif
  15372. #ifdef FUNC_DETECT_PP
  15373. {
  15374. HTK_BOOL bDetectPP = HTK_FALSE;
  15375. for (uint8_t i = 7; i <= 9; i++)
  15376. {
  15377. bDetectPP |=
  15378. (
  15379. Charger.memory.EVSE_Config.data.item.ModelName[i] == '2' //IEC 62196-2 Type 1 / SAE J1772 Socket
  15380. || Charger.memory.EVSE_Config.data.item.ModelName[i] == '4' //IEC 62196-2 Type 2 Socket
  15381. || Charger.memory.EVSE_Config.data.item.ModelName[i] == '6' //GB/T AC Socket
  15382. ) ? HTK_TRUE : HTK_FALSE;
  15383. }
  15384. Charger.m_bDetectPP = bDetectPP;
  15385. XP("#DetectPP: %s\r\n", Charger.m_bDetectPP ? "Enable" : "Disable");
  15386. }
  15387. #endif //FUNC_DETECT_PP
  15388. #ifdef FUNC_DETECT_PP_NACS
  15389. {
  15390. HTK_BOOL bDetectPP_NACS = HTK_FALSE;
  15391. #ifdef FUNC_AX80_NACS
  15392. bDetectPP_NACS = Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P;
  15393. #else
  15394. bDetectPP_NACS = Charger.m_bModelNameAX48_NACS_1P;
  15395. #endif
  15396. Charger.m_bDetectPP_NACS = bDetectPP_NACS;
  15397. XP("#DetectPP_NACS: %s\r\n", Charger.m_bDetectPP_NACS ? "Enable" : "Disable");
  15398. }
  15399. #endif //FUNC_DETECT_PP_NACS
  15400. #ifdef FUNC_GUN_LOCK
  15401. {
  15402. HTK_BOOL bUseGunLock = HTK_FALSE;
  15403. for (uint8_t i = 7; i <= 9; i++)
  15404. {
  15405. bUseGunLock |=
  15406. (
  15407. Charger.memory.EVSE_Config.data.item.ModelName[i] == '2' //IEC 62196-2 Type 1 / SAE J1772 Socket
  15408. || Charger.memory.EVSE_Config.data.item.ModelName[i] == '4' //IEC 62196-2 Type 2 Socket
  15409. || Charger.memory.EVSE_Config.data.item.ModelName[i] == '6' //GB/T AC Socket
  15410. ) ? HTK_TRUE : HTK_FALSE;
  15411. }
  15412. Charger.m_bUseGunLock = bUseGunLock;
  15413. XP("#UseGunLock: %s\r\n", Charger.m_bUseGunLock ? "Enable" : "Disable");
  15414. #ifdef FUNC_GUN_LOCK_TRIG_MODE
  15415. if (IS_CSU_MOUNTED) //CSU Mounted
  15416. {
  15417. Charger.m_GunLockTrigMode = GL_TRIG_MODE_REQUEST;
  15418. Charger.m_GunLockRequestMode_LockDelayTick = 0;
  15419. }
  15420. else //No CSU Mounted or DC Model
  15421. {
  15422. Charger.m_GunLockTrigMode = GL_TRIG_MODE_RELAY;
  15423. }
  15424. XP("#GunLockTrigMode: %d\r\n", (int)Charger.m_GunLockTrigMode);
  15425. #endif
  15426. }
  15427. #endif //FUNC_GUN_LOCK
  15428. #ifdef FUNC_USE_RELAY_B_CONTACT
  15429. {
  15430. HTK_BOOL bUseRelayBContact = HTK_FALSE;
  15431. bUseRelayBContact = Charger.m_b3PhaseModel;
  15432. ////#ifdef DISABLE_USE_RELAY_B_CONTACT_WITH_DC_MODELNAME
  15433. //// if (Charger.m_bModelNameDC)
  15434. //// bUseRelayBContact = HTK_FALSE;
  15435. ////#endif
  15436. #ifdef DISABLE_USE_RELAY_B_CONTACT_WITH_AX32_OLD_PCB
  15437. bUseRelayBContact = HTK_FALSE;
  15438. #endif
  15439. Charger.m_bUseRelayBContact = bUseRelayBContact;
  15440. XP("#UseRelayBContact: %s\r\n", Charger.m_bUseRelayBContact ? "True" : "False");
  15441. }
  15442. #endif //FUNC_USE_RELAY_B_CONTACT
  15443. #ifdef FUNC_OUTP_TYPE_E
  15444. {
  15445. //#ifdef FUNC_USE_MODELNAME_TO_JUDGE_TYPEE_ENABLE
  15446. // HTK_BOOL bEnableTypeE = HTK_FALSE;
  15447. // for (uint8_t i = 7; i <= 9; i++)
  15448. // {
  15449. // bEnableTypeE |=
  15450. // (
  15451. // Charger.memory.EVSE_Config.data.item.ModelName[i] == '8' //Type E Socket
  15452. // ) ? HTK_TRUE : HTK_FALSE;
  15453. //
  15454. // }
  15455. // Charger.m_bEnableTypeE = bEnableTypeE;
  15456. //#else
  15457. #ifdef FUNC_ENABLE_TYPE_E_ONLY_IN_AX32
  15458. Charger.m_bEnableTypeE = Charger.m_b3PhaseModel;
  15459. #else
  15460. Charger.m_bEnableTypeE = HTK_TRUE;
  15461. #endif
  15462. //#endif //FUNC_USE_MODELNAME_TO_JUDGE_TYPEE_ENABLE
  15463. XP("#TypeE: %s\r\n", Charger.m_bEnableTypeE ? "Enable" : "Disable");
  15464. }
  15465. #endif //FUNC_OUTP_TYPE_E
  15466. #ifdef FUNC_CP_ADC_MODIFY
  15467. #ifdef NEW_CP_SPEC
  15468. CpDetectModuleInitialize(Charger.memory.EVSE_Config.data.item.ModelName[3]);
  15469. Charger.m_bCpDetectModuleInitOK = 1;
  15470. #endif //NEW_CP_SPEC
  15471. #endif //FUNC_CP_ADC_MODIFY
  15472. #ifdef FUNC_RULE_GB_202108
  15473. Charger.m_bSafetyRegulationGB = (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'G');
  15474. #endif
  15475. #ifdef FUNC_UPDATE_ROTARY_SWITCH_SETTING_AFTER_PARSE_MODELNAME
  15476. getRotarySwitchSetting();
  15477. #endif
  15478. }
  15479. void HTK_ByteArray2HexStr(const u8* buf, const u16 BegIdx, const u16 len, char* OutStr, u16 nMaxBytesPerLine, HTK_BOOL bSpace)
  15480. {
  15481. char sTmp[8] = { 0 };
  15482. strcpy(OutStr, "\0");
  15483. for (u16 i = BegIdx; i < (BegIdx + len); i++)
  15484. {
  15485. sprintf(sTmp, bSpace ? "%02X " : "%02X", buf[i]);
  15486. strcat(OutStr, sTmp);
  15487. if ((i - BegIdx) % nMaxBytesPerLine == (nMaxBytesPerLine - 1))
  15488. {
  15489. strcat(OutStr, "\r\n");
  15490. }
  15491. }
  15492. }
  15493. void HTK_ByteArray2HexStr_XP(const char* Title, const u8* buf, const u16 BegIdx, const u16 len)
  15494. {
  15495. static char OutStr[1024 * 3 + 8] = { 0 };
  15496. HTK_ByteArray2HexStr(buf, BegIdx, len, OutStr, 0, HTK_TRUE);
  15497. XP("[%s] %s(%d)\r\n", (Title == NULL ? "" : Title), OutStr, len);
  15498. }
  15499. void HTK_ByteArray2HexStr_XT(const char* Title, const u8* buf, const u16 BegIdx, const u16 len)
  15500. {
  15501. static char OutStr[1024 * 3 + 8] = { 0 };
  15502. HTK_ByteArray2HexStr(buf, BegIdx, len, OutStr, 0, HTK_TRUE);
  15503. XT("[%s] %s(%d)\r\n", (Title == NULL ? "" : Title), OutStr, len);
  15504. }
  15505. #ifdef ENABLE_PRINT_IMCP_MSG
  15506. int CheckPrintImcpMsg(uint8_t MsgID)
  15507. {
  15508. #ifdef ENABLE_PRINT_IMCP_SPEC_MSG
  15509. return
  15510. (
  15511. // MsgID == PROTOCOL_MESSAGE_CONFIG_PARAMETER
  15512. // || MsgID == PROTOCOL_MESSAGE_QUERY_METER_IC_MEAS_PARAMETER
  15513. // || MsgID == PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_PARAMETER
  15514. // || MsgID == PROTOCOL_MESSAGE_CONFIG_METER_IC_CALI_PARAMETER
  15515. MsgID == PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT
  15516. || MsgID == PROTOCOL_MESSAGE_CONFIG_MAX_CURRENT_PWM_DUTY
  15517. || MsgID == PROTOCOL_MESSAGE_CONFIG_LEGACY_REQUEST
  15518. );
  15519. #else
  15520. return true;
  15521. #endif //ENABLE_PRINT_IMCP_SPEC_MSG
  15522. }
  15523. #endif //ENABLE_PRINT_IMCP_MSG
  15524. #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
  15525. void ColdLoadPickup_Delay(const char* Description)
  15526. {
  15527. //osDelay((rand()%175000)+5000);
  15528. int r = rand();
  15529. if (r < 0)
  15530. {
  15531. r = (-1) * r;
  15532. }
  15533. //uint32_t dt = (r % 175000) + 5000; //ms
  15534. uint32_t dt = (r % (COLD_LOAD_PICKUP_DELAY_TIME_MAX_RANGE_SEC * 1000)) + 5000; //ms
  15535. XP("ColdLoadPickup_Delay(ms) [%s]: %d\r\n", Description, dt);
  15536. osDelay(dt);
  15537. }
  15538. #endif
  15539. #ifdef MODIFY_CP_TASK_CTRL_CP_PWM
  15540. uint16_t GetCpPwmDuty(uint16_t Curr)
  15541. {
  15542. #ifdef FUNC_AX80
  15543. if (Curr > Charger.maxRatingCurrent)
  15544. {
  15545. Curr = Charger.maxRatingCurrent;
  15546. }
  15547. #endif
  15548. #ifdef FUNC_DETECT_PP
  15549. if (Charger.m_bDetectPP)
  15550. {
  15551. PPPInfo p = &Charger.m_PPInfo;
  15552. if (Curr > p->m_CurCurr)
  15553. Curr = p->m_CurCurr;
  15554. if (p->m_PreCurr != p->m_CurCurr)
  15555. p->m_PreCurr = p->m_CurCurr;
  15556. }
  15557. #endif
  15558. #ifdef FUNC_AX80
  15559. uint16_t rtn = 0;
  15560. if (Curr >= 6 && Curr <= 51)
  15561. {
  15562. rtn = (uint16_t)((Curr / 0.6) * 10);
  15563. }
  15564. else if (Curr > 51 && Curr <= 80)
  15565. {
  15566. rtn = (uint16_t)((Curr / 2.5 + 64) * 10);
  15567. }
  15568. #else
  15569. uint16_t rtn = (uint16_t)((Curr / 0.6) * 10);
  15570. #endif
  15571. XP("#GetCpPwmDuty(%d) => %d\r\n", Curr, rtn);
  15572. return rtn;
  15573. }
  15574. #endif
  15575. #ifdef HTK
  15576. u8 GetBit1Num(u32 x)
  15577. {
  15578. u8 Num = 0;
  15579. while (x)
  15580. {
  15581. Num++;
  15582. x &= (x - 1);
  15583. }
  15584. return Num;
  15585. }
  15586. HTK_BOOL HTK_IsInTime(u32 BegTick, u32 MaxTick)
  15587. {
  15588. u32 EndTick = HAL_GetTick();
  15589. u32 ElapseTick = (EndTick >= BegTick ? EndTick - BegTick : HTK_U32_MAX - BegTick + EndTick);
  15590. return ElapseTick <= MaxTick ? HTK_TRUE : HTK_FALSE;
  15591. }
  15592. HTK_BOOL HTK_IsTimeout(u32 BegTick, u32 MaxTick)
  15593. {
  15594. u32 EndTick = HAL_GetTick();
  15595. u32 ElapseTick = (EndTick >= BegTick ? EndTick - BegTick : HTK_U32_MAX - BegTick + EndTick);
  15596. return ElapseTick > MaxTick ? HTK_TRUE : HTK_FALSE;
  15597. }
  15598. void HTK_Timer_Reset(PHTK_Timer p)
  15599. {
  15600. //XP("#<Timer reset>\r\n\r\n");
  15601. p->m_bStart = HTK_FALSE;
  15602. p->m_bTimeout = HTK_FALSE;
  15603. p->m_BegTick = 0;
  15604. p->m_MaxTick = 0;
  15605. }
  15606. void HTK_Timer_Start(PHTK_Timer p, u32 MaxTick)
  15607. {
  15608. //XP("#<Timer start>\r\n\r\n");
  15609. p->m_bStart = HTK_TRUE;
  15610. p->m_BegTick = HAL_GetTick();
  15611. p->m_MaxTick = MaxTick;
  15612. }
  15613. HTK_BOOL HTK_Timer_CheckTimeout(PHTK_Timer p)
  15614. {
  15615. // return HTK_IsTimeout(p->m_BegTick, p->m_MaxTick);
  15616. HTK_BOOL rtn = HTK_IsTimeout(p->m_BegTick, p->m_MaxTick);
  15617. if (rtn == HTK_TRUE)
  15618. {
  15619. //XP("#<Timer timeout>\r\n\r\n");
  15620. p->m_bTimeout = HTK_TRUE;
  15621. }
  15622. return rtn;
  15623. }
  15624. uint8_t HTK_CheckSum_Calulate(uint8_t* pBeg, uint32_t len)
  15625. {
  15626. if (pBeg != NULL)
  15627. {
  15628. uint8_t CheckSum = 0;
  15629. for (uint32_t i = 0; i < len; i++)
  15630. {
  15631. CheckSum ^= *(pBeg + i);
  15632. }
  15633. return CheckSum;
  15634. }
  15635. else
  15636. {
  15637. return 0;
  15638. }
  15639. }
  15640. HTK_BOOL HTK_CheckSum_Update(uint8_t* pBeg, uint32_t len, uint8_t* pCheckSum)
  15641. {
  15642. if (pBeg != NULL && pCheckSum != NULL)
  15643. {
  15644. uint8_t CheckSum = HTK_CheckSum_Calulate(pBeg, len);
  15645. *pCheckSum = CheckSum;
  15646. return HTK_TRUE;
  15647. }
  15648. else
  15649. {
  15650. return HTK_FALSE;
  15651. }
  15652. }
  15653. HTK_BOOL HTK_CheckSum_IsOK(uint8_t* pBeg, uint32_t len, uint8_t* pCheckSum)
  15654. {
  15655. if (pBeg != NULL && pCheckSum != NULL)
  15656. {
  15657. uint8_t CheckSum = HTK_CheckSum_Calulate(pBeg, len);
  15658. return (*pCheckSum == CheckSum) ? HTK_TRUE : HTK_FALSE;
  15659. }
  15660. else
  15661. {
  15662. return HTK_FALSE;
  15663. }
  15664. }
  15665. HTK_BOOL HTK_HexStrToByteArray(byte* Dst, int DstLen, const char* Src, int SrcLen)
  15666. {
  15667. if (DstLen * 2 + 1 != SrcLen)
  15668. return HTK_FALSE;
  15669. char buf[3] = { 0 };
  15670. for (int i = 0; i < DstLen; i++)
  15671. {
  15672. memcpy(buf, &Src[i * 2], 2);
  15673. Dst[i] = strtol(buf, NULL, 16);
  15674. }
  15675. return HTK_TRUE;
  15676. }
  15677. void HTK_FillChar(char* buf, char c, int count)
  15678. {
  15679. if (buf != NULL)
  15680. {
  15681. memset(buf, c, count);
  15682. buf[count] = '\0';
  15683. }
  15684. }
  15685. void HTK_PrintRow(char c, int count)
  15686. {
  15687. enum { MAX = 80 };
  15688. static char s_row[MAX + 1] = { 0 };
  15689. static int s_count = 0;
  15690. if (count > MAX)
  15691. {
  15692. count = MAX;
  15693. }
  15694. if (c != s_row[0] || count != s_count)
  15695. {
  15696. HTK_FillChar(s_row, c, count);
  15697. }
  15698. s_count = count;
  15699. XP("%s\r\n", s_row);
  15700. return;
  15701. }
  15702. static HTK_MallocHandle s_MallocHandle;
  15703. void HTK_Malloc_Init(void)
  15704. {
  15705. memset(&s_MallocHandle, 0, sizeof(s_MallocHandle));
  15706. //XP("HTK_Malloc_Init(): %d\r\n", HTK_Malloc_BlockTest(1024));
  15707. //XP("HTK_Malloc_Init(): %d\r\n", HTK_Malloc_BlockTest(8000));
  15708. XP("HTK_Malloc_Init(): %d\r\n", HTK_Malloc_BlockTest(512));
  15709. }
  15710. void* HTK_Malloc(s32 size)
  15711. {
  15712. void* p = malloc(size);
  15713. if (p != NULL)
  15714. {
  15715. s_MallocHandle.m_Allocated += size;
  15716. s_MallocHandle.m_Reserved -= size;
  15717. memset(p, 0, size);
  15718. }
  15719. XP("HTK_Malloc(%d) %s\r\n", size, (p == NULL) ? "*** [NG] ***" : "OK");
  15720. return p;
  15721. }
  15722. void HTK_Free(void* p)
  15723. {
  15724. if (p != NULL)
  15725. {
  15726. free(p);
  15727. p = NULL;
  15728. XP("HTK_Free: OK\r\n");
  15729. }
  15730. }
  15731. s32 HTK_Malloc_BlockTest(s32 size)
  15732. {
  15733. int Total = 0;
  15734. for (int i = 1; ; i++)
  15735. {
  15736. void* p = HTK_Malloc(size);
  15737. if (p == NULL)
  15738. {
  15739. break;
  15740. }
  15741. else
  15742. {
  15743. Total += size;
  15744. }
  15745. }
  15746. s_MallocHandle.m_Total = Total;
  15747. s_MallocHandle.m_Allocated = 0;
  15748. s_MallocHandle.m_Reserved = Total;
  15749. return Total;
  15750. }
  15751. #ifdef FUNC_SALT_AND_BLEND
  15752. int Salt(u8* Mixture, int MixtureLen, u8* SaltMap, int SaltMapLen, u8* Data, int DataLen, u8 bRestore)
  15753. {
  15754. int SaltMapLenMin = GET_BOX_NUM(MixtureLen, 8);
  15755. if (Mixture == NULL || SaltMap == NULL || Data == NULL || DataLen > MixtureLen || SaltMapLen < SaltMapLenMin)
  15756. return FAIL;
  15757. int SaltUsed = 0; //0 ~ (MixtureLen - DataLen)
  15758. int i = 0; //0 ~ (MixtureLen - 1)
  15759. int j = 0; //0 ~ (DataLen - 1)
  15760. if (bRestore)
  15761. {
  15762. memset(Data, 0, DataLen);
  15763. for (; i < MixtureLen; i++)
  15764. {
  15765. if (BIT_GET(SaltMap[i / 8], i % 8) == 0)
  15766. {
  15767. Data[j++] = Mixture[i];
  15768. if (j == DataLen)
  15769. {
  15770. return PASS;
  15771. }
  15772. }
  15773. }
  15774. }
  15775. else
  15776. {
  15777. memset(Mixture, 0, MixtureLen);
  15778. memset(SaltMap, 0, SaltMapLen);
  15779. for (; i < MixtureLen; i++)
  15780. {
  15781. if (rand() % 2 == 0) //insert Data
  15782. {
  15783. if (j < DataLen)
  15784. {
  15785. Mixture[i] = Data[j++];
  15786. }
  15787. else
  15788. {
  15789. Mixture[i] = rand() % 0x100;
  15790. BIT_SET(SaltMap[i / 8], i % 8);
  15791. }
  15792. }
  15793. else //insert Salt
  15794. {
  15795. if (SaltUsed < (MixtureLen - DataLen))
  15796. {
  15797. Mixture[i] = rand() % 0x100;
  15798. BIT_SET(SaltMap[i / 8], i % 8);
  15799. SaltUsed++;
  15800. }
  15801. else
  15802. {
  15803. Mixture[i] = Data[j++];
  15804. }
  15805. }
  15806. }
  15807. }
  15808. return PASS;
  15809. }
  15810. int Blend(u8* Dst, u8* Src, int Len, u8 ShiftType, u8 bRestore)
  15811. {
  15812. if (Dst == NULL || Src == NULL || Len == 0)
  15813. return FAIL;
  15814. int n = 0;
  15815. if (ShiftType == 1) //u8
  15816. {
  15817. for (int i = 0; i < Len; i++)
  15818. {
  15819. u8 x = Src[i];
  15820. n = ((GetBit1Num(x) + i + 3) % 7 + 1) * (bRestore ? (-1) : (1));
  15821. Dst[i] = LOOP_SHIFT_U8(x, n);
  15822. }
  15823. }
  15824. // else if (ShiftType == 2) //u16
  15825. // {
  15826. // for (int i = 0; i < (Len / ShiftType); i += ShiftType)
  15827. // {
  15828. // u16 x = HTK_U16(Src[i]);
  15829. // n = ((GetBit1Num(x) + i + 5) % 15 + 1) * (bRestore ? (-1) : (1));
  15830. // HTK_U16(Dst[i]) = LOOP_SHIFT_U16(x, n);
  15831. // }
  15832. //
  15833. // }
  15834. // else if (ShiftType == 4) //u32
  15835. // {
  15836. // for (int i = 0; i < (Len / ShiftType); i += ShiftType)
  15837. // {
  15838. // u32 x = HTK_U32(Src[i]);
  15839. // n = ((GetBit1Num(x) + i + 7) % 31 + 1) * (bRestore ? (-1) : (1));
  15840. // HTK_U32(Dst[i]) = LOOP_SHIFT_U32(x, n);
  15841. // }
  15842. // }
  15843. else
  15844. {
  15845. return FAIL;
  15846. }
  15847. return PASS;
  15848. }
  15849. int DataEncryption(u8* Data, int DataLen, u8* EncryptedData, int EncryptedDataLen, u8 bDecryption)
  15850. {
  15851. enum
  15852. {
  15853. DATA_LEN = 64,
  15854. SALT_LEN = 64,
  15855. MIXTURE_LEN = DATA_LEN + SALT_LEN,
  15856. SALTMAP_LEN = GET_BOX_NUM(MIXTURE_LEN, 8),
  15857. ALL_LEN = MIXTURE_LEN + SALTMAP_LEN,
  15858. };
  15859. if (DataLen != DATA_LEN || EncryptedDataLen != ALL_LEN)
  15860. return FAIL;
  15861. u8* p = EncryptedData;
  15862. if (bDecryption)
  15863. {
  15864. #ifdef FUNC_SALT_AND_BLEND_DEBUG
  15865. XP("<Decryption>----------------------------\r\n");
  15866. HTK_ByteArray2HexStr_XP("EncryptedData", p, 0, ALL_LEN);
  15867. #endif
  15868. // if (Blend(p, p, ALL_LEN, 4, 1) == FAIL)
  15869. // return FAIL;
  15870. //#ifdef FUNC_SALT_AND_BLEND_DEBUG
  15871. // HTK_ByteArray2HexStr_XP("Blend-Rest-4B", p, 0, ALL_LEN);
  15872. //#endif
  15873. //
  15874. // if (Blend(p, p, ALL_LEN, 2, 1) == FAIL)
  15875. // return FAIL;
  15876. //#ifdef FUNC_SALT_AND_BLEND_DEBUG
  15877. // HTK_ByteArray2HexStr_XP("Blend-Rest-2B", p, 0, ALL_LEN);
  15878. //#endif
  15879. if (Blend(p, p, ALL_LEN, 1, 1) == FAIL)
  15880. return FAIL;
  15881. #ifdef FUNC_SALT_AND_BLEND_DEBUG
  15882. HTK_ByteArray2HexStr_XP("Blend-Rest-1B", p, 0, ALL_LEN);
  15883. #endif
  15884. if (Salt(p, MIXTURE_LEN, p + MIXTURE_LEN, SALTMAP_LEN, Data, DataLen, 1) == FAIL)
  15885. return FAIL;
  15886. #ifdef FUNC_SALT_AND_BLEND_DEBUG
  15887. HTK_ByteArray2HexStr_XP("Salt-Restore ", Data, 0, DATA_LEN);
  15888. #endif
  15889. }
  15890. else
  15891. {
  15892. #ifdef FUNC_SALT_AND_BLEND_DEBUG
  15893. XP("<Encryption>----------------------------\r\n");
  15894. HTK_ByteArray2HexStr_XP("RAW Data ", Data, 0, DataLen);
  15895. #endif
  15896. if (Salt(p, MIXTURE_LEN, p + MIXTURE_LEN, SALTMAP_LEN, Data, DataLen, 0) == FAIL)
  15897. return FAIL;
  15898. #ifdef FUNC_SALT_AND_BLEND_DEBUG
  15899. HTK_ByteArray2HexStr_XP("Salt ", p, 0, ALL_LEN);
  15900. #endif
  15901. if (Blend(p, p, ALL_LEN, 1, 0) == FAIL)
  15902. return FAIL;
  15903. #ifdef FUNC_SALT_AND_BLEND_DEBUG
  15904. HTK_ByteArray2HexStr_XP("Blend-1B ", p, 0, ALL_LEN);
  15905. #endif
  15906. // if (Blend(p, p, ALL_LEN, 2, 0) == FAIL)
  15907. // return FAIL;
  15908. //#ifdef FUNC_SALT_AND_BLEND_DEBUG
  15909. // HTK_ByteArray2HexStr_XP("Blend-2B ", p, 0, ALL_LEN);
  15910. //#endif
  15911. //
  15912. // if (Blend(p, p, ALL_LEN, 4, 0) == FAIL)
  15913. // return FAIL;
  15914. //#ifdef FUNC_SALT_AND_BLEND_DEBUG
  15915. // HTK_ByteArray2HexStr_XP("Blend-4B ", p, 0, ALL_LEN);
  15916. //#endif
  15917. }
  15918. return PASS;
  15919. }
  15920. #endif //FUNC_SALT_AND_BLEND
  15921. #endif //HTK
  15922. #ifdef FUNC_OUTP_TYPE_E
  15923. HTK_BOOL IsTypeEPlugIn(void)
  15924. {
  15925. return HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin) ? HTK_FALSE : HTK_TRUE;
  15926. }
  15927. #endif
  15928. #ifdef MODIFY_CPTASK_HEAD
  15929. void Proc_CpTaskHead(HTK_BOOL bCSU)
  15930. {
  15931. if(Charger.Alarm_Code > 0) // alarm occur
  15932. {
  15933. if(Charger.Mode != MODE_ALARM)
  15934. {
  15935. #ifdef FUNC_BLOCK_CSU_CMD_SET_DUTY_WHEN_ALARM_CP_F_STATE
  15936. Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF = HTK_TRUE;
  15937. #endif
  15938. HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_SET);
  15939. setChargerMode(MODE_ALARM);
  15940. user_pwm_setvalue(PWM_CH_CP, 0);
  15941. timerEnable(TIMER_IDX_STATE_E, 4000);
  15942. Charger.isAlarmSetPWM = OFF ;
  15943. }
  15944. // CP E or F to X1
  15945. if(timer[TIMER_IDX_STATE_E].isAlarm == ON)
  15946. {
  15947. HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_RESET);
  15948. if ( Charger.isAlarmSetPWM == OFF )
  15949. {
  15950. Charger.isAlarmSetPWM = ON ;
  15951. user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
  15952. }
  15953. #ifdef FUNC_BLOCK_CSU_CMD_SET_DUTY_WHEN_ALARM_CP_F_STATE
  15954. if (Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF)
  15955. {
  15956. Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF = HTK_FALSE;
  15957. }
  15958. #endif
  15959. }
  15960. }
  15961. else
  15962. {
  15963. if(Charger.Mode != MODE_ALARM)
  15964. {
  15965. if (!bCSU)
  15966. {
  15967. HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_RESET); //CCS communication, so skip this line
  15968. }
  15969. timerDisable(TIMER_IDX_STATE_E);
  15970. }
  15971. #ifdef FIX_OUTP_PWM_WHEN_ALARM_RECOVER_IN_4SEC
  15972. #ifdef FUNC_BLOCK_CSU_CMD_SET_DUTY_WHEN_ALARM_CP_F_STATE
  15973. if (Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF)
  15974. {
  15975. Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF = HTK_FALSE;
  15976. }
  15977. #endif
  15978. #endif
  15979. }
  15980. #ifdef FUNC_GUN_LOCK_TRIG_MODE
  15981. if (Charger.m_bUseGunLock)
  15982. {
  15983. if (Charger.m_GunLockTrigMode == GL_TRIG_MODE_REQUEST)
  15984. {
  15985. if (Charger.CP_State == SYSTEM_STATE_A && Charger.m_GunLockRequestMode_LockDelayTick != 0)
  15986. {
  15987. Charger.m_GunLockRequestMode_LockDelayTick = 0;
  15988. }
  15989. if (Charger.Alarm_Code > 0)
  15990. {
  15991. if (Charger.Alarm_Code & ALARM_EMERGENCY_STOP)
  15992. {
  15993. if (Charger.am3352.isRequestOn && !GL_IsLock())
  15994. {
  15995. if (Charger.CP_State != SYSTEM_STATE_A)
  15996. {
  15997. GL_Trig(GL_MODE_LOCK);
  15998. }
  15999. }
  16000. else if (!Charger.am3352.isRequestOn && GL_IsLock())
  16001. {
  16002. GL_Trig(GL_MODE_UNLOCK);
  16003. }
  16004. }
  16005. else //other alarm
  16006. {
  16007. if (GL_IsLock())
  16008. {
  16009. GL_Trig(GL_MODE_UNLOCK);
  16010. }
  16011. }
  16012. }
  16013. else
  16014. {
  16015. if (Charger.am3352.isRequestOn && !GL_IsLock())
  16016. {
  16017. if (Charger.CP_State != SYSTEM_STATE_A)
  16018. {
  16019. if (Charger.m_GunLockRequestMode_LockDelayTick == 0)
  16020. {
  16021. Charger.m_GunLockRequestMode_LockDelayTick = HAL_GetTick();
  16022. }
  16023. else
  16024. {
  16025. if (HTK_IsTimeout(Charger.m_GunLockRequestMode_LockDelayTick, 3000))
  16026. {
  16027. GL_Trig(GL_MODE_LOCK);
  16028. Charger.m_GunLockRequestMode_LockDelayTick = 0;
  16029. }
  16030. }
  16031. }
  16032. }
  16033. else if (!Charger.am3352.isRequestOn && GL_IsLock())
  16034. {
  16035. GL_Trig(GL_MODE_UNLOCK);
  16036. }
  16037. }
  16038. }
  16039. }
  16040. #endif
  16041. }
  16042. #endif //MODIFY_CPTASK_HEAD
  16043. #ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME
  16044. void Update_McuCtrlMode(void)
  16045. {
  16046. while (!Charger.m_bModelNameDCReadOK)
  16047. {
  16048. osDelay(100);
  16049. }
  16050. if (IS_CSU_MOUNTED || Charger.m_bModelNameDC == 1)
  16051. {
  16052. Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_CSU;
  16053. DEBUG_INFO("#MCU_CONTROL_MODE_CSU\r\n");
  16054. }
  16055. else
  16056. {
  16057. Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_NO_CSU;
  16058. DEBUG_INFO("#MCU_CONTROL_MODE_NO_CSU\r\n");
  16059. if (Charger.memory.EVSE_Config.data.item.AuthMode > AUTH_MODE_FREE)
  16060. {
  16061. Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ;
  16062. DEBUG_INFO("#AuthMode set defualt AUTH_MODE_FREE \r\n");
  16063. }
  16064. if (Charger.memory.EVSE_Config.data.item.OfflinePolicy > RFID_USER_AUTH_NO_CHARGING)
  16065. {
  16066. Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ;
  16067. DEBUG_INFO("#OfflinePolicy set defualt RFID_USER_AUTH_FREE \r\n");
  16068. }
  16069. }
  16070. }
  16071. #endif //FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME
  16072. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  16073. void IdleUntilReadAllMemory(void)
  16074. {
  16075. while (!Charger.m_bReadAllMemory)
  16076. {
  16077. osDelay(10);
  16078. }
  16079. }
  16080. #endif
  16081. #ifdef FUNC_IDLE_UNTIL_INIT_METER_IC
  16082. void IdleUntilInitMeterIC(void)
  16083. {
  16084. while (!Charger.m_bInitMeterIC)
  16085. {
  16086. osDelay(10);
  16087. }
  16088. }
  16089. #endif
  16090. #ifdef FUNC_GUN_LOCK
  16091. #define GL_GPIO_IS_LOCK ((HAL_GPIO_ReadPin(IN_LOCK_Status_GPIO_Port, IN_LOCK_Status_Pin) == GPIO_PIN_RESET) ? HTK_FALSE : HTK_TRUE)
  16092. #define GL_GPIO_UNLOCK(x) (HAL_GPIO_WritePin(OUT_UNLOCK_L_GPIO_Port, OUT_UNLOCK_L_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET))
  16093. #define GL_GPIO_LOCK(x) (HAL_GPIO_WritePin(OUT_LOCK_L_GPIO_Port, OUT_LOCK_L_Pin, ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET))
  16094. #define GL_GPIO_PULSE_WIDTH (290) //must < 300ms
  16095. void GL_Init(void)
  16096. {
  16097. GL_GPIO_LOCK(0);
  16098. GL_GPIO_UNLOCK(0);
  16099. GL_Unlock();
  16100. }
  16101. void GL_Lock(void)
  16102. {
  16103. GL_GPIO_LOCK(1);
  16104. osDelay(GL_GPIO_PULSE_WIDTH);
  16105. GL_GPIO_LOCK(0);
  16106. }
  16107. void GL_Unlock(void)
  16108. {
  16109. GL_GPIO_UNLOCK(1);
  16110. osDelay(GL_GPIO_PULSE_WIDTH);
  16111. GL_GPIO_UNLOCK(0);
  16112. }
  16113. HTK_BOOL GL_IsLock(void)
  16114. {
  16115. return GL_GPIO_IS_LOCK;
  16116. }
  16117. void GL_Trig(GL_MODE mode)
  16118. {
  16119. static uint32_t LastTrigTick = 0;
  16120. const uint32_t MIN_TRIG_TICK_PERIOD = 500;
  16121. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  16122. if (
  16123. (mode == GL_MODE_LOCK && Charger.m_GunLock_Counter > GUN_LOCK_PULSE_MAX_TIMES) ||
  16124. (mode == GL_MODE_UNLOCK && Charger.m_GunUnlock_Counter > GUN_LOCK_PULSE_MAX_TIMES)
  16125. )
  16126. {
  16127. return;
  16128. }
  16129. #endif
  16130. if (HTK_IsInTime(LastTrigTick, MIN_TRIG_TICK_PERIOD))
  16131. {
  16132. return;
  16133. }
  16134. LastTrigTick = HAL_GetTick();
  16135. switch(mode)
  16136. {
  16137. case GL_MODE_UNLOCK:
  16138. if (!Charger.m_bTrigGunUnlock) //Trig unlock process
  16139. {
  16140. Charger.m_bTrigGunUnlock = HTK_TRUE;
  16141. timerEnable(TIMER_IDX_GUN_LOCK, GL_GPIO_PULSE_WIDTH);
  16142. GL_GPIO_UNLOCK(1);
  16143. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  16144. //Charger.m_GunUnlock_Counter++;
  16145. XP("#GL Unlock-H (%d)\r\n", Charger.m_GunUnlock_Counter);
  16146. #else
  16147. XP("#GL Unlock-H\r\n");
  16148. #endif
  16149. }
  16150. break;
  16151. case GL_MODE_LOCK:
  16152. if (!Charger.m_bTrigGunLock) //Trig lock process
  16153. {
  16154. Charger.m_bTrigGunLock = HTK_TRUE;
  16155. timerEnable(TIMER_IDX_GUN_LOCK, GL_GPIO_PULSE_WIDTH);
  16156. GL_GPIO_LOCK(1);
  16157. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  16158. //Charger.m_GunLock_Counter++;
  16159. XP("#GL Lock-H (%d)\r\n", Charger.m_GunLock_Counter);
  16160. #else
  16161. XP("#GL Lock-H\r\n");
  16162. #endif
  16163. }
  16164. break;
  16165. }
  16166. }
  16167. void GL_Proc(void)
  16168. {
  16169. if (timer[TIMER_IDX_GUN_LOCK].isAlarm)
  16170. {
  16171. if (Charger.m_bTrigGunUnlock)
  16172. {
  16173. XP("#GL Timer: %d\r\n", (uint32_t)(HAL_GetTick() - timer[TIMER_IDX_GUN_LOCK].startTime));
  16174. timerDisable(TIMER_IDX_GUN_LOCK);
  16175. Charger.m_bTrigGunUnlock = HTK_FALSE;
  16176. GL_GPIO_UNLOCK(0);
  16177. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  16178. XP("#GL Unlock-L (%d)\r\n", Charger.m_GunUnlock_Counter);
  16179. Charger.m_GunUnlock_Counter++;
  16180. #else
  16181. XP("#GL Unlock-L\r\n");
  16182. #endif
  16183. }
  16184. if (Charger.m_bTrigGunLock)
  16185. {
  16186. XP("#GL Timer: %d\r\n", (uint32_t)(HAL_GetTick() - timer[TIMER_IDX_GUN_LOCK].startTime));
  16187. timerDisable(TIMER_IDX_GUN_LOCK);
  16188. Charger.m_bTrigGunLock = HTK_FALSE;
  16189. GL_GPIO_LOCK(0);
  16190. #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM
  16191. XP("#GL Lock-L (%d)\r\n", Charger.m_GunLock_Counter);
  16192. Charger.m_GunLock_Counter++;
  16193. #else
  16194. XP("#GL Lock-L\r\n");
  16195. #endif
  16196. }
  16197. }
  16198. }
  16199. #endif //FUNC_GUN_LOCK
  16200. #ifdef FUNC_AX32_TRIG_LEAKAGE
  16201. #define TRIG_LEAKAGE_GPIO_IS_TRIGGERING ((HAL_GPIO_ReadPin(OUT_TrigLeakage_GPIO_Port, OUT_TrigLeakage_Pin) == GPIO_PIN_RESET) ? HTK_FALSE : HTK_TRUE)
  16202. #define TRIG_LEAKAGE_GPIO_SET(x) (HAL_GPIO_WritePin(OUT_TrigLeakage_GPIO_Port, OUT_TrigLeakage_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET))
  16203. #define TRIG_LEAKAGE_GPIO_PULSE_WIDTH (450) //must < 500ms
  16204. #define TRIG_LEAKAGE_MAX_TIMES (3)
  16205. void TrigLeakage_Init(void)
  16206. {
  16207. XP("#TrigLeakage_Init\r\n");
  16208. TRIG_LEAKAGE_GPIO_SET(0);
  16209. }
  16210. void TrigLeakage_Trig(void)
  16211. {
  16212. static uint8_t TrigTimes = 0;
  16213. static uint32_t LastTrigTick = 0;
  16214. const uint32_t MIN_TRIG_TICK_PERIOD = 3000; //ms
  16215. if (HTK_IsInTime(LastTrigTick, MIN_TRIG_TICK_PERIOD))
  16216. {
  16217. return;
  16218. }
  16219. LastTrigTick = HAL_GetTick();
  16220. if (!Charger.m_bTrigLeakage) //Trig process
  16221. {
  16222. if (TrigTimes < TRIG_LEAKAGE_MAX_TIMES)
  16223. {
  16224. TrigTimes++;
  16225. XP("#TrigLeakage_Proc (%d)\r\n", TrigTimes);
  16226. Charger.m_bTrigLeakage = HTK_TRUE;
  16227. timerEnable(TIMER_IDX_TRIG_LEAKAGE, TRIG_LEAKAGE_GPIO_PULSE_WIDTH);
  16228. TRIG_LEAKAGE_GPIO_SET(1);
  16229. XP("#TRIG_LEAKAGE-H\r\n");
  16230. }
  16231. else
  16232. {
  16233. XP("#TrigLeakage_Proc FAIL (MAX Trig times = %d)\r\n", TRIG_LEAKAGE_MAX_TIMES);
  16234. }
  16235. }
  16236. }
  16237. //void TrigLeakage_SimpleTrig(void)
  16238. //{
  16239. // TRIG_LEAKAGE_GPIO_SET(1);
  16240. // osDelay(TRIG_LEAKAGE_GPIO_PULSE_WIDTH);
  16241. // TRIG_LEAKAGE_GPIO_SET(0);
  16242. //}
  16243. void TrigLeakage_Proc(void)
  16244. {
  16245. if (timer[TIMER_IDX_TRIG_LEAKAGE].isAlarm)
  16246. {
  16247. if (Charger.m_bTrigLeakage)
  16248. {
  16249. XP("#TRIG_LEAKAGE-Timer: %d\r\n", (uint32_t)(HAL_GetTick() - timer[TIMER_IDX_TRIG_LEAKAGE].startTime));
  16250. timerDisable(TIMER_IDX_TRIG_LEAKAGE);
  16251. Charger.m_bTrigLeakage = HTK_FALSE;
  16252. TRIG_LEAKAGE_GPIO_SET(0);
  16253. XP("#TRIG_LEAKAGE-L\r\n");
  16254. }
  16255. }
  16256. }
  16257. #endif //FUNC_AX32_TRIG_LEAKAGE
  16258. #ifdef MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK
  16259. void AlarmDetect_RelayWelding_UseADC(void)
  16260. {
  16261. #ifdef RELAY_WELDING_PROTECT
  16262. #ifdef VO_DISABLE_RELAY_WELDING
  16263. if (!Charger.m_VOCode.m_DisableRelayWelding)
  16264. #else
  16265. if (1)
  16266. #endif //VO_DISABLE_RELAY_WELDING
  16267. {
  16268. uint16_t MAX_FAIL_TIMES = 1000;
  16269. if (Charger.GroundingSystem == GROUNGING_SYSTEM_LL || Charger.GroundingSystem == GROUNGING_SYSTEM_LN)
  16270. {
  16271. if ((Charger.Relay_Action == GPIO_RELAY_ACTION_ON) && (Charger.Relay_isOperationCompleted == 0x11) &&
  16272. ((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.011)))
  16273. {
  16274. #ifdef FUNC_NEW_RELAY_MONITOR
  16275. double threshold = Charger.Voltage[0] * //0.01V
  16276. Charger.alarm_spec.Relay_LL_DriveFault_Slop +
  16277. Charger.alarm_spec.Relay_LL_DriveFault_Offs;
  16278. if(adc_value.ADC2_IN5_Welding.value < threshold)
  16279. #endif
  16280. {
  16281. if(Charger.counter.RELAY_Drive_Fualt.fail > MAX_FAIL_TIMES)
  16282. {
  16283. if(!(Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT))
  16284. {
  16285. Charger.counter.RELAY.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  16286. Charger.Alarm_Code |= ALARM_RELAY_DRIVE_FUALT;
  16287. DEBUG_ERROR("Alarm Welding Voltage = %d.\r\n",adc_value.ADC2_IN5_Welding.value);
  16288. DEBUG_ERROR("Alarm relay ON status fault occur.\r\n");
  16289. }
  16290. }
  16291. else
  16292. {
  16293. Charger.counter.RELAY_Drive_Fualt.fail++;
  16294. #ifdef DEBUG_RELAY_MONITOR_SHOW_INFO
  16295. XP("#RelayDriveFault(%d): W(%.2f) T(%.2f)\r\n",
  16296. Charger.counter.RELAY_Drive_Fualt.fail,
  16297. adc_value.ADC2_IN5_Welding.value,
  16298. threshold);
  16299. #endif
  16300. }
  16301. }
  16302. else
  16303. {
  16304. Charger.counter.RELAY_Drive_Fualt.fail = 0 ;
  16305. }
  16306. }
  16307. else if ((Charger.Relay_Action == GPIO_RELAY_ACTION_OFF) && (Charger.Relay_isOperationCompleted == 0x00) &&
  16308. ((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.011)))
  16309. {
  16310. #ifdef FUNC_NEW_RELAY_MONITOR
  16311. double threshold =
  16312. Charger.Voltage[0] * //0.01V
  16313. Charger.alarm_spec.Relay_LL_Welding_Slop +
  16314. Charger.alarm_spec.Relay_LL_Welding_Offs;
  16315. if(adc_value.ADC2_IN5_Welding.value > threshold)
  16316. #endif
  16317. {
  16318. if(Charger.counter.RELAY.fail > MAX_FAIL_TIMES)
  16319. {
  16320. if(!(Charger.Alarm_Code & ALARM_RELAY_STATUS))
  16321. {
  16322. Charger.counter.RELAY.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  16323. Charger.Alarm_Code |= ALARM_RELAY_STATUS;
  16324. #ifdef FUNC_AX32_TRIG_LEAKAGE
  16325. Charger.AlarmRelayWeldingOccurTick = HAL_GetTick();
  16326. #endif
  16327. DEBUG_ERROR("Alarm Welding Voltage = %d.\r\n",adc_value.ADC2_IN5_Welding.value);
  16328. DEBUG_ERROR("Alarm relay OFF status fault occur.\r\n");
  16329. }
  16330. }
  16331. else
  16332. {
  16333. Charger.counter.RELAY.fail++;
  16334. #ifdef DEBUG_RELAY_MONITOR_SHOW_INFO
  16335. XP("#RelayWelding(%d): W(%.2f) T(%.2f)\r\n",
  16336. Charger.counter.RELAY.fail,
  16337. adc_value.ADC2_IN5_Welding.value,
  16338. threshold);
  16339. #endif
  16340. }
  16341. }
  16342. else
  16343. {
  16344. Charger.counter.RELAY.fail = 0 ;
  16345. }
  16346. }
  16347. }
  16348. //-------------------------------------------------
  16349. }
  16350. #endif //RELAY_WELDING_PROTECT
  16351. }
  16352. #ifdef FUNC_USE_RELAY_B_CONTACT
  16353. HTK_BOOL IsRelayContact_Closed(void)
  16354. {
  16355. return HAL_GPIO_ReadPin(IN_Relay_b_Contact_GPIO_Port, IN_Relay_b_Contact_Pin) == GPIO_PIN_SET ? HTK_TRUE : HTK_FALSE;
  16356. }
  16357. void AlarmDetect_RelayWelding_UseGPIO(void)
  16358. {
  16359. #ifdef RELAY_WELDING_PROTECT
  16360. #ifdef VO_DISABLE_RELAY_WELDING
  16361. if (!Charger.m_VOCode.m_DisableRelayWelding)
  16362. #else
  16363. if (1)
  16364. #endif //VO_DISABLE_RELAY_WELDING
  16365. {
  16366. uint16_t MAX_FAIL_TIMES = 1000;
  16367. if (Charger.GroundingSystem == GROUNGING_SYSTEM_LL || Charger.GroundingSystem == GROUNGING_SYSTEM_LN)
  16368. {
  16369. if ((Charger.Relay_Action == GPIO_RELAY_ACTION_ON) && (Charger.Relay_isOperationCompleted == 0x11) &&
  16370. ((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.011)))
  16371. {
  16372. if (!IsRelayContact_Closed())
  16373. {
  16374. if(Charger.counter.RELAY_Drive_Fualt.fail > MAX_FAIL_TIMES)
  16375. {
  16376. if(!(Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT))
  16377. {
  16378. Charger.counter.RELAY.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  16379. Charger.Alarm_Code |= ALARM_RELAY_DRIVE_FUALT;
  16380. //DEBUG_ERROR("Alarm Welding Voltage = %d.\r\n",adc_value.ADC2_IN5_Welding.value);
  16381. DEBUG_ERROR("Alarm relay ON status fault occur.\r\n");
  16382. }
  16383. }
  16384. else
  16385. {
  16386. Charger.counter.RELAY_Drive_Fualt.fail++;
  16387. }
  16388. }
  16389. else
  16390. {
  16391. Charger.counter.RELAY_Drive_Fualt.fail = 0 ;
  16392. }
  16393. }
  16394. else if ((Charger.Relay_Action == GPIO_RELAY_ACTION_OFF) && (Charger.Relay_isOperationCompleted == 0x00) &&
  16395. ((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.011)))
  16396. {
  16397. if (IsRelayContact_Closed())
  16398. {
  16399. if(Charger.counter.RELAY.fail > MAX_FAIL_TIMES)
  16400. {
  16401. if(!(Charger.Alarm_Code & ALARM_RELAY_STATUS))
  16402. {
  16403. Charger.counter.RELAY.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
  16404. Charger.Alarm_Code |= ALARM_RELAY_STATUS;
  16405. #ifdef FUNC_AX32_TRIG_LEAKAGE
  16406. Charger.AlarmRelayWeldingOccurTick = HAL_GetTick();
  16407. #endif
  16408. //DEBUG_ERROR("Alarm Welding Voltage = %d.\r\n",adc_value.ADC2_IN5_Welding.value);
  16409. DEBUG_ERROR("Alarm relay OFF status fault occur.\r\n");
  16410. }
  16411. }
  16412. else
  16413. {
  16414. Charger.counter.RELAY.fail++;
  16415. }
  16416. }
  16417. else
  16418. {
  16419. Charger.counter.RELAY.fail = 0 ;
  16420. }
  16421. }
  16422. }
  16423. }
  16424. #endif //RELAY_WELDING_PROTECT
  16425. }
  16426. #endif //FUNC_USE_RELAY_B_CONTACT
  16427. #endif //MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK
  16428. #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE
  16429. void RS485_TX_Enable(void)
  16430. {
  16431. HAL_GPIO_WritePin(OUT_Meter_485_DE_GPIO_Port, OUT_Meter_485_DE_Pin, GPIO_PIN_SET);
  16432. HAL_GPIO_WritePin(OUT_Meter_485_RE_GPIO_Port, OUT_Meter_485_RE_Pin, GPIO_PIN_SET);
  16433. osDelay(1);
  16434. }
  16435. void RS485_TX_Disable(void)
  16436. {
  16437. HAL_GPIO_WritePin(OUT_Meter_485_DE_GPIO_Port, OUT_Meter_485_DE_Pin, GPIO_PIN_RESET);
  16438. HAL_GPIO_WritePin(OUT_Meter_485_RE_GPIO_Port, OUT_Meter_485_RE_Pin, GPIO_PIN_RESET);
  16439. }
  16440. void Prefix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf)
  16441. {
  16442. if (RxBuf == UART_RS485_rx_buffer)
  16443. {
  16444. RS485_TX_Enable();
  16445. TxBuf[1] = Charger.m_RS485SlaveAddr; //Update Slave Address
  16446. }
  16447. }
  16448. void Postfix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf)
  16449. {
  16450. if (RxBuf == UART_RS485_rx_buffer)
  16451. {
  16452. RS485_TX_Disable();
  16453. }
  16454. }
  16455. #endif //MODIFY_DC_RS485_UPGRADE_ISSUE
  16456. #ifdef FUNC_AX80_ADD_TILT_SENSOR
  16457. //#define TILT_GPIO_IS_ACTION_ON ((HAL_GPIO_ReadPin(IN_Tilt_ActOn_GPIO_Port, IN_Tilt_ActOn_Pin) == GPIO_PIN_RESET) ? HTK_FALSE : HTK_TRUE)
  16458. //#define TILT_GPIO_TEST_SET(x) (HAL_GPIO_WritePin(OUT_Tilt_Test_GPIO_Port, OUT_Tilt_Test_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET))
  16459. #define TILT_GPIO_IS_ACTION_ON ((HAL_GPIO_ReadPin(IN_Tilt_ActOn_GPIO_Port, IN_Tilt_ActOn_Pin) == GPIO_PIN_RESET) ? HTK_TRUE : HTK_FALSE)
  16460. #define TILT_GPIO_TEST_SET(x) (HAL_GPIO_WritePin(OUT_Tilt_Test_GPIO_Port, OUT_Tilt_Test_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET))
  16461. #define TILT_TRIG_LEAKAGE_GPIO_IS_TRIGGERING ((HAL_GPIO_ReadPin(OUT_Tilt_DrvLeakage_GPIO_Port, OUT_Tilt_DrvLeakage_Pin) == GPIO_PIN_RESET) ? HTK_FALSE : HTK_TRUE)
  16462. #define TILT_TRIG_LEAKAGE_GPIO_SET(x) (HAL_GPIO_WritePin(OUT_Tilt_DrvLeakage_GPIO_Port, OUT_Tilt_DrvLeakage_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET))
  16463. #define TILT_TRIG_LEAKAGE_GPIO_PULSE_WIDTH (450) //must < 500ms
  16464. #define TILT_TRIG_LEAKAGE_MAX_TIMES (3)
  16465. void TILT_TrigLeakage_Init(void)
  16466. {
  16467. XP("#TILT_TrigLeakage_Init\r\n");
  16468. TILT_TRIG_LEAKAGE_GPIO_SET(0);
  16469. TILT_GPIO_TEST_SET(1);
  16470. osDelay(1);
  16471. if (TILT_GPIO_IS_ACTION_ON)
  16472. {
  16473. XP("#Tilt sensor test OK\r\n");
  16474. }
  16475. else
  16476. {
  16477. XP("#Tilt sensor test [NG]\r\n");
  16478. }
  16479. TILT_GPIO_TEST_SET(0);
  16480. }
  16481. void TILT_TrigLeakage_Trig(void)
  16482. {
  16483. static uint8_t TrigTimes = 0;
  16484. static uint32_t LastTrigTick = 0;
  16485. const uint32_t MIN_TRIG_TICK_PERIOD = 3000; //ms
  16486. if (HTK_IsInTime(LastTrigTick, MIN_TRIG_TICK_PERIOD))
  16487. {
  16488. return;
  16489. }
  16490. LastTrigTick = HAL_GetTick();
  16491. if (!Charger.m_bTILT_TrigLeakage) //Trig process
  16492. {
  16493. if (TrigTimes < TILT_TRIG_LEAKAGE_MAX_TIMES)
  16494. {
  16495. TrigTimes++;
  16496. XP("#TILT_TrigLeakage_Proc (%d)\r\n", TrigTimes);
  16497. Charger.m_bTILT_TrigLeakage = HTK_TRUE;
  16498. timerEnable(TIMER_IDX_TILT_TRIG_LEAKAGE, TILT_TRIG_LEAKAGE_GPIO_PULSE_WIDTH);
  16499. TILT_TRIG_LEAKAGE_GPIO_SET(1);
  16500. XP("#TILT_TRIG_LEAKAGE-H\r\n");
  16501. }
  16502. else
  16503. {
  16504. XP("#TILT_TrigLeakage_Proc FAIL (MAX Trig times = %d)\r\n", TILT_TRIG_LEAKAGE_MAX_TIMES);
  16505. }
  16506. }
  16507. }
  16508. //void TILT_TrigLeakage_SimpleTrig(void)
  16509. //{
  16510. // TILT_TRIG_LEAKAGE_GPIO_SET(1);
  16511. // osDelay(TILT_TRIG_LEAKAGE_GPIO_PULSE_WIDTH);
  16512. // TILT_TRIG_LEAKAGE_GPIO_SET(0);
  16513. //}
  16514. void TILT_TrigLeakage_Proc(void)
  16515. {
  16516. if (timer[TIMER_IDX_TILT_TRIG_LEAKAGE].isAlarm)
  16517. {
  16518. if (Charger.m_bTILT_TrigLeakage)
  16519. {
  16520. XP("#TILT_TRIG_LEAKAGE-Timer: %d\r\n", (uint32_t)(HAL_GetTick() - timer[TIMER_IDX_TILT_TRIG_LEAKAGE].startTime));
  16521. timerDisable(TIMER_IDX_TILT_TRIG_LEAKAGE);
  16522. Charger.m_bTILT_TrigLeakage = HTK_FALSE;
  16523. TILT_TRIG_LEAKAGE_GPIO_SET(0);
  16524. XP("#TILT_TRIG_LEAKAGE-L\r\n");
  16525. }
  16526. }
  16527. }
  16528. void AlarmDetect_TiltSensor(void)
  16529. {
  16530. #ifdef VO_DISABLE_DETECT_TILT_SENSOR
  16531. if (!Charger.m_VOCode.m_DisableDetectTiltSensor)
  16532. #else
  16533. if (1)
  16534. #endif
  16535. {
  16536. uint16_t MAX_FAIL_TIMES = 1000;
  16537. if (TILT_GPIO_IS_ACTION_ON)
  16538. {
  16539. if (Charger.counter.TiltSensor.fail > MAX_FAIL_TIMES)
  16540. {
  16541. if(!(Charger.Alarm_Code & ALARM_TILT_SENSOR))
  16542. {
  16543. Charger.Alarm_Code |= ALARM_TILT_SENSOR;
  16544. Charger.AlarmTiltSensorOccurTick = HAL_GetTick();
  16545. DEBUG_ERROR("Alarm tilt sensor fault occur.\r\n");
  16546. }
  16547. }
  16548. else
  16549. {
  16550. Charger.counter.TiltSensor.fail++;
  16551. }
  16552. }
  16553. else
  16554. {
  16555. Charger.counter.TiltSensor.fail = 0 ;
  16556. }
  16557. }
  16558. }
  16559. #endif //FUNC_AX80_ADD_TILT_SENSOR
  16560. #ifdef FUNC_TASK_MONITOR
  16561. void StartMonitorTask(void const * argument)
  16562. {
  16563. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  16564. IdleUntilReadAllMemory();
  16565. #endif
  16566. memset(&Charger.m_TaskMonitor, 0, sizeof(Charger.m_TaskMonitor));
  16567. #ifdef FUNC_MODIFY_TASK_MONITOR_20231227
  16568. enum { ADC_RESET_MAX = 1 };
  16569. #else
  16570. enum { ADC_RESET_MAX = 10 };
  16571. #endif
  16572. while (1)
  16573. {
  16574. //ADC
  16575. {
  16576. static PTaskADCInfo p = &Charger.m_TaskMonitor.m_ADC;
  16577. if (
  16578. (
  16579. p->m_ADC1_Counter[0] != 0 &&
  16580. p->m_ADC2_Counter[0] != 0 &&
  16581. p->m_ADC3_Counter[0] != 0
  16582. )
  16583. &&
  16584. (
  16585. p->m_ADC1_Counter[0] == p->m_ADC1_Counter[1] ||
  16586. p->m_ADC2_Counter[0] == p->m_ADC2_Counter[1] ||
  16587. p->m_ADC3_Counter[0] == p->m_ADC3_Counter[1]
  16588. )
  16589. )
  16590. {
  16591. p->m_ContinueResetCounter++;
  16592. p->m_TotalResetCounter++;
  16593. XP("#TaskMonitor: ADC[%d/%d](%d, %d, %d) ADC->SR(0x%04X, 0x%04X, 0x%04X) => [NG] Reset %s\r\n",
  16594. p->m_ContinueResetCounter, p->m_TotalResetCounter,
  16595. p->m_ADC1_Counter[0],
  16596. p->m_ADC2_Counter[0],
  16597. p->m_ADC3_Counter[0], ADC1->SR, ADC2->SR, ADC3->SR,
  16598. p->m_ContinueResetCounter > ADC_RESET_MAX ? "MCU" : "ADC");
  16599. if (p->m_ContinueResetCounter > ADC_RESET_MAX)
  16600. {
  16601. NVIC_SystemReset();
  16602. }
  16603. else
  16604. {
  16605. isDMAEnd_ADC1 = OFF;
  16606. isDMAEnd_ADC2 = OFF;
  16607. isDMAEnd_ADC3 = OFF;
  16608. HAL_ADC_Stop_DMA(&hadc1);
  16609. HAL_ADC_Stop_DMA(&hadc2);
  16610. HAL_ADC_Stop_DMA(&hadc3);
  16611. //__HAL_ADC_CLEAR_FLAG(&hadc1, ADC_FLAG_STRT);
  16612. //__HAL_ADC_CLEAR_FLAG(&hadc2, ADC_FLAG_STRT);
  16613. //__HAL_ADC_CLEAR_FLAG(&hadc3, ADC_FLAG_STRT);
  16614. MX_DMA_Init();
  16615. MX_ADC1_Init();
  16616. MX_ADC2_Init();
  16617. MX_ADC3_Init();
  16618. if(HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT)!=HAL_OK)Error_Handler();
  16619. if(HAL_ADC_Start_DMA(&hadc2, (uint32_t*)&ADC2_Buffer, ADC2_CHANEL_COUNT*ADC2_SAMPLE_COUNT)!=HAL_OK)Error_Handler();
  16620. if(HAL_ADC_Start_DMA(&hadc3, (uint32_t*)&ADC3_Buffer, ADC3_CHANEL_COUNT*ADC3_SAMPLE_COUNT)!=HAL_OK)Error_Handler();
  16621. }
  16622. }
  16623. else
  16624. {
  16625. p->m_ContinueResetCounter = 0;
  16626. p->m_ADC1_Counter[1] = p->m_ADC1_Counter[0];
  16627. p->m_ADC2_Counter[1] = p->m_ADC2_Counter[0];
  16628. p->m_ADC3_Counter[1] = p->m_ADC3_Counter[0];
  16629. }
  16630. }
  16631. osDelay(300);
  16632. }
  16633. }
  16634. #endif //FUNC_TASK_MONITOR
  16635. #ifdef FUNC_RS485_BLE_SW
  16636. void RS485_SW(HTK_BOOL bON)
  16637. {
  16638. XP("#<RS485_SW: %s>\r\n", (bON ? "ON" : "OFF"));
  16639. HAL_GPIO_WritePin(RS485_SW_GPIO_Port, RS485_SW_Pin, bON ? GPIO_PIN_SET : GPIO_PIN_RESET);
  16640. }
  16641. void BLE_SW(HTK_BOOL bON)
  16642. {
  16643. XP("#<BLE_SW: %s>\r\n", (bON ? "ON" : "OFF"));
  16644. HAL_GPIO_WritePin(BLE_SW_GPIO_Port, BLE_SW_Pin, bON ? GPIO_PIN_SET : GPIO_PIN_RESET);
  16645. }
  16646. #endif //FUNC_RS485_BLE_SW
  16647. #ifdef FUNC_LIN_EN_SW
  16648. void LIN_EN(HTK_BOOL bEnable)
  16649. {
  16650. XP("#<LIN_EN: %s>\r\n", (bEnable ? "Enable" : "Disable"));
  16651. HAL_GPIO_WritePin(OUT_USB_DriveBus_GPIO_Port, OUT_USB_DriveBus_Pin, bEnable ? GPIO_PIN_SET : GPIO_PIN_RESET);
  16652. }
  16653. void LIN_SW(HTK_BOOL bUseLIN)
  16654. {
  16655. XP("#<LIN_SW: Use %s>\r\n", (bUseLIN ? "LIN" : "PWM"));
  16656. //TMUX6219 Table8-1
  16657. // EN SEL Select Source
  16658. // 0 X All off
  16659. // 1 0 S1 (CP-LIN)
  16660. // 1 1 S2 (CP-PWM)
  16661. HAL_GPIO_WritePin(LIN_PWM_SW_GPIO_Port, LIN_PWM_SW_Pin, bUseLIN ? GPIO_PIN_RESET : GPIO_PIN_SET);
  16662. }
  16663. #endif //FUNC_LIN_EN_SW
  16664. #ifdef FUNC_LIN_CP
  16665. void StartLinCpTask(void const * argument)
  16666. {
  16667. #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM
  16668. IdleUntilReadAllMemory();
  16669. #endif
  16670. do
  16671. {
  16672. osDelay(1000);
  16673. }
  16674. while (!Charger.m_bUseLinCP);
  16675. static PLinCP p = NULL;
  16676. if (p == NULL)
  16677. {
  16678. p = (PLinCP)HTK_Malloc(sizeof(LinCP));
  16679. if (p != NULL)
  16680. {
  16681. Charger.m_pLinCP = p;
  16682. LIN_Init(p, USART1);
  16683. }
  16684. }
  16685. LIN_EN(HTK_TRUE);
  16686. //Test
  16687. //LIN_SW(HTK_TRUE);
  16688. //LIN_SW(HTK_FALSE);
  16689. // SeVersionList data;
  16690. // memset(&data, 0, sizeof(data));
  16691. // data.SeSelectedVersion = 0x01;
  16692. // data.B1 = 0x02;
  16693. // data.SeVersionPageNumber = 0x03;
  16694. // data.SeSupportedVersion1 = 0x04;
  16695. // data.SeSupportedVersion2 = 0x05;
  16696. // data.SeSupportedVersion3 = 0x06;
  16697. // data.SeSupportedVersion4 = 0x07;
  16698. // data.SeSupportedVersion5 = 0x08;
  16699. while (1)
  16700. {
  16701. // LIN_TxHeaderData(p, LINCPID_SE_VERSION_LIST, &data, sizeof(data));
  16702. // osDelay(30);
  16703. // LIN_TxHeader(p, LINCPID_EV_VERSION_LIST);
  16704. // osDelay(30);
  16705. osDelay(1000);
  16706. }
  16707. }
  16708. #endif //FUNC_LIN_CP
  16709. #ifdef FUNC_AW48_NET_LED
  16710. void Proc_NetLedActionSubState(void)
  16711. {
  16712. if (Charger.am3352.NetLedActionState == NET_LED_ACTION_ALL_CONNECTING)
  16713. {
  16714. //if(blinker[BLINKER_IDX_LED_NET].blinkisFinish)
  16715. {
  16716. if (Charger.am3352.NetLedActionSubState == NET_LED_ACTION_LTE_CONNECTING_H)
  16717. {
  16718. setNetLedMotion(Charger.am3352.NetLedActionSubState = NET_LED_ACTION_WIFI_CONNECTING_H);
  16719. }
  16720. else if (Charger.am3352.NetLedActionSubState == NET_LED_ACTION_WIFI_CONNECTING_H)
  16721. {
  16722. setNetLedMotion(Charger.am3352.NetLedActionSubState = NET_LED_ACTION_ETHERNET_CONNECTING_H);
  16723. }
  16724. else if (Charger.am3352.NetLedActionSubState == NET_LED_ACTION_ETHERNET_CONNECTING_H)
  16725. {
  16726. setNetLedMotion(Charger.am3352.NetLedActionSubState = NET_LED_ACTION_LTE_CONNECTING_H);
  16727. }
  16728. }
  16729. }
  16730. }
  16731. #endif //FUNC_AW48_NET_LED
  16732. #ifdef FUNC_AES256
  16733. HTK_BOOL AES256_Verify(u8* Data, int DataLen, u8* Key, u8* IV, u8* RemoteEncryptedData)
  16734. {
  16735. u8 PlainData[16] = { 0 };
  16736. memcpy(PlainData, Data, HTK_GET_VAL_MIN(DataLen, 16));
  16737. u8 EncryptedData[16];
  16738. size_t encryptedSize;
  16739. // Fill padding data to 16 byte with PKCS7
  16740. PKCS7_Pad(PlainData, 4, 16, PlainData);
  16741. //XP("strlen((char*)PlainData) = %d\r\n", strlen((char*)PlainData)); //??????????????????
  16742. // Encrypt data
  16743. //AES256MainCBC(Key, PlainData, IV, strlen((char*)PlainData), EncryptedData, &encryptedSize, true);
  16744. AES256MainCBC(Key, PlainData, IV, 16, EncryptedData, &encryptedSize, true);
  16745. // DEBUG_INFO("AES256 Check ============================================\r\n");
  16746. // DEBUG_INFO("EncryptedSize: %d\r\n", encryptedSize);
  16747. // for(uint8_t idx=0;idx<16;idx++)
  16748. // DEBUG_INFO("PlainData[%d]: %02X\r\n", idx, PlainData[idx]);
  16749. HTK_BOOL bRes = HTK_TRUE;
  16750. for(uint8_t idx=0;idx<16;idx++)
  16751. {
  16752. // DEBUG_INFO("EncryptedData[%d]: %02X, RemoteEncryptedData[%d]: %02X\r\n",
  16753. // idx, EncryptedData[idx], idx, RemoteEncryptedData[idx]);
  16754. if (RemoteEncryptedData[idx] != EncryptedData[idx])
  16755. {
  16756. bRes = HTK_FALSE;
  16757. break;
  16758. }
  16759. }
  16760. if (bRes)
  16761. {
  16762. DEBUG_INFO("<AES Check OK>\r\n");
  16763. return HTK_TRUE;
  16764. }
  16765. else
  16766. {
  16767. DEBUG_INFO("<AES Check NG>\r\n");
  16768. return HTK_FALSE;
  16769. }
  16770. }
  16771. void AES256_Test(void)
  16772. {
  16773. /* AES test */
  16774. uint8_t Key[32] =
  16775. {
  16776. 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
  16777. 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12
  16778. };
  16779. uint8_t IV[] =
  16780. {
  16781. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
  16782. };
  16783. uint8_t PlainData[] =
  16784. {
  16785. 0x11, 0x22, 0x33, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  16786. };
  16787. uint8_t encryptedData[16];
  16788. size_t encryptedSize;
  16789. // Fill padding data to 16 byte with PKCS7
  16790. PKCS7_Pad(PlainData, 4, 16, PlainData);
  16791. // Encrypt data
  16792. AES256MainCBC((u8*)Key, PlainData, IV, strlen((char*)PlainData), encryptedData, &encryptedSize, true);
  16793. DEBUG_INFO("encryptedSize: %d\r\n", encryptedSize);
  16794. for(uint8_t idx=0;idx<16;idx++)
  16795. DEBUG_INFO("PlainData[%d]: %02X\r\n", idx, PlainData[idx]);
  16796. for(uint8_t idx=0;idx<16;idx++)
  16797. DEBUG_INFO("encryptedData[%d]: %02X\r\n", idx, encryptedData[idx]);
  16798. {
  16799. u8 Data[4] = { 0x11, 0x22, 0x33, 0x44 };
  16800. AES256_Verify(Data, 4, (u8*)Key, IV, encryptedData);
  16801. }
  16802. }
  16803. #endif //FUNC_AES256
  16804. #ifdef FUNC_ECDSA
  16805. HTK_BOOL ECDSA_Verify(u8* PublicKey, int PublicKeyLen, u8* Hash, int HashLen, u8* Signature, int SignatureLen)
  16806. {
  16807. cmox_ecc_handle_t Ecc_Ctx;
  16808. cmox_ecc_retval_t retval;
  16809. uint32_t fault_check = 0;
  16810. if (PublicKeyLen != 64 || HashLen != 32 || SignatureLen != 64)
  16811. {
  16812. return HTK_FALSE;
  16813. }
  16814. enum { WORKING_BUFFER_SIZE = 2000 };
  16815. uint8_t* Working_Buffer = (uint8_t*)HTK_Malloc(WORKING_BUFFER_SIZE);
  16816. if (Working_Buffer == NULL)
  16817. {
  16818. return HTK_FALSE;
  16819. }
  16820. HTK_BOOL bRtn = HTK_FALSE;
  16821. if (cmox_initialize(NULL) != CMOX_INIT_SUCCESS)
  16822. {
  16823. XP("<cmox_initialize NG>\r\n");
  16824. bRtn = HTK_FALSE;
  16825. }
  16826. else
  16827. {
  16828. cmox_ecc_construct(&Ecc_Ctx, CMOX_ECC256_MATH_FUNCS, Working_Buffer, WORKING_BUFFER_SIZE);
  16829. for(uint8_t idx=0;idx<2;idx++) //2nd function call will get the correct result
  16830. {
  16831. retval = cmox_ecdsa_verify(
  16832. &Ecc_Ctx, /* ECC context */
  16833. #ifdef FUNC_CSU_VERIFY_USE_ECDSA_CMOX_ECC_CURVE_SECP256R1
  16834. CMOX_ECC_CURVE_SECP256R1, //more safe then SECP256K1
  16835. #else
  16836. CMOX_ECC_CURVE_SECP256K1, /* SECP256K1 ECC curve selected */
  16837. #endif
  16838. PublicKey, PublicKeyLen, /* Public key for verification */
  16839. Hash, CMOX_SHA256_SIZE, /* Digest to verify */
  16840. Signature, SignatureLen, /* Data buffer to receive signature */
  16841. &fault_check); /* Fault check variable: to ensure no fault injection occurs during this API call */
  16842. static char* CMOX_ECC_RETVAL_STR[] =
  16843. {
  16844. "UNKNOW", //0
  16845. "SUCCESS", //1
  16846. "ERR_INTERNAL", //2
  16847. "ERR_BAD_PARAMETERS", //3
  16848. "ERR_INVALID_PUBKEY", //4
  16849. "ERR_INVALID_SIGNATURE", //5
  16850. "ERR_WRONG_RANDOM", //6
  16851. "ERR_MEMORY_FAIL", //7
  16852. "ERR_MATHCURVE_MISMATCH", //8
  16853. "ERR_ALGOCURVE_MISMATCH", //9
  16854. "AUTH_SUCCESS", //10
  16855. "AUTH_FAIL" //11
  16856. };
  16857. int StrIdx = 0;
  16858. switch (retval)
  16859. {
  16860. case CMOX_ECC_SUCCESS: StrIdx = 1; break;
  16861. case CMOX_ECC_ERR_INTERNAL: StrIdx = 2; break;
  16862. case CMOX_ECC_ERR_BAD_PARAMETERS: StrIdx = 3; break;
  16863. case CMOX_ECC_ERR_INVALID_PUBKEY: StrIdx = 4; break;
  16864. case CMOX_ECC_ERR_INVALID_SIGNATURE: StrIdx = 5; break;
  16865. case CMOX_ECC_ERR_WRONG_RANDOM: StrIdx = 6; break;
  16866. case CMOX_ECC_ERR_MEMORY_FAIL: StrIdx = 7; break;
  16867. case CMOX_ECC_ERR_MATHCURVE_MISMATCH: StrIdx = 8; break;
  16868. case CMOX_ECC_ERR_ALGOCURVE_MISMATCH: StrIdx = 9; break;
  16869. case CMOX_ECC_AUTH_SUCCESS: StrIdx = 10; break;
  16870. case CMOX_ECC_AUTH_FAIL: StrIdx = 11; break;
  16871. default: StrIdx = 0; break;
  16872. }
  16873. XP("[%d] retval = 0x%08X (CMOX_ECC_%s), fault_check = 0x%08X\r\n", idx, retval, CMOX_ECC_RETVAL_STR[StrIdx], fault_check);
  16874. }
  16875. /* Verify API returned value */
  16876. //XP("retval = 0x%08X, fault_check = 0x%08X\r\n", retval, fault_check);
  16877. if ((retval == CMOX_ECC_AUTH_SUCCESS) && (fault_check == CMOX_ECC_AUTH_SUCCESS))
  16878. {
  16879. XP("<ECDSA Verify OK>\r\n");
  16880. bRtn = HTK_TRUE;
  16881. }
  16882. else
  16883. {
  16884. XP("<ECDSA Verify NG>\r\n");
  16885. bRtn = HTK_FALSE;
  16886. }
  16887. cmox_ecc_cleanup(&Ecc_Ctx);
  16888. }
  16889. HTK_Free(Working_Buffer);
  16890. return bRtn;
  16891. }
  16892. void ECDSA_VerifyTest(void)
  16893. {
  16894. u8 Public_Key[] =
  16895. {
  16896. 0x5A, 0x3D, 0x38, 0xEC, 0x72, 0x37, 0xA1, 0xB5, 0xF5, 0x2F, 0x3C, 0x34, 0x3C, 0x6E, 0x73, 0xBE,
  16897. 0x31, 0x9B, 0x15, 0x13, 0xF5, 0x92, 0x9B, 0xE9, 0xD3, 0x9A, 0xD0, 0x43, 0xA7, 0xBC, 0xD1, 0x26,
  16898. 0x81, 0x9C, 0x9A, 0x48, 0x1A, 0x3B, 0xE5, 0x32, 0xEE, 0xA9, 0x9D, 0x3C, 0x67, 0x30, 0x21, 0x63,
  16899. 0xF4, 0x26, 0x56, 0x22, 0xE5, 0x39, 0x49, 0xEC, 0x54, 0x63, 0x6D, 0x2E, 0x98, 0x40, 0xE0, 0x19
  16900. };
  16901. u8 Known_Hash[] =
  16902. {
  16903. 0xB2, 0xED, 0x99, 0x21, 0x86, 0xA5, 0xCB, 0x19, 0xF6, 0x66, 0x8A, 0xAD, 0xE8, 0x21, 0xF5, 0x02,
  16904. 0xC1, 0xD0, 0x09, 0x70, 0xDF, 0xD0, 0xE3, 0x51, 0x28, 0xD5, 0x1B, 0xAC, 0x46, 0x49, 0x91, 0x6C
  16905. };
  16906. u8 Known_Signature[] =
  16907. {
  16908. 0x0F, 0x80, 0xBE, 0x7F, 0x68, 0xE9, 0x73, 0x80, 0x22, 0x9A, 0xFF, 0x81, 0xEC, 0xE4, 0xE8, 0xCA,
  16909. 0xB7, 0x5D, 0xF6, 0x2D, 0x69, 0xEC, 0x06, 0xB9, 0xCA, 0x6D, 0x14, 0x72, 0x7A, 0x1C, 0xBE, 0xA7,
  16910. 0xC7, 0xE5, 0x1A, 0xF3, 0x43, 0x7D, 0xFD, 0x60, 0x04, 0x5B, 0xE7, 0xF1, 0xB8, 0x9C, 0xEA, 0x19,
  16911. 0xE8, 0x1D, 0xF0, 0xA7, 0xA7, 0x4F, 0xE3, 0x39, 0xFE, 0xB8, 0x0B, 0xF2, 0xFA, 0x1A, 0x93, 0x44
  16912. };
  16913. ECDSA_Verify(Public_Key, sizeof(Public_Key), Known_Hash, sizeof(Known_Hash), Known_Signature, sizeof(Known_Signature));
  16914. }
  16915. #endif //FUNC_ECDSA
  16916. #ifdef FUNC_VERIFY_TASK
  16917. void StartVerifyTask(void const * argument)
  16918. {
  16919. static u8* p = Charger.m_VerifyTaskRxBuf;
  16920. #ifdef FUNC_CSU_VERIFY_USE_ECDSA
  16921. static u8* pKey = Charger.memory.EVSE_Config.data.item.m_CsuPublicKey;
  16922. #else
  16923. //Generator: https://seanwasere.com/generate-random-hex/
  16924. const u8 AES256_KEY[32] =
  16925. {
  16926. 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
  16927. 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12
  16928. };
  16929. #endif
  16930. while (1)
  16931. {
  16932. //#ifdef FIXHW_AW48_CSU_EXIST_DELAY_CHECK
  16933. // if (Charger.m_bModelNameAW48_1P && Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  16934. // {
  16935. // AW48_CheckCSU();
  16936. // }
  16937. //#endif
  16938. if (Charger.m_bCsuSignInMustVerify || Charger.m_bCsuUpgradeFwMustVerify)
  16939. {
  16940. if (Charger.m_bCsuSignInMustVerify && !Charger.m_bCsuSignInVerifyOK && Charger.m_bRunCsuSignInVerify)
  16941. {
  16942. #ifdef FUNC_CSU_VERIFY_USE_ECDSA
  16943. Charger.m_bCsuSignInVerifyOK = ECDSA_Verify(pKey, CSU_PUBLIC_KEY_LEN, &p[10], 32, &p[42], 64);
  16944. #else
  16945. Charger.m_bCsuSignInVerifyOK = AES256_Verify(&p[6], 4, (u8*)AES256_KEY, &p[10], &p[26]);
  16946. #endif
  16947. Charger.m_bRunCsuSignInVerify = HTK_FALSE;
  16948. if (Charger.m_bCsuSignInVerifyOK && Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
  16949. {
  16950. Update_McuCtrlMode();
  16951. }
  16952. }
  16953. else if (Charger.m_bCsuUpgradeFwMustVerify && !Charger.m_bCsuUpgradeFwVerifyOK && Charger.m_bRunCsuUpgradeFwVerify)
  16954. {
  16955. #ifdef FUNC_CSU_VERIFY_USE_ECDSA
  16956. Charger.m_bCsuUpgradeFwVerifyOK = ECDSA_Verify(pKey, CSU_PUBLIC_KEY_LEN, &p[10], 32, &p[42], 64);
  16957. #else
  16958. Charger.m_bCsuUpgradeFwVerifyOK = AES256_Verify(&p[6], 4, (u8*)AES256_KEY, &p[10], &p[26]);
  16959. #endif
  16960. Charger.m_bRunCsuUpgradeFwVerify = HTK_FALSE;
  16961. }
  16962. }
  16963. osDelay(100);
  16964. }
  16965. }
  16966. #endif //FUNC_VERIFY_TASK
  16967. /* USER CODE END Application */
  16968. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/