appl.c 224 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796
  1. #include "appl.h"
  2. #define EXPORT_PATH "/sys/class/gpio/export" // GPIO设备导出设备
  3. #define DIR_OUT "out"
  4. #define DIR_IN "in"
  5. char* VERSION = "常宝股份 1.0";
  6. struct appl_t APPL;
  7. struct mg_mgr mgr_mqtt1; // thingsboard
  8. struct mg_mgr mgr_mqtt2; // cloud
  9. struct mg_mgr mgr_mqtt3; // gate and trans meter
  10. void appl_ac_set_ctlmod(int m)
  11. {
  12. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  13. ac->Step = 0;
  14. switch(m)
  15. {
  16. case AC_CTLMOD_EMS:
  17. strcpy(ac->szCtlMode,"EMS控制");
  18. break;
  19. case AC_CTLMOD_NON_EMS:
  20. strcpy(ac->szCtlMode,"非EMS控制");
  21. break;
  22. default:
  23. strcpy(ac->szCtlMode,"未知");
  24. break;
  25. }
  26. ac->CtlMode = m;
  27. syslog(LOG_INFO,"%s, CtlMode is Set To %s",__func__,ac->szCtlMode);
  28. }
  29. #if 0
  30. int appl_cfg_save(void)
  31. {
  32. long long chksum = 0;
  33. FILE* fp = NULL;
  34. int rc,i;
  35. fp = fopen("./cfg.bin","wb");
  36. if(fp == NULL)
  37. {
  38. syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail",__func__);
  39. return -1;
  40. }
  41. else
  42. {
  43. for(i = 0; i < sizeof(APPL.Set.buf - 8); i++)
  44. {
  45. chksum += APPL.Set.buf[8 + i];
  46. }
  47. APPL.Set.s.chksum = chksum;
  48. rc = fwrite(APPL.Set.buf,sizeof(char),sizeof(APPL.Set.buf),fp);
  49. if(rc != sizeof(APPL.Set.buf))
  50. {
  51. syslog(LOG_INFO,"%s, fwrite ./cfg.bin Fail, rc:%d",__func__,rc);
  52. return -1;
  53. }
  54. else
  55. {
  56. return 0;
  57. }
  58. }
  59. }
  60. int appl_cfg_read(void)
  61. {
  62. long long chksum = 0;
  63. FILE* fp = NULL;
  64. int rc,i;
  65. fp = fopen("./cfg.bin","rb");
  66. if(fp == NULL)
  67. {
  68. syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail",__func__);
  69. return -1;
  70. }
  71. else
  72. {
  73. rc = fread(APPL.Set.buf,sizeof(char),sizeof(APPL.Set.buf),fp);
  74. if(rc != sizeof(APPL.Set.buf))
  75. {
  76. syslog(LOG_INFO,"%s, fread ./cfg.bin Fail, rc:%d",__func__,rc);
  77. return -1;
  78. }
  79. else
  80. {
  81. for(i = 0; i < sizeof(APPL.Set.buf - 8); i++)
  82. {
  83. chksum += APPL.Set.buf[8 + i];
  84. }
  85. if(chksum == APPL.Set.s.chksum)
  86. {
  87. return 0;
  88. }
  89. else
  90. {
  91. syslog(LOG_INFO,"%s, Chksum Fail, rc:%d",__func__,rc);
  92. return -1;
  93. }
  94. }
  95. }
  96. }
  97. #else
  98. int appl_cfg_save(void)
  99. {
  100. FILE* fp = NULL;
  101. int rc,i;
  102. fp = fopen("./cfg.bin","wb");
  103. if(fp == NULL)
  104. {
  105. syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail",__func__);
  106. return -1;
  107. }
  108. else
  109. {
  110. rc = fwrite(APPL.Set.buf,sizeof(char),sizeof(APPL.Set.buf),fp);
  111. if(rc != sizeof(APPL.Set.buf))
  112. {
  113. syslog(LOG_INFO,"%s, fwrite ./cfg.bin Fail, rc:%d",__func__,rc);
  114. return -1;
  115. }
  116. else
  117. {
  118. return 0;
  119. }
  120. }
  121. }
  122. int appl_cfg_read(void)
  123. {
  124. FILE* fp = NULL;
  125. int rc,i;
  126. fp = fopen("./cfg.bin","rb");
  127. if(fp == NULL)
  128. {
  129. syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail",__func__);
  130. return -1;
  131. }
  132. else
  133. {
  134. rc = fread(APPL.Set.buf,sizeof(char),sizeof(APPL.Set.buf),fp);
  135. if(rc != sizeof(APPL.Set.buf))
  136. {
  137. syslog(LOG_INFO,"%s, fread ./cfg.bin Fail, rc:%d",__func__,rc);
  138. return -1;
  139. }
  140. else
  141. {
  142. return 0;
  143. }
  144. }
  145. }
  146. #endif
  147. void appl_cfg_set_err(void)
  148. {
  149. APPL.Set.s.bErr = 1;
  150. strcpy(APPL.Set.s.szState,"故障");
  151. }
  152. void appl_cfg_reset_err(void)
  153. {
  154. APPL.Set.s.bErr = 0;
  155. strcpy(APPL.Set.s.szState,"正常");
  156. }
  157. void appl_dido_set_state(int s,int e)
  158. {
  159. struct Dido_t* dido = &APPL.Dido;
  160. dido->State = s;
  161. switch(s)
  162. {
  163. case ST_DIDO_INIT:
  164. strcpy(dido->szState,"初始化");
  165. break;
  166. case ST_DIDO_RUN:
  167. strcpy(dido->szState,"运行");
  168. break;
  169. case ST_DIDO_ERR:
  170. strcpy(dido->szState,"故障");
  171. break;
  172. default:
  173. strcpy(dido->szState,"未知");
  174. break;
  175. }
  176. dido->ErrCode = e;
  177. switch(e)
  178. {
  179. case ERR_DIDO_NONE:
  180. strcpy(dido->szErrCode,"无");
  181. break;
  182. case ERR_DIDO_INIT_FAIL:
  183. strcpy(dido->szErrCode,"初始化失败");
  184. break;
  185. default:
  186. strcpy(dido->szErrCode,"未知");
  187. break;
  188. }
  189. }
  190. char* appl_get_datetime_long(void)
  191. {
  192. time_t timep;
  193. struct tm* tsp;
  194. static char buf[128];
  195. time(&timep);
  196. // tsp = gmtime(&timep);
  197. tsp = localtime(&timep);
  198. sprintf(buf,"%04d-%02d-%02d %02d:%02d:%02d",tsp->tm_year + 1900,
  199. tsp->tm_mon + 1,tsp->tm_mday,tsp->tm_hour,tsp->tm_min,
  200. (short)tsp->tm_sec);
  201. return buf;
  202. }
  203. static char* appl_get_datetime_short(void)
  204. {
  205. static char buf[128];
  206. time_t timep;
  207. struct tm* tsp;
  208. time(&timep);
  209. // tsp = gmtime(&timep);
  210. tsp = localtime(&timep);
  211. sprintf(buf,"%02d:%02d:%02d",tsp->tm_hour,tsp->tm_min,
  212. (short)tsp->tm_sec);
  213. return buf;
  214. }
  215. static void appl_get_datetime_num(int* y,int* m,int* d,int* h,int* min,
  216. int* s)
  217. {
  218. time_t timep;
  219. struct tm* tsp;
  220. time(&timep);
  221. // tsp = gmtime(&timep);
  222. tsp = localtime(&timep);
  223. *y = 1900 + tsp->tm_year;
  224. *m = 1 + tsp->tm_mon;
  225. *d = tsp->tm_mday;
  226. *h = tsp->tm_hour;
  227. *min = tsp->tm_min;
  228. *s = tsp->tm_sec;
  229. }
  230. static void* thrd_485_1(void* param)
  231. {
  232. char buf[128];
  233. modbus_t* ctx = NULL;
  234. struct timeval t;
  235. int rc;
  236. unsigned short data[256];
  237. unsigned short start;
  238. unsigned short nbr;
  239. int chidx = 1;
  240. struct chan485_t* ch = &APPL.chan485[chidx];
  241. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  242. struct Adl200_t* auxm = &APPL.Adl200;
  243. int64_t startts;
  244. int trycnt;
  245. MG_INFO(("%s ENTER",__func__));
  246. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  247. while(1)
  248. {
  249. startts = mg_millis();
  250. switch(ch->state)
  251. {
  252. case ST_485_INIT:
  253. ctx = modbus_new_rtu(ch->szdev,ch->baud,'N',8,1);
  254. if(ctx == NULL)
  255. {
  256. MG_INFO(("%s, modbus rtu new fail",__func__));
  257. appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
  258. }
  259. else if(modbus_connect(ctx) == -1)
  260. {
  261. MG_INFO(("%s, modbus rtu connect fail",__func__));
  262. modbus_free(ctx);
  263. ctx = NULL;
  264. appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
  265. }
  266. else
  267. {
  268. // t.tv_sec = 0;
  269. // t.tv_usec = 500000; // 500ms
  270. // modbus_set_response_timeout(ctx, 0, 500000);
  271. ch->reqcnt = 0;
  272. ch->failcnt = 0;
  273. appl_485_set_state(chidx,ST_485_RUN,ERR_485_NONE);
  274. }
  275. break;
  276. case ST_485_RUN:
  277. // Process Cmd
  278. if(ch->Cmd == CMD_485_PCS_START)
  279. {
  280. ch->Cmd = CMD_485_DONE;
  281. trycnt = 3;
  282. while(trycnt-- > 0)
  283. {
  284. appl_chan485_lock(chidx);
  285. usleep(30000);
  286. modbus_set_slave(ctx,pcs->Adr);
  287. rc = modbus_write_register(ctx,0x0291,1);
  288. appl_chan485_unlock(chidx);
  289. if(rc >= 0)
  290. {
  291. break;
  292. }
  293. else
  294. {
  295. modbus_flush(ctx);
  296. }
  297. }
  298. }
  299. else if(ch->Cmd == CMD_485_PCS_STOP)
  300. {
  301. ch->Cmd = CMD_485_DONE;
  302. trycnt = 3;
  303. while(trycnt-- > 0)
  304. {
  305. appl_chan485_lock(chidx);
  306. usleep(30000);
  307. modbus_set_slave(ctx,pcs->Adr);
  308. rc = modbus_write_register(ctx,0x0291,0);
  309. appl_chan485_unlock(chidx);
  310. if(rc >= 0)
  311. {
  312. break;
  313. }
  314. else
  315. {
  316. modbus_flush(ctx);
  317. }
  318. }
  319. }
  320. else if(ch->Cmd == CMD_485_PCS_SET_APS)
  321. {
  322. ch->Cmd = CMD_485_DONE;
  323. trycnt = 3;
  324. while(trycnt-- > 0)
  325. {
  326. appl_chan485_lock(chidx);
  327. usleep(30000);
  328. modbus_set_slave(ctx,pcs->Adr);
  329. rc = modbus_write_register(ctx,0x0D57,(0 - ch->CmdParam) * 10);
  330. appl_chan485_unlock(chidx);
  331. if(rc >= 0)
  332. {
  333. break;
  334. }
  335. else
  336. {
  337. modbus_flush(ctx);
  338. }
  339. }
  340. }
  341. else if(ch->Cmd == CMD_485_RESET)
  342. {
  343. ch->Cmd = CMD_485_DONE;
  344. if(ctx != NULL)
  345. {
  346. modbus_close(ctx);
  347. modbus_free(ctx);
  348. ctx = NULL;
  349. }
  350. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  351. break;
  352. }
  353. // ****************************************
  354. // Comm With PCS
  355. // ****************************************
  356. if(mg_millis() - pcs->LastUpdate > 5000)
  357. {
  358. pcs->CommState = ST_COMM_ERR;
  359. strcpy(pcs->szCommState,"故障");
  360. }
  361. else
  362. {
  363. pcs->CommState = ST_COMM_NORM;
  364. strcpy(pcs->szCommState,"正常");
  365. }
  366. // Part1
  367. appl_chan485_lock(chidx);
  368. usleep(30000);
  369. modbus_set_slave(ctx,pcs->Adr);
  370. start = 0x6020;
  371. nbr = 60;
  372. rc = modbus_read_registers(ctx,start,nbr,data);
  373. appl_chan485_unlock(chidx);
  374. ch->reqcnt += 1;
  375. if(rc != nbr)
  376. {
  377. ch->failcnt += 1;
  378. pcs->CommFailTotalCnt += 1;
  379. modbus_flush(ctx);
  380. }
  381. else
  382. {
  383. pcs->Uab = (short)data[0x6020 - start] / 10.0;
  384. pcs->Ubc = (short)data[0x6021 - start] / 10.0;
  385. pcs->Uca = (short)data[0x6022 - start] / 10.0;
  386. pcs->Ia = (short)data[0x6026 - start] / 10.0;
  387. pcs->Ib = (short)data[0x6027 - start] / 10.0;
  388. pcs->Ic = (short)data[0x6028 - start] / 10.0;
  389. pcs->Ap = 0 - (short)data[0x6039 - start] / 10.0;
  390. pcs->Rap = (short)data[0x603A - start] / 10.0;
  391. pcs->TotalBusVolt = (short)data[0x6050 - start] / 10.0;
  392. pcs->BatV = (short)data[0x6053 - start] / 10.0;
  393. pcs->BatC = (short)data[0x6054 - start] / 10.0;
  394. //syslog(LOG_INFO,"pcs state : %d",data[0x6057 - start]);
  395. if((data[0x6057 - start] & 0xffff) == 0)
  396. {
  397. pcs->WorkState = 0;
  398. strcpy(pcs->szWorkState,"停机");
  399. }
  400. else if(data[0x6057 - start] == 3)
  401. {
  402. pcs->WorkState = 2;
  403. strcpy(pcs->szWorkState,"启动中");
  404. }
  405. else if(data[0x6057 - start] == 5)
  406. {
  407. pcs->WorkState = 1;
  408. strcpy(pcs->szWorkState,"待机");
  409. }
  410. else if((data[0x6057 - start] == 9) ||
  411. (data[0x6057 - start] == 257))
  412. {
  413. pcs->WorkState = 1;
  414. strcpy(pcs->szWorkState,"运行");
  415. }
  416. else if((data[0x6057 - start] & 0b1000000) == 0b1000000)
  417. {
  418. pcs->WorkState = 3;
  419. strcpy(pcs->szWorkState,"故障");
  420. pcs->ErrState = data[0x6057 - start] >> 6 & 0x0001;
  421. }
  422. if(pcs->ErrState == 0)
  423. {
  424. strcpy(pcs->szErrState,"否");
  425. }
  426. else
  427. {
  428. strcpy(pcs->szErrState,"是");
  429. }
  430. pcs->Tigbt = (short)data[0x6058 - start] / 10.0;
  431. pcs->Tenv = (short)data[0x6059 - start] / 10.0;
  432. pcs->Tind = (short)data[0x605A - start] / 10.0;
  433. // Part2
  434. appl_chan485_lock(chidx);
  435. usleep(30000);
  436. start = 0x0D57;
  437. nbr = 1;
  438. rc = modbus_read_registers(ctx,start,nbr,data);
  439. appl_chan485_unlock(chidx);
  440. ch->reqcnt += 1;
  441. if(rc != nbr)
  442. {
  443. ch->failcnt += 1;
  444. pcs->CommFailTotalCnt += 1;
  445. modbus_flush(ctx);
  446. }
  447. else
  448. {
  449. pcs->Aps = (short)data[0x0D57 - start] / 10.0;
  450. // Part3
  451. appl_chan485_lock(chidx);
  452. usleep(30000);
  453. start = 0x1700;
  454. nbr = 8;
  455. rc = modbus_read_registers(ctx,start,nbr,data);
  456. appl_chan485_unlock(chidx);
  457. ch->reqcnt += 1;
  458. if(rc != nbr)
  459. {
  460. ch->failcnt += 1;
  461. pcs->CommFailTotalCnt += 1;
  462. modbus_flush(ctx);
  463. }
  464. else
  465. {
  466. // 硬件故障字 1 0x1700
  467. pcs->szHwFault1[0] = 0;
  468. pcs->HwFault1 = data[0x1700 - start];
  469. if((pcs->HwFault1 >> 0) & 0x0001)
  470. {
  471. strcat(pcs->szHwFault1,"EPO 故障");
  472. }
  473. if((pcs->HwFault1 >> 1) & 0x0001)
  474. {
  475. strcat(pcs->szHwFault1,"IGBT 硬件过流");
  476. }
  477. if((pcs->HwFault1 >> 2) & 0x0001)
  478. {
  479. strcat(pcs->szHwFault1,"母线硬件过压");
  480. }
  481. if((pcs->HwFault1 >> 4) & 0x0001)
  482. {
  483. strcat(pcs->szHwFault1,"功率模块逐波限流");
  484. }
  485. // 硬件故障字 2 0x1701
  486. pcs->szHwFault2[0] = 0;
  487. pcs->HwFault2 = data[0x1701 - start];
  488. if((pcs->HwFault2 >> 0) & 0x0001)
  489. {
  490. strcat(pcs->szHwFault2,"24V 电源故障");
  491. }
  492. if((pcs->HwFault2 >> 1) & 0x0001)
  493. {
  494. strcat(pcs->szHwFault2,"风扇故障");
  495. }
  496. if((pcs->HwFault2 >> 2) & 0x0001)
  497. {
  498. strcat(pcs->szHwFault2,"连接故障");
  499. }
  500. if((pcs->HwFault2 >> 6) & 0x0001)
  501. {
  502. strcat(pcs->szHwFault2,"防雷器故障");
  503. }
  504. if((pcs->HwFault2 >> 8) & 0x0001)
  505. {
  506. strcat(pcs->szHwFault2,"功率模块过温");
  507. }
  508. if((pcs->HwFault2 >> 10) & 0x0001)
  509. {
  510. strcat(pcs->szHwFault2,"15V 电源故障");
  511. }
  512. // 电网故障字 0x1702
  513. pcs->szGridFault[0] = 0;
  514. pcs->GridFault = data[0x1702 - start];
  515. if((pcs->GridFault >> 0) & 0x0001)
  516. {
  517. strcat(pcs->szGridFault,"A 相过压故障");
  518. }
  519. if((pcs->GridFault >> 1) & 0x0001)
  520. {
  521. strcat(pcs->szGridFault,"B 相过压故障");
  522. }
  523. if((pcs->GridFault >> 2) & 0x0001)
  524. {
  525. strcat(pcs->szGridFault,"C 相过压故障");
  526. }
  527. if((pcs->GridFault >> 3) & 0x0001)
  528. {
  529. strcat(pcs->szGridFault,"A 相欠压故障");
  530. }
  531. if((pcs->GridFault >> 4) & 0x0001)
  532. {
  533. strcat(pcs->szGridFault,"B 相欠压故障");
  534. }
  535. if((pcs->GridFault >> 5) & 0x0001)
  536. {
  537. strcat(pcs->szGridFault,"C 相欠压故障");
  538. }
  539. if((pcs->GridFault >> 6) & 0x0001)
  540. {
  541. strcat(pcs->szGridFault,"电网过频");
  542. }
  543. if((pcs->GridFault >> 7) & 0x0001)
  544. {
  545. strcat(pcs->szGridFault,"电网欠频");
  546. }
  547. if((pcs->GridFault >> 8) & 0x0001)
  548. {
  549. strcat(pcs->szGridFault,"电网相序错误");
  550. }
  551. if((pcs->GridFault >> 9) & 0x0001)
  552. {
  553. strcat(pcs->szGridFault,"A 相软件过流");
  554. }
  555. if((pcs->GridFault >> 10) & 0x0001)
  556. {
  557. strcat(pcs->szGridFault,"B 相软件过流");
  558. }
  559. if((pcs->GridFault >> 11) & 0x0001)
  560. {
  561. strcat(pcs->szGridFault,"C 相软件过流");
  562. }
  563. if((pcs->GridFault >> 12) & 0x0001)
  564. {
  565. strcat(pcs->szGridFault,"电网电压不平衡");
  566. }
  567. if((pcs->GridFault >> 13) & 0x0001)
  568. {
  569. strcat(pcs->szGridFault,"电网电流不平衡");
  570. }
  571. if((pcs->GridFault >> 14) & 0x0001)
  572. {
  573. strcat(pcs->szGridFault,"电网缺相");
  574. }
  575. if((pcs->GridFault >> 15) & 0x0001)
  576. {
  577. strcat(pcs->szGridFault,"N 线过流");
  578. }
  579. // 母线故障字 0x1703
  580. pcs->szBusFault[0] = 0;
  581. pcs->BusFault = data[0x1703 - start];
  582. if((pcs->BusFault >> 0) & 0x0001)
  583. {
  584. strcat(pcs->szBusFault,"预充母线过压");
  585. }
  586. if((pcs->BusFault >> 1) & 0x0001)
  587. {
  588. strcat(pcs->szBusFault,"预充母线欠压");
  589. }
  590. if((pcs->BusFault >> 2) & 0x0001)
  591. {
  592. strcat(pcs->szBusFault,"不控整流母线过压");
  593. }
  594. if((pcs->BusFault >> 3) & 0x0001)
  595. {
  596. strcat(pcs->szBusFault,"不控整流母线欠压");
  597. }
  598. if((pcs->BusFault >> 4) & 0x0001)
  599. {
  600. strcat(pcs->szBusFault,"运行母线过压");
  601. }
  602. if((pcs->BusFault >> 5) & 0x0001)
  603. {
  604. strcat(pcs->szBusFault,"运行母线欠压");
  605. }
  606. if((pcs->BusFault >> 6) & 0x0001)
  607. {
  608. strcat(pcs->szBusFault,"正负母线不平衡");
  609. }
  610. if((pcs->BusFault >> 7) & 0x0001)
  611. {
  612. strcat(pcs->szBusFault,"电池欠压");
  613. }
  614. if((pcs->BusFault >> 8) & 0x0001)
  615. {
  616. strcat(pcs->szBusFault,"电流模式母线欠压");
  617. }
  618. if((pcs->BusFault >> 9) & 0x0001)
  619. {
  620. strcat(pcs->szBusFault,"电池过压");
  621. }
  622. if((pcs->BusFault >> 10) & 0x0001)
  623. {
  624. strcat(pcs->szBusFault,"直流预充电过流");
  625. }
  626. if((pcs->BusFault >> 11) & 0x0001)
  627. {
  628. strcat(pcs->szBusFault,"直流过流");
  629. }
  630. // 交流电容故障字 0x1704
  631. pcs->szAcCapFault[0] = 0;
  632. pcs->AcCapFault = data[0x1704 - start];
  633. if((pcs->AcCapFault >> 0) & 0x0001)
  634. {
  635. strcat(pcs->szAcCapFault,"预充电超时");
  636. }
  637. if((pcs->AcCapFault >> 1) & 0x0001)
  638. {
  639. strcat(pcs->szAcCapFault,"预充电 A 相过流");
  640. }
  641. if((pcs->AcCapFault >> 2) & 0x0001)
  642. {
  643. strcat(pcs->szAcCapFault,"预充电 B 相过流");
  644. }
  645. if((pcs->AcCapFault >> 3) & 0x0001)
  646. {
  647. strcat(pcs->szAcCapFault,"预充电 C 相过流");
  648. }
  649. // 系统故障字 0x1705
  650. pcs->szSysFault[0] = 0;
  651. pcs->SysFault = data[0x1705 - start];
  652. if((pcs->SysFault >> 2) & 0x0001)
  653. {
  654. strcat(pcs->szSysFault,"AD 采样零漂");
  655. }
  656. if((pcs->SysFault >> 11) & 0x0001)
  657. {
  658. strcat(pcs->szSysFault,"STS 通信故障");
  659. }
  660. if((pcs->SysFault >> 12) & 0x0001)
  661. {
  662. strcat(pcs->szSysFault,"电池系统告警或故障");
  663. }
  664. if((pcs->SysFault >> 13) & 0x0001)
  665. {
  666. strcat(pcs->szSysFault,"BMS 通讯故障");
  667. }
  668. if((pcs->SysFault >> 14) & 0x0001)
  669. {
  670. strcat(pcs->szSysFault,"从模块 CAN 通信故障");
  671. }
  672. if((pcs->SysFault >> 15) & 0x0001)
  673. {
  674. strcat(pcs->szSysFault,"EMS 通信故障");
  675. }
  676. // 开关故障字 0x1706
  677. pcs->szOnOffFault[0] = 0;
  678. pcs->OnOffFault = data[0x1706 - start];
  679. if((pcs->OnOffFault >> 0) & 0x0001)
  680. {
  681. strcat(pcs->szOnOffFault,"预充电继电器闭合失败");
  682. }
  683. if((pcs->OnOffFault >> 1) & 0x0001)
  684. {
  685. strcat(pcs->szOnOffFault,"预充电继电器断开失败");
  686. }
  687. if((pcs->OnOffFault >> 2) & 0x0001)
  688. {
  689. strcat(pcs->szOnOffFault,"预充电继电器闭合状态错误");
  690. }
  691. if((pcs->OnOffFault >> 3) & 0x0001)
  692. {
  693. strcat(pcs->szOnOffFault,"预充电继电器断开状态错误");
  694. }
  695. if((pcs->OnOffFault >> 4) & 0x0001)
  696. {
  697. strcat(pcs->szOnOffFault,"主继电器闭合失败");
  698. }
  699. if((pcs->OnOffFault >> 5) & 0x0001)
  700. {
  701. strcat(pcs->szOnOffFault,"主继电器断开失败");
  702. }
  703. if((pcs->OnOffFault >> 6) & 0x0001)
  704. {
  705. strcat(pcs->szOnOffFault,"主继电器闭合状态错误");
  706. }
  707. if((pcs->OnOffFault >> 7) & 0x0001)
  708. {
  709. strcat(pcs->szOnOffFault,"主继电器断开状态错误");
  710. }
  711. // 其他故障字 0x1707
  712. pcs->szOtherFault[0] = 0;
  713. pcs->OtherFault = data[0x1707 - start];
  714. if((pcs->OtherFault >> 0) & 0x0001)
  715. {
  716. strcat(pcs->szOtherFault,"逆变电压 A 相过压故障");
  717. }
  718. if((pcs->OtherFault >> 1) & 0x0001)
  719. {
  720. strcat(pcs->szOtherFault,"逆变电压 B 相过压故障");
  721. }
  722. if((pcs->OtherFault >> 2) & 0x0001)
  723. {
  724. strcat(pcs->szOtherFault,"逆变电压 C 相过压故障");
  725. }
  726. if((pcs->OtherFault >> 3) & 0x0001)
  727. {
  728. strcat(pcs->szOtherFault,"电网孤岛故障");
  729. }
  730. if((pcs->OtherFault >> 5) & 0x0001)
  731. {
  732. strcat(pcs->szOtherFault,"系统谐振故障");
  733. }
  734. if((pcs->OtherFault >> 6) & 0x0001)
  735. {
  736. strcat(pcs->szOtherFault,"软件过压过流");
  737. }
  738. if((pcs->OtherFault >> 8) & 0x0001)
  739. {
  740. strcat(pcs->szOtherFault,"模块拨码地址错误");
  741. }
  742. if((pcs->OtherFault >> 9) & 0x0001)
  743. {
  744. strcat(pcs->szOtherFault,"逆变电压 A 相欠压故障");
  745. }
  746. if((pcs->OtherFault >> 10) & 0x0001)
  747. {
  748. strcat(pcs->szOtherFault,"逆变电压 B 相欠压故障");
  749. }
  750. if((pcs->OtherFault >> 11) & 0x0001)
  751. {
  752. strcat(pcs->szOtherFault,"逆变电压 C 相欠压故障");
  753. }
  754. if((pcs->OtherFault >> 12) & 0x0001)
  755. {
  756. strcat(pcs->szOtherFault,"离网无同步信号故障");
  757. }
  758. if((pcs->OtherFault >> 14) & 0x0001)
  759. {
  760. strcat(pcs->szOtherFault,"离网短路故障");
  761. }
  762. pcs->LastUpdate = mg_millis();
  763. strcpy(pcs->szLastUpdate,appl_get_datetime_long());
  764. }
  765. }
  766. }
  767. // comm with AUXM
  768. if(mg_millis() - auxm->LastUpdate > 5000)
  769. {
  770. auxm->CommState = ST_COMM_ERR;
  771. strcpy(auxm->szCommState,"故障");
  772. }
  773. else
  774. {
  775. auxm->CommState = ST_COMM_NORM;
  776. strcpy(auxm->szCommState,"正常");
  777. }
  778. appl_chan485_lock(chidx);
  779. usleep(30000);
  780. modbus_set_slave(ctx,auxm->Adr);
  781. start = 0x000B;
  782. nbr = 7;
  783. rc = modbus_read_registers(ctx,start,nbr,data);
  784. appl_chan485_unlock(chidx);
  785. ch->reqcnt += 1;
  786. if(rc != nbr)
  787. {
  788. ch->failcnt += 1;
  789. auxm->CommFailTotalCnt += 1;
  790. modbus_flush(ctx);
  791. }
  792. else
  793. {
  794. auxm->Volt = data[0x000B - start] * 0.1;
  795. auxm->Curr = data[0x000C - start] * 0.01;
  796. auxm->Ap = data[0x000D - start] * 0.001;
  797. auxm->Rap = data[0x000E - start] * 0.001;
  798. auxm->Pf = data[0x0010 - start] * 0.001;
  799. auxm->Gf = data[0x0011 - start] * 0.01;
  800. appl_chan485_lock(chidx);
  801. usleep(30000);
  802. start = 0x0068;
  803. nbr = 24;
  804. rc = modbus_read_registers(ctx,start,nbr,data);
  805. appl_chan485_unlock(chidx);
  806. ch->reqcnt += 1;
  807. if(rc != nbr)
  808. {
  809. ch->failcnt += 1;
  810. auxm->CommFailTotalCnt += 1;
  811. modbus_flush(ctx);
  812. }
  813. else
  814. {
  815. auxm->PosAe =
  816. (data[0x0069 - start] | data[0x0068 - start] << 16) * 0.01;
  817. auxm->NegAe =
  818. (data[0x0073 - start] | data[0x0072 - start] << 16) * 0.01;
  819. auxm->LastUpdate = mg_millis();
  820. strcpy(auxm->szLastUpdate,appl_get_datetime_long());
  821. }
  822. }
  823. break;
  824. case ST_485_ERR:
  825. if(ch->Cmd == CMD_485_RESET)
  826. {
  827. ch->Cmd = CMD_485_DONE;
  828. if(ctx != NULL)
  829. {
  830. modbus_close(ctx);
  831. modbus_free(ctx);
  832. ctx = NULL;
  833. }
  834. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  835. }
  836. else
  837. {
  838. usleep(300000);
  839. }
  840. break;
  841. default:
  842. // never reach here
  843. break;
  844. }
  845. usleep(100000);
  846. ch->loopcnt += 1;
  847. ch->looptime = mg_millis() - startts;
  848. }
  849. MG_INFO(("%s EXIT",__func__));
  850. }
  851. static void* thrd_485_2(void* param)
  852. {
  853. char buf[128];
  854. modbus_t* ctx = NULL;
  855. struct timeval t;
  856. int rc;
  857. unsigned short data[256];
  858. unsigned char bits[256];
  859. unsigned short start;
  860. unsigned short nbr;
  861. int chidx = 2;
  862. struct chan485_t* ch = &APPL.chan485[chidx];
  863. struct GaoteBms_t* bms = &APPL.GaoteBms;
  864. int step = 1;
  865. int i;
  866. int64_t startts;
  867. MG_INFO(("%s ENTER",__func__));
  868. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  869. while(1)
  870. {
  871. startts = mg_millis();
  872. switch(ch->state)
  873. {
  874. case ST_485_INIT:
  875. ctx = modbus_new_rtu(ch->szdev,ch->baud,'N',8,1);
  876. if(ctx == NULL)
  877. {
  878. MG_INFO(("%s, modbus rtu new fail",__func__));
  879. appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
  880. }
  881. else if(modbus_connect(ctx) == -1)
  882. {
  883. MG_INFO(("%s, modbus rtu connect fail",__func__));
  884. modbus_free(ctx);
  885. ctx = NULL;
  886. appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
  887. }
  888. else
  889. {
  890. t.tv_sec = 0;
  891. t.tv_usec = 500000;
  892. modbus_set_response_timeout(ctx,0,500000);
  893. ch->reqcnt = 0;
  894. ch->failcnt = 0;
  895. appl_485_set_state(chidx,ST_485_RUN,ERR_485_NONE);
  896. }
  897. break;
  898. case ST_485_RUN:
  899. // Process Cmd
  900. if(ch->Cmd == CMD_485_RESET)
  901. {
  902. ch->Cmd = CMD_485_DONE;
  903. if(ctx != NULL)
  904. {
  905. modbus_close(ctx);
  906. modbus_free(ctx);
  907. ctx = NULL;
  908. }
  909. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  910. break;
  911. }
  912. // comm with BMS
  913. if(mg_millis() - bms->LastUpdate > 5000)
  914. {
  915. bms->CommState = ST_COMM_ERR;
  916. strcpy(bms->szCommState,"故障");
  917. }
  918. else
  919. {
  920. bms->CommState = ST_COMM_NORM;
  921. strcpy(bms->szCommState,"正常");
  922. }
  923. // ****** PART 1 ******************
  924. appl_chan485_lock(chidx);
  925. usleep(30000);
  926. modbus_set_slave(ctx,bms->Adr);
  927. start = 1;
  928. nbr = 64;
  929. rc = modbus_read_input_registers(ctx,start,nbr,data);
  930. appl_chan485_unlock(chidx);
  931. ch->reqcnt += 1;
  932. if(rc != nbr)
  933. {
  934. ch->failcnt += 1;
  935. bms->CommFailTotalCnt += 1;
  936. modbus_flush(ctx);
  937. }
  938. else
  939. {
  940. bms->BatV = data[1 - start] / 10.0;
  941. bms->BatI = data[2 - start] / 10.0 - 1600;
  942. bms->Soc = data[3 - start];
  943. bms->Soh = data[4 - start];
  944. bms->PosRes = data[5 - start];
  945. bms->NegRes = data[6 - start];
  946. bms->BatState = data[7 - start];
  947. if(bms->BatState == 1)
  948. {
  949. strcpy(bms->szBatState,"充电");
  950. }
  951. else if(bms->BatState == 2)
  952. {
  953. strcpy(bms->szBatState,"放电");
  954. }
  955. else if(bms->BatState == 3)
  956. {
  957. strcpy(bms->szBatState,"开路");
  958. }
  959. else
  960. {
  961. strcpy(bms->szBatState,"未知");
  962. }
  963. bms->DI = data[8 - start];
  964. if((bms->DI & 0x00000025) == 0x00000025)
  965. {
  966. bms->HvState = 1;
  967. strcpy(bms->szHvState,"ON");
  968. }
  969. else
  970. {
  971. bms->HvState = 0;
  972. strcpy(bms->szHvState,"OFF");
  973. }
  974. bms->MaxCellT = data[11 - start] - 40;
  975. bms->MaxCellTModIdx = data[12 - start];
  976. bms->MaxCellTIdx = data[13 - start];
  977. bms->MinCellT = data[14 - start] - 40;
  978. bms->MinCellTModIdx = data[15 - start];
  979. bms->MinCellTIdx = data[16 - start];
  980. bms->AvgCellT = data[17 - start] - 40;
  981. bms->MaxCellV = data[20 - start] / 1000.0;
  982. bms->MaxCellVModIdx = data[21 - start];
  983. bms->MaxCellVIdx = data[22 - start];
  984. bms->AvgCellV = data[19 - start] / 1000.0;
  985. bms->MinCellV = data[23 - start] / 1000.0;
  986. bms->MinCellVModIdx = data[24 - start];
  987. bms->MinCellVIdx = data[25 - start];
  988. bms->MaxChgCurr = data[59 - start] / 10.0;
  989. bms->MaxDhgCurr = data[60 - start] / 10.0;
  990. if(data[61 - start] & 0x0001)
  991. {
  992. bms->bChgNotAllowed = 1;
  993. }
  994. else
  995. {
  996. bms->bChgNotAllowed = 0;
  997. }
  998. if((data[61 - start] >> 1) & 0x0001)
  999. {
  1000. bms->bDhgNotAllowed = 1;
  1001. }
  1002. else
  1003. {
  1004. bms->bDhgNotAllowed = 0;
  1005. }
  1006. if((data[61 - start] >> 2) & 0x0001)
  1007. {
  1008. bms->bTotalFatalErr = 1;
  1009. }
  1010. else
  1011. {
  1012. bms->bTotalFatalErr = 0;
  1013. }
  1014. if((data[61 - start] >> 2) & 0x0001)
  1015. {
  1016. bms->bWarning = 1;
  1017. }
  1018. else
  1019. {
  1020. bms->bWarning = 0;
  1021. }
  1022. bms->CellVDiff = data[62 - start];
  1023. bms->CellTDiff = data[63 - start] - 40;
  1024. // ****** PART 2 ******************
  1025. appl_chan485_lock(chidx);
  1026. usleep(30000);
  1027. modbus_set_slave(ctx,bms->Adr);
  1028. start = 1;
  1029. nbr = 58;
  1030. rc = modbus_read_input_bits(ctx,start,nbr,bits);
  1031. appl_chan485_unlock(chidx);
  1032. ch->reqcnt += 1;
  1033. if(rc != nbr)
  1034. {
  1035. ch->failcnt += 1;
  1036. bms->CommFailTotalCnt += 1;
  1037. }
  1038. else
  1039. {
  1040. bms->szErrMsg[0] = 0;
  1041. if(bits[1 - start])
  1042. {
  1043. bms->bTotalOv = 1;
  1044. strcpy(bms->szErrMsg,"组端过压3级报警");
  1045. }
  1046. else
  1047. {
  1048. bms->bTotalOv = 0;
  1049. }
  1050. if(bits[6 - start])
  1051. {
  1052. bms->bTotalUv = 1;
  1053. strcpy(bms->szErrMsg,"组端欠压3级报警");
  1054. }
  1055. else
  1056. {
  1057. bms->bTotalUv = 0;
  1058. }
  1059. if(bits[9 - start])
  1060. {
  1061. bms->bTotalDhgOc = 1;
  1062. strcpy(bms->szErrMsg,"组端放电过流 3 级报警");
  1063. }
  1064. else
  1065. {
  1066. bms->bTotalDhgOc = 0;
  1067. }
  1068. if(bits[12 - start])
  1069. {
  1070. bms->bTotalChgOc = 1;
  1071. strcpy(bms->szErrMsg,"组端充电过流 3 级报警");
  1072. }
  1073. else
  1074. {
  1075. bms->bTotalChgOc = 0;
  1076. }
  1077. if(bits[15 - start])
  1078. {
  1079. bms->bTotalResWarn = 1;
  1080. strcpy(bms->szErrMsg,"组端绝缘 3 级报警");
  1081. }
  1082. else
  1083. {
  1084. bms->bTotalResWarn = 0;
  1085. }
  1086. if(bits[18 - start])
  1087. {
  1088. bms->bCellOt = 1;
  1089. strcpy(bms->szErrMsg,"单体电池过温 3 级报警");
  1090. }
  1091. else
  1092. {
  1093. bms->bCellOt = 0;
  1094. }
  1095. if(bits[21 - start])
  1096. {
  1097. bms->bCellUt = 1;
  1098. strcpy(bms->szErrMsg,"单体电池欠温 3 级报警");
  1099. }
  1100. else
  1101. {
  1102. bms->bCellUt = 0;
  1103. }
  1104. if(bits[24 - start])
  1105. {
  1106. bms->bCellOv = 1;
  1107. strcpy(bms->szErrMsg,"单体电压过压 3 级报警");
  1108. }
  1109. else
  1110. {
  1111. bms->bCellOv = 0;
  1112. }
  1113. if(bits[27 - start])
  1114. {
  1115. bms->bCellUv = 1;
  1116. strcpy(bms->szErrMsg,"单体电压欠压 3 级报警");
  1117. }
  1118. else
  1119. {
  1120. bms->bCellUv = 0;
  1121. }
  1122. if(bits[30 - start])
  1123. {
  1124. bms->bCellVDiffErr = 1;
  1125. strcpy(bms->szErrMsg,"单体压差过高 3 级报警");
  1126. }
  1127. else
  1128. {
  1129. bms->bCellVDiffErr = 0;
  1130. }
  1131. if(bits[33 - start])
  1132. {
  1133. bms->bCellTDiffErr = 1;
  1134. strcpy(bms->szErrMsg,"单体温差过高 3 级报警");
  1135. }
  1136. else
  1137. {
  1138. bms->bCellTDiffErr = 0;
  1139. }
  1140. if(bits[36 - start])
  1141. {
  1142. bms->bSocLowErr = 1;
  1143. strcpy(bms->szErrMsg,"SOC 过低 3 级告警");
  1144. }
  1145. else
  1146. {
  1147. bms->bSocLowErr = 0;
  1148. }
  1149. if(bits[39 - start])
  1150. {
  1151. bms->bPowerPackOtErr = 1;
  1152. strcpy(bms->szErrMsg,"动力插箱温度过高 3 级报警");
  1153. }
  1154. else
  1155. {
  1156. bms->bPowerPackOtErr = 0;
  1157. }
  1158. if(bits[42 - start])
  1159. {
  1160. bms->bPackOv = 1;
  1161. strcpy(bms->szErrMsg,"电池模组过压 3 级报警");
  1162. }
  1163. else
  1164. {
  1165. bms->bPackOv = 0;
  1166. }
  1167. if(bits[45 - start])
  1168. {
  1169. bms->bPackUv = 1;
  1170. strcpy(bms->szErrMsg,"电池模组欠压 3 级报警");
  1171. }
  1172. else
  1173. {
  1174. bms->bPackUv = 0;
  1175. }
  1176. if(bits[46 - start])
  1177. {
  1178. bms->bDI1Err = 1;
  1179. strcpy(bms->szErrMsg,"DI1故障");
  1180. }
  1181. else
  1182. {
  1183. bms->bDI1Err = 0;
  1184. }
  1185. if(bits[47 - start])
  1186. {
  1187. bms->bDI2Err = 1;
  1188. strcpy(bms->szErrMsg,"DI2故障");
  1189. }
  1190. else
  1191. {
  1192. bms->bDI2Err = 0;
  1193. }
  1194. if(bits[48 - start])
  1195. {
  1196. bms->bDI3Err = 1;
  1197. strcpy(bms->szErrMsg,"DI3故障");
  1198. }
  1199. else
  1200. {
  1201. bms->bDI3Err = 0;
  1202. }
  1203. if(bits[49 - start])
  1204. {
  1205. bms->bDI4Err = 1;
  1206. strcpy(bms->szErrMsg,"DI4故障");
  1207. }
  1208. else
  1209. {
  1210. bms->bDI4Err = 0;
  1211. }
  1212. if(bits[50 - start])
  1213. {
  1214. bms->bDI5Err = 1;
  1215. strcpy(bms->szErrMsg,"DI5故障");
  1216. }
  1217. else
  1218. {
  1219. bms->bDI5Err = 0;
  1220. }
  1221. if(bits[51 - start])
  1222. {
  1223. bms->bDI6Err = 1;
  1224. strcpy(bms->szErrMsg,"DI6故障");
  1225. }
  1226. else
  1227. {
  1228. bms->bDI6Err = 0;
  1229. }
  1230. if(bits[52 - start])
  1231. {
  1232. bms->bDI7Err = 1;
  1233. strcpy(bms->szErrMsg,"DI7故障");
  1234. }
  1235. else
  1236. {
  1237. bms->bDI7Err = 0;
  1238. }
  1239. if(bits[53 - start])
  1240. {
  1241. bms->bDI8Err = 1;
  1242. strcpy(bms->szErrMsg,"DI8故障");
  1243. }
  1244. else
  1245. {
  1246. bms->bDI8Err = 0;
  1247. }
  1248. if(bits[54 - start])
  1249. {
  1250. bms->bMasterSlaveCommErr = 1;
  1251. strcpy(bms->szErrMsg,"主从内网通讯失联");
  1252. }
  1253. else
  1254. {
  1255. bms->bMasterSlaveCommErr = 0;
  1256. }
  1257. if(bits[55 - start])
  1258. {
  1259. bms->bCellVoltDacErr = 1;
  1260. strcpy(bms->szErrMsg,"单体电压采集故障");
  1261. }
  1262. else
  1263. {
  1264. bms->bCellVoltDacErr = 0;
  1265. }
  1266. if(bits[56 - start])
  1267. {
  1268. bms->bCellTempDacErr = 1;
  1269. strcpy(bms->szErrMsg,"单体温度采集故障");
  1270. }
  1271. else
  1272. {
  1273. bms->bCellTempDacErr = 0;
  1274. }
  1275. if(bits[57 - start])
  1276. {
  1277. bms->bJumpErr = 1;
  1278. strcpy(bms->szErrMsg,"跳机故障");
  1279. }
  1280. else
  1281. {
  1282. bms->bJumpErr = 0;
  1283. }
  1284. if(bits[58 - start])
  1285. {
  1286. bms->bBatLimErr = 1;
  1287. strcpy(bms->szErrMsg,"电池极限故障");
  1288. }
  1289. else
  1290. {
  1291. bms->bBatLimErr = 0;
  1292. }
  1293. // ****** PART 3 ******************
  1294. if(step == 1)
  1295. {
  1296. appl_chan485_lock(chidx);
  1297. usleep(30000);
  1298. modbus_set_slave(ctx,bms->Adr);
  1299. start = 100;
  1300. nbr = 52 * 2;
  1301. rc = modbus_read_input_registers(ctx,start,nbr,data);
  1302. appl_chan485_unlock(chidx);
  1303. ch->reqcnt += 1;
  1304. if(rc != nbr)
  1305. {
  1306. ch->failcnt += 1;
  1307. bms->CommFailTotalCnt += 1;
  1308. modbus_flush(ctx);
  1309. }
  1310. else
  1311. {
  1312. for(i = 1; i <= 52; i++)
  1313. { // pack1 cell volt
  1314. bms->CellVolt[1][i] = data[100 + i - 1 - start] / 1000.0;
  1315. }
  1316. for(i = 1; i <= 52; i++)
  1317. { // pack2 cell volt
  1318. bms->CellVolt[2][i] = data[100 + i - 1 + 52 - start] / 1000.0;
  1319. }
  1320. // ****** PART 4 ******************
  1321. appl_chan485_lock(chidx);
  1322. usleep(30000);
  1323. modbus_set_slave(ctx,bms->Adr);
  1324. start = 204;
  1325. nbr = 52 * 2;
  1326. rc = modbus_read_input_registers(ctx,start,nbr,data);
  1327. appl_chan485_unlock(chidx);
  1328. ch->reqcnt += 1;
  1329. if(rc != nbr)
  1330. {
  1331. ch->failcnt += 1;
  1332. bms->CommFailTotalCnt += 1;
  1333. modbus_flush(ctx);
  1334. }
  1335. else
  1336. {
  1337. for(i = 1; i <= 52; i++)
  1338. { // pack3 cell volt
  1339. bms->CellVolt[3][i] = data[i - 1] / 1000.0;
  1340. }
  1341. for(i = 1; i <= 52; i++)
  1342. { // pack4 cell volt
  1343. bms->CellVolt[4][i] = data[i - 1 + 52] / 1000.0;
  1344. }
  1345. step = 2;
  1346. bms->LastUpdate = mg_millis();
  1347. strcpy(bms->szLastUpdate,appl_get_datetime_long());
  1348. }
  1349. }
  1350. }
  1351. else if(step == 2)
  1352. {
  1353. appl_chan485_lock(chidx);
  1354. usleep(30000);
  1355. modbus_set_slave(ctx,bms->Adr);
  1356. start = 308;
  1357. nbr = 52;
  1358. rc = modbus_read_input_registers(ctx,start,nbr,data);
  1359. appl_chan485_unlock(chidx);
  1360. ch->reqcnt += 1;
  1361. if(rc != nbr)
  1362. {
  1363. ch->failcnt += 1;
  1364. bms->CommFailTotalCnt += 1;
  1365. modbus_flush(ctx);
  1366. }
  1367. else
  1368. {
  1369. for(i = 1; i <= 52; i++)
  1370. {
  1371. bms->CellVolt[5][i] = data[i - 1] / 1000.0;
  1372. }
  1373. appl_chan485_lock(chidx);
  1374. usleep(30000);
  1375. modbus_set_slave(ctx,bms->Adr);
  1376. start = 600;
  1377. nbr = 52 * 2;
  1378. rc = modbus_read_input_registers(ctx,start,nbr,data);
  1379. appl_chan485_unlock(chidx);
  1380. ch->reqcnt += 1;
  1381. if(rc != nbr)
  1382. {
  1383. ch->failcnt += 1;
  1384. bms->CommFailTotalCnt += 1;
  1385. modbus_flush(ctx);
  1386. }
  1387. else
  1388. {
  1389. for(i = 1; i <= 52; i++)
  1390. { // pack1 temp
  1391. bms->CellTemp[1][i] = data[i - 1] - 40;
  1392. }
  1393. for(i = 1; i <= 52; i++)
  1394. { // pack2 temp
  1395. bms->CellTemp[2][i] = data[i - 1 + 52] - 40;
  1396. }
  1397. step = 3;
  1398. bms->LastUpdate = mg_millis();
  1399. strcpy(bms->szLastUpdate,appl_get_datetime_long());
  1400. }
  1401. }
  1402. }
  1403. else if(step == 3)
  1404. {
  1405. appl_chan485_lock(chidx);
  1406. usleep(30000);
  1407. modbus_set_slave(ctx,bms->Adr);
  1408. start = 704;
  1409. nbr = 52 * 2;
  1410. rc = modbus_read_input_registers(ctx,start,nbr,data);
  1411. appl_chan485_unlock(chidx);
  1412. ch->reqcnt += 1;
  1413. if(rc != nbr)
  1414. {
  1415. ch->failcnt += 1;
  1416. bms->CommFailTotalCnt += 1;
  1417. modbus_flush(ctx);
  1418. }
  1419. else
  1420. {
  1421. for(i = 1; i <= 52; i++)
  1422. { // pack3 temp
  1423. bms->CellTemp[3][i] = data[i - 1] - 40;
  1424. }
  1425. for(i = 1; i <= 52; i++)
  1426. { // pack4 temp
  1427. bms->CellTemp[4][i] = data[i - 1 + 52] - 40;
  1428. }
  1429. appl_chan485_lock(chidx);
  1430. usleep(30000);
  1431. modbus_set_slave(ctx,bms->Adr);
  1432. start = 808;
  1433. nbr = 52;
  1434. rc = modbus_read_input_registers(ctx,start,nbr,data);
  1435. appl_chan485_unlock(chidx);
  1436. ch->reqcnt += 1;
  1437. if(rc != nbr)
  1438. {
  1439. ch->failcnt += 1;
  1440. bms->CommFailTotalCnt += 1;
  1441. modbus_flush(ctx);
  1442. }
  1443. else
  1444. {
  1445. for(i = 1; i <= 52; i++)
  1446. { // pack5 temp
  1447. bms->CellTemp[5][i] = data[i - 1] - 40;
  1448. }
  1449. step = 1;
  1450. bms->LastUpdate = mg_millis();
  1451. strcpy(bms->szLastUpdate,appl_get_datetime_long());
  1452. }
  1453. }
  1454. }
  1455. }
  1456. }
  1457. break;
  1458. case ST_485_ERR:
  1459. if(ch->Cmd == CMD_485_RESET)
  1460. {
  1461. ch->Cmd = CMD_485_DONE;
  1462. if(ctx != NULL)
  1463. {
  1464. modbus_close(ctx);
  1465. modbus_free(ctx);
  1466. ctx = NULL;
  1467. }
  1468. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  1469. }
  1470. else
  1471. {
  1472. usleep(300000);
  1473. }
  1474. break;
  1475. default:
  1476. // never reach here
  1477. break;
  1478. }
  1479. usleep(100000);
  1480. ch->loopcnt += 1;
  1481. ch->looptime = mg_millis() - startts;
  1482. }
  1483. MG_INFO(("%s EXIT",__func__));
  1484. }
  1485. static void* thrd_485_3(void* param)
  1486. {
  1487. char buf[128];
  1488. modbus_t* ctx = NULL;
  1489. struct timeval t;
  1490. int rc;
  1491. unsigned short data[256];
  1492. unsigned short start;
  1493. unsigned short nbr;
  1494. int chidx = 3;
  1495. struct chan485_t* ch = &APPL.chan485[chidx];
  1496. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  1497. struct GaoteBms_t* bms = &APPL.GaoteBms;
  1498. int64_t startts;
  1499. int trycnt;
  1500. syslog(LOG_INFO,"%s ENTER",__func__);
  1501. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  1502. while(1)
  1503. {
  1504. startts = mg_millis();
  1505. switch(ch->state)
  1506. {
  1507. case ST_485_INIT:
  1508. ctx = modbus_new_rtu(ch->szdev,ch->baud,'N',8,1);
  1509. if(ctx == NULL)
  1510. {
  1511. MG_INFO(("%s, modbus rtu new fail",__func__));
  1512. appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
  1513. }
  1514. else if(modbus_connect(ctx) == -1)
  1515. {
  1516. MG_INFO(("%s, modbus rtu connect fail",__func__));
  1517. modbus_free(ctx);
  1518. ctx = NULL;
  1519. appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
  1520. }
  1521. else
  1522. {
  1523. t.tv_sec = 0;
  1524. t.tv_usec = 500000;
  1525. modbus_set_response_timeout(ctx,0,500000);
  1526. ch->reqcnt = 0;
  1527. ch->failcnt = 0;
  1528. appl_485_set_state(chidx,ST_485_RUN,ERR_485_NONE);
  1529. }
  1530. break;
  1531. case ST_485_RUN:
  1532. // ****************************
  1533. // Process Cmd
  1534. // ****************************
  1535. if(ch->Cmd == CMD_485_RESET)
  1536. {
  1537. ch->Cmd = CMD_485_DONE;
  1538. if(ctx != NULL)
  1539. {
  1540. modbus_close(ctx);
  1541. modbus_free(ctx);
  1542. ctx = NULL;
  1543. }
  1544. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  1545. break;
  1546. }
  1547. break;
  1548. case ST_485_ERR:
  1549. if(ch->Cmd == CMD_485_RESET)
  1550. {
  1551. ch->Cmd = CMD_485_DONE;
  1552. if(ctx != NULL)
  1553. {
  1554. modbus_close(ctx);
  1555. modbus_free(ctx);
  1556. ctx = NULL;
  1557. }
  1558. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  1559. }
  1560. else
  1561. {
  1562. usleep(300000);
  1563. }
  1564. break;
  1565. default:
  1566. // never reach here
  1567. break;
  1568. }
  1569. usleep(100000);
  1570. ch->loopcnt += 1;
  1571. ch->looptime = mg_millis() - startts;
  1572. }
  1573. MG_INFO(("%s EXIT",__func__));
  1574. }
  1575. static void* thrd_485_4(void* param)
  1576. {
  1577. char buf[128];
  1578. modbus_t* ctx = NULL;
  1579. struct timeval t;
  1580. int rc;
  1581. unsigned short data[256];
  1582. unsigned char uc[128];
  1583. unsigned short start;
  1584. unsigned short nbr;
  1585. int chidx = 4;
  1586. struct chan485_t* ch = &APPL.chan485[chidx];
  1587. struct Dehumi_t* dh = &APPL.Dehumi;
  1588. struct Co_t* co = &APPL.Co;
  1589. int64_t startts;
  1590. int trycnt;
  1591. MG_INFO(("%s ENTER",__func__));
  1592. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  1593. while(1)
  1594. {
  1595. startts = mg_millis();
  1596. switch(ch->state)
  1597. {
  1598. case ST_485_INIT:
  1599. ctx = modbus_new_rtu(ch->szdev,ch->baud,'N',8,1);
  1600. if(ctx == NULL)
  1601. {
  1602. MG_INFO(("%s, modbus rtu new fail",__func__));
  1603. appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
  1604. }
  1605. else if(modbus_connect(ctx) == -1)
  1606. {
  1607. MG_INFO(("%s, modbus rtu connect fail",__func__));
  1608. modbus_free(ctx);
  1609. ctx = NULL;
  1610. appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
  1611. }
  1612. else
  1613. {
  1614. t.tv_sec = 0;
  1615. t.tv_usec = 500000;
  1616. modbus_set_response_timeout(ctx,0,500000);
  1617. ch->reqcnt = 0;
  1618. ch->failcnt = 0;
  1619. appl_485_set_state(chidx,ST_485_RUN,ERR_485_NONE);
  1620. }
  1621. break;
  1622. case ST_485_RUN:
  1623. // Process Cmd
  1624. if(ch->Cmd == CMD_485_RESET)
  1625. {
  1626. ch->Cmd = CMD_485_DONE;
  1627. if(ctx != NULL)
  1628. {
  1629. modbus_close(ctx);
  1630. modbus_free(ctx);
  1631. ctx = NULL;
  1632. }
  1633. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  1634. break;
  1635. }
  1636. else if(ch->Cmd == CMD_485_DH_SET_HUMISTART)
  1637. {
  1638. ch->Cmd = CMD_485_DONE;
  1639. trycnt = 3;
  1640. while(trycnt-- > 0)
  1641. {
  1642. appl_chan485_lock(chidx);
  1643. usleep(30000);
  1644. modbus_set_slave(ctx,dh->Adr);
  1645. rc = modbus_write_register(ctx,2,ch->CmdParam);
  1646. appl_chan485_unlock(chidx);
  1647. if(rc >= 0)
  1648. {
  1649. break;
  1650. }
  1651. else
  1652. {
  1653. modbus_flush(ctx);
  1654. }
  1655. }
  1656. }
  1657. else if(ch->Cmd == CMD_485_DH_SET_HUMISTOP)
  1658. {
  1659. ch->Cmd = CMD_485_DONE;
  1660. trycnt = 3;
  1661. while(trycnt-- > 0)
  1662. {
  1663. appl_chan485_lock(chidx);
  1664. usleep(30000);
  1665. modbus_set_slave(ctx,dh->Adr);
  1666. rc = modbus_write_register(ctx,3,ch->CmdParam);
  1667. appl_chan485_unlock(chidx);
  1668. if(rc >= 0)
  1669. {
  1670. break;
  1671. }
  1672. else
  1673. {
  1674. modbus_flush(ctx);
  1675. }
  1676. }
  1677. }
  1678. // comm with DH
  1679. if(mg_millis() - dh->LastUpdate > 5000)
  1680. {
  1681. dh->CommState = ST_COMM_ERR;
  1682. strcpy(dh->szCommState,"故障");
  1683. }
  1684. else
  1685. {
  1686. dh->CommState = ST_COMM_NORM;
  1687. strcpy(dh->szCommState,"正常");
  1688. }
  1689. appl_chan485_lock(chidx);
  1690. usleep(30000);
  1691. modbus_set_slave(ctx,dh->Adr);
  1692. start = 0;
  1693. nbr = 12;
  1694. rc = modbus_read_registers(ctx,start,nbr,data);
  1695. appl_chan485_unlock(chidx);
  1696. ch->reqcnt += 1;
  1697. if(rc != nbr)
  1698. {
  1699. ch->failcnt += 1;
  1700. dh->CommFailTotalCnt += 1;
  1701. }
  1702. else
  1703. {
  1704. dh->Temp = (short)data[0 - start] / 10.0;
  1705. dh->Humi = (short)data[1 - start] / 10.0;
  1706. dh->HumiStart = (short)data[2 - start];
  1707. dh->HumiStop = (short)data[3 - start];
  1708. dh->HeatStart = (short)data[4 - start];
  1709. dh->HeatState = data[7 - start];
  1710. if(dh->HeatState == 0)
  1711. {
  1712. strcpy(dh->szHeatState,"未加热");
  1713. }
  1714. else if(dh->HeatState == 1)
  1715. {
  1716. strcpy(dh->szHeatState,"正在加热");
  1717. }
  1718. else
  1719. {
  1720. strcpy(dh->szHeatState,"未知");
  1721. }
  1722. dh->WorkState = data[8 - start];
  1723. if(dh->WorkState == 0)
  1724. {
  1725. strcpy(dh->szWorkState,"待机");
  1726. }
  1727. else if(dh->WorkState == 1)
  1728. {
  1729. strcpy(dh->szWorkState,"正在除湿");
  1730. }
  1731. else if(dh->WorkState >= 2 || dh->WorkState <= 9)
  1732. {
  1733. strcpy(dh->szWorkState,"故障");
  1734. }
  1735. else
  1736. {
  1737. strcpy(dh->szWorkState,"未知");
  1738. }
  1739. dh->ManOrAuto = data[9 - start];
  1740. if(dh->ManOrAuto == 0)
  1741. {
  1742. strcpy(dh->szManOrAuto,"自动");
  1743. }
  1744. else if(dh->ManOrAuto == 1)
  1745. {
  1746. strcpy(dh->szManOrAuto,"手动");
  1747. }
  1748. else
  1749. {
  1750. strcpy(dh->szManOrAuto,"未知");
  1751. }
  1752. dh->ManHumi = data[0x0A - start];
  1753. dh->ManHeat = data[0x0B - start];
  1754. dh->LastUpdate = mg_millis();
  1755. strcpy(dh->szLastUpdate,appl_get_datetime_long());
  1756. }
  1757. // comm with CO
  1758. if(mg_millis() - co->LastUpdate > 5000)
  1759. {
  1760. co->CommState = ST_COMM_ERR;
  1761. strcpy(co->szCommState,"故障");
  1762. }
  1763. else
  1764. {
  1765. co->CommState = ST_COMM_NORM;
  1766. strcpy(co->szCommState,"正常");
  1767. }
  1768. appl_chan485_lock(chidx);
  1769. usleep(30000);
  1770. modbus_set_slave(ctx,co->Adr);
  1771. start = 1;
  1772. nbr = 2;
  1773. rc = modbus_read_registers(ctx,start,nbr,data);
  1774. appl_chan485_unlock(chidx);
  1775. ch->reqcnt += 1;
  1776. if(rc != nbr)
  1777. {
  1778. ch->failcnt += 1;
  1779. co->CommFailTotalCnt += 1;
  1780. }
  1781. else
  1782. {
  1783. co->Flag = data[1 - start] & 0x000F;
  1784. if(co->Flag == 0x00)
  1785. {
  1786. strcpy(co->szFlag,"无报警");
  1787. }
  1788. else if(co->Flag == 0xFF)
  1789. {
  1790. strcpy(co->szFlag,"气体告警");
  1791. }
  1792. else if(co->Flag == 0xFE)
  1793. {
  1794. strcpy(co->szFlag,"传感器故障");
  1795. }
  1796. else if(co->Flag == 0xFD)
  1797. {
  1798. strcpy(co->szFlag,"传感器预热");
  1799. }
  1800. else
  1801. {
  1802. strcpy(co->szFlag,"未知");
  1803. }
  1804. co->Density = data[2 - start];
  1805. co->LastUpdate = mg_millis();
  1806. strcpy(co->szLastUpdate,appl_get_datetime_long());
  1807. }
  1808. break;
  1809. case ST_485_ERR:
  1810. if(ch->Cmd == CMD_485_RESET)
  1811. {
  1812. ch->Cmd = CMD_485_DONE;
  1813. if(ctx != NULL)
  1814. {
  1815. modbus_close(ctx);
  1816. modbus_free(ctx);
  1817. ctx = NULL;
  1818. }
  1819. appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
  1820. }
  1821. else
  1822. {
  1823. usleep(300000);
  1824. }
  1825. break;
  1826. default:
  1827. // never reach here
  1828. break;
  1829. }
  1830. usleep(200000);
  1831. ch->loopcnt += 1;
  1832. ch->looptime = mg_millis() - startts;
  1833. }
  1834. MG_INFO(("%s EXIT",__func__));
  1835. }
  1836. #define PF_CAN 29
  1837. #define AF_CAN PF_CAN
  1838. #define SIOCSCANBAUDRATE (SIOCDEVPRIVATE + 0)
  1839. #define SIOCGCANBAUDRATE (SIOCDEVPRIVATE + 1)
  1840. #define SOL_CAN_RAW (SOL_CAN_BASE + CAN_RAW)
  1841. #define CAN_RAW_FILTER 1
  1842. #define CAN_RAW_RECV_OWN_MSGS 0x4
  1843. typedef __u32 can_baudrate_t;
  1844. struct ifreq ifr[CHANCAN_NBR + 1];
  1845. static void* thrd_can1_rx(void* thrdparam)
  1846. {
  1847. int i = 0;
  1848. int rc = 0;
  1849. struct can_frame frame;
  1850. int chidx = 1;
  1851. struct chancan_t* ch = &APPL.chancan[chidx];
  1852. int is_ext_frm = 0;
  1853. unsigned int id = 0;
  1854. int pidx;
  1855. struct FireAlarm_t* fa = NULL;
  1856. syslog(LOG_INFO,"%s ENTER",__func__);
  1857. while(1)
  1858. {
  1859. if(ch->sock <= 0)
  1860. {
  1861. usleep(100000);
  1862. continue;
  1863. }
  1864. memset(&frame,0,sizeof(struct can_frame));
  1865. rc = read(ch->sock,&frame,sizeof(struct can_frame));
  1866. if(rc > 0)
  1867. {
  1868. ch->RdCnt += 1;
  1869. if(frame.can_dlc)
  1870. {
  1871. is_ext_frm = (frame.can_id & CAN_EFF_FLAG) ? 1 : 0;
  1872. if(is_ext_frm)
  1873. {
  1874. id = frame.can_id & CAN_EFF_MASK;
  1875. }
  1876. else
  1877. {
  1878. id = frame.can_id & CAN_SFF_MASK;
  1879. }
  1880. if(((id >> 16) & 0xFF) == 0xB0)
  1881. {
  1882. pidx = id & 0xFF;
  1883. fa = &APPL.Fa[pidx];
  1884. fa->T1 = frame.data[0] - 40;
  1885. fa->T2 = frame.data[1] - 40;
  1886. fa->Co = frame.data[2] * 256 + frame.data[3];
  1887. fa->Voc = frame.data[4] * 256 + frame.data[5];
  1888. if(frame.data[6] == 0xAA)
  1889. {
  1890. strcpy(fa->szSmokeFlag,"正常");
  1891. fa->SmokeFlagVal = 0;
  1892. }
  1893. else if(frame.data[6] == 0x55)
  1894. {
  1895. strcpy(fa->szSmokeFlag,"预警");
  1896. fa->SmokeFlagVal = 1;
  1897. }
  1898. else
  1899. {
  1900. strcpy(fa->szSmokeFlag,"未知");
  1901. fa->SmokeFlagVal = -1;
  1902. }
  1903. fa->LevelVal = ((frame.data[7] >> 4) & 0x0F);
  1904. if(fa->LevelVal == 0x00)
  1905. {
  1906. strcpy(fa->szLevel,"正常");
  1907. }
  1908. else if(fa->LevelVal == 0x01)
  1909. {
  1910. strcpy(fa->szLevel,"一级");
  1911. }
  1912. else if(fa->LevelVal == 0x02)
  1913. {
  1914. strcpy(fa->szLevel,"二级");
  1915. }
  1916. else if(fa->LevelVal == 0x03)
  1917. {
  1918. strcpy(fa->szLevel,"三级");
  1919. }
  1920. else if(fa->LevelVal == 0x04)
  1921. {
  1922. strcpy(fa->szLevel,"四级");
  1923. }
  1924. else
  1925. {
  1926. strcpy(fa->szLevel,"未知");
  1927. }
  1928. fa->ErrCodeVal = (frame.data[7] & 0x0F);
  1929. if(fa->ErrCodeVal == 0x00)
  1930. {
  1931. strcpy(fa->szErrCode,"正常");
  1932. }
  1933. else if(fa->ErrCodeVal == 0x01)
  1934. {
  1935. strcpy(fa->szErrCode,"灭火器已启动");
  1936. }
  1937. else if(fa->ErrCodeVal == 0x02)
  1938. {
  1939. strcpy(fa->szErrCode,"传感器故障");
  1940. }
  1941. else if(fa->ErrCodeVal == 0x03)
  1942. {
  1943. strcpy(fa->szErrCode,"硬件故障");
  1944. }
  1945. else
  1946. {
  1947. strcpy(fa->szErrCode,"未知");
  1948. }
  1949. fa->LastUpdate = mg_millis();
  1950. }
  1951. }
  1952. }
  1953. else
  1954. {
  1955. APPL.chancan[chidx].RdFailcnt += 1;
  1956. }
  1957. }
  1958. return NULL;
  1959. }
  1960. static void* thrd_can1(void* param)
  1961. {
  1962. int chidx = 1;
  1963. struct chancan_t* ch = &APPL.chancan[chidx];
  1964. struct sockaddr_can addr;
  1965. int recv_own_msgs = 0; // set loop back: 1 enable 0 disable
  1966. int rc = 0;
  1967. pthread_t thrd_rx;
  1968. struct can_frame frame;
  1969. int64_t startts;
  1970. unsigned char FaAdr = 1;
  1971. int i;
  1972. struct FireAlarm_t* fa = NULL;
  1973. MG_INFO(("%s ENTER",__func__));
  1974. appl_can_set_state(chidx,ST_CAN_INIT,ERR_CAN_NONE);
  1975. while(1)
  1976. {
  1977. startts = mg_millis();
  1978. for(i = 1; i <= 5; i++)
  1979. {
  1980. fa = &APPL.Fa[i];
  1981. if(mg_millis() - fa->LastUpdate > 5000)
  1982. {
  1983. fa->CommState = ST_COMM_ERR;
  1984. strcpy(fa->szCommState,"故障");
  1985. }
  1986. else
  1987. {
  1988. fa->CommState = ST_COMM_NORM;
  1989. strcpy(fa->szCommState,"正常");
  1990. }
  1991. }
  1992. switch(appl_can_get_state(chidx))
  1993. {
  1994. case ST_CAN_INIT:
  1995. ch->sock = socket(PF_CAN,SOCK_RAW,CAN_RAW);
  1996. if(ch->sock < 0)
  1997. {
  1998. appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
  1999. }
  2000. else
  2001. {
  2002. addr.can_family = AF_CAN;
  2003. strcpy(ifr[chidx].ifr_name,ch->szdev);
  2004. rc = ioctl(ch->sock,SIOCGIFINDEX,&ifr[chidx]);
  2005. if(rc && ifr[chidx].ifr_ifindex == 0)
  2006. {
  2007. close(ch->sock);
  2008. ch->sock = 0;
  2009. appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
  2010. }
  2011. else
  2012. {
  2013. addr.can_ifindex = ifr[chidx].ifr_ifindex;
  2014. setsockopt(ch->sock,SOL_CAN_RAW,CAN_RAW_RECV_OWN_MSGS,
  2015. &recv_own_msgs,sizeof(recv_own_msgs));
  2016. if(bind(ch->sock,(struct sockaddr*)&addr,sizeof(addr)) < 0)
  2017. {
  2018. close(ch->sock);
  2019. ch->sock = 0;
  2020. appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
  2021. }
  2022. else
  2023. {
  2024. if(pthread_create(&thrd_rx,NULL,thrd_can1_rx,NULL) != 0)
  2025. {
  2026. close(ch->sock);
  2027. ch->sock = 0;
  2028. appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
  2029. }
  2030. else
  2031. {
  2032. appl_can_set_state(chidx,ST_CHANCAN_RUN,ERR_CAN_NONE);
  2033. }
  2034. }
  2035. }
  2036. }
  2037. break;
  2038. case ST_CHANCAN_RUN:
  2039. usleep(200000); // 200ms
  2040. frame.can_id = 0x18A200F6 | (FaAdr << 8);
  2041. FaAdr++;
  2042. if(FaAdr > 5)
  2043. {
  2044. FaAdr = 1;
  2045. }
  2046. // e.frame.can_id = 0x18A200F6 | (0xFF << 8); //发送广播消息
  2047. frame.can_id |= CAN_EFF_FLAG;
  2048. frame.can_dlc = 2;
  2049. frame.data[0] = 0x5A;
  2050. frame.data[1] = 0x4E;
  2051. frame.data[2] = 0;
  2052. frame.data[3] = 0;
  2053. frame.data[4] = 0;
  2054. frame.data[5] = 0;
  2055. frame.data[6] = 0;
  2056. frame.data[7] = 0;
  2057. write(ch->sock,(char*)&frame,sizeof(frame));
  2058. ch->WrCnt += 1;
  2059. break;
  2060. case ST_CHANCAN_ERR:
  2061. usleep(100000);
  2062. break;
  2063. default:
  2064. // NEVER REACH HERE
  2065. usleep(100000);
  2066. break;
  2067. }
  2068. ch->Loopcnt += 1;
  2069. ch->LoopTime = mg_millis() - startts;
  2070. }
  2071. MG_INFO(("%s EXIT",__func__));
  2072. }
  2073. static void* thrd_can2_rx(void* thrdparam)
  2074. {
  2075. int i = 0;
  2076. int rc = 0;
  2077. struct can_frame frame;
  2078. int chidx = 2;
  2079. struct chancan_t* ch = &APPL.chancan[chidx];
  2080. int is_ext_frm = 0;
  2081. unsigned int id = 0;
  2082. struct Envicool5kW_t* dev = &APPL.Envicool5kW;
  2083. syslog(LOG_INFO,"%s ENTER",__func__);
  2084. while(1)
  2085. {
  2086. if(ch->sock <= 0)
  2087. {
  2088. syslog(LOG_INFO,"ch->sock <= 0");
  2089. usleep(100000); // 100ms
  2090. continue;
  2091. }
  2092. memset(&frame,0,sizeof(struct can_frame));
  2093. rc = read(ch->sock,&frame,sizeof(struct can_frame));
  2094. if(rc > 0)
  2095. {
  2096. ch->RdCnt += 1;
  2097. if(frame.can_dlc)
  2098. {
  2099. is_ext_frm = (frame.can_id & CAN_EFF_FLAG) ? 1 : 0;
  2100. if(is_ext_frm)
  2101. {
  2102. id = frame.can_id & CAN_EFF_MASK;
  2103. }
  2104. else
  2105. {
  2106. id = frame.can_id & CAN_SFF_MASK;
  2107. }
  2108. if(id == 0x18008040)
  2109. {
  2110. // syslog(LOG_INFO,"id=0x18008040");
  2111. dev->LastUpdate1 = mg_millis();
  2112. strcpy(dev->szLastUpdate1,appl_get_datetime_long());
  2113. dev->WorkMode = frame.data[0] & 0x03; // byte1
  2114. if(dev->WorkMode == 0)
  2115. {
  2116. strcpy(dev->szWorkMode,"停机");
  2117. }
  2118. else if(dev->WorkMode == 1)
  2119. {
  2120. strcpy(dev->szWorkMode,"制冷");
  2121. }
  2122. else if(dev->WorkMode == 2)
  2123. {
  2124. strcpy(dev->szWorkMode,"加热");
  2125. }
  2126. else if(dev->WorkMode == 3)
  2127. {
  2128. strcpy(dev->szWorkMode,"自循环");
  2129. }
  2130. else
  2131. {
  2132. strcpy(dev->szWorkMode,"未知");
  2133. }
  2134. dev->OutWaterTemp = frame.data[1] - 40;
  2135. dev->InWaterTemp = frame.data[2] - 40;
  2136. dev->EnvTemp = frame.data[3] - 40;
  2137. dev->InWaterPre = frame.data[4] / 10.0;
  2138. dev->OutWaterPre = frame.data[5] / 10.0;
  2139. dev->ErrCode = frame.data[7] & 0x1f;
  2140. dev->ErrLevel = (frame.data[7] >> 6) & 0x03;
  2141. }
  2142. else if(id == 0x18018040)
  2143. {
  2144. // syslog(LOG_INFO,"id=0x18018040");
  2145. dev->LastUpdate2 = mg_millis();
  2146. strcpy(dev->szLastUpdate2,appl_get_datetime_long());
  2147. if((frame.data[0] & 0x01) == 0x01)
  2148. {
  2149. dev->CompState = 1;
  2150. strcpy(dev->szCompState,"打开");
  2151. }
  2152. else
  2153. {
  2154. dev->CompState = 0;
  2155. strcpy(dev->szCompState,"关闭");
  2156. }
  2157. if(((frame.data[0] >> 1) & 0x01) == 0x01)
  2158. {
  2159. dev->CompHeatStripState = 1;
  2160. }
  2161. else
  2162. {
  2163. dev->CompHeatStripState = 0;
  2164. }
  2165. if(((frame.data[0] >> 2) & 0x01) == 0x01)
  2166. {
  2167. dev->ElecHeatState = 1;
  2168. strcpy(dev->szElecHeatState,"打开");
  2169. }
  2170. else
  2171. {
  2172. dev->ElecHeatState = 0;
  2173. strcpy(dev->szElecHeatState,"关闭");
  2174. }
  2175. if(((frame.data[0] >> 3) & 0x01) == 0x01)
  2176. {
  2177. dev->PumpState = 1;
  2178. strcpy(dev->szPumpState,"打开");
  2179. }
  2180. else
  2181. {
  2182. dev->PumpState = 0;
  2183. strcpy(dev->szPumpState,"关闭");
  2184. }
  2185. if(((frame.data[0] >> 4) & 0x01) == 0x01)
  2186. {
  2187. dev->Fan1State = 1;
  2188. strcpy(dev->szFan1State,"打开");
  2189. }
  2190. else
  2191. {
  2192. dev->Fan1State = 0;
  2193. strcpy(dev->szFan1State,"关闭");
  2194. }
  2195. if(((frame.data[0] >> 5) & 0x01) == 0x01)
  2196. {
  2197. dev->Fan2State = 1;
  2198. strcpy(dev->szFan2State,"打开");
  2199. }
  2200. else
  2201. {
  2202. dev->Fan2State = 0;
  2203. strcpy(dev->szFan2State,"关闭");
  2204. }
  2205. if(((frame.data[0] >> 6) & 0x01) == 0x01)
  2206. {
  2207. dev->Fan3State = 1;
  2208. strcpy(dev->szFan3State,"打开");
  2209. }
  2210. else
  2211. {
  2212. dev->Fan3State = 0;
  2213. strcpy(dev->szFan3State,"关闭");
  2214. }
  2215. dev->CompRpm = frame.data[1] * 100;
  2216. dev->PumpRpm = frame.data[2] * 100;
  2217. }
  2218. else if(id == 0x18068040)
  2219. {
  2220. // syslog(LOG_INFO,"id=0x18068040, err");
  2221. dev->szErrMsg1[0] = 0;
  2222. if((frame.data[0] >> 0) & 0x01)
  2223. {
  2224. strcat(dev->szErrMsg1,"出水压力传感器故障(进、出均故障)");
  2225. }
  2226. if((frame.data[0] >> 1) & 0x01)
  2227. {
  2228. strcat(dev->szErrMsg1,"交流过压告警");
  2229. }
  2230. if((frame.data[0] >> 2) & 0x01)
  2231. {
  2232. strcat(dev->szErrMsg1,"交流欠压告警");
  2233. }
  2234. if((frame.data[0] >> 3) & 0x01)
  2235. {
  2236. strcat(dev->szErrMsg1,"水箱缺水告警");
  2237. }
  2238. if((frame.data[0] >> 4) & 0x01)
  2239. {
  2240. strcat(dev->szErrMsg1,"水泵故障");
  2241. }
  2242. if((frame.data[0] >> 5) & 0x01)
  2243. {
  2244. strcat(dev->szErrMsg1,"水泵故障锁定");
  2245. }
  2246. }
  2247. else if(id == 0x18078040)
  2248. {
  2249. // syslog(LOG_INFO,"id=0x18078040, err");
  2250. dev->szErrMsg2[0] = 0;
  2251. // byte1
  2252. if((frame.data[0] >> 0) & 0x01)
  2253. {
  2254. strcat(dev->szErrMsg2,"出水压力传感器故障");
  2255. }
  2256. if((frame.data[0] >> 1) & 0x01)
  2257. {
  2258. strcat(dev->szErrMsg2,"回水压力传感器故障");
  2259. }
  2260. if((frame.data[0] >> 2) & 0x01)
  2261. {
  2262. strcat(dev->szErrMsg2,"低压传感器故障");
  2263. }
  2264. if((frame.data[0] >> 3) & 0x01)
  2265. {
  2266. strcat(dev->szErrMsg2,"出水温感故障");
  2267. }
  2268. if((frame.data[0] >> 4) & 0x01)
  2269. {
  2270. strcat(dev->szErrMsg2,"系统低压告警");
  2271. }
  2272. if((frame.data[0] >> 5) & 0x01)
  2273. {
  2274. strcat(dev->szErrMsg2,"系统高压开关告警");
  2275. }
  2276. if((frame.data[0] >> 6) & 0x01)
  2277. {
  2278. strcat(dev->szErrMsg2,"排气温度过高告警");
  2279. }
  2280. if((frame.data[0] >> 7) & 0x01)
  2281. {
  2282. strcat(dev->szErrMsg2,"CAN 通讯故障告警");
  2283. }
  2284. // byte2
  2285. if((frame.data[1] >> 0) & 0x01)
  2286. {
  2287. strcat(dev->szErrMsg2,"吸气温感故障");
  2288. }
  2289. if((frame.data[1] >> 1) & 0x01)
  2290. {
  2291. strcat(dev->szErrMsg2,"制冷系统异常");
  2292. }
  2293. if((frame.data[1] >> 2) & 0x01)
  2294. {
  2295. strcat(dev->szErrMsg2,"低吸气过热度告警");
  2296. }
  2297. if((frame.data[1] >> 3) & 0x01)
  2298. {
  2299. strcat(dev->szErrMsg2,"压缩机变频器过压告警");
  2300. }
  2301. if((frame.data[1] >> 4) & 0x01)
  2302. {
  2303. strcat(dev->szErrMsg2,"压缩机变频器欠压告警");
  2304. }
  2305. if((frame.data[1] >> 5) & 0x01)
  2306. {
  2307. strcat(dev->szErrMsg2,"压缩机变频器过流告警");
  2308. }
  2309. if((frame.data[1] >> 6) & 0x01)
  2310. {
  2311. strcat(dev->szErrMsg2,"压缩机变频器过温告警");
  2312. }
  2313. if((frame.data[1] >> 7) & 0x01)
  2314. {
  2315. strcat(dev->szErrMsg2,"压缩机变频器通讯故障告警");
  2316. }
  2317. // byte3
  2318. if((frame.data[2] >> 0) & 0x01)
  2319. {
  2320. strcat(dev->szErrMsg2,"压缩机变频器缺相告警");
  2321. }
  2322. if((frame.data[2] >> 1) & 0x01)
  2323. {
  2324. strcat(dev->szErrMsg2,"压缩机变频器其他故障告警");
  2325. }
  2326. if((frame.data[2] >> 2) & 0x01)
  2327. {
  2328. strcat(dev->szErrMsg2,"水泵压差低告警");
  2329. }
  2330. if((frame.data[2] >> 3) & 0x01)
  2331. {
  2332. strcat(dev->szErrMsg2,"排气温度过高锁定");
  2333. }
  2334. if((frame.data[2] >> 4) & 0x01)
  2335. {
  2336. strcat(dev->szErrMsg2,"系统高压锁定");
  2337. }
  2338. if((frame.data[2] >> 5) & 0x01)
  2339. {
  2340. strcat(dev->szErrMsg2,"系统低压锁定");
  2341. }
  2342. if((frame.data[2] >> 6) & 0x01)
  2343. {
  2344. strcat(dev->szErrMsg2,"压缩机变频器过流锁定");
  2345. }
  2346. if((frame.data[2] >> 7) & 0x01)
  2347. {
  2348. strcat(dev->szErrMsg2,"压缩机变频器过压锁定");
  2349. }
  2350. // byte4
  2351. if((frame.data[3] >> 0) & 0x01)
  2352. {
  2353. strcat(dev->szErrMsg2,"压缩机变频器欠压锁定");
  2354. }
  2355. if((frame.data[3] >> 1) & 0x01)
  2356. {
  2357. strcat(dev->szErrMsg2,"压缩机变频器过温锁定");
  2358. }
  2359. if((frame.data[3] >> 2) & 0x01)
  2360. {
  2361. strcat(dev->szErrMsg2,"压缩机变频器缺相锁定");
  2362. }
  2363. if((frame.data[3] >> 3) & 0x01)
  2364. {
  2365. strcat(dev->szErrMsg2,"压缩机变频器其他故障锁定");
  2366. }
  2367. }
  2368. else if(id == 0x18088040)
  2369. {
  2370. // syslog(LOG_INFO,"id=0x18088040, err");
  2371. dev->szErrMsg3[0] = 0;
  2372. // byte1
  2373. if((frame.data[0] >> 0) & 0x01)
  2374. {
  2375. strcat(dev->szErrMsg3,"高压压力传感器故障");
  2376. }
  2377. if((frame.data[0] >> 1) & 0x01)
  2378. {
  2379. strcat(dev->szErrMsg3,"环境温感故障");
  2380. }
  2381. if((frame.data[0] >> 2) & 0x01)
  2382. {
  2383. strcat(dev->szErrMsg3,"回水温感故障");
  2384. }
  2385. if((frame.data[0] >> 3) & 0x01)
  2386. {
  2387. strcat(dev->szErrMsg3,"排气温感故障");
  2388. }
  2389. if((frame.data[0] >> 4) & 0x01)
  2390. {
  2391. strcat(dev->szErrMsg3,"冷凝温感故障");
  2392. }
  2393. if((frame.data[0] >> 5) & 0x01)
  2394. {
  2395. strcat(dev->szErrMsg3,"异常掉电告警");
  2396. }
  2397. if((frame.data[0] >> 6) & 0x01)
  2398. {
  2399. strcat(dev->szErrMsg3,"出水低温告警");
  2400. }
  2401. if((frame.data[0] >> 7) & 0x01)
  2402. {
  2403. strcat(dev->szErrMsg3,"出水高温告警");
  2404. }
  2405. // byte2
  2406. if((frame.data[1] >> 0) & 0x01)
  2407. {
  2408. strcat(dev->szErrMsg3,"出水压力过高告警");
  2409. }
  2410. }
  2411. }
  2412. }
  2413. else
  2414. {
  2415. APPL.chancan[chidx].RdFailcnt += 1;
  2416. syslog(LOG_INFO,"can2 read fail");
  2417. }
  2418. }
  2419. return NULL;
  2420. }
  2421. static void* thrd_can2(void* param)
  2422. {
  2423. int chidx = 2;
  2424. struct Settings_t* set = &APPL.Set.s;
  2425. struct chancan_t* ch = &APPL.chancan[chidx];
  2426. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  2427. int* step = &ac->Step;
  2428. struct GaoteBms_t* bms = &APPL.GaoteBms;
  2429. struct sockaddr_can addr;
  2430. int recv_own_msgs = 0; // set loop back: 1 enable 0 disable
  2431. int rc = 0;
  2432. pthread_t thrd_rx;
  2433. struct can_frame frame;
  2434. int64_t startts;
  2435. int64_t Update1Intv;
  2436. int64_t Update2Intv;
  2437. int ret;
  2438. syslog(LOG_INFO,"%s ENTER",__func__);
  2439. ac->MaxUpdate1Intv = 0;
  2440. ac->MaxUpdate2Intv = 0;
  2441. appl_can_set_state(chidx,ST_CAN_INIT,ERR_CAN_NONE);
  2442. while(1)
  2443. {
  2444. startts = mg_millis();
  2445. Update1Intv = mg_millis() - ac->LastUpdate1;
  2446. if(Update1Intv > ac->MaxUpdate1Intv)
  2447. {
  2448. ac->MaxUpdate1Intv = Update1Intv;
  2449. }
  2450. Update2Intv = mg_millis() - ac->LastUpdate2;
  2451. if(Update2Intv > ac->MaxUpdate2Intv)
  2452. {
  2453. ac->MaxUpdate2Intv = Update2Intv;
  2454. }
  2455. if(Update1Intv < 900000 && Update2Intv < 900000)
  2456. {
  2457. ac->CommState = ST_COMM_NORM;
  2458. strcpy(ac->szCommState,"正常");
  2459. }
  2460. else
  2461. {
  2462. ac->CommState = ST_COMM_ERR;
  2463. strcpy(ac->szCommState,"故障");
  2464. }
  2465. switch(appl_can_get_state(chidx))
  2466. {
  2467. case ST_CAN_INIT:
  2468. ch->sock = socket(PF_CAN,SOCK_RAW,CAN_RAW);
  2469. if(ch->sock < 0)
  2470. {
  2471. appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
  2472. }
  2473. else
  2474. {
  2475. addr.can_family = AF_CAN;
  2476. strcpy(ifr[chidx].ifr_name,ch->szdev);
  2477. rc = ioctl(ch->sock,SIOCGIFINDEX,&ifr[chidx]);
  2478. if(rc && ifr[chidx].ifr_ifindex == 0)
  2479. {
  2480. close(ch->sock);
  2481. ch->sock = 0;
  2482. appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
  2483. }
  2484. else
  2485. {
  2486. addr.can_ifindex = ifr[chidx].ifr_ifindex;
  2487. setsockopt(ch->sock,SOL_CAN_RAW,CAN_RAW_RECV_OWN_MSGS,
  2488. &recv_own_msgs,sizeof(recv_own_msgs));
  2489. if(bind(ch->sock,(struct sockaddr*)&addr,sizeof(addr)) < 0)
  2490. {
  2491. close(ch->sock);
  2492. ch->sock = 0;
  2493. appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
  2494. }
  2495. else
  2496. {
  2497. if(pthread_create(&thrd_rx,NULL,thrd_can2_rx,NULL) != 0)
  2498. {
  2499. close(ch->sock);
  2500. ch->sock = 0;
  2501. appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
  2502. }
  2503. else
  2504. {
  2505. appl_can_set_state(chidx,ST_CHANCAN_RUN,ERR_CAN_NONE);
  2506. }
  2507. }
  2508. }
  2509. }
  2510. break;
  2511. case ST_CHANCAN_RUN:
  2512. usleep(1000 * 1000);
  2513. frame.can_id = 0x04904000;
  2514. frame.can_id |= CAN_EFF_FLAG;
  2515. frame.can_dlc = 8;
  2516. frame.data[1] = 0;
  2517. frame.data[2] = 0;
  2518. frame.data[3] = 0;
  2519. frame.data[5] = 0;
  2520. frame.data[6] = 0;
  2521. frame.data[7] = 0;
  2522. if(ac->CtlMode == AC_CTLMOD_NON_EMS)
  2523. {
  2524. frame.data[0] = ac->SetMode;
  2525. frame.data[4] = ac->SetTemp + 40;
  2526. ret = write(ch->sock,(char*)&frame,sizeof(frame));
  2527. // syslog(LOG_INFO,"write ret=%d",ret);
  2528. ch->WrCnt += 1;
  2529. }
  2530. else if(ac->CtlMode == AC_CTLMOD_EMS)
  2531. {
  2532. if(bms->CommState == ST_COMM_NORM)
  2533. {
  2534. switch(*step)
  2535. {
  2536. case 0:
  2537. if(bms->AvgCellT < set->HeatTemp)
  2538. {
  2539. frame.data[0] = 2; // Heat
  2540. frame.data[4] = set->HeatTempSet + 40;
  2541. *step = 1;
  2542. }
  2543. else if(bms->AvgCellT > set->CoolTemp)
  2544. {
  2545. frame.data[0] = 1; // cool
  2546. frame.data[4] = set->CoolTempSet + 40;
  2547. *step = 2;
  2548. }
  2549. else
  2550. {
  2551. frame.data[0] = 3; // circulate
  2552. }
  2553. ret = write(ch->sock,(char*)&frame,sizeof(frame));
  2554. // syslog(LOG_INFO,"write ret=%d",ret);
  2555. ch->WrCnt += 1;
  2556. break;
  2557. case 1: // heat
  2558. if(bms->AvgCellT > set->HeatTemp + set->HeatGap)
  2559. {
  2560. frame.data[0] = 3;
  2561. *step = 0;
  2562. }
  2563. ret = write(ch->sock,(char*)&frame,sizeof(frame));
  2564. // syslog(LOG_INFO,"write ret=%d",ret);
  2565. ch->WrCnt += 1;
  2566. break;
  2567. case 2: // cool
  2568. if(bms->AvgCellT < set->CoolTemp - set->CoolGap)
  2569. {
  2570. frame.data[0] = 3;
  2571. *step = 0;
  2572. }
  2573. ret = write(ch->sock,(char*)&frame,sizeof(frame));
  2574. // syslog(LOG_INFO, "write ret=%d", ret);
  2575. ch->WrCnt += 1;
  2576. break;
  2577. default:
  2578. // NEVER REACH HERE
  2579. break;
  2580. }
  2581. }
  2582. }
  2583. break;
  2584. case ST_CHANCAN_ERR:
  2585. usleep(100000);
  2586. break;
  2587. default:
  2588. // NEVER REACH HERE
  2589. usleep(100000);
  2590. break;
  2591. }
  2592. ch->Loopcnt += 1;
  2593. ch->LoopTime = mg_millis() - startts;
  2594. }
  2595. MG_INFO(("%s EXIT",__func__));
  2596. }
  2597. static void* thrd_dido(void* param)
  2598. {
  2599. struct stat file_info;
  2600. char buf[128] = { 0 };
  2601. int rdsize;
  2602. int exported;
  2603. int fd_value;
  2604. int fd_export;
  2605. int fd_direction;
  2606. struct Dido_t* dido = &APPL.Dido;
  2607. struct Ctl_t* ctl = &APPL.Ctl;
  2608. syslog(LOG_INFO,"%s ENTER",__func__);
  2609. appl_dido_set_state(ST_DIDO_INIT,ERR_DIDO_NONE);
  2610. while(1)
  2611. {
  2612. usleep(1000000); // 1s
  2613. switch(dido->State)
  2614. {
  2615. case ST_DIDO_INIT:
  2616. // *************************************
  2617. // set gpio488 1#水浸
  2618. // *************************************
  2619. exported = 0;
  2620. sprintf(buf,"/sys/class/gpio/gpio488");
  2621. if(stat(buf,&file_info) != -1)
  2622. {
  2623. printf("gpio480 already exported\n");
  2624. exported = 1;
  2625. }
  2626. else
  2627. {
  2628. fd_export = open(EXPORT_PATH,O_WRONLY);
  2629. if(fd_export == -1)
  2630. {
  2631. printf("open gpio488 fail when export\n");
  2632. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2633. continue;
  2634. }
  2635. else
  2636. {
  2637. if(write(fd_export,"488",3) == -1)
  2638. {
  2639. printf("write path %s fail:%s\n",buf,strerror(errno));
  2640. close(fd_export);
  2641. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2642. continue;
  2643. }
  2644. else
  2645. {
  2646. close(fd_export);
  2647. exported = 1;
  2648. }
  2649. }
  2650. }
  2651. if(exported == 1)
  2652. {
  2653. // 设置gpio方向
  2654. sprintf(buf,"/sys/class/gpio/gpio488/direction");
  2655. fd_direction = open(buf,O_RDWR);
  2656. if(fd_direction == -1)
  2657. {
  2658. printf("open direction %s fail: %s\n",buf,strerror(errno));
  2659. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2660. continue;
  2661. }
  2662. else
  2663. {
  2664. sprintf(buf,"%s",DIR_IN);
  2665. if(write(fd_direction,buf,strlen(buf)) == -1)
  2666. {
  2667. printf("write direction %s fail:%s\n",buf,strerror(errno));
  2668. close(fd_direction);
  2669. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2670. continue;
  2671. }
  2672. else
  2673. {
  2674. close(fd_direction);
  2675. printf("gpio480 ok\n");
  2676. }
  2677. }
  2678. }
  2679. // ***********************************************
  2680. // set gpio489 2#水浸
  2681. // ***********************************************
  2682. exported = 0;
  2683. sprintf(buf,"/sys/class/gpio/gpio489");
  2684. if(stat(buf,&file_info) != -1)
  2685. {
  2686. printf("stat : gpio489 path exported: %s\n",buf);
  2687. exported = 1;
  2688. }
  2689. else
  2690. {
  2691. fd_export = open(EXPORT_PATH,O_WRONLY);
  2692. if(fd_export == -1)
  2693. {
  2694. printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
  2695. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2696. continue;
  2697. }
  2698. else
  2699. {
  2700. if(write(fd_export,"489",3) == -1)
  2701. {
  2702. printf("write path fail:%s\n",strerror(errno));
  2703. close(fd_export);
  2704. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2705. continue;
  2706. }
  2707. else
  2708. {
  2709. close(fd_export);
  2710. exported = 1;
  2711. }
  2712. }
  2713. }
  2714. if(exported == 1)
  2715. {
  2716. // 设置gpio489方向
  2717. sprintf(buf,"/sys/class/gpio/gpio489/direction");
  2718. fd_direction = open(buf,O_RDWR);
  2719. if(fd_direction == -1)
  2720. {
  2721. printf("open direction fail: %s\n",strerror(errno));
  2722. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2723. continue;
  2724. }
  2725. else
  2726. {
  2727. sprintf(buf,"%s",DIR_IN);
  2728. if(write(fd_direction,buf,strlen(buf)) == -1)
  2729. {
  2730. printf("write direction fail:%s\n",strerror(errno));
  2731. close(fd_direction);
  2732. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2733. continue;
  2734. }
  2735. else
  2736. {
  2737. close(fd_direction);
  2738. }
  2739. }
  2740. }
  2741. // ***************************************
  2742. // set gpio491 及安盾消防触发反馈
  2743. // ***************************************
  2744. exported = 0;
  2745. sprintf(buf,"/sys/class/gpio/gpio491");
  2746. if(stat(buf,&file_info) != -1)
  2747. {
  2748. printf("stat : gpio491 path exported: %s\n",buf);
  2749. exported = 1;
  2750. }
  2751. else
  2752. {
  2753. fd_export = open(EXPORT_PATH,O_WRONLY);
  2754. if(fd_export == -1)
  2755. {
  2756. printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
  2757. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2758. continue;
  2759. }
  2760. else
  2761. {
  2762. if(write(fd_export,"491",3) == -1)
  2763. {
  2764. printf("write path %s fail\n",strerror(errno));
  2765. close(fd_export);
  2766. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2767. continue;
  2768. }
  2769. else
  2770. {
  2771. close(fd_export);
  2772. exported = 1;
  2773. }
  2774. }
  2775. }
  2776. if(exported == 1)
  2777. {
  2778. // 设置gpio方向
  2779. sprintf(buf,"/sys/class/gpio/gpio491/direction");
  2780. fd_direction = open(buf,O_RDWR);
  2781. if(fd_direction == -1)
  2782. {
  2783. printf("open direction fail: %s\n",strerror(errno));
  2784. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2785. continue;
  2786. }
  2787. else
  2788. {
  2789. sprintf(buf,"%s",DIR_IN);
  2790. if(write(fd_direction,buf,strlen(buf)) == -1)
  2791. {
  2792. printf("write direction %s fail\n",strerror(errno));
  2793. close(fd_direction);
  2794. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2795. continue;
  2796. }
  2797. else
  2798. {
  2799. close(fd_direction);
  2800. }
  2801. }
  2802. }
  2803. // ********************************************
  2804. // set gpio134 前门磁
  2805. // ********************************************
  2806. exported = 0;
  2807. sprintf(buf,"/sys/class/gpio/gpio134");
  2808. if(stat(buf,&file_info) != -1)
  2809. {
  2810. printf("gpio134 already exported\n");
  2811. exported = 1;
  2812. }
  2813. else
  2814. {
  2815. fd_export = open(EXPORT_PATH,O_WRONLY);
  2816. if(fd_export == -1)
  2817. {
  2818. printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
  2819. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2820. continue;
  2821. }
  2822. if(write(fd_export,"134",3) == -1)
  2823. {
  2824. printf("write path %s fail\n",strerror(errno));
  2825. close(fd_export);
  2826. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2827. continue;
  2828. }
  2829. else
  2830. {
  2831. close(fd_export);
  2832. exported = 1;
  2833. }
  2834. }
  2835. if(exported == 1)
  2836. {
  2837. // 设置gpio方向
  2838. sprintf(buf,"/sys/class/gpio/gpio134/direction");
  2839. fd_direction = open(buf,O_RDWR);
  2840. if(fd_direction == -1)
  2841. {
  2842. printf("open direction fail: %s\n",strerror(errno));
  2843. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2844. continue;
  2845. }
  2846. else
  2847. {
  2848. sprintf(buf,"%s",DIR_IN);
  2849. if(write(fd_direction,buf,strlen(buf)) == -1)
  2850. {
  2851. printf("write direction %s fail\n",strerror(errno));
  2852. close(fd_direction);
  2853. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2854. continue;
  2855. }
  2856. else
  2857. {
  2858. close(fd_direction);
  2859. }
  2860. }
  2861. }
  2862. // ***************************************
  2863. // set gpio135 后门磁
  2864. // ***************************************
  2865. exported = 0;
  2866. sprintf(buf,"/sys/class/gpio/gpio135");
  2867. if(stat(buf,&file_info) != -1)
  2868. {
  2869. printf("stat : gpio135 path exported: %s\n",buf);
  2870. exported = 1;
  2871. }
  2872. else
  2873. {
  2874. fd_export = open(EXPORT_PATH,O_WRONLY);
  2875. if(fd_export == -1)
  2876. {
  2877. printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
  2878. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2879. continue;
  2880. }
  2881. else
  2882. {
  2883. if(write(fd_export,"135",3) == -1)
  2884. {
  2885. printf("write path %s fail\n",strerror(errno));
  2886. close(fd_export);
  2887. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2888. continue;
  2889. }
  2890. else
  2891. {
  2892. close(fd_export);
  2893. exported = 1;
  2894. }
  2895. }
  2896. }
  2897. if(exported == 1)
  2898. {
  2899. // 设置gpio方向
  2900. sprintf(buf,"/sys/class/gpio/gpio135/direction");
  2901. fd_direction = open(buf,O_RDWR);
  2902. if(fd_direction == -1)
  2903. {
  2904. printf("open direction fail: %s\n",strerror(errno));
  2905. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2906. continue;
  2907. }
  2908. else
  2909. {
  2910. sprintf(buf,"%s",DIR_IN);
  2911. if(write(fd_direction,buf,strlen(buf)) == -1)
  2912. {
  2913. printf("write direction %s fail\n",strerror(errno));
  2914. close(fd_direction);
  2915. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2916. continue;
  2917. }
  2918. else
  2919. {
  2920. close(fd_direction);
  2921. }
  2922. }
  2923. }
  2924. // **************************************************
  2925. // set gpio137 急停
  2926. // **************************************************
  2927. exported = 0;
  2928. sprintf(buf,"/sys/class/gpio/gpio137");
  2929. if(stat(buf,&file_info) != -1)
  2930. {
  2931. printf("stat : gpio137 path exported: %s\n",buf);
  2932. exported = 1;
  2933. }
  2934. else
  2935. {
  2936. fd_export = open(EXPORT_PATH,O_WRONLY);
  2937. if(fd_export == -1)
  2938. {
  2939. printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
  2940. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2941. continue;
  2942. }
  2943. else
  2944. {
  2945. if(write(fd_export,"137",3) == -1)
  2946. {
  2947. printf("write path %s fail\n",strerror(errno));
  2948. close(fd_export);
  2949. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2950. continue;
  2951. }
  2952. else
  2953. {
  2954. close(fd_export);
  2955. exported = 1;
  2956. }
  2957. }
  2958. }
  2959. if(exported == 1)
  2960. {
  2961. // 设置gpio方向
  2962. sprintf(buf,"/sys/class/gpio/gpio137/direction");
  2963. fd_direction = open(buf,O_RDWR);
  2964. if(fd_direction == -1)
  2965. {
  2966. printf("open direction fail: %s\n",strerror(errno));
  2967. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2968. continue;
  2969. }
  2970. else
  2971. {
  2972. sprintf(buf,"%s",DIR_IN);
  2973. if(write(fd_direction,buf,strlen(buf)) == -1)
  2974. {
  2975. printf("write direction %s fail\n",strerror(errno));
  2976. close(fd_direction);
  2977. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  2978. continue;
  2979. }
  2980. else
  2981. {
  2982. close(fd_direction);
  2983. }
  2984. }
  2985. }
  2986. // ************************************************
  2987. // set gpio480 红灯
  2988. // ************************************************
  2989. exported = 0;
  2990. sprintf(buf,"/sys/class/gpio/gpio480");
  2991. if(stat(buf,&file_info) != -1)
  2992. {
  2993. printf("gpio480 already exported\n");
  2994. exported = 1;
  2995. }
  2996. else
  2997. {
  2998. fd_export = open(EXPORT_PATH,O_WRONLY);
  2999. if(fd_export == -1)
  3000. {
  3001. printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
  3002. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3003. continue;
  3004. }
  3005. else
  3006. {
  3007. if(write(fd_export,"480",3) == -1)
  3008. {
  3009. printf("write path %s fail\n",strerror(errno));
  3010. close(fd_export);
  3011. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3012. continue;
  3013. }
  3014. else
  3015. {
  3016. close(fd_export);
  3017. exported = 1;
  3018. }
  3019. }
  3020. }
  3021. if(exported == 1)
  3022. {
  3023. // 设置gpio方向
  3024. sprintf(buf,"/sys/class/gpio/gpio480/direction");
  3025. fd_direction = open(buf,O_RDWR);
  3026. if(fd_direction == -1)
  3027. {
  3028. printf("open direction fail: %s\n",strerror(errno));
  3029. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3030. continue;
  3031. }
  3032. else
  3033. {
  3034. sprintf(buf,"%s",DIR_OUT);
  3035. if(write(fd_direction,buf,strlen(buf)) == -1)
  3036. {
  3037. printf("write direction %s fail\n",strerror(errno));
  3038. close(fd_direction);
  3039. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3040. continue;
  3041. }
  3042. else
  3043. {
  3044. printf("gpio480 set ok");
  3045. close(fd_direction);
  3046. appl_dido_set_state(ST_DIDO_RUN,ERR_DIDO_NONE);
  3047. }
  3048. }
  3049. }
  3050. // ************************************************
  3051. // set gpio481 绿灯
  3052. // ************************************************
  3053. exported = 0;
  3054. sprintf(buf,"/sys/class/gpio/gpio481");
  3055. if(stat(buf,&file_info) != -1)
  3056. {
  3057. printf("stat : gpio481 path exported: %s\n",buf);
  3058. exported = 1;
  3059. }
  3060. else
  3061. {
  3062. printf("%s, exporting gpio481\n",__func__);
  3063. fd_export = open(EXPORT_PATH,O_WRONLY);
  3064. if(fd_export == -1)
  3065. {
  3066. printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
  3067. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3068. continue;
  3069. }
  3070. else
  3071. {
  3072. if(write(fd_export,"481",3) == -1)
  3073. {
  3074. printf("write path %s fail\n",strerror(errno));
  3075. close(fd_export);
  3076. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3077. continue;
  3078. }
  3079. else
  3080. {
  3081. close(fd_export);
  3082. exported = 1;
  3083. }
  3084. }
  3085. }
  3086. if(exported == 1)
  3087. {
  3088. // 设置gpio方向
  3089. sprintf(buf,"/sys/class/gpio/gpio481/direction");
  3090. fd_direction = open(buf,O_RDWR);
  3091. if(fd_direction == -1)
  3092. {
  3093. printf("open direction fail: %s\n",strerror(errno));
  3094. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3095. continue;
  3096. }
  3097. else
  3098. {
  3099. sprintf(buf,"%s",DIR_OUT);
  3100. if(write(fd_direction,buf,strlen(buf)) == -1)
  3101. {
  3102. printf("write direction %s fail\n",strerror(errno));
  3103. close(fd_direction);
  3104. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3105. continue;
  3106. }
  3107. else
  3108. {
  3109. close(fd_direction);
  3110. }
  3111. }
  3112. }
  3113. // ************************************************
  3114. // set gpio482 蓝灯
  3115. // ************************************************
  3116. exported = 0;
  3117. sprintf(buf,"/sys/class/gpio/gpio482");
  3118. if(stat(buf,&file_info) != -1)
  3119. {
  3120. printf("stat : gpio482 path exported: %s\n",buf);
  3121. exported = 1;
  3122. }
  3123. else
  3124. {
  3125. fd_export = open(EXPORT_PATH,O_WRONLY);
  3126. if(fd_export == -1)
  3127. {
  3128. printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
  3129. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3130. continue;
  3131. }
  3132. else
  3133. {
  3134. if(write(fd_export,"482",3) == -1)
  3135. {
  3136. printf("write path %s fail\n",strerror(errno));
  3137. close(fd_export);
  3138. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3139. continue;
  3140. }
  3141. else
  3142. {
  3143. close(fd_export);
  3144. exported = 1;
  3145. }
  3146. }
  3147. }
  3148. if(exported == 1)
  3149. {
  3150. // 设置gpio方向
  3151. sprintf(buf,"/sys/class/gpio/gpio482/direction");
  3152. fd_direction = open(buf,O_RDWR);
  3153. if(fd_direction == -1)
  3154. {
  3155. printf("open direction fail: %s\n",strerror(errno));
  3156. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3157. continue;
  3158. }
  3159. else
  3160. {
  3161. sprintf(buf,"%s",DIR_OUT);
  3162. if(write(fd_direction,buf,strlen(buf)) == -1)
  3163. {
  3164. printf("write direction %s fail\n",strerror(errno));
  3165. close(fd_direction);
  3166. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
  3167. continue;
  3168. }
  3169. else
  3170. {
  3171. close(fd_direction);
  3172. }
  3173. }
  3174. }
  3175. // *************************************
  3176. // set gpio483 蜂鸣器
  3177. // *************************************
  3178. // exported = 0;
  3179. // sprintf(buf, "/sys/class/gpio/gpio483");
  3180. // if (stat(buf, &file_info) != -1){
  3181. // printf("stat : gpio483 path exported: %s\n", buf);
  3182. // exported = 1;
  3183. // }else{
  3184. // fd_export = open(EXPORT_PATH, O_WRONLY);
  3185. // if (fd_export == -1){
  3186. // printf("open path %s failed : %s\n", EXPORT_PATH,
  3187. // strerror(errno)); appl_dido_set_state(ST_DIDO_ERR,
  3188. // ERR_DIDO_INIT_FAIL); continue;
  3189. // }else{
  3190. // if (write(fd_export, "483", 3) == -1){
  3191. // printf("write path %s fail\n", strerror(errno));
  3192. // close(fd_export);
  3193. // appl_dido_set_state(ST_DIDO_ERR, ERR_DIDO_INIT_FAIL);
  3194. // continue;
  3195. // }else{
  3196. // close(fd_export);
  3197. // exported = 1;
  3198. // }
  3199. // }
  3200. // }
  3201. // if(exported == 1){
  3202. // // 设置gpio方向
  3203. // sprintf(buf, "/sys/class/gpio/gpio483/direction");
  3204. // fd_direction = open(buf, O_RDWR);
  3205. // if (fd_direction == -1){
  3206. // printf("open direction fail: %s\n", strerror(errno));
  3207. // appl_dido_set_state(ST_DIDO_ERR, ERR_DIDO_INIT_FAIL);
  3208. // continue;
  3209. // }else{
  3210. // sprintf(buf, "%s", DIR_OUT);
  3211. // if (write(fd_direction, buf, strlen(buf)) == -1){
  3212. // printf("write direction %s fail\n", strerror(errno));
  3213. // close(fd_direction);
  3214. // appl_dido_set_state(ST_DIDO_ERR, ERR_DIDO_INIT_FAIL);
  3215. // continue;
  3216. // }else{
  3217. // close(fd_direction);
  3218. // appl_dido_set_state(ST_DIDO_RUN, ERR_DIDO_NONE);
  3219. // MG_INFO(("%s Goto Run State",__func__));
  3220. // }
  3221. // }
  3222. // }
  3223. break;
  3224. case ST_DIDO_RUN:
  3225. if(dido->Cmd == CMD_DIDO_SET_LEDMOD)
  3226. {
  3227. dido->Cmd = CMD_DIDO_DONE;
  3228. appl_dido_set_led(dido->CmdParam);
  3229. }
  3230. if(ctl->State == CTL_ST_RUN)
  3231. {
  3232. if(ctl->Ap > 0)
  3233. { // CHG
  3234. appl_dido_set_led(LEDMODE_BLUE);
  3235. }
  3236. else if(ctl->Ap < 0)
  3237. { // DHG
  3238. appl_dido_set_led(LEDMODE_GREEN);
  3239. }
  3240. else
  3241. {
  3242. appl_dido_set_led(LEDMODE_WHITE);
  3243. }
  3244. }
  3245. else if(ctl->State == CTL_ST_ERR)
  3246. {
  3247. appl_dido_set_led(LEDMODE_RED);
  3248. }
  3249. else if(ctl->State == CTL_ST_STOP)
  3250. {
  3251. appl_dido_set_led(LEDMODE_OFF);
  3252. }
  3253. // read 488 1#水浸
  3254. sprintf(buf,"/sys/class/gpio/gpio488/value");
  3255. fd_value = open(buf,O_RDONLY);
  3256. if(fd_value == -1)
  3257. {
  3258. MG_INFO(("%s 488 open fail, Goto Err State",__func__));
  3259. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3260. continue;
  3261. }
  3262. else
  3263. {
  3264. memset(buf,0,sizeof(buf));
  3265. lseek(fd_value,0,SEEK_SET);
  3266. rdsize = read(fd_value,buf,sizeof(buf));
  3267. if(rdsize < 0)
  3268. {
  3269. MG_INFO(("%s 488 read fail, Goto Err State",__func__));
  3270. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3271. continue;
  3272. }
  3273. else
  3274. {
  3275. dido->WaterDec1 = 1 - atoi(buf);
  3276. if(dido->WaterDec1 == 1)
  3277. {
  3278. strcpy(dido->szWaterDec1,"有水");
  3279. }
  3280. else if(dido->WaterDec1 == 0)
  3281. {
  3282. strcpy(dido->szWaterDec1,"无水");
  3283. }
  3284. else
  3285. {
  3286. strcpy(dido->szWaterDec1,"未知");
  3287. MG_INFO(("%s 488 unknown value, Goto Err State",__func__));
  3288. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3289. continue;
  3290. }
  3291. }
  3292. close(fd_value);
  3293. }
  3294. // read 489 2#水浸
  3295. sprintf(buf,"/sys/class/gpio/gpio489/value");
  3296. fd_value = open(buf,O_RDONLY);
  3297. if(fd_value == -1)
  3298. {
  3299. syslog(LOG_INFO,"%s 489 open fail, Goto Err State",__func__);
  3300. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3301. continue;
  3302. }
  3303. else
  3304. {
  3305. memset(buf,0,sizeof(buf));
  3306. lseek(fd_value,0,SEEK_SET);
  3307. rdsize = read(fd_value,buf,sizeof(buf));
  3308. if(rdsize < 0)
  3309. {
  3310. syslog(LOG_INFO,"%s 489 read fail, Goto Err State",__func__);
  3311. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3312. continue;
  3313. }
  3314. else
  3315. {
  3316. dido->WaterDec2 = 1 - atoi(buf);
  3317. if(dido->WaterDec2 == 1)
  3318. {
  3319. strcpy(dido->szWaterDec2,"有水");
  3320. }
  3321. else if(dido->WaterDec2 == 0)
  3322. {
  3323. strcpy(dido->szWaterDec2,"无水");
  3324. }
  3325. else
  3326. {
  3327. strcpy(dido->szWaterDec2,"未知");
  3328. syslog(LOG_INFO,"%s 489 unknown value, Goto Err State",
  3329. __func__);
  3330. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3331. continue;
  3332. }
  3333. }
  3334. close(fd_value);
  3335. }
  3336. // read 491, 及安盾消防触发反馈
  3337. sprintf(buf,"/sys/class/gpio/gpio491/value");
  3338. fd_value = open(buf,O_RDONLY);
  3339. if(fd_value == -1)
  3340. {
  3341. syslog(LOG_INFO,"%s 491 open fail, Goto Err State",__func__);
  3342. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3343. continue;
  3344. }
  3345. else
  3346. {
  3347. memset(buf,0,sizeof(buf));
  3348. lseek(fd_value,0,SEEK_SET);
  3349. rdsize = read(fd_value,buf,sizeof(buf));
  3350. if(rdsize < 0)
  3351. {
  3352. syslog(LOG_INFO,"%s 491 read fail, Goto Err State",__func__);
  3353. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3354. continue;
  3355. }
  3356. else
  3357. {
  3358. dido->FeEruptFb = atoi(buf);
  3359. if(dido->FeEruptFb == 1)
  3360. {
  3361. strcpy(dido->szFeEruptFb,"触发");
  3362. }
  3363. else if(dido->FeEruptFb == 0)
  3364. {
  3365. strcpy(dido->szFeEruptFb,"未触发");
  3366. }
  3367. else
  3368. {
  3369. strcpy(dido->szFeEruptFb,"未知");
  3370. syslog(LOG_INFO,"%s 491 unknown value, Goto Err State",
  3371. __func__);
  3372. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3373. continue;
  3374. }
  3375. }
  3376. close(fd_value);
  3377. }
  3378. // read 134 前门磁
  3379. sprintf(buf,"/sys/class/gpio/gpio134/value");
  3380. fd_value = open(buf,O_RDONLY);
  3381. if(fd_value == -1)
  3382. {
  3383. MG_INFO(("%s 134 open fail, Goto Err State",__func__));
  3384. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3385. continue;
  3386. }
  3387. else
  3388. {
  3389. memset(buf,0,sizeof(buf));
  3390. lseek(fd_value,0,SEEK_SET);
  3391. rdsize = read(fd_value,buf,sizeof(buf));
  3392. if(rdsize < 0)
  3393. {
  3394. MG_INFO(("%s 134 read fail, Goto Err State",__func__));
  3395. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3396. continue;
  3397. }
  3398. else
  3399. {
  3400. dido->FrontDoor = atoi(buf);
  3401. if(dido->FrontDoor == 0)
  3402. {
  3403. strcpy(dido->szFrontDoor,"关");
  3404. }
  3405. else if(dido->FrontDoor == 1)
  3406. {
  3407. strcpy(dido->szFrontDoor,"开");
  3408. }
  3409. else
  3410. {
  3411. strcpy(dido->szFrontDoor,"未知");
  3412. MG_INFO(("%s 134 unknown value, Goto Err State",__func__));
  3413. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3414. continue;
  3415. }
  3416. }
  3417. close(fd_value);
  3418. }
  3419. // read 135 后门磁
  3420. sprintf(buf,"/sys/class/gpio/gpio135/value");
  3421. fd_value = open(buf,O_RDONLY);
  3422. if(fd_value == -1)
  3423. {
  3424. MG_INFO(("%s 135 open fail, Goto Err State",__func__));
  3425. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3426. continue;
  3427. }
  3428. else
  3429. {
  3430. memset(buf,0,sizeof(buf));
  3431. lseek(fd_value,0,SEEK_SET);
  3432. rdsize = read(fd_value,buf,sizeof(buf));
  3433. if(rdsize < 0)
  3434. {
  3435. MG_INFO(("%s 113534 read fail, Goto Err State",__func__));
  3436. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3437. continue;
  3438. }
  3439. else
  3440. {
  3441. dido->BackDoor = atoi(buf);
  3442. if(dido->BackDoor == 0)
  3443. {
  3444. strcpy(dido->szBackDoor,"关");
  3445. }
  3446. else if(dido->BackDoor == 1)
  3447. {
  3448. strcpy(dido->szBackDoor,"开");
  3449. }
  3450. else
  3451. {
  3452. strcpy(dido->szBackDoor,"未知");
  3453. MG_INFO(("%s 135 invalid value, Goto Err State",__func__));
  3454. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3455. continue;
  3456. }
  3457. }
  3458. close(fd_value);
  3459. }
  3460. // read 137 急停
  3461. sprintf(buf,"/sys/class/gpio/gpio137/value");
  3462. fd_value = open(buf,O_RDONLY);
  3463. if(fd_value == -1)
  3464. {
  3465. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3466. continue;
  3467. }
  3468. else
  3469. {
  3470. memset(buf,0,sizeof(buf));
  3471. lseek(fd_value,0,SEEK_SET);
  3472. rdsize = read(fd_value,buf,sizeof(buf));
  3473. if(rdsize < 0)
  3474. {
  3475. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3476. continue;
  3477. }
  3478. else
  3479. {
  3480. dido->EmgStop = atoi(buf);
  3481. if(dido->EmgStop == 0)
  3482. {
  3483. strcpy(dido->szEmgStop,"按下");
  3484. }
  3485. else if(dido->EmgStop == 1)
  3486. {
  3487. strcpy(dido->szEmgStop,"未按下");
  3488. }
  3489. else
  3490. {
  3491. strcpy(dido->szEmgStop,"未知");
  3492. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
  3493. continue;
  3494. }
  3495. }
  3496. close(fd_value);
  3497. }
  3498. dido->LastUpdate = mg_millis();
  3499. strcpy(dido->szLastUpdate,appl_get_datetime_long());
  3500. break;
  3501. case ST_DIDO_ERR:
  3502. break;
  3503. default:
  3504. break;
  3505. }
  3506. }
  3507. }
  3508. void appl_chan485_lock(int idx)
  3509. {
  3510. // pthread_mutex_lock(&APPL.chan485[idx].mutex);
  3511. }
  3512. void appl_chan485_unlock(int idx)
  3513. {
  3514. // pthread_mutex_unlock(&APPL.chan485[idx].mutex);
  3515. }
  3516. void appl_485_set_state(int idx,int s,int e)
  3517. {
  3518. struct chan485_t* c = &APPL.chan485[idx];
  3519. c->state = s;
  3520. switch(c->state)
  3521. {
  3522. case ST_485_INIT:
  3523. strcpy(c->szstate,"初始化");
  3524. break;
  3525. case ST_485_RUN:
  3526. strcpy(c->szstate,"运行");
  3527. break;
  3528. case ST_485_ERR:
  3529. strcpy(c->szstate,"故障");
  3530. break;
  3531. default:
  3532. strcpy(c->szstate,"未知");
  3533. break;
  3534. }
  3535. c->err = e;
  3536. switch(e)
  3537. {
  3538. case ERR_485_NONE:
  3539. strcpy(c->szerr,"无");
  3540. break;
  3541. case ERR_485_INIT_FAIL:
  3542. strcpy(c->szerr,"初始化失败");
  3543. break;
  3544. default:
  3545. strcpy(c->szerr,"未知");
  3546. break;
  3547. }
  3548. }
  3549. int appl_chan485_get_state(int idx)
  3550. {
  3551. return APPL.chan485[idx].state;
  3552. }
  3553. void appl_can_set_state(int idx,int s,int e)
  3554. {
  3555. struct chancan_t* c = &APPL.chancan[idx];
  3556. c->State = s;
  3557. switch(c->State)
  3558. {
  3559. case ST_CAN_INIT:
  3560. strcpy(c->szState,"初始化");
  3561. break;
  3562. case ST_CHANCAN_RUN:
  3563. strcpy(c->szState,"运行");
  3564. break;
  3565. case ST_CHANCAN_ERR:
  3566. strcpy(c->szState,"故障");
  3567. break;
  3568. default:
  3569. strcpy(c->szState,"未知");
  3570. break;
  3571. }
  3572. c->Err = e;
  3573. switch(e)
  3574. {
  3575. case ERR_CAN_NONE:
  3576. strcpy(c->szErr,"无");
  3577. break;
  3578. case ERR_CAN_INIT_FAIL:
  3579. strcpy(c->szErr,"初始化失败");
  3580. break;
  3581. default:
  3582. break;
  3583. }
  3584. }
  3585. // 声光报警
  3586. void appl_dido_set_alarm(int en)
  3587. {
  3588. struct Dido_t* dido = &APPL.Dido;
  3589. char buf[128] = { 0 };
  3590. int fd_value;
  3591. int ret = -1;
  3592. // write 482
  3593. sprintf(buf,"/sys/class/gpio/gpio482/value");
  3594. fd_value = open(buf,O_RDWR);
  3595. if(fd_value == -1)
  3596. {
  3597. ret = -1;
  3598. }
  3599. else
  3600. {
  3601. memset(buf,0,sizeof(buf));
  3602. lseek(fd_value,0,SEEK_SET);
  3603. sprintf(buf,"%d",en); // 0 : 不叫 1:叫
  3604. write(fd_value,buf,strlen(buf));
  3605. close(fd_value);
  3606. ret = 0;
  3607. }
  3608. syslog(LOG_INFO,"%s, En:%d, ret:%d",__func__,en,ret);
  3609. }
  3610. // 消防喷发确认
  3611. void appl_dido_set_fe_confirm(int en)
  3612. {
  3613. struct Dido_t* dido = &APPL.Dido;
  3614. char buf[128] = { 0 };
  3615. int fd_value;
  3616. int ret = -1;
  3617. // write 480
  3618. sprintf(buf,"/sys/class/gpio/gpio480/value");
  3619. fd_value = open(buf,O_RDWR);
  3620. if(fd_value == -1)
  3621. {
  3622. ret = -1;
  3623. }
  3624. else
  3625. {
  3626. memset(buf,0,sizeof(buf));
  3627. lseek(fd_value,0,SEEK_SET);
  3628. sprintf(buf,"%d",en);
  3629. write(fd_value,buf,strlen(buf));
  3630. close(fd_value);
  3631. ret = 0;
  3632. }
  3633. syslog(LOG_INFO,"%s, En:%d, ret:%d",__func__,en,ret);
  3634. }
  3635. void appl_dido_set_led(int m)
  3636. {
  3637. struct Dido_t* dido = &APPL.Dido;
  3638. char buf[128] = { 0 };
  3639. int fd_value;
  3640. int rc;
  3641. dido->LedMode = m;
  3642. switch(m)
  3643. {
  3644. case LEDMODE_OFF:
  3645. strcpy(dido->szLedMode,"灭");
  3646. // write 480 Red
  3647. sprintf(buf,"/sys/class/gpio/gpio480/value");
  3648. fd_value = open(buf,O_RDWR);
  3649. if(fd_value == -1)
  3650. {
  3651. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3652. }
  3653. else
  3654. {
  3655. memset(buf,0,sizeof(buf));
  3656. lseek(fd_value,0,SEEK_SET);
  3657. sprintf(buf,"%d",1); // !!!
  3658. rc = write(fd_value,buf,strlen(buf));
  3659. close(fd_value);
  3660. }
  3661. // write 481 Green
  3662. sprintf(buf,"/sys/class/gpio/gpio481/value");
  3663. fd_value = open(buf,O_RDWR);
  3664. if(fd_value == -1)
  3665. {
  3666. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3667. }
  3668. else
  3669. {
  3670. memset(buf,0,sizeof(buf));
  3671. lseek(fd_value,0,SEEK_SET);
  3672. sprintf(buf,"%d",1); // !!!
  3673. write(fd_value,buf,strlen(buf));
  3674. close(fd_value);
  3675. }
  3676. // write 482 Blue Blue
  3677. sprintf(buf,"/sys/class/gpio/gpio482/value");
  3678. fd_value = open(buf,O_RDWR);
  3679. if(fd_value == -1)
  3680. {
  3681. ;
  3682. }
  3683. else
  3684. {
  3685. memset(buf,0,sizeof(buf));
  3686. lseek(fd_value,0,SEEK_SET);
  3687. sprintf(buf,"%d",1); // !!!
  3688. write(fd_value,buf,strlen(buf));
  3689. close(fd_value);
  3690. }
  3691. break;
  3692. case LEDMODE_WHITE:
  3693. strcpy(dido->szLedMode,"白");
  3694. // write 480 Red
  3695. sprintf(buf,"/sys/class/gpio/gpio480/value");
  3696. fd_value = open(buf,O_RDWR);
  3697. if(fd_value == -1)
  3698. {
  3699. printf("fd_value -1\n");
  3700. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3701. }
  3702. else
  3703. {
  3704. memset(buf,0,sizeof(buf));
  3705. lseek(fd_value,0,SEEK_SET);
  3706. sprintf(buf,"%d",0); // !!!
  3707. rc = write(fd_value,buf,strlen(buf));
  3708. close(fd_value);
  3709. }
  3710. // write 481 Green
  3711. sprintf(buf,"/sys/class/gpio/gpio481/value");
  3712. fd_value = open(buf,O_RDWR);
  3713. if(fd_value == -1)
  3714. {
  3715. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3716. }
  3717. else
  3718. {
  3719. memset(buf,0,sizeof(buf));
  3720. lseek(fd_value,0,SEEK_SET);
  3721. sprintf(buf,"%d",0);
  3722. write(fd_value,buf,strlen(buf));
  3723. close(fd_value);
  3724. }
  3725. // write 482 Blue
  3726. sprintf(buf,"/sys/class/gpio/gpio482/value");
  3727. fd_value = open(buf,O_RDWR);
  3728. if(fd_value == -1)
  3729. {
  3730. ;
  3731. }
  3732. else
  3733. {
  3734. memset(buf,0,sizeof(buf));
  3735. lseek(fd_value,0,SEEK_SET);
  3736. sprintf(buf,"%d",0);
  3737. write(fd_value,buf,strlen(buf));
  3738. close(fd_value);
  3739. }
  3740. break;
  3741. case LEDMODE_RED:
  3742. strcpy(dido->szLedMode,"红");
  3743. // write 480 Red
  3744. sprintf(buf,"/sys/class/gpio/gpio480/value");
  3745. fd_value = open(buf,O_RDWR);
  3746. if(fd_value == -1)
  3747. {
  3748. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3749. }
  3750. else
  3751. {
  3752. memset(buf,0,sizeof(buf));
  3753. lseek(fd_value,0,SEEK_SET);
  3754. sprintf(buf,"%d",0);
  3755. write(fd_value,buf,strlen(buf));
  3756. close(fd_value);
  3757. }
  3758. // write 481 Green
  3759. sprintf(buf,"/sys/class/gpio/gpio481/value");
  3760. fd_value = open(buf,O_RDWR);
  3761. if(fd_value == -1)
  3762. {
  3763. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3764. }
  3765. else
  3766. {
  3767. memset(buf,0,sizeof(buf));
  3768. lseek(fd_value,0,SEEK_SET);
  3769. sprintf(buf,"%d",1);
  3770. write(fd_value,buf,strlen(buf));
  3771. close(fd_value);
  3772. }
  3773. // write 482 Blue
  3774. sprintf(buf,"/sys/class/gpio/gpio482/value");
  3775. fd_value = open(buf,O_RDWR);
  3776. if(fd_value == -1)
  3777. {
  3778. ;
  3779. }
  3780. else
  3781. {
  3782. memset(buf,0,sizeof(buf));
  3783. lseek(fd_value,0,SEEK_SET);
  3784. sprintf(buf,"%d",1);
  3785. write(fd_value,buf,strlen(buf));
  3786. close(fd_value);
  3787. }
  3788. break;
  3789. case LEDMODE_GREEN:
  3790. strcpy(dido->szLedMode,"绿");
  3791. // write 480 Red
  3792. sprintf(buf,"/sys/class/gpio/gpio480/value");
  3793. fd_value = open(buf,O_RDWR);
  3794. if(fd_value == -1)
  3795. {
  3796. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3797. }
  3798. else
  3799. {
  3800. memset(buf,0,sizeof(buf));
  3801. lseek(fd_value,0,SEEK_SET);
  3802. sprintf(buf,"%d",1); // !!
  3803. write(fd_value,buf,strlen(buf));
  3804. close(fd_value);
  3805. }
  3806. // write 481 Green
  3807. sprintf(buf,"/sys/class/gpio/gpio481/value");
  3808. fd_value = open(buf,O_RDWR);
  3809. if(fd_value == -1)
  3810. {
  3811. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3812. }
  3813. else
  3814. {
  3815. memset(buf,0,sizeof(buf));
  3816. lseek(fd_value,0,SEEK_SET);
  3817. sprintf(buf,"%d",0); // !!
  3818. write(fd_value,buf,strlen(buf));
  3819. close(fd_value);
  3820. }
  3821. // write 482 Blue
  3822. sprintf(buf,"/sys/class/gpio/gpio482/value");
  3823. fd_value = open(buf,O_RDWR);
  3824. if(fd_value == -1)
  3825. {
  3826. ;
  3827. }
  3828. else
  3829. {
  3830. memset(buf,0,sizeof(buf));
  3831. lseek(fd_value,0,SEEK_SET);
  3832. sprintf(buf,"%d",1);
  3833. write(fd_value,buf,strlen(buf));
  3834. close(fd_value);
  3835. }
  3836. break;
  3837. case LEDMODE_BLUE:
  3838. strcpy(dido->szLedMode,"蓝");
  3839. // write 480 Red
  3840. sprintf(buf,"/sys/class/gpio/gpio480/value");
  3841. fd_value = open(buf,O_RDWR);
  3842. if(fd_value == -1)
  3843. {
  3844. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3845. }
  3846. else
  3847. {
  3848. memset(buf,0,sizeof(buf));
  3849. lseek(fd_value,0,SEEK_SET);
  3850. sprintf(buf,"%d",1);
  3851. write(fd_value,buf,strlen(buf));
  3852. close(fd_value);
  3853. }
  3854. // write 481 Green
  3855. sprintf(buf,"/sys/class/gpio/gpio481/value");
  3856. fd_value = open(buf,O_RDWR);
  3857. if(fd_value == -1)
  3858. {
  3859. appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
  3860. }
  3861. else
  3862. {
  3863. memset(buf,0,sizeof(buf));
  3864. lseek(fd_value,0,SEEK_SET);
  3865. sprintf(buf,"%d",1);
  3866. write(fd_value,buf,strlen(buf));
  3867. close(fd_value);
  3868. }
  3869. // write 482 Blue
  3870. sprintf(buf,"/sys/class/gpio/gpio482/value");
  3871. fd_value = open(buf,O_RDWR);
  3872. if(fd_value == -1)
  3873. {
  3874. ;
  3875. }
  3876. else
  3877. {
  3878. memset(buf,0,sizeof(buf));
  3879. lseek(fd_value,0,SEEK_SET);
  3880. sprintf(buf,"%d",0);
  3881. write(fd_value,buf,strlen(buf));
  3882. close(fd_value);
  3883. }
  3884. break;
  3885. default:
  3886. break;
  3887. }
  3888. }
  3889. int appl_can_get_state(int idx)
  3890. {
  3891. return APPL.chancan[idx].State;
  3892. }
  3893. eMBErrorCode eMBRegInputCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
  3894. USHORT usAddress,USHORT usNRegs)
  3895. {
  3896. eMBErrorCode eStatus = MB_ENOERR;
  3897. int iRegIndex;
  3898. return MB_ENOREG;
  3899. }
  3900. eMBErrorCode eMBRegHoldingCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
  3901. USHORT usAddress,USHORT usNRegs,
  3902. eMBRegisterMode eMode)
  3903. {
  3904. eMBErrorCode eStatus = MB_ENOERR;
  3905. int iRegIndex;
  3906. int i = 0;
  3907. return eStatus;
  3908. }
  3909. eMBErrorCode eMBRegCoilsCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
  3910. USHORT usAddress,USHORT usNCoils,
  3911. eMBRegisterMode eMode)
  3912. {
  3913. return MB_ENOREG;
  3914. }
  3915. eMBErrorCode eMBRegDiscreteCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
  3916. USHORT usAddress,USHORT usNDiscrete)
  3917. {
  3918. return MB_ENOREG;
  3919. }
  3920. static void appl_ctl_set_workmode(int m)
  3921. {
  3922. struct Ctl_t* ctl = &APPL.Ctl;
  3923. ctl->WorkMode = m;
  3924. switch(m)
  3925. {
  3926. case CTL_WORKMODE_SLAVE:
  3927. strcpy(ctl->szWorkMode,"从机");
  3928. break;
  3929. case CTL_WORKMODE_PCURV:
  3930. strcpy(ctl->szWorkMode,"功率曲线");
  3931. break;
  3932. default:
  3933. break;
  3934. }
  3935. syslog(LOG_INFO,"%s, Ctl Workmode is Set To %s",__func__,ctl->szWorkMode);
  3936. }
  3937. void appl_485_set_485mode(void)
  3938. {
  3939. int fd;
  3940. struct serial_rs485 rs485conf = { 0 };
  3941. int ret;
  3942. // 1# 485
  3943. fd = open("/dev/ttymxc1",O_RDWR | O_NOCTTY);
  3944. if(fd <= 0)
  3945. {
  3946. syslog(LOG_INFO,"%s, Open ttymxc1 Fail",__func__);
  3947. }
  3948. else
  3949. {
  3950. /* get configure from device */
  3951. ret = ioctl(fd,TIOCGRS485,&rs485conf);
  3952. if(ret < 0)
  3953. {
  3954. // failed
  3955. syslog(LOG_INFO,"%s, ioctl ttymxc1 Fail",__func__);
  3956. }
  3957. /* set enable rs485 mode in configure */
  3958. /* Enable RS485 mode: */
  3959. rs485conf.flags |= SER_RS485_ENABLED;
  3960. /* Set logical level for RTS pin equal to 1 when sending: */
  3961. rs485conf.flags |= SER_RS485_RTS_ON_SEND;
  3962. /* Set logical level for RTS pin equal to 0 after sending: */
  3963. rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
  3964. /* Set this flag if you want to receive data even whilst sending data */
  3965. rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
  3966. /* Set rts delay before send, if needed: */
  3967. rs485conf.delay_rts_before_send = 0; // in miliseconds
  3968. /* Set rts delay after send, if needed: */
  3969. rs485conf.delay_rts_after_send = 0; // in miliseconds
  3970. ret = ioctl(fd,TIOCSRS485,&rs485conf);
  3971. if(ret < 0)
  3972. {
  3973. /* Error handling. See errno. */
  3974. syslog(LOG_INFO,"%s, Set ttymxc1 485 Fail",__func__);
  3975. }
  3976. close(fd);
  3977. }
  3978. // 2# 485
  3979. fd = open("/dev/ttymxc2",O_RDWR | O_NOCTTY);
  3980. if(fd <= 0)
  3981. {
  3982. syslog(LOG_INFO,"%s, Open ttymxc2 Fail",__func__);
  3983. }
  3984. else
  3985. {
  3986. /* get configure from device */
  3987. ret = ioctl(fd,TIOCGRS485,&rs485conf);
  3988. if(ret < 0)
  3989. {
  3990. // failed
  3991. syslog(LOG_INFO,"%s, ioctl ttymxc2 Fail",__func__);
  3992. }
  3993. /* set enable rs485 mode in configure */
  3994. /* Enable RS485 mode: */
  3995. rs485conf.flags |= SER_RS485_ENABLED;
  3996. /* Set logical level for RTS pin equal to 1 when sending: */
  3997. rs485conf.flags |= SER_RS485_RTS_ON_SEND;
  3998. /* Set logical level for RTS pin equal to 0 after sending: */
  3999. rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
  4000. /* Set this flag if you want to receive data even whilst sending data */
  4001. rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
  4002. /* Set rts delay before send, if needed: */
  4003. rs485conf.delay_rts_before_send = 0; // in miliseconds
  4004. /* Set rts delay after send, if needed: */
  4005. rs485conf.delay_rts_after_send = 0; // in miliseconds
  4006. ret = ioctl(fd,TIOCSRS485,&rs485conf);
  4007. if(ret < 0)
  4008. {
  4009. /* Error handling. See errno. */
  4010. syslog(LOG_INFO,"%s, Set ttymxc2 485 Fail",__func__);
  4011. }
  4012. close(fd);
  4013. }
  4014. // 3# 485
  4015. fd = open("/dev/ttymxc3",O_RDWR | O_NOCTTY);
  4016. if(fd <= 0)
  4017. {
  4018. syslog(LOG_INFO,"%s, Open ttymxc3 Fail",__func__);
  4019. }
  4020. else
  4021. {
  4022. /* get configure from device */
  4023. ret = ioctl(fd,TIOCGRS485,&rs485conf);
  4024. if(ret < 0)
  4025. {
  4026. // failed
  4027. syslog(LOG_INFO,"%s, ioctl ttymxc3 Fail",__func__);
  4028. }
  4029. /* set enable rs485 mode in configure */
  4030. /* Enable RS485 mode: */
  4031. rs485conf.flags |= SER_RS485_ENABLED;
  4032. /* Set logical level for RTS pin equal to 1 when sending: */
  4033. rs485conf.flags |= SER_RS485_RTS_ON_SEND;
  4034. /* Set logical level for RTS pin equal to 0 after sending: */
  4035. rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
  4036. /* Set this flag if you want to receive data even whilst sending data */
  4037. rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
  4038. /* Set rts delay before send, if needed: */
  4039. rs485conf.delay_rts_before_send = 0; // in miliseconds
  4040. /* Set rts delay after send, if needed: */
  4041. rs485conf.delay_rts_after_send = 0; // in miliseconds
  4042. ret = ioctl(fd,TIOCSRS485,&rs485conf);
  4043. if(ret < 0)
  4044. {
  4045. /* Error handling. See errno. */
  4046. syslog(LOG_INFO,"%s, Set ttymxc3 485 Fail",__func__);
  4047. }
  4048. close(fd);
  4049. }
  4050. // 4# 485
  4051. fd = open("/dev/ttymxc5",O_RDWR | O_NOCTTY);
  4052. if(fd <= 0)
  4053. {
  4054. syslog(LOG_INFO,"%s, Open ttymxc5 Fail",__func__);
  4055. }
  4056. else
  4057. {
  4058. /* get configure from device */
  4059. ret = ioctl(fd,TIOCGRS485,&rs485conf);
  4060. if(ret < 0)
  4061. {
  4062. // failed
  4063. syslog(LOG_INFO,"%s, ioctl ttymxc5 Fail",__func__);
  4064. }
  4065. /* set enable rs485 mode in configure */
  4066. /* Enable RS485 mode: */
  4067. rs485conf.flags |= SER_RS485_ENABLED;
  4068. /* Set logical level for RTS pin equal to 1 when sending: */
  4069. rs485conf.flags |= SER_RS485_RTS_ON_SEND;
  4070. /* Set logical level for RTS pin equal to 0 after sending: */
  4071. rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
  4072. /* Set this flag if you want to receive data even whilst sending data */
  4073. rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
  4074. /* Set rts delay before send, if needed: */
  4075. rs485conf.delay_rts_before_send = 0; // in miliseconds
  4076. /* Set rts delay after send, if needed: */
  4077. rs485conf.delay_rts_after_send = 0; // in miliseconds
  4078. ret = ioctl(fd,TIOCSRS485,&rs485conf);
  4079. if(ret < 0)
  4080. {
  4081. /* Error handling. See errno. */
  4082. syslog(LOG_INFO,"%s, Set ttymxc5 485 Fail",__func__);
  4083. }
  4084. close(fd);
  4085. }
  4086. }
  4087. static void appl_ctl_set_state(int s,int e)
  4088. {
  4089. struct Ctl_t* ctl = &APPL.Ctl;
  4090. ctl->Step = 0;
  4091. ctl->State = s;
  4092. switch(s)
  4093. {
  4094. case CTL_ST_LAUNCH:
  4095. strcpy(ctl->szState,"启动");
  4096. break;
  4097. case CTL_ST_STDBY:
  4098. strcpy(ctl->szState,"监控");
  4099. break;
  4100. case CTL_ST_STOP:
  4101. strcpy(ctl->szState,"停机");
  4102. break;
  4103. case CTL_ST_RUN:
  4104. strcpy(ctl->szState,"运行");
  4105. break;
  4106. case CTL_ST_ERR:
  4107. strcpy(ctl->szState,"故障");
  4108. break;
  4109. default:
  4110. strcpy(ctl->szState,"未知");
  4111. break;
  4112. }
  4113. ctl->Err = e;
  4114. switch(e)
  4115. {
  4116. case CTL_ERR_NONE:
  4117. strcpy(ctl->szErr,"无");
  4118. break;
  4119. case CTL_ERR_LAUNCH_COMMERR_DETECTED:
  4120. strcpy(ctl->szErr,"启动状态下检测到通信故障");
  4121. break;
  4122. case CTL_ERR_LAUNCH_CFGERR:
  4123. strcpy(ctl->szErr,"启动状态下检测到参数配置故障");
  4124. break;
  4125. case CTL_ERR_STDBY_COMMERR_DETECTED:
  4126. strcpy(ctl->szErr,"监控状态下检测到通信故障");
  4127. break;
  4128. case CTL_ERR_STDBY_WAIT_PCS_STOP_TIMEOUT:
  4129. strcpy(ctl->szErr,"监控状态下等待PCS停机超时");
  4130. break;
  4131. case CTL_ERR_STDBY_WAIT_PCS_APS0_TIMEOUT:
  4132. strcpy(ctl->szErr,"监控状态下等待PCS有功功率设定值为0超时");
  4133. break;
  4134. case CTL_ERR_STOP_COMMERR_DETECTED:
  4135. strcpy(ctl->szErr,"停机状态下检测到通信故障");
  4136. break;
  4137. case CTL_ERR_STOP_PCS_NOT_STOP_DETECTED:
  4138. strcpy(ctl->szErr,"停机状态下检测到PCS非停机");
  4139. break;
  4140. case CTL_ERR_STOP_WAIT_PCS_START_TIMEOUT:
  4141. strcpy(ctl->szErr,"停机状态下等待PCS运行超时");
  4142. break;
  4143. case CTL_ERR_RUN_COMMERR_DETECTED:
  4144. strcpy(ctl->szErr,"运行状态下检测到通信故障");
  4145. break;
  4146. case CTL_ERR_RUN_PCS_NOT_START_DETECTED:
  4147. strcpy(ctl->szErr,"运行状态下检测到PCS非运行");
  4148. break;
  4149. case CTL_ERR_RUN_WAIT_PCS_STOP_TIMEOUT:
  4150. strcpy(ctl->szErr,"运行状态下等待PCS停机超时");
  4151. break;
  4152. case CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT:
  4153. strcpy(ctl->szErr,"运行状态下等待PCS有功功率设定值为0超时");
  4154. break;
  4155. case CTL_ERR_ERR_COMMERR_DETECTED:
  4156. strcpy(ctl->szErr,"故障状态下检测到通信故障");
  4157. break;
  4158. default:
  4159. strcpy(ctl->szErr,"未知");
  4160. break;
  4161. }
  4162. }
  4163. static int appl_ctl_check_comm_state_slave(void)
  4164. {
  4165. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  4166. struct GaoteBms_t* bms = &APPL.GaoteBms;
  4167. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  4168. static int bFirstErr = 1;
  4169. if(pcs->CommState == ST_COMM_NORM && bms->CommState == ST_COMM_NORM &&
  4170. ac->CommState == ST_COMM_NORM)
  4171. {
  4172. if(bFirstErr == 0)
  4173. {
  4174. bFirstErr = 1;
  4175. }
  4176. return 0;
  4177. }
  4178. else
  4179. {
  4180. if(bFirstErr == 1)
  4181. {
  4182. bFirstErr = 0;
  4183. syslog(LOG_INFO,"%s, Err Detected, PCS:%d,BMS:%d,AC:%d",__func__,
  4184. pcs->CommState,bms->CommState,ac->CommState);
  4185. }
  4186. return -1;
  4187. }
  4188. }
  4189. static int appl_ctl_check_comm_state_pcurv(void)
  4190. {
  4191. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  4192. struct GaoteBms_t* bms = &APPL.GaoteBms;
  4193. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  4194. static int bFirstErr = 1;
  4195. if(pcs->CommState == ST_COMM_NORM
  4196. && bms->CommState == ST_COMM_NORM
  4197. && ac->CommState == ST_COMM_NORM
  4198. /*&& gm->CommState == ST_COMM_NORM
  4199. && tm->CommState == ST_COMM_NORM*/)
  4200. {
  4201. if(bFirstErr == 0)
  4202. {
  4203. bFirstErr = 1;
  4204. }
  4205. return 0;
  4206. }
  4207. else
  4208. {
  4209. if(bFirstErr == 1)
  4210. {
  4211. bFirstErr = 0;
  4212. syslog(LOG_INFO,
  4213. "%s, Err Detected, PCS:%d,BMS:%d,AC:%d, MaxUpdate1Intv:%ld, "
  4214. "MaxUpdate2Intv:%ld",
  4215. __func__,pcs->CommState,bms->CommState,ac->CommState,
  4216. ac->MaxUpdate1Intv,ac->MaxUpdate2Intv);
  4217. }
  4218. return -1;
  4219. }
  4220. }
  4221. static void appl_ctl_update(void)
  4222. {
  4223. struct Settings_t* set = &APPL.Set.s;
  4224. struct Ctl_t* ctl = &APPL.Ctl;
  4225. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  4226. struct GaoteBms_t* bms = &APPL.GaoteBms;
  4227. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  4228. struct Dtsd1352_t* gm = &APPL.GateMeter;
  4229. struct Dtsd1352_t* tm = &APPL.TransMeter;
  4230. int i;
  4231. int sum;
  4232. ctl->Ap = pcs->Ap;
  4233. sum = 0;
  4234. for(i = 0; i < set->CtnMeterNbr; i++)
  4235. {
  4236. sum += APPL.CtnMeter[i + 1].com_active_p;
  4237. }
  4238. ctl->GateEsAp = sum;
  4239. ctl->TransEsAp = APPL.CtnMeter[set->CtnMeterId].com_active_p;
  4240. ctl->GateAp = gm->com_active_p;
  4241. ctl->GateLoadAp = ctl->GateAp - ctl->GateEsAp;
  4242. ctl->TransAp = tm->com_active_p;
  4243. ctl->TransLoadAp = ctl->TransAp - ctl->TransEsAp;
  4244. }
  4245. static void appl_ctl_workmode_slave_run(void)
  4246. {
  4247. struct Settings_t* set = &APPL.Set.s;
  4248. struct Ctl_t* ctl = &APPL.Ctl;
  4249. struct chan485_t* c1 = &APPL.chan485[1];
  4250. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  4251. struct GaoteBms_t* bms = &APPL.GaoteBms;
  4252. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  4253. switch(ctl->State)
  4254. {
  4255. case CTL_ST_LAUNCH:
  4256. if(appl_ctl_check_comm_state_slave() == 0)
  4257. {
  4258. if(set->bErr)
  4259. {
  4260. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_LAUNCH_CFGERR);
  4261. syslog(LOG_INFO,"[LAUNCH] Comm Check Ok, Goto ERR");
  4262. }
  4263. else
  4264. {
  4265. appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
  4266. syslog(LOG_INFO,"[LAUNCH] Comm Check Ok, Goto STDBY");
  4267. }
  4268. }
  4269. else
  4270. {
  4271. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_LAUNCH_COMMERR_DETECTED);
  4272. syslog(LOG_INFO,"[LAUNCH] Comm Check Fail, Goto ERR");
  4273. }
  4274. break;
  4275. case CTL_ST_STDBY:
  4276. if(appl_ctl_check_comm_state_slave() < 0)
  4277. {
  4278. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_COMMERR_DETECTED);
  4279. syslog(LOG_INFO,"[STDBY] Comm Check Fail, Goto ERR");
  4280. }
  4281. else
  4282. {
  4283. if(ctl->Step == 0)
  4284. { // wait cmd
  4285. if(ctl->Cmd == CTL_CMD_STOP)
  4286. {
  4287. ctl->Cmd = CTL_CMD_DONE;
  4288. syslog(LOG_INFO,"[STDBY] Get CTL_CMD_STOP");
  4289. if(pcs->WorkState == 0)
  4290. {
  4291. syslog(LOG_INFO,"[STDBY] Check PCS WorkState==0 Ok");
  4292. if(abs(pcs->Aps) < 0.1)
  4293. {
  4294. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  4295. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
  4296. }
  4297. else
  4298. {
  4299. c1->Cmd = CMD_485_PCS_SET_APS;
  4300. c1->CmdParam = 0;
  4301. ctl->Step = 20;
  4302. ctl->Cnt = 0;
  4303. syslog(LOG_INFO,
  4304. "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Check");
  4305. }
  4306. }
  4307. else
  4308. {
  4309. c1->Cmd = CMD_485_PCS_STOP;
  4310. ctl->Step = 10;
  4311. ctl->Cnt = 0;
  4312. syslog(LOG_INFO,
  4313. "[STDBY] Check PCS WorkState==0 Fail, Send Cmd And Check");
  4314. }
  4315. }
  4316. else if(ctl->Cmd == CTL_CMD_SET_WORKMODE)
  4317. {
  4318. ctl->Cmd = CTL_CMD_DONE;
  4319. appl_ctl_set_workmode(ctl->CmdPara);
  4320. syslog(LOG_INFO,"[STDBY] Get CTL_CMD_SET_WORKMODE");
  4321. }
  4322. }
  4323. else if(ctl->Step == 10)
  4324. { // wait pcs stop
  4325. if(ctl->Cnt++ > 5)
  4326. {
  4327. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_WAIT_PCS_STOP_TIMEOUT);
  4328. syslog(LOG_INFO,
  4329. "[STDBY] Check PCS WorkState==0 Timeout, Goto ERR");
  4330. }
  4331. else
  4332. {
  4333. if(pcs->WorkState == 0)
  4334. {
  4335. if(abs(pcs->Aps) < 0.1)
  4336. {
  4337. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  4338. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
  4339. }
  4340. else
  4341. {
  4342. c1->Cmd = CMD_485_PCS_SET_APS;
  4343. c1->CmdParam = 0;
  4344. ctl->Step = 20;
  4345. ctl->Cnt = 0;
  4346. syslog(LOG_INFO,
  4347. "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Check");
  4348. }
  4349. }
  4350. else
  4351. {
  4352. syslog(LOG_INFO,"[STDBY] Waiting PCS WorkState==0");
  4353. }
  4354. }
  4355. }
  4356. else if(ctl->Step == 20)
  4357. { // wait pcs aps = 0
  4358. if(ctl->Cnt++ > 20)
  4359. {
  4360. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_WAIT_PCS_APS0_TIMEOUT);
  4361. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Timeout, Goto ERR");
  4362. }
  4363. else
  4364. {
  4365. if(abs(pcs->Aps) < 0.1)
  4366. {
  4367. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  4368. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
  4369. }
  4370. else
  4371. {
  4372. syslog(LOG_INFO,"[STDBY] Waiting PCS Aps==0");
  4373. }
  4374. }
  4375. }
  4376. }
  4377. break;
  4378. case CTL_ST_STOP:
  4379. if(appl_ctl_check_comm_state_slave() < 0)
  4380. {
  4381. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STOP_COMMERR_DETECTED);
  4382. syslog(LOG_INFO,"[STOP] Comm Check Fail, Goto ERR");
  4383. }
  4384. else
  4385. {
  4386. if(ctl->Step == 0)
  4387. { // wait cmd and check
  4388. if(ctl->Cmd == CTL_CMD_RUN)
  4389. {
  4390. ctl->Cmd = CTL_CMD_DONE;
  4391. c1->Cmd = CMD_485_PCS_START;
  4392. ctl->Step = 10;
  4393. ctl->Cnt = 0;
  4394. syslog(LOG_INFO,"[STOP] Get CTL_CMD_RUN");
  4395. }
  4396. else if(ctl->Cmd == CTL_CMD_STDBY)
  4397. {
  4398. ctl->Cmd = CTL_CMD_DONE;
  4399. appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
  4400. syslog(LOG_INFO,"[STOP] Get CTL_CMD_STDBY, Goto STDBY");
  4401. }
  4402. else if(ctl->Cmd == CTL_CMD_SET_WORKMODE)
  4403. {
  4404. ctl->Cmd = CTL_CMD_DONE;
  4405. appl_ctl_set_workmode(ctl->CmdPara);
  4406. syslog(LOG_INFO,"[STOP] Get CTL_CMD_SET_WORKMODE");
  4407. }
  4408. else
  4409. {
  4410. if(pcs->WorkState != 0)
  4411. {
  4412. appl_ctl_set_state(CTL_ST_ERR,
  4413. CTL_ERR_STOP_PCS_NOT_STOP_DETECTED);
  4414. syslog(LOG_INFO,"[STOP] PCS NOT STOP Detected, Goto ERR");
  4415. }
  4416. }
  4417. }
  4418. else if(ctl->Step == 10)
  4419. {
  4420. if(ctl->Cnt++ > 55)
  4421. {
  4422. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STOP_WAIT_PCS_START_TIMEOUT);
  4423. syslog(LOG_INFO,"[STOP] Check PCS WorkState==1 Timeout, Goto ERR");
  4424. }
  4425. else
  4426. {
  4427. // syslog(LOG_INFO,"slave run : %d:", pcs->WorkState);
  4428. if(pcs->WorkState == 1)
  4429. {
  4430. appl_ctl_set_state(CTL_ST_RUN,CTL_ERR_NONE);
  4431. syslog(LOG_INFO,"[STOP] Check PCS WorkState==1 Ok, Goto RUN");
  4432. }
  4433. else
  4434. {
  4435. syslog(LOG_INFO,"[STOP] Waiting PCS WorkState==1");
  4436. }
  4437. }
  4438. }
  4439. }
  4440. break;
  4441. case CTL_ST_RUN:
  4442. if(appl_ctl_check_comm_state_slave() < 0)
  4443. {
  4444. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_COMMERR_DETECTED);
  4445. syslog(LOG_INFO,"[RUN] Comm Check Fail, Goto ERR");
  4446. }
  4447. else
  4448. {
  4449. if(ctl->Step == 0)
  4450. { // wait cmd
  4451. if(ctl->Cmd == CTL_CMD_STOP)
  4452. {
  4453. ctl->Cmd = CTL_CMD_DONE;
  4454. c1->Cmd = CMD_485_PCS_STOP;
  4455. ctl->Step = 10;
  4456. ctl->Cnt = 0;
  4457. syslog(LOG_INFO,"[RUN] Get CTL_CMD_STOP");
  4458. }
  4459. else if(ctl->Cmd == CTL_CMD_SET_APS)
  4460. {
  4461. ctl->Cmd = CTL_CMD_DONE;
  4462. if(ctl->CmdPara < 0)
  4463. { // dhg
  4464. if(ctl->bDhgAble)
  4465. {
  4466. c1->Cmd = CMD_485_PCS_SET_APS;
  4467. c1->CmdParam = ctl->CmdPara;
  4468. syslog(LOG_INFO,"[RUN]New Aps:%d",ctl->CmdPara);
  4469. if(ctl->bChgAble == 0)
  4470. {
  4471. ctl->bChgAble = 1;
  4472. }
  4473. }
  4474. else
  4475. {
  4476. syslog(LOG_INFO,"[RUN]New Aps:%d, BUT NOT DHGABLE",
  4477. ctl->CmdPara);
  4478. }
  4479. }
  4480. else if(ctl->CmdPara > 0)
  4481. { // chg
  4482. if(ctl->bChgAble)
  4483. {
  4484. c1->Cmd = CMD_485_PCS_SET_APS;
  4485. c1->CmdParam = ctl->CmdPara;
  4486. syslog(LOG_INFO,"[RUN]New Aps:%d",ctl->CmdPara);
  4487. if(ctl->bDhgAble == 0)
  4488. {
  4489. ctl->bDhgAble = 1;
  4490. }
  4491. }
  4492. else
  4493. {
  4494. syslog(LOG_INFO,"[RUN]New Aps:%d, BUT NOT CHGABLE",
  4495. ctl->CmdPara);
  4496. }
  4497. }
  4498. else
  4499. {
  4500. c1->Cmd = CMD_485_PCS_SET_APS;
  4501. c1->CmdParam = ctl->CmdPara;
  4502. syslog(LOG_INFO,"[RUN]New Aps:%d",ctl->CmdPara);
  4503. }
  4504. }
  4505. else if(pcs->WorkState != 1)
  4506. {
  4507. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_PCS_NOT_START_DETECTED);
  4508. syslog(LOG_INFO,"[RUN] PCS NOT RUN Detected, Goto ERR");
  4509. }
  4510. else if(bms->MaxCellV >= set->ChgCellV)
  4511. {
  4512. ctl->bChgAble = 0;
  4513. c1->Cmd = CMD_485_PCS_SET_APS;
  4514. c1->CmdParam = 0;
  4515. ctl->Step = 20;
  4516. ctl->Cnt = 0;
  4517. syslog(LOG_INFO,
  4518. "[RUN] MaxCellV(%.3f) >= ChgCellV(%.3f) Detected, Set PCS "
  4519. "Aps=0, Wait And Check",
  4520. bms->MaxCellV,set->ChgCellV);
  4521. }
  4522. else if(bms->MinCellV <= set->DhgCellV)
  4523. {
  4524. ctl->bDhgAble = 0;
  4525. c1->Cmd = CMD_485_PCS_SET_APS;
  4526. c1->CmdParam = 0;
  4527. ctl->Step = 20;
  4528. ctl->Cnt = 0;
  4529. syslog(LOG_INFO,
  4530. "[RUN] MinCellV(%.3f) <= DhgCellV(%.3f) Detected, Set PCS "
  4531. "Aps=0, Wait And Check",
  4532. bms->MinCellV,set->DhgCellV);
  4533. }
  4534. }
  4535. else if(ctl->Step == 10)
  4536. { // wait pcs stop
  4537. if(ctl->Cnt++ > 5)
  4538. {
  4539. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_STOP_TIMEOUT);
  4540. syslog(LOG_INFO,"[RUN] Check PCS WorkState==0 Timeout, Goto ERR");
  4541. }
  4542. else
  4543. {
  4544. if(pcs->WorkState == 0)
  4545. {
  4546. if(abs(pcs->Aps) < 0.1)
  4547. {
  4548. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  4549. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
  4550. }
  4551. else
  4552. {
  4553. c1->Cmd = CMD_485_PCS_SET_APS;
  4554. c1->CmdParam = 0;
  4555. ctl->Step = 30;
  4556. ctl->Cnt = 0;
  4557. syslog(LOG_INFO,
  4558. "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Check");
  4559. }
  4560. }
  4561. else
  4562. {
  4563. syslog(LOG_INFO,"[RUN] Waiting PCS WorkState==0");
  4564. }
  4565. }
  4566. }
  4567. else if(ctl->Step == 20)
  4568. { // wait pcs aps = 0 and stay run
  4569. if(ctl->Cnt++ > 5)
  4570. {
  4571. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT);
  4572. syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Timeout, Goto ERR");
  4573. }
  4574. else
  4575. {
  4576. if(abs(pcs->Aps) < 0.1)
  4577. {
  4578. ctl->Step = 0;
  4579. syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Ok, Stay RUN");
  4580. }
  4581. else
  4582. {
  4583. syslog(LOG_INFO,"[RUN] Waiting PCS Aps==0");
  4584. }
  4585. }
  4586. }
  4587. else if(ctl->Step == 30)
  4588. { // wait pcs aps = 0 and goto stop
  4589. if(ctl->Cnt++ > 5)
  4590. {
  4591. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT);
  4592. syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Timeout, Goto ERR");
  4593. }
  4594. else
  4595. {
  4596. if(abs(pcs->Aps) < 0.1)
  4597. {
  4598. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  4599. syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Ok, Goto STOP");
  4600. }
  4601. else
  4602. {
  4603. syslog(LOG_INFO,"[RUN] Waiting PCS Aps==0");
  4604. }
  4605. }
  4606. }
  4607. }
  4608. break;
  4609. case CTL_ST_ERR:
  4610. if(ctl->Step == 0)
  4611. {
  4612. c1->Cmd = CMD_485_PCS_STOP;
  4613. ctl->Step = 10;
  4614. }
  4615. else if(ctl->Step == 10)
  4616. {
  4617. if(ctl->Cmd == CTL_CMD_STDBY)
  4618. {
  4619. ctl->Cmd = CTL_CMD_DONE;
  4620. syslog(LOG_INFO,"[ERR] Get CTL_CMD_STDBY");
  4621. if(appl_ctl_check_comm_state_slave() == 0)
  4622. {
  4623. appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
  4624. syslog(LOG_INFO,"[ERR] Comm Check Ok, Goto STDBY");
  4625. }
  4626. else
  4627. {
  4628. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_ERR_COMMERR_DETECTED);
  4629. syslog(LOG_INFO,"[ERR] Comm Check Fail, Goto ERR");
  4630. }
  4631. }
  4632. }
  4633. break;
  4634. default:
  4635. // NEVER REACH HERE
  4636. break;
  4637. }
  4638. }
  4639. static void appl_ctl_workmode_pcurv_run(void)
  4640. {
  4641. struct Ctl_t* ctl = &APPL.Ctl;
  4642. struct Settings_t* set = &APPL.Set.s;
  4643. struct chan485_t* c1 = &APPL.chan485[1];
  4644. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  4645. struct GaoteBms_t* bms = &APPL.GaoteBms;
  4646. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  4647. struct Dtsd1352_t* gm = &APPL.GateMeter;
  4648. struct Dtsd1352_t* tm = &APPL.TransMeter;
  4649. int yy,mm,dd,hh,nn,ss;
  4650. int tgtaps;
  4651. int CommChkOk = 0;
  4652. int i;
  4653. switch(ctl->State)
  4654. {
  4655. case CTL_ST_LAUNCH:
  4656. if(appl_ctl_check_comm_state_pcurv() == 0)
  4657. {
  4658. appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
  4659. syslog(LOG_INFO,"[LAUNCH] Comm Check Ok, Goto STDBY");
  4660. }
  4661. else
  4662. {
  4663. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_LAUNCH_COMMERR_DETECTED);
  4664. syslog(LOG_INFO,"[LAUNCH] Comm Check Fail, Goto ERR");
  4665. }
  4666. break;
  4667. case CTL_ST_STDBY:
  4668. if(appl_ctl_check_comm_state_pcurv() < 0)
  4669. {
  4670. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_COMMERR_DETECTED);
  4671. syslog(LOG_INFO,"[STDBY] Comm Check Fail, Goto ERR");
  4672. }
  4673. else
  4674. {
  4675. if(ctl->Step == 0)
  4676. { // wait cmd
  4677. if(ctl->Cmd == CTL_CMD_STOP)
  4678. {
  4679. ctl->Cmd = CTL_CMD_DONE;
  4680. syslog(LOG_INFO,"[STDBY] Get CTL_CMD_STOP");
  4681. if(pcs->WorkState == 0)
  4682. {
  4683. syslog(LOG_INFO,"[STDBY] Check PCS WorkState==0 Ok");
  4684. if(abs(pcs->Aps) < 0.1)
  4685. {
  4686. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  4687. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
  4688. }
  4689. else
  4690. {
  4691. c1->Cmd = CMD_485_PCS_SET_APS;
  4692. c1->CmdParam = 0;
  4693. ctl->Step = 20;
  4694. ctl->Cnt = 0;
  4695. syslog(LOG_INFO,
  4696. "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Wait");
  4697. }
  4698. }
  4699. else
  4700. {
  4701. c1->Cmd = CMD_485_PCS_STOP;
  4702. ctl->Step = 10;
  4703. ctl->Cnt = 0;
  4704. syslog(LOG_INFO,
  4705. "[STDBY] Check PCS WorkState==0 Fail, Send Cmd And Wait");
  4706. }
  4707. }
  4708. else if(CTL_CMD_SET_WORKMODE)
  4709. {
  4710. ctl->Cmd = CTL_CMD_DONE;
  4711. appl_ctl_set_workmode(ctl->CmdPara);
  4712. syslog(LOG_INFO,"[STDBY] Get CTL_CMD_SET_WORKMODE");
  4713. }
  4714. }
  4715. else if(ctl->Step == 10)
  4716. { // wait pcs stop
  4717. if(ctl->Cnt++ > 5)
  4718. {
  4719. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_WAIT_PCS_STOP_TIMEOUT);
  4720. syslog(LOG_INFO,
  4721. "[STDBY] Check PCS WorkState==0 Timeout, Goto ERR");
  4722. }
  4723. else
  4724. {
  4725. if(pcs->WorkState == 0)
  4726. {
  4727. if(abs(pcs->Aps) < 0.1)
  4728. {
  4729. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  4730. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
  4731. }
  4732. else
  4733. {
  4734. c1->Cmd = CMD_485_PCS_SET_APS;
  4735. c1->CmdParam = 0;
  4736. ctl->Step = 20;
  4737. ctl->Cnt = 0;
  4738. syslog(LOG_INFO,
  4739. "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Wait");
  4740. }
  4741. }
  4742. else
  4743. {
  4744. syslog(LOG_INFO,"[STDBY] Waiting PCS WorkState==0");
  4745. }
  4746. }
  4747. }
  4748. else if(ctl->Step == 20)
  4749. { // wait pcs aps = 0
  4750. if(ctl->Cnt++ > 5)
  4751. {
  4752. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_WAIT_PCS_APS0_TIMEOUT);
  4753. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Timeout, Goto ERR");
  4754. }
  4755. else
  4756. {
  4757. if(abs(pcs->Aps) < 0.1)
  4758. {
  4759. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  4760. syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
  4761. }
  4762. else
  4763. {
  4764. syslog(LOG_INFO,"[STDBY] Waiting PCS Aps==0");
  4765. }
  4766. }
  4767. }
  4768. }
  4769. break;
  4770. case CTL_ST_STOP:
  4771. if(appl_ctl_check_comm_state_pcurv() < 0)
  4772. {
  4773. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STOP_COMMERR_DETECTED);
  4774. syslog(LOG_INFO,"[STOP] Comm Check Fail, Goto ERR");
  4775. }
  4776. else
  4777. {
  4778. if(ctl->Step == 0)
  4779. { // wait cmd and check
  4780. if(ctl->Cmd == CTL_CMD_RUN)
  4781. {
  4782. ctl->Cmd = CTL_CMD_DONE;
  4783. c1->Cmd = CMD_485_PCS_START;
  4784. ctl->Step = 10;
  4785. ctl->Cnt = 0;
  4786. ctl->LastTune = 0;
  4787. syslog(LOG_INFO,"[STOP] Get CTL_CMD_RUN");
  4788. }
  4789. else if(0)
  4790. { // ctl->Cmd = CTL_CMD_STDBY !!NOT SUPPORTED
  4791. ctl->Cmd = CTL_CMD_DONE;
  4792. appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
  4793. syslog(LOG_INFO,"[STOP] Get CTL_CMD_STDBY, Goto STDBY");
  4794. }
  4795. else if(ctl->Cmd == CTL_CMD_SET_WORKMODE)
  4796. {
  4797. ctl->Cmd = CTL_CMD_DONE;
  4798. appl_ctl_set_workmode(ctl->CmdPara);
  4799. syslog(LOG_INFO,"[STOP] Get CTL_CMD_SET_WORKMODE, Para:%d",
  4800. ctl->CmdPara);
  4801. }
  4802. else
  4803. {
  4804. if(pcs->WorkState != 0)
  4805. {
  4806. appl_ctl_set_state(CTL_ST_ERR,
  4807. CTL_ERR_STOP_PCS_NOT_STOP_DETECTED);
  4808. syslog(LOG_INFO,"[STOP] PCS NOT STOP Detected, Goto ERR");
  4809. }
  4810. }
  4811. }
  4812. else if(ctl->Step == 10)
  4813. { // wait PCS start
  4814. if(ctl->Cnt++ > 45)
  4815. {
  4816. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STOP_WAIT_PCS_START_TIMEOUT);
  4817. syslog(LOG_INFO,"[STOP] Check PCS WorkState==1 Timeout, Goto ERR");
  4818. }
  4819. else
  4820. {
  4821. if(pcs->WorkState == 1)
  4822. {
  4823. appl_ctl_set_state(CTL_ST_RUN,CTL_ERR_NONE);
  4824. syslog(LOG_INFO,"[STOP] Check PCS WorkState==1 Ok, Goto RUN");
  4825. }
  4826. else
  4827. {
  4828. syslog(LOG_INFO,"[STOP] Waiting PCS WorkState==1");
  4829. }
  4830. }
  4831. }
  4832. }
  4833. break;
  4834. case CTL_ST_RUN:
  4835. if(appl_ctl_check_comm_state_pcurv() < 0)
  4836. {
  4837. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_COMMERR_DETECTED);
  4838. syslog(LOG_INFO,"[RUN] Comm Check Fail, Goto ERR");
  4839. }
  4840. else
  4841. {
  4842. if(ctl->Step == 0)
  4843. { // wait cmd and run
  4844. if(ctl->Cmd == CTL_CMD_STOP)
  4845. {
  4846. ctl->Cmd = CTL_CMD_DONE;
  4847. c1->Cmd = CMD_485_PCS_STOP;
  4848. ctl->Step = 10;
  4849. ctl->Cnt = 0;
  4850. syslog(LOG_INFO,"[RUN] Get CTL_CMD_STOP");
  4851. }
  4852. else if(mg_millis() - ctl->LastTune > 10000)
  4853. {
  4854. ctl->LastTune = mg_millis();
  4855. appl_get_datetime_num(&yy,&mm,&dd,&hh,&nn,&ss);
  4856. tgtaps = set->pcurv[(hh * 60 + nn) / 15];
  4857. // syslog(LOG_INFO,"%s, [RUN] Get Target Aps:%d", __func__, tgtaps);
  4858. if(tgtaps < 0)
  4859. { // DHG
  4860. if(ctl->bDhgAble != 1)
  4861. {
  4862. // syslog(LOG_INFO,"%s, [RUN] NOT DHGABLE", __func__);
  4863. break;
  4864. }
  4865. else
  4866. { // Aps Limit
  4867. if(tgtaps * set->TransCoupleNbr + ctl->TransLoadAp <
  4868. set->DhgTransLim)
  4869. {
  4870. tgtaps = (set->DhgTransLim - ctl->TransLoadAp) /
  4871. set->TransCoupleNbr;
  4872. if(tgtaps > 0)
  4873. {
  4874. tgtaps = 0;
  4875. }
  4876. }
  4877. if(tgtaps * set->GateCoupleNbr + ctl->GateLoadAp <
  4878. set->DhgGateLim)
  4879. {
  4880. tgtaps =
  4881. (set->DhgGateLim - ctl->GateLoadAp) / set->GateCoupleNbr;
  4882. if(tgtaps > 0)
  4883. {
  4884. tgtaps = 0;
  4885. }
  4886. }
  4887. }
  4888. }
  4889. else if(tgtaps > 0)
  4890. { // CHG
  4891. if(ctl->bChgAble != 1)
  4892. {
  4893. // syslog(LOG_INFO,"%s, [RUN] NOT CHGABLE", __func__);
  4894. break;
  4895. }
  4896. else
  4897. {
  4898. if(tgtaps * set->TransCoupleNbr + ctl->TransLoadAp >
  4899. set->ChgTransLim)
  4900. {
  4901. tgtaps = (set->ChgTransLim - ctl->TransLoadAp) /
  4902. set->TransCoupleNbr;
  4903. if(tgtaps < 0)
  4904. {
  4905. tgtaps = 0;
  4906. }
  4907. }
  4908. if(tgtaps * set->GateCoupleNbr + ctl->GateLoadAp >
  4909. set->ChgGateLim)
  4910. {
  4911. tgtaps =
  4912. (set->ChgGateLim - ctl->GateLoadAp) / set->GateCoupleNbr;
  4913. if(tgtaps < 0)
  4914. {
  4915. tgtaps = 0;
  4916. }
  4917. }
  4918. }
  4919. }
  4920. CommChkOk = 0;
  4921. if(gm->CommState != ST_COMM_NORM ||
  4922. tm->CommState != ST_COMM_NORM)
  4923. {
  4924. CommChkOk = -1;
  4925. }
  4926. for(i = 0; i < set->CtnMeterNbr; i++)
  4927. {
  4928. if(APPL.CtnMeter[i + 1].CommState != ST_COMM_NORM)
  4929. {
  4930. CommChkOk = -1;
  4931. break;
  4932. }
  4933. }
  4934. if(CommChkOk < 0)
  4935. {
  4936. c1->Cmd = CMD_485_PCS_SET_APS;
  4937. c1->CmdParam = 0;
  4938. }
  4939. else
  4940. {
  4941. c1->Cmd = CMD_485_PCS_SET_APS;
  4942. c1->CmdParam = tgtaps;
  4943. }
  4944. if(tgtaps < 0)
  4945. { // DHG
  4946. if(ctl->bChgAble == 0)
  4947. {
  4948. ctl->bChgAble = 1;
  4949. }
  4950. }
  4951. if(tgtaps > 0)
  4952. { // CHG
  4953. if(ctl->bDhgAble == 0)
  4954. {
  4955. ctl->bDhgAble = 1;
  4956. }
  4957. }
  4958. // syslog(LOG_INFO,"%s, [RUN] Target Aps Sent", __func__);
  4959. }
  4960. else if(pcs->WorkState != 1)
  4961. {
  4962. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_PCS_NOT_START_DETECTED);
  4963. syslog(LOG_INFO,"[RUN] PCS NOT RUN Detected, Goto ERR");
  4964. }
  4965. else if(bms->MaxCellV >= set->ChgCellV)
  4966. {
  4967. ctl->bChgAble = 0; // !!
  4968. c1->Cmd = CMD_485_PCS_SET_APS;
  4969. c1->CmdParam = 0;
  4970. ctl->Step = 20;
  4971. ctl->Cnt = 0;
  4972. syslog(LOG_INFO,
  4973. "[RUN] MaxCellV(%.3f) >= ChgCellV(%.3f) Detected, Set PCS "
  4974. "Aps=0, Wait And Check",
  4975. bms->MaxCellV,set->ChgCellV);
  4976. }
  4977. else if(bms->MinCellV <= set->DhgCellV)
  4978. {
  4979. ctl->bDhgAble = 0;
  4980. c1->Cmd = CMD_485_PCS_SET_APS;
  4981. c1->CmdParam = 0;
  4982. ctl->Step = 20;
  4983. ctl->Cnt = 0;
  4984. syslog(LOG_INFO,
  4985. "[RUN] MinCellV(%.3f) <= DhgCellV(%.3f) Detected, Set PCS "
  4986. "Aps=0, Wait And Check",
  4987. bms->MinCellV,set->DhgCellV);
  4988. }
  4989. }
  4990. else if(ctl->Step == 10)
  4991. { // wait pcs stop
  4992. if(ctl->Cnt++ > 5)
  4993. {
  4994. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_STOP_TIMEOUT);
  4995. syslog(LOG_INFO,"[RUN] Check PCS WorkState==0 Timeout, Goto ERR");
  4996. }
  4997. else
  4998. {
  4999. if(pcs->WorkState == 0)
  5000. {
  5001. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  5002. syslog(LOG_INFO,"[RUN] Check PCS WorkState==0 Ok, Goto STOP");
  5003. }
  5004. else
  5005. {
  5006. syslog(LOG_INFO,"[RUN] Waiting PCS WorkState==0");
  5007. }
  5008. }
  5009. }
  5010. else if(ctl->Step == 20)
  5011. { // wait pcs aps = 0 and stay run
  5012. if(ctl->Cnt++ > 5)
  5013. {
  5014. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT);
  5015. syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Timeout, Goto ERR");
  5016. }
  5017. else
  5018. {
  5019. if(abs(pcs->Aps) < 0.1)
  5020. {
  5021. ctl->Step = 0;
  5022. syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Ok, Stay RUN");
  5023. }
  5024. else
  5025. {
  5026. syslog(LOG_INFO,"[RUN] Waiting PCS Aps==0");
  5027. }
  5028. }
  5029. }
  5030. else if(ctl->Step == 30)
  5031. { // wait pcs aps = 0 and goto stop
  5032. if(ctl->Cnt++ > 5)
  5033. {
  5034. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT);
  5035. syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Timeout, Goto ERR");
  5036. }
  5037. else
  5038. {
  5039. if(abs(pcs->Aps) < 0.1)
  5040. {
  5041. appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
  5042. syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Ok, Goto STOP");
  5043. }
  5044. else
  5045. {
  5046. syslog(LOG_INFO,"[RUN] Waiting PCS Aps==0");
  5047. }
  5048. }
  5049. }
  5050. }
  5051. break;
  5052. case CTL_ST_ERR:
  5053. if(ctl->Step == 0)
  5054. {
  5055. c1->Cmd = CMD_485_PCS_STOP;
  5056. ctl->Step = 10;
  5057. }
  5058. else if(ctl->Step == 10)
  5059. {
  5060. if(ctl->Cmd == CTL_CMD_STDBY)
  5061. {
  5062. ctl->Cmd = CTL_CMD_DONE;
  5063. syslog(LOG_INFO,"[ERR] Get CTL_CMD_STDBY");
  5064. if(appl_ctl_check_comm_state_pcurv() == 0)
  5065. {
  5066. appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
  5067. syslog(LOG_INFO,"[ERR] Comm Check Ok, Goto STDBY");
  5068. }
  5069. else
  5070. {
  5071. appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_ERR_COMMERR_DETECTED);
  5072. syslog(LOG_INFO,"[ERR] Comm Check Fail, Goto ERR");
  5073. }
  5074. }
  5075. }
  5076. break;
  5077. default:
  5078. // NEVER REACH HERE
  5079. break;
  5080. }
  5081. }
  5082. static void* thrd_ctl(void* param)
  5083. {
  5084. struct Ctl_t* ctl = &APPL.Ctl;
  5085. struct chan485_t* c1 = &APPL.chan485[1];
  5086. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  5087. struct GaoteBms_t* bms = &APPL.GaoteBms;
  5088. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  5089. sleep(3);
  5090. syslog(LOG_INFO,"%s ++",__func__);
  5091. appl_ctl_set_state(CTL_ST_LAUNCH,CTL_ERR_NONE);
  5092. ctl->Cmd = CTL_CMD_DONE;
  5093. while(1)
  5094. {
  5095. appl_ctl_update();
  5096. switch(ctl->WorkMode)
  5097. {
  5098. case CTL_WORKMODE_SLAVE:
  5099. appl_ctl_workmode_slave_run();
  5100. break;
  5101. case CTL_WORKMODE_PCURV:
  5102. appl_ctl_workmode_pcurv_run();
  5103. break;
  5104. default:
  5105. break;
  5106. }
  5107. usleep(1000000);
  5108. }
  5109. syslog(LOG_INFO,"%s --",__func__);
  5110. }
  5111. static void fn_mqtt1(struct mg_connection* c,int ev,void* ev_data)
  5112. {
  5113. // struct chanmqtt_t* m = &APPL.chanmqtt[1];
  5114. // if (ev == MG_EV_OPEN) {
  5115. // MG_INFO(("%lu CREATED", c->id));
  5116. // // c->is_hexdumping = 1;
  5117. // } else if (ev == MG_EV_CONNECT) {
  5118. // if (mg_url_is_ssl(m->szs_url)) {
  5119. // struct mg_tls_opts opts = {.ca = mg_unpacked("/certs/ca.pem"),
  5120. // .name = mg_url_host(m->szs_url)};
  5121. // mg_tls_init(c, &opts);
  5122. // }
  5123. // } else if (ev == MG_EV_ERROR) {
  5124. // // On error, log error message
  5125. // MG_ERROR(("%lu ERROR %s", c->id, (char *) ev_data));
  5126. // } else if (ev == MG_EV_MQTT_OPEN) {
  5127. // m->bConnected = 1;
  5128. // strcpy(m->szState,"正常");
  5129. // // MQTT connect is successful
  5130. // struct mg_str subt = mg_str(m->szs_sub_topic);
  5131. // MG_INFO(("%lu CONNECTED to %s", c->id, m->szs_url));
  5132. // struct mg_mqtt_opts sub_opts;
  5133. // memset(&sub_opts, 0, sizeof(sub_opts));
  5134. // sub_opts.topic = subt;
  5135. // sub_opts.qos = m->s_qos;
  5136. // mg_mqtt_sub(c, &sub_opts);
  5137. // MG_INFO(("%lu SUBSCRIBED to %.*s", c->id, (int) subt.len, subt.ptr));
  5138. // } else if (ev == MG_EV_MQTT_MSG) {
  5139. // // When we get echo response, print it
  5140. // struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
  5141. // MG_INFO(("%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len,
  5142. // mm->data.ptr, (int) mm->topic.len, mm->topic.ptr));
  5143. // } else if (ev == MG_EV_CLOSE) {
  5144. // MG_INFO(("%lu CLOSED", c->id));
  5145. // m->s_conn = NULL; // Mark that we're closed
  5146. // m->bConnected = 0;
  5147. // strcpy(m->szState,"故障");
  5148. // }
  5149. }
  5150. static void fn_mqtt2(struct mg_connection* c,int ev,void* ev_data)
  5151. {
  5152. struct Settings_t* set = &APPL.Set.s;
  5153. struct chanmqtt_t* m = &APPL.chanmqtt[2];
  5154. struct Ctl_t* ctl = &APPL.Ctl;
  5155. struct Dtsd1352_t* gm = &APPL.GateMeter;
  5156. struct Dtsd1352_t* tm = &APPL.TransMeter;
  5157. struct Dtsd1352_t* cm = NULL;
  5158. int i;
  5159. if(ev == MG_EV_OPEN)
  5160. {
  5161. syslog(LOG_INFO,"%lu CREATED",c->id);
  5162. // c->is_hexdumping = 1;
  5163. }
  5164. else if(ev == MG_EV_CONNECT)
  5165. {
  5166. if(mg_url_is_ssl(m->szs_url))
  5167. {
  5168. struct mg_tls_opts opts = { .ca = mg_unpacked("/certs/ca.pem"),
  5169. .name = mg_url_host(m->szs_url) };
  5170. mg_tls_init(c,&opts);
  5171. }
  5172. }
  5173. else if(ev == MG_EV_ERROR)
  5174. {
  5175. // On error, log error message
  5176. syslog(LOG_INFO,"%lu ERROR %s",c->id,(char*)ev_data);
  5177. }
  5178. else if(ev == MG_EV_MQTT_OPEN)
  5179. {
  5180. m->bConnected = 1;
  5181. strcpy(m->szState,"正常");
  5182. // MQTT connect is successful
  5183. syslog(LOG_INFO,"%lu CONNECTED to %s",c->id,m->szs_url);
  5184. struct mg_mqtt_opts sub_opts;
  5185. struct mg_str subt;
  5186. // Control
  5187. memset(&sub_opts,0,sizeof(sub_opts));
  5188. subt = mg_str(m->szs_sub_topic[0]);
  5189. sub_opts.topic = subt;
  5190. sub_opts.qos = m->s_qos;
  5191. mg_mqtt_sub(c,&sub_opts);
  5192. syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s",c->id,(int)subt.len,subt.ptr);
  5193. // GateMeter
  5194. memset(&sub_opts,0,sizeof(sub_opts));
  5195. subt = mg_str(m->szs_sub_topic[1]);
  5196. sub_opts.topic = subt;
  5197. sub_opts.qos = m->s_qos;
  5198. mg_mqtt_sub(c,&sub_opts);
  5199. syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s",c->id,(int)subt.len,subt.ptr);
  5200. // TransMeter
  5201. memset(&sub_opts,0,sizeof(sub_opts));
  5202. subt = mg_str(m->szs_sub_topic[2]);
  5203. sub_opts.topic = subt;
  5204. sub_opts.qos = m->s_qos;
  5205. mg_mqtt_sub(c,&sub_opts);
  5206. syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s",c->id,(int)subt.len,subt.ptr);
  5207. // CtnMeter1
  5208. for(i = 0; i < set->CtnMeterNbr; i++)
  5209. {
  5210. memset(&sub_opts,0,sizeof(sub_opts));
  5211. subt = mg_str(m->szs_sub_topic[3 + i]);
  5212. sub_opts.topic = subt;
  5213. sub_opts.qos = m->s_qos;
  5214. mg_mqtt_sub(c,&sub_opts);
  5215. syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s",c->id,(int)subt.len,
  5216. subt.ptr);
  5217. }
  5218. }
  5219. else if(ev == MG_EV_MQTT_MSG)
  5220. {
  5221. // When we get echo response, print it
  5222. struct mg_mqtt_message* mm = (struct mg_mqtt_message*)ev_data;
  5223. // syslog(LOG_INFO,"%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len,
  5224. // mm->data.ptr, (int) mm->topic.len, mm->topic.ptr);
  5225. struct mg_str json = mg_str(mm->data.ptr);
  5226. struct mg_str new_json;
  5227. int offset,length;
  5228. char buf[512];
  5229. char devid[128] = { 0 };
  5230. char* str = NULL;
  5231. double val;
  5232. offset = mg_json_get(json,"$.data[0]",&length);
  5233. if(offset > 0)
  5234. {
  5235. memset(buf,0,sizeof(buf));
  5236. strncpy(buf,json.ptr + offset,length);
  5237. // syslog(LOG_INFO,"%s, Get data[0]:%s", __func__, buf);
  5238. new_json = mg_str(buf);
  5239. str = mg_json_get_str(new_json,"$.device_id");
  5240. if(str != NULL)
  5241. {
  5242. for(i = 0; i < set->CtnMeterNbr; i++)
  5243. {
  5244. sprintf(devid,"CtnMeter%d",i + 1);
  5245. cm = &APPL.CtnMeter[i + 1];
  5246. if(strcmp(str,devid) == 0)
  5247. {
  5248. if(mg_json_get_num(new_json,"$.com_ap",&val))
  5249. {
  5250. cm->com_active_p = val;
  5251. cm->LastUpdate = mg_millis();
  5252. }
  5253. }
  5254. }
  5255. sprintf(devid,"TransMeter%d",set->TransId);
  5256. if(strcmp(str,devid) == 0)
  5257. {
  5258. if(mg_json_get_num(new_json,"$.com_ap",&val))
  5259. {
  5260. tm->com_active_p = val;
  5261. tm->LastUpdate = mg_millis();
  5262. }
  5263. }
  5264. if(strcmp(str,"GateMeter") == 0)
  5265. {
  5266. if(mg_json_get_num(new_json,"$.com_ap",&val))
  5267. {
  5268. gm->com_active_p = val;
  5269. gm->LastUpdate = mg_millis();
  5270. if(m->LastRecv == 0)
  5271. { // First Recv
  5272. m->TotalRecvCnt = 0;
  5273. m->LastRecv = mg_millis();
  5274. m->TotalRecvIntv = 0;
  5275. }
  5276. else
  5277. {
  5278. m->TotalRecvCnt++;
  5279. int64_t CurrIntv = mg_millis() - m->LastRecv;
  5280. m->LastRecv = mg_millis();
  5281. if(CurrIntv > m->MaxRecvIntv)
  5282. {
  5283. m->MaxRecvIntv = CurrIntv;
  5284. }
  5285. m->TotalRecvIntv += CurrIntv;
  5286. m->AvgRecvIntv = m->TotalRecvIntv / m->TotalRecvCnt;
  5287. }
  5288. }
  5289. }
  5290. free(str);
  5291. }
  5292. }
  5293. else
  5294. {
  5295. syslog(LOG_INFO,"%s, Fail to Get data[0]:%d",__func__,offset);
  5296. }
  5297. }
  5298. else if(ev == MG_EV_CLOSE)
  5299. {
  5300. syslog(LOG_INFO,"%lu CLOSED",c->id);
  5301. m->s_conn = NULL; // Mark that we're closed
  5302. m->bConnected = 0;
  5303. strcpy(m->szState,"故障");
  5304. }
  5305. }
  5306. static void fn_mqtt3(struct mg_connection* c,int ev,void* ev_data)
  5307. {
  5308. // struct Dtsd1352_t* gm = &APPL.GateMeter;
  5309. // struct Dtsd1352_t* tm = &APPL.TransMeter;
  5310. // struct chanmqtt_t* m = &APPL.chanmqtt[3];
  5311. // char buf[256];
  5312. // if (ev == MG_EV_OPEN) {
  5313. // syslog(LOG_INFO,"%s, %lu CREATED", __func__, c->id);
  5314. // // c->is_hexdumping = 1;
  5315. // } else if (ev == MG_EV_CONNECT) {
  5316. // if (mg_url_is_ssl(m->szs_url)) {
  5317. // struct mg_tls_opts opts = {.ca = mg_unpacked("/certs/ca.pem"),
  5318. // .name = mg_url_host(m->szs_url)};
  5319. // mg_tls_init(c, &opts);
  5320. // }
  5321. // } else if (ev == MG_EV_ERROR) {
  5322. // // On error, log error message
  5323. // syslog(LOG_INFO, "%s, %lu ERROR %s", __func__, c->id, (char *)
  5324. // ev_data);
  5325. // } else if (ev == MG_EV_MQTT_OPEN) {
  5326. // m->bConnected = 1;
  5327. // strcpy(m->szState,"正常");
  5328. // // MQTT connect is successful
  5329. // syslog(LOG_INFO,"%s, %lu CONNECTED to %s", __func__, c->id,
  5330. // m->szs_url);
  5331. // struct mg_str subt = mg_str(m->szs_sub_topic[0]);
  5332. // struct mg_mqtt_opts sub_opts;
  5333. // memset(&sub_opts, 0, sizeof(sub_opts));
  5334. // sub_opts.topic = subt;
  5335. // sub_opts.qos = m->s_qos;
  5336. // mg_mqtt_sub(c, &sub_opts);
  5337. // syslog(LOG_INFO,"%s, %lu SUBSCRIBED to %.*s", __func__, c->id,
  5338. // (int) subt.len, subt.ptr);
  5339. // // subt = mg_str(m->szs_sub_topic[1]);
  5340. // // memset(&sub_opts, 0, sizeof(sub_opts));
  5341. // // sub_opts.topic = subt;
  5342. // // sub_opts.qos = m->s_qos;
  5343. // // mg_mqtt_sub(c, &sub_opts);
  5344. // // syslog(LOG_INFO,"%s, %lu SUBSCRIBED to %.*s", __func__, c->id,
  5345. // (int) subt.len, subt.ptr);
  5346. // } else if (ev == MG_EV_MQTT_MSG) {
  5347. // // When we get echo response, print it
  5348. // struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
  5349. // //syslog(LOG_INFO,"%s, %lu RECEIVED %.*s <- %.*s", __func__, c->id,
  5350. // (int) mm->data.len,
  5351. // // mm->data.ptr, (int) mm->topic.len, mm->topic.ptr);
  5352. // struct mg_str json = mg_str(mm->data.ptr);
  5353. // double dval;
  5354. // bool ok;
  5355. // if( strcmp(mm->topic.ptr, m->szs_sub_topic[0]) == 0){ // gate meter
  5356. // syslog(LOG_INFO,"%s, Get Gate Meter Data", __func__);
  5357. // ok = mg_json_get_num(json,"$.m1_com_ap", &dval);
  5358. // if( ok ){
  5359. // gm->com_active_p = dval;
  5360. // gm->LastUpdate = mg_millis();
  5361. // strcpy(gm->szLastUpdate, appl_get_datetime_long());
  5362. // }
  5363. // ok = mg_json_get_num(json,"$.m2_com_ap", &dval);
  5364. // if( ok ){
  5365. // tm->com_active_p = dval;
  5366. // tm->LastUpdate = mg_millis();
  5367. // strcpy(tm->szLastUpdate, appl_get_datetime_long());
  5368. // }
  5369. // }
  5370. // } else if (ev == MG_EV_CLOSE) {
  5371. // syslog(LOG_INFO,"%s, %lu CLOSED", __func__, c->id);
  5372. // m->s_conn = NULL; // Mark that we're closed
  5373. // m->bConnected = 0;
  5374. // strcpy(m->szState,"故障");
  5375. // }
  5376. }
  5377. static void* thrd_mqtt_1(void* param)
  5378. {
  5379. // struct chanmqtt_t* m = &APPL.chanmqtt[1];
  5380. // struct dtsd1352_t* meter = NULL;
  5381. // struct mg_mqtt_opts opts = {.user = mg_str(m->szusrname),
  5382. // .clean = true,
  5383. // .qos = m->s_qos,
  5384. // .topic = mg_str(m->szs_pub_topic),
  5385. // .version = 4,
  5386. // .message = mg_str("bye")};
  5387. // struct mg_mqtt_opts pub_opts;
  5388. // struct mg_str pubt = mg_str(m->szs_pub_topic);
  5389. // char msg[2048];
  5390. // char buf[2048];
  5391. // int i;
  5392. // mg_mgr_init(&mgr_mqtt1);
  5393. // MG_INFO(("%s ENTER, idx:1", __func__));
  5394. // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1,
  5395. // m->szs_url, &opts, fn_mqtt1, NULL); while(1){
  5396. // mg_mgr_poll(&mgr_mqtt1, 50);
  5397. // if(mg_millis() - m->LastUpload > 5000){
  5398. // m->LastUpload = mg_millis();
  5399. // if(m->bConnected){
  5400. // for(i = 1; i <= 2; i++){
  5401. // meter = &APPL.Dtsd1352[i];
  5402. // if( meter->CommState == ST_COMM_NORM ){
  5403. // memset(&pub_opts, 0, sizeof(pub_opts));
  5404. // pub_opts.topic = pubt;
  5405. // sprintf(buf,
  5406. // "\"m%d_pf\":%.3f,\
  5407. // \"m%d_com_ap\":%.1f,\"m%d_com_ae\":%.1f,\"m%d_pos_ae\":%.1f,\"m%d_neg_ae\":%.1f,
  5408. // \
  5409. // \"m%d_ua\":%.1f,\"m%d_ub\":%.1f,\"m%d_uc\":%.1f, \
  5410. // \"m%d_ia\":%.1f,\"m%d_ib\":%.1f,\"m%d_ic\":%.1f",
  5411. // i, meter->pwr_factor,
  5412. // i, meter->com_active_p,i, meter->com_active_e,i, meter->pos_active_e,i,
  5413. // meter->neg_active_e, i, meter->ua,i, meter->ub,i, meter->uc, i,
  5414. // meter->ia,i, meter->ib,i, meter->ic);
  5415. // sprintf(msg,"{'ts':%lld,'values':{%s}}", (long
  5416. // long)time(NULL)*1000, buf); pub_opts.message =
  5417. // mg_str(msg); pub_opts.qos = m->s_qos,
  5418. // pub_opts.retain = false; mg_mqtt_pub(m->s_conn,
  5419. // &pub_opts);
  5420. // }
  5421. // }
  5422. // }
  5423. // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1,
  5424. // m->szs_url, &opts, fn_mqtt1, NULL);
  5425. // }
  5426. // }
  5427. // MG_INFO(("%s EXIT, idx:1", __func__));
  5428. }
  5429. static void* thrd_mqtt_2(void* param)
  5430. {
  5431. struct Dtsd1352_t* gm = &APPL.GateMeter;
  5432. struct Dtsd1352_t* tm = &APPL.TransMeter;
  5433. struct dtsd1352_t* meter = NULL;
  5434. struct chanmqtt_t* m = &APPL.chanmqtt[2];
  5435. struct Ctl_t* ctl = &APPL.Ctl;
  5436. struct GaoteBms_t* bms = &APPL.GaoteBms;
  5437. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  5438. struct FireAlarm_t* fa = NULL;
  5439. struct Adl200_t* auxm = &APPL.Adl200;
  5440. struct Co_t* co = &APPL.Co;
  5441. struct Dehumi_t* dh = &APPL.Dehumi;
  5442. struct Dido_t* dido = &APPL.Dido;
  5443. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  5444. struct Settings_t* set = &APPL.Set.s;
  5445. struct mg_mqtt_opts opts = { .user = mg_str(m->szusrname),
  5446. .pass = mg_str(m->szpasswd),
  5447. .client_id = mg_str(set->szSN),
  5448. .clean = true,
  5449. .qos = m->s_qos,
  5450. .topic = mg_str(m->szs_pub_topic),
  5451. .version = 4 };
  5452. struct mg_mqtt_opts pub_opts;
  5453. struct mg_str pubt = mg_str(m->szs_pub_topic);
  5454. struct Dtsd1352_t* cm = NULL;
  5455. char msg[2048];
  5456. char stakv[2048];
  5457. char ctnkv[2048];
  5458. char pcskv[2048];
  5459. char bmskv[8192];
  5460. char ackv[2048];
  5461. char fakv[10][512];
  5462. char amkv[512];
  5463. char cokv[512];
  5464. char dhkv[512];
  5465. char buf[2048];
  5466. char didokv[512];
  5467. int64_t LastCommCheck;
  5468. int i,j;
  5469. double avgcellv;
  5470. int CommChkOk;
  5471. mg_mgr_init(&mgr_mqtt2);
  5472. syslog(LOG_INFO,"%s ENTER idx:2",__func__);
  5473. if(m->s_conn == NULL)
  5474. m->s_conn = mg_mqtt_connect(&mgr_mqtt2,m->szs_url,&opts,fn_mqtt2,NULL);
  5475. while(1)
  5476. {
  5477. mg_mgr_poll(&mgr_mqtt2,20);
  5478. // Process Cmd
  5479. if(m->Cmd == CMD_MQTT_REGISTER)
  5480. {
  5481. m->Cmd = CMD_MQTT_DONE;
  5482. // // Register STA
  5483. // sprintf(msg,
  5484. // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":0,\"idx\":1}]}",
  5485. // set->szCloudUserName, (long long)time(NULL)*1000, set->szSN);
  5486. // pub_opts.message = mg_str(msg);
  5487. // pub_opts.qos = m->s_qos, pub_opts.retain = false;
  5488. // pub_opts.topic = mg_str("register");
  5489. // mg_mqtt_pub(m->s_conn, &pub_opts);
  5490. // m->TotalSendCnt++;
  5491. // Register CTN
  5492. sprintf(msg,
  5493. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5494. "id\":\"%s\",\"type\":1,\"idx\":1}]}",
  5495. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN);
  5496. pub_opts.message = mg_str(msg);
  5497. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5498. pub_opts.topic = mg_str("register");
  5499. mg_mqtt_pub(m->s_conn,&pub_opts);
  5500. m->TotalSendCnt++;
  5501. // Register PCS
  5502. sprintf(msg,
  5503. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5504. "id\":\"%s-PCS\",\"pid\":\"%s\",\"type\":2,\"idx\":1}]}",
  5505. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  5506. set->szSN);
  5507. pub_opts.message = mg_str(msg);
  5508. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5509. pub_opts.topic = mg_str("register");
  5510. mg_mqtt_pub(m->s_conn,&pub_opts);
  5511. m->TotalSendCnt++;
  5512. // Register BMS
  5513. sprintf(msg,
  5514. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5515. "id\":\"%s-BMS\",\"pid\":\"%s\",\"type\":3,\"idx\":1}]}",
  5516. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  5517. set->szSN);
  5518. pub_opts.message = mg_str(msg);
  5519. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5520. pub_opts.topic = mg_str("register");
  5521. mg_mqtt_pub(m->s_conn,&pub_opts);
  5522. m->TotalSendCnt++;
  5523. // Register AC
  5524. sprintf(msg,
  5525. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5526. "id\":\"%s-AC\",\"pid\":\"%s\",\"type\":4,\"idx\":1}]}",
  5527. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  5528. set->szSN);
  5529. pub_opts.message = mg_str(msg);
  5530. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5531. pub_opts.topic = mg_str("register");
  5532. mg_mqtt_pub(m->s_conn,&pub_opts);
  5533. m->TotalSendCnt++;
  5534. // Register FA, FireAlarm
  5535. for(i = 1; i <= 5; i++)
  5536. {
  5537. sprintf(msg,
  5538. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5539. "id\":\"%s-FA%d\",\"pid\":\"%s\",\"type\":14,\"idx\":1}]}",
  5540. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  5541. i,set->szSN);
  5542. pub_opts.message = mg_str(msg);
  5543. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5544. pub_opts.topic = mg_str("register");
  5545. mg_mqtt_pub(m->s_conn,&pub_opts);
  5546. m->TotalSendCnt++;
  5547. }
  5548. // Register AM, Aux Meter
  5549. sprintf(msg,
  5550. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5551. "id\":\"%s-AM\",\"pid\":\"%s\",\"type\":10,\"idx\":1}]}",
  5552. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  5553. set->szSN);
  5554. pub_opts.message = mg_str(msg);
  5555. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5556. pub_opts.topic = mg_str("register");
  5557. mg_mqtt_pub(m->s_conn,&pub_opts);
  5558. m->TotalSendCnt++;
  5559. // Register CO, Co Sensor
  5560. sprintf(msg,
  5561. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5562. "id\":\"%s-CO\",\"pid\":\"%s\",\"type\":8,\"idx\":1}]}",
  5563. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  5564. set->szSN);
  5565. pub_opts.message = mg_str(msg);
  5566. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5567. pub_opts.topic = mg_str("register");
  5568. mg_mqtt_pub(m->s_conn,&pub_opts);
  5569. m->TotalSendCnt++;
  5570. // Register DH, Dehumi
  5571. sprintf(msg,
  5572. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5573. "id\":\"%s-DH\",\"pid\":\"%s\",\"type\":6,\"idx\":1}]}",
  5574. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  5575. set->szSN);
  5576. pub_opts.message = mg_str(msg);
  5577. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5578. pub_opts.topic = mg_str("register");
  5579. mg_mqtt_pub(m->s_conn,&pub_opts);
  5580. m->TotalSendCnt++;
  5581. // Register DIDO
  5582. sprintf(msg,
  5583. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  5584. "id\":\"%s-DIDO\",\"pid\":\"%s\",\"type\":9,\"idx\":1}]}",
  5585. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  5586. set->szSN);
  5587. pub_opts.message = mg_str(msg);
  5588. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5589. pub_opts.topic = mg_str("register");
  5590. mg_mqtt_pub(m->s_conn,&pub_opts);
  5591. m->TotalSendCnt++;
  5592. }
  5593. avgcellv = bms->AvgCellV;
  5594. // ******************************************
  5595. // Upload Fast Data
  5596. // ******************************************
  5597. if(mg_millis() - m->LastFastUpload > set->UploadHighSpeed)
  5598. {
  5599. m->LastFastUpload = mg_millis();
  5600. if(m->bConnected)
  5601. {
  5602. // CTN
  5603. ctnkv[0] = 0;
  5604. sprintf(buf,
  5605. "\"device_id\":\"%s\",\"type\":1,\"state\":%d,\"err\":\"%s\",",
  5606. set->szSN,ctl->State,ctl->szErr);
  5607. strcat(ctnkv,buf);
  5608. if(pcs->CommState == ST_COMM_NORM)
  5609. {
  5610. sprintf(buf,"\"ap\":%d,",ctl->Ap);
  5611. strcat(ctnkv,buf);
  5612. }
  5613. if(bms->CommState == ST_COMM_NORM)
  5614. {
  5615. sprintf(buf,"\"soc\":%.3f,",bms->Soc);
  5616. strcat(ctnkv,buf);
  5617. }
  5618. if(bms->CommState == ST_COMM_NORM)
  5619. {
  5620. sprintf(buf,"\"soh\":%.3f,",bms->Soh);
  5621. strcat(ctnkv,buf);
  5622. }
  5623. sprintf(buf,"\"end\":0");
  5624. strcat(ctnkv,buf);
  5625. sprintf(msg,
  5626. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5627. set->szCloudUserName,(long long)time(NULL) * 1000,ctnkv);
  5628. pub_opts.message = mg_str(msg);
  5629. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5630. pub_opts.topic = pubt;
  5631. mg_mqtt_pub(m->s_conn,&pub_opts);
  5632. m->TotalSendCnt++;
  5633. // PCS
  5634. pcskv[0] = 0;
  5635. if(pcs->CommState == ST_COMM_NORM)
  5636. {
  5637. sprintf(buf,"\"device_id\":\"%s-PCS\",\"type\":2,",set->szSN);
  5638. strcat(pcskv,buf);
  5639. sprintf(buf,
  5640. "\"ap\":%.1f,\"aps\":%.1f,\"rap\":%.1f,\"dcv\":%.1f,\"dcc\":%"
  5641. ".1f,\"errstat\":%d,\"runstat\":%d",
  5642. pcs->Ap,pcs->Aps,pcs->Rap,pcs->BatV,pcs->BatC,
  5643. pcs->ErrState,pcs->WorkState);
  5644. strcat(pcskv,buf);
  5645. sprintf(msg,
  5646. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5647. set->szCloudUserName,(long long)time(NULL) * 1000,pcskv);
  5648. pub_opts.message = mg_str(msg);
  5649. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5650. pub_opts.topic = pubt;
  5651. mg_mqtt_pub(m->s_conn,&pub_opts);
  5652. m->TotalSendCnt++;
  5653. }
  5654. // BMS
  5655. bmskv[0] = 0;
  5656. if(bms->CommState == ST_COMM_NORM)
  5657. {
  5658. sprintf(buf,"\"device_id\":\"%s-BMS\",\"type\":3,",set->szSN);
  5659. strcat(bmskv,buf);
  5660. sprintf(buf,
  5661. "\"hv\":%d,\"v\":%.1f,\"c\":%.1f,\"cell_max_v\":%.3f,\"cell_"
  5662. "ave_v\":%.3f,\"cell_min_v\":%.3f,",
  5663. bms->HvState,bms->BatV,bms->BatI,bms->MaxCellV,
  5664. bms->AvgCellV,bms->MinCellV);
  5665. strcat(bmskv,buf);
  5666. if(bms->MinCellV < 3.08 || bms->MaxCellV > 3.37)
  5667. {
  5668. for(i = 1; i <= PACK_NBR; i++)
  5669. {
  5670. for(j = 1; j <= PACK_CELL_NBR; j++)
  5671. {
  5672. sprintf(buf,"\"p%d_v%d\":%.3f,",i,j,bms->CellVolt[i][j]);
  5673. strcat(bmskv,buf);
  5674. }
  5675. }
  5676. }
  5677. sprintf(buf,"\"end\":0");
  5678. strcat(bmskv,buf);
  5679. sprintf(msg,
  5680. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5681. set->szCloudUserName,(long long)time(NULL) * 1000,bmskv);
  5682. pub_opts.message = mg_str(msg);
  5683. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5684. pub_opts.topic = pubt;
  5685. mg_mqtt_pub(m->s_conn,&pub_opts);
  5686. m->TotalSendCnt++;
  5687. }
  5688. }
  5689. }
  5690. // ******************************************
  5691. // Upload Medium Data
  5692. // ******************************************
  5693. if(mg_millis() - m->LastMediumUpload > set->UploadMediumSpeed)
  5694. {
  5695. m->LastMediumUpload = mg_millis();
  5696. if(m->bConnected)
  5697. {
  5698. // PCS
  5699. pcskv[0] = 0;
  5700. if(pcs->CommState == ST_COMM_NORM)
  5701. {
  5702. sprintf(buf,"\"device_id\":\"%s-PCS\",\"type\":2,",set->szSN);
  5703. strcat(pcskv,buf);
  5704. sprintf(buf,
  5705. "\"t_igbt\":%.1f,\"t_env\":%.1f,\"uab\":%.1f,\"ubc\":%.1f,"
  5706. "\"uca\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f",
  5707. pcs->Tigbt,pcs->Tenv,pcs->Uab,pcs->Ubc,pcs->Uca,pcs->Ia,
  5708. pcs->Ib,pcs->Ic);
  5709. strcat(pcskv,buf);
  5710. sprintf(msg,
  5711. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5712. set->szCloudUserName,(long long)time(NULL) * 1000,pcskv);
  5713. pub_opts.message = mg_str(msg);
  5714. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5715. pub_opts.topic = pubt;
  5716. mg_mqtt_pub(m->s_conn,&pub_opts);
  5717. m->TotalSendCnt++;
  5718. }
  5719. // BMS
  5720. bmskv[0] = 0;
  5721. if(bms->CommState == ST_COMM_NORM)
  5722. {
  5723. sprintf(buf,"\"device_id\":\"%s-BMS\",\"type\":3,",set->szSN);
  5724. strcat(bmskv,buf);
  5725. sprintf(
  5726. buf,
  5727. "\"cell_max_t\":%.1f,\"cell_ave_t\":%.1f,\"cell_min_t\":%.1f,\"soc\":%.3f,\"soh\":%.3f,\
  5728. \"cell_v_diff\":%.3f,\"cell_t_diff\":%.1f,\"cell_max_v_index\":%d,\"cell_min_v_index\":%d,\"cell_max_t_index\":%d,\"cell_min_t_index\":%d,\
  5729. \"pos_ins\":%.1f,\"neg_ins\":%.1f,",
  5730. bms->MaxCellT,bms->AvgCellT,bms->MinCellT,bms->Soc,bms->Soh,
  5731. bms->CellVDiff,bms->CellTDiff,bms->MaxCellVIdx,
  5732. bms->MinCellVIdx,bms->MaxCellTIdx,bms->MinCellTIdx,bms->PosRes,
  5733. bms->NegRes);
  5734. strcat(bmskv,buf);
  5735. if(bms->MinCellV >= 3.08 && bms->MaxCellV <= 3.37)
  5736. {
  5737. for(i = 1; i <= PACK_NBR; i++)
  5738. {
  5739. for(j = 1; j <= PACK_CELL_NBR; j++)
  5740. {
  5741. sprintf(buf,"\"p%d_v%d\":%.3f,",i,j,bms->CellVolt[i][j]);
  5742. strcat(bmskv,buf);
  5743. }
  5744. }
  5745. }
  5746. for(i = 1; i <= PACK_NBR; i++)
  5747. {
  5748. for(j = 1; j <= PACK_CELL_NBR; j++)
  5749. {
  5750. sprintf(buf,"\"p%d_t%d\":%.1f,",i,j,bms->CellTemp[i][j]);
  5751. strcat(bmskv,buf);
  5752. }
  5753. }
  5754. sprintf(buf,"\"end\":0");
  5755. strcat(bmskv,buf);
  5756. sprintf(msg,
  5757. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5758. set->szCloudUserName,(long long)time(NULL) * 1000,bmskv);
  5759. pub_opts.message = mg_str(msg);
  5760. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5761. pub_opts.topic = pubt;
  5762. mg_mqtt_pub(m->s_conn,&pub_opts);
  5763. m->TotalSendCnt++;
  5764. }
  5765. // AC
  5766. ackv[0] = 0;
  5767. if(ac->CommState == ST_COMM_NORM)
  5768. {
  5769. sprintf(buf,"\"device_id\":\"%s-AC\",\"type\":4,",set->szSN);
  5770. strcat(ackv,buf);
  5771. sprintf(buf,
  5772. "\"work_mode\":%d,\"outwater_t\":%d,\"rtnwater_t\":%d,"
  5773. "\"outwater_pre\":%.1f,\"rtnwater_pre\":%.1f,\"err_code\":%d,"
  5774. "\"err_level\":%d",
  5775. ac->WorkMode,ac->OutWaterTemp,ac->InWaterTemp,
  5776. ac->OutWaterPre,ac->InWaterPre,ac->ErrCode,ac->ErrLevel);
  5777. strcat(ackv,buf);
  5778. sprintf(msg,
  5779. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5780. set->szCloudUserName,(long long)time(NULL) * 1000,ackv);
  5781. pub_opts.message = mg_str(msg);
  5782. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5783. pub_opts.topic = pubt;
  5784. mg_mqtt_pub(m->s_conn,&pub_opts);
  5785. m->TotalSendCnt++;
  5786. }
  5787. }
  5788. }
  5789. // ******************************************
  5790. // Upload SLow Data
  5791. // ******************************************
  5792. if(mg_millis() - m->LastSlowUpload > set->UploadSlowSpeed)
  5793. {
  5794. m->LastSlowUpload = mg_millis();
  5795. if(m->bConnected)
  5796. {
  5797. // FA
  5798. for(i = 1; i <= 5; i++)
  5799. {
  5800. fakv[i][0] = 0;
  5801. }
  5802. for(i = 1; i <= 5; i++)
  5803. {
  5804. fa = &APPL.Fa[i];
  5805. if(fa->CommState == ST_COMM_NORM)
  5806. {
  5807. sprintf(buf,"\"device_id\":\"%s-FA%d\",\"type\":14,",set->szSN,
  5808. i);
  5809. strcat(fakv[i],buf);
  5810. sprintf(buf,
  5811. "\"T1\":%d,\"T2\":%d,\"Co\":%d,\"Voc\":%d,\"SmokeFlag\":%d,"
  5812. "\"Level\":%d,\"ErrCode\":%d",
  5813. fa->T1,fa->T2,fa->Co,fa->Voc,fa->SmokeFlagVal,
  5814. fa->LevelVal,fa->ErrCodeVal);
  5815. strcat(fakv[i],buf);
  5816. // Sending
  5817. sprintf(
  5818. msg,
  5819. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5820. set->szCloudUserName,(long long)time(NULL) * 1000,fakv[i]);
  5821. pub_opts.message = mg_str(msg);
  5822. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5823. pub_opts.topic = pubt;
  5824. mg_mqtt_pub(m->s_conn,&pub_opts);
  5825. m->TotalSendCnt++;
  5826. }
  5827. }
  5828. // AM
  5829. amkv[0] = 0;
  5830. if(auxm->CommState == ST_COMM_NORM)
  5831. {
  5832. sprintf(buf,"\"device_id\":\"%s-AM\",\"type\":10,",set->szSN);
  5833. strcat(amkv,buf);
  5834. sprintf(buf,"\"pos_ae\":%.1f,\"neg_ae\":%.1f,\"ap\":%.1f",
  5835. auxm->PosAe,auxm->NegAe,auxm->Ap);
  5836. strcat(amkv,buf);
  5837. sprintf(msg,
  5838. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5839. set->szCloudUserName,(long long)time(NULL) * 1000,amkv);
  5840. pub_opts.message = mg_str(msg);
  5841. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5842. pub_opts.topic = pubt;
  5843. mg_mqtt_pub(m->s_conn,&pub_opts);
  5844. m->TotalSendCnt++;
  5845. }
  5846. // CO
  5847. cokv[0] = 0;
  5848. if(co->CommState == ST_COMM_NORM)
  5849. {
  5850. sprintf(buf,"\"device_id\":\"%s-CO\",\"type\":8,",set->szSN);
  5851. strcat(cokv,buf);
  5852. sprintf(buf,"\"Density\":%u",co->Density);
  5853. strcat(cokv,buf);
  5854. // Sending
  5855. sprintf(msg,
  5856. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5857. set->szCloudUserName,(long long)time(NULL) * 1000,cokv);
  5858. pub_opts.message = mg_str(msg);
  5859. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5860. pub_opts.topic = pubt;
  5861. mg_mqtt_pub(m->s_conn,&pub_opts);
  5862. m->TotalSendCnt++;
  5863. }
  5864. // DH
  5865. dhkv[0] = 0;
  5866. if(dh->CommState)
  5867. {
  5868. sprintf(buf,"\"device_id\":\"%s-DH\",\"type\":7,",set->szSN);
  5869. strcat(dhkv,buf);
  5870. sprintf(buf,"\"temp\":%.1f,\"humi\":%.1f",dh->Temp,dh->Humi);
  5871. strcat(dhkv,buf);
  5872. // Sending
  5873. sprintf(msg,
  5874. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5875. set->szCloudUserName,(long long)time(NULL) * 1000,dhkv);
  5876. pub_opts.message = mg_str(msg);
  5877. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5878. pub_opts.topic = pubt;
  5879. mg_mqtt_pub(m->s_conn,&pub_opts);
  5880. m->TotalSendCnt++;
  5881. }
  5882. // DIDO
  5883. didokv[0] = 0;
  5884. sprintf(buf,"\"device_id\":\"%s-DIDO\",\"type\":9,",set->szSN);
  5885. strcat(didokv,buf);
  5886. sprintf(buf,
  5887. "\"WaterDec1\":%d,\"WaterDec2\":%d,\"FrontDoor\":%d,"
  5888. "\"BackDoor\":%d,\"EmgStop\":%d,\"FeEruptFb\":%d",
  5889. dido->WaterDec1,dido->WaterDec2,dido->FrontDoor,
  5890. dido->BackDoor,dido->EmgStop,dido->FeEruptFb);
  5891. strcat(didokv,buf);
  5892. // Sending
  5893. sprintf(msg,
  5894. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  5895. set->szCloudUserName,(long long)time(NULL) * 1000,didokv);
  5896. pub_opts.message = mg_str(msg);
  5897. pub_opts.qos = m->s_qos,pub_opts.retain = false;
  5898. pub_opts.topic = pubt;
  5899. mg_mqtt_pub(m->s_conn,&pub_opts);
  5900. m->TotalSendCnt++;
  5901. // sprintf(msg,
  5902. // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s},{%s},{%s},{%s},{%s},{%s},{%s},{%s},{%s}]}",
  5903. // set->szCloudUserName, (long long)time(NULL)*1000,
  5904. // fakv[1],fakv[2],fakv[3],fakv[4],fakv[5],amkv,cokv,dhkv,didokv);
  5905. // // sprintf(msg,
  5906. // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s},{%s},{%s},{%s},{%s},{%s}]}",
  5907. // // set->szCloudUserName, (long long)time(NULL)*1000, fekv,
  5908. // fakv[1],fakv[2],fakv[3],fakv[4],fakv[5]); pub_opts.message =
  5909. // mg_str(msg); pub_opts.qos = m->s_qos, pub_opts.retain = false;
  5910. // pub_opts.topic = pubt;
  5911. // mg_mqtt_pub(m->s_conn, &pub_opts);
  5912. // m->TotalSendCnt++;
  5913. }
  5914. }
  5915. // **************************************
  5916. // Meters Comm Check
  5917. // **************************************
  5918. if(mg_millis() - LastCommCheck > 1000)
  5919. {
  5920. LastCommCheck = mg_millis();
  5921. if(mg_millis() - gm->LastUpdate > 10000)
  5922. {
  5923. gm->CommState = ST_COMM_ERR;
  5924. strcpy(gm->szCommState,"故障");
  5925. }
  5926. else
  5927. {
  5928. gm->CommState = ST_COMM_NORM;
  5929. strcpy(gm->szCommState,"正常");
  5930. }
  5931. if(mg_millis() - tm->LastUpdate > 10000)
  5932. {
  5933. tm->CommState = ST_COMM_ERR;
  5934. strcpy(tm->szCommState,"故障");
  5935. }
  5936. else
  5937. {
  5938. tm->CommState = ST_COMM_NORM;
  5939. strcpy(tm->szCommState,"正常");
  5940. }
  5941. CommChkOk = 0;
  5942. for(i = 0; i < set->CtnMeterNbr; i++)
  5943. {
  5944. cm = &APPL.CtnMeter[i + 1];
  5945. if(mg_millis() - cm->LastUpdate > 10000)
  5946. {
  5947. cm->CommState = ST_COMM_ERR;
  5948. strcpy(cm->szCommState,"故障");
  5949. CommChkOk = -1;
  5950. }
  5951. else
  5952. {
  5953. cm->CommState = ST_COMM_NORM;
  5954. strcpy(cm->szCommState,"正常");
  5955. }
  5956. }
  5957. if(CommChkOk < 0)
  5958. {
  5959. APPL.CtnMeterCommState = ST_COMM_ERR;
  5960. strcpy(APPL.szCtnMeterCommState,"故障");
  5961. }
  5962. else
  5963. {
  5964. APPL.CtnMeterCommState = ST_COMM_NORM;
  5965. strcpy(APPL.szCtnMeterCommState,"正常");
  5966. }
  5967. }
  5968. if(m->s_conn == NULL)
  5969. {
  5970. m->s_conn =
  5971. mg_mqtt_connect(&mgr_mqtt2,m->szs_url,&opts,fn_mqtt2,NULL);
  5972. m->TotalReconnCnt++;
  5973. }
  5974. }
  5975. syslog(LOG_INFO,"%s EXIT, idx:2",__func__);
  5976. }
  5977. // Get data from mosquitto server
  5978. static void* thrd_mqtt_3(void* param)
  5979. {
  5980. // struct chanmqtt_t* m = &APPL.chanmqtt[3];
  5981. // struct Dtsd1352_t* gm = &APPL.GateMeter;
  5982. // struct Dtsd1352_t* tm = &APPL.TransMeter;
  5983. // struct mg_mqtt_opts opts = {.user = mg_str(m->szusrname),
  5984. // .clean = true,
  5985. // .qos = m->s_qos,
  5986. // .topic = mg_str(m->szs_pub_topic),
  5987. // .version = 4,
  5988. // .keepalive = 3,
  5989. // .message = mg_str("bye")};
  5990. // struct mg_mqtt_opts pub_opts;
  5991. // struct mg_str pubt = mg_str(m->szs_pub_topic);
  5992. // char msg[2048];
  5993. // int64_t LastReconn = 0;
  5994. // int64_t LastCommCheck = 0;
  5995. // mg_mgr_init(&mgr_mqtt3);
  5996. // syslog(LOG_INFO,"%s ENTER, idx:3", __func__);
  5997. // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt3, m->szs_url,
  5998. // &opts, fn_mqtt3, NULL); while(1){
  5999. // mg_mgr_poll(&mgr_mqtt3, 50);
  6000. // if(mg_millis() - LastReconn > 5000){ // 5s
  6001. // LastReconn = mg_millis();
  6002. // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1,
  6003. // m->szs_url, &opts, fn_mqtt3, NULL);
  6004. // }
  6005. // if(mg_millis() - LastCommCheck > 1000){ // 1s
  6006. // LastCommCheck = mg_millis();
  6007. // if( mg_millis() - gm->LastUpdate > 10000){
  6008. // gm->CommState = ST_COMM_ERR;
  6009. // strcpy(gm->szCommState,"故障");
  6010. // }else{
  6011. // gm->CommState = ST_COMM_NORM;
  6012. // strcpy(gm->szCommState,"正常");
  6013. // }
  6014. // if( mg_millis() - tm->LastUpdate > 10000){
  6015. // tm->CommState = ST_COMM_ERR;
  6016. // strcpy(tm->szCommState,"故障");
  6017. // }else{
  6018. // tm->CommState = ST_COMM_NORM;
  6019. // strcpy(tm->szCommState,"正常");
  6020. // }
  6021. // }
  6022. // }
  6023. // syslog(LOG_INFO,"%s EXIT, idx:1", __func__);
  6024. }
  6025. static void fn_mqtt4_connlost(void* context,char* cause)
  6026. {
  6027. syslog(LOG_INFO,"%s, mqtt connection lost, cause: %s\n",__func__,cause);
  6028. struct chanmqtt_t* m = &APPL.chanmqtt[4];
  6029. m->bConnected = 0;
  6030. strcpy(m->szState,"故障");
  6031. }
  6032. static int fn_mqtt4_msgarrvd(void* context,char* topicName,int topicLen,
  6033. MQTTClient_message* message)
  6034. {
  6035. struct Dtsd1352_t* gm = &APPL.GateMeter;
  6036. struct Dtsd1352_t* tm = &APPL.TransMeter;
  6037. // struct Dtsd1352_t* pm = &APPL.PvMeter;
  6038. struct Dtsd1352_t* cm = &APPL.CtnMeter;
  6039. struct chanmqtt_t* m = &APPL.chanmqtt[4];
  6040. int64_t CurrIntv;
  6041. // syslog(LOG_INFO, "%s, Message arrived, topic:%s topic len:%d payload
  6042. // len:%d",
  6043. // __func__, topicName, topicLen, message->payloadlen);
  6044. struct mg_str json = mg_str(message->payload);
  6045. double dval;
  6046. bool ok;
  6047. char* str = NULL;
  6048. struct mg_str json_device_id;
  6049. char buf[512];
  6050. char devid[128] = { 0 };
  6051. int i;
  6052. int length;
  6053. int offset = mg_json_get(json,"$.data[0]",&length);
  6054. double val;
  6055. struct Settings_t* set = &APPL.Set.s;
  6056. if(offset > 0)
  6057. {
  6058. memset(buf,0,sizeof(buf));
  6059. strncpy(buf,json.ptr + offset,length);
  6060. // syslog(LOG_INFO,"%s, Get data[0]:%s", __func__, buf);
  6061. json_device_id = mg_str(buf);
  6062. str = mg_json_get_str(json_device_id,"$.device_id");
  6063. if(str != NULL)
  6064. {
  6065. for(i = 0; i < set->CtnMeterNbr; i++)
  6066. {
  6067. sprintf(devid,"CtnMeter%d",i + 1);
  6068. cm = &APPL.CtnMeter[i + 1];
  6069. if(strcmp(str,devid) == 0)
  6070. {
  6071. if(mg_json_get_num(json_device_id,"$.com_ap",&val))
  6072. {
  6073. cm->com_active_p = val;
  6074. cm->LastUpdate = mg_millis();
  6075. }
  6076. }
  6077. }
  6078. sprintf(devid,"TransMeter%d",set->TransId);
  6079. if(strcmp(str,devid) == 0)
  6080. {
  6081. if(mg_json_get_num(json_device_id,"$.com_ap",&val))
  6082. {
  6083. tm->com_active_p = val;
  6084. tm->LastUpdate = mg_millis();
  6085. }
  6086. }
  6087. if(strcmp(str,"GateMeter") == 0)
  6088. {
  6089. if(mg_json_get_num(json_device_id,"$.com_ap",&val))
  6090. {
  6091. gm->com_active_p = val;
  6092. gm->LastUpdate = mg_millis();
  6093. if(m->LastRecv == 0)
  6094. { // First Recv
  6095. m->TotalRecvCnt = 0;
  6096. m->LastRecv = mg_millis();
  6097. m->TotalRecvIntv = 0;
  6098. }
  6099. else
  6100. {
  6101. m->TotalRecvCnt++;
  6102. int64_t CurrIntv = mg_millis() - m->LastRecv;
  6103. m->LastRecv = mg_millis();
  6104. if(CurrIntv > m->MaxRecvIntv)
  6105. {
  6106. m->MaxRecvIntv = CurrIntv;
  6107. }
  6108. m->TotalRecvIntv += CurrIntv;
  6109. m->AvgRecvIntv = m->TotalRecvIntv / m->TotalRecvCnt;
  6110. }
  6111. }
  6112. }
  6113. free(str);
  6114. }
  6115. }
  6116. else
  6117. {
  6118. syslog(LOG_INFO,"%s, Fail to Get data[0]:%d",__func__,offset);
  6119. }
  6120. }
  6121. static void mqtt4_connect(void)
  6122. {
  6123. struct Settings_t* set = &APPL.Set.s;
  6124. int rc;
  6125. struct chanmqtt_t* m = &APPL.chanmqtt[4];
  6126. MQTTClient_deliveryToken token;
  6127. MQTTClient_connectOptions conn_opts;
  6128. MQTTClient_connectOptions tmpconn_opts =
  6129. MQTTClient_connectOptions_initializer5;
  6130. conn_opts = tmpconn_opts;
  6131. MQTTClient_createOptions createOpts = MQTTClient_createOptions_initializer;
  6132. createOpts.MQTTVersion = MQTTVERSION_5;
  6133. if((rc = MQTTClient_createWithOptions(&m->s_paho_client,m->szs_url,set->szSN,
  6134. MQTTCLIENT_PERSISTENCE_NONE,NULL,
  6135. &createOpts)) != MQTTCLIENT_SUCCESS)
  6136. {
  6137. syslog(LOG_INFO,
  6138. "%s, MQTTClient_createWithOptions fail, rc:%d msg:%s %s %s",
  6139. __func__,rc,MQTTClient_strerror(rc));
  6140. }
  6141. conn_opts.keepAliveInterval = 8;
  6142. conn_opts.cleansession = 0;
  6143. conn_opts.username = m->szusrname;
  6144. conn_opts.password = m->szpasswd;
  6145. MQTTProperties props = MQTTProperties_initializer;
  6146. MQTTProperties willProps = MQTTProperties_initializer;
  6147. MQTTResponse response = MQTTResponse_initializer;
  6148. MQTTClient_setCallbacks(m->s_paho_client,NULL,fn_mqtt4_connlost,fn_mqtt4_msgarrvd,
  6149. NULL);
  6150. response = MQTTClient_connect5(m->s_paho_client,&conn_opts,&props,&willProps);
  6151. if(response.reasonCode != MQTTCLIENT_SUCCESS)
  6152. {
  6153. syslog(LOG_INFO,"%s, MQTTClient_connect fail, rc:%d msg:%s",__func__,
  6154. response.reasonCode,MQTTClient_strerror(response.reasonCode));
  6155. m->bConnected = 0;
  6156. strcpy(m->szState,"故障");
  6157. }
  6158. else
  6159. {
  6160. syslog(LOG_INFO,"%s, Connect Ok",__func__);
  6161. m->bConnected = 1;
  6162. strcpy(m->szState,"正常");
  6163. // control
  6164. response =
  6165. MQTTClient_subscribe5(m->s_paho_client,m->szs_sub_topic[0],m->s_qos,NULL,NULL);
  6166. if(response.reasonCode != MQTTCLIENT_SUCCESS &&
  6167. response.reasonCode != m->s_qos)
  6168. {
  6169. syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s",
  6170. __func__,response.reasonCode,
  6171. MQTTClient_strerror(response.reasonCode));
  6172. }
  6173. else
  6174. {
  6175. syslog(LOG_INFO,"SUBSCRIBED to %s",m->szs_sub_topic[0]);
  6176. }
  6177. // GateMeter
  6178. response =
  6179. MQTTClient_subscribe5(m->s_paho_client,m->szs_sub_topic[1],m->s_qos,NULL,NULL);
  6180. if(response.reasonCode != MQTTCLIENT_SUCCESS &&
  6181. response.reasonCode != m->s_qos)
  6182. {
  6183. syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s",
  6184. __func__,response.reasonCode,
  6185. MQTTClient_strerror(response.reasonCode));
  6186. }
  6187. else
  6188. {
  6189. syslog(LOG_INFO,"SUBSCRIBED to %s",m->szs_sub_topic[1]);
  6190. }
  6191. // TransMeter
  6192. response =
  6193. MQTTClient_subscribe5(m->s_paho_client,m->szs_sub_topic[2],m->s_qos,NULL,NULL);
  6194. if(response.reasonCode != MQTTCLIENT_SUCCESS &&
  6195. response.reasonCode != m->s_qos)
  6196. {
  6197. syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s",
  6198. __func__,response.reasonCode,
  6199. MQTTClient_strerror(response.reasonCode));
  6200. }
  6201. else
  6202. {
  6203. syslog(LOG_INFO,"SUBSCRIBED to %s",m->szs_sub_topic[2]);
  6204. }
  6205. // CtnMeter1
  6206. for(int i = 0; i < set->CtnMeterNbr; i++)
  6207. {
  6208. response = MQTTClient_subscribe5(m->s_paho_client,m->szs_sub_topic[3 + i],m->s_qos,
  6209. NULL,NULL);
  6210. if(response.reasonCode != MQTTCLIENT_SUCCESS &&
  6211. response.reasonCode != m->s_qos)
  6212. {
  6213. syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s",
  6214. __func__,response.reasonCode,
  6215. MQTTClient_strerror(response.reasonCode));
  6216. }
  6217. else
  6218. {
  6219. syslog(LOG_INFO,"SUBSCRIBED to %s",m->szs_sub_topic[3 + i]);
  6220. }
  6221. }
  6222. }
  6223. }
  6224. static void mqtt4_pub(const char* szTopic,const char* szPayload)
  6225. {
  6226. double pub_time;
  6227. int ret = 0;
  6228. int rc;
  6229. struct chanmqtt_t* m = &APPL.chanmqtt[4];
  6230. MQTTResponse response = MQTTResponse_initializer;
  6231. if(m->bConnected == false)
  6232. {
  6233. goto leave;
  6234. }
  6235. MQTTClient_deliveryToken token;
  6236. MQTTClient_message msg = MQTTClient_message_initializer;
  6237. msg.retained = 0;
  6238. msg.qos = m->s_qos;
  6239. msg.payload = (void*)szPayload;
  6240. msg.payloadlen = (int)strlen(szPayload);
  6241. response =
  6242. MQTTClient_publishMessage5(m->s_paho_client,szTopic,&msg,&token);
  6243. if(response.reasonCode != MQTTCLIENT_SUCCESS)
  6244. {
  6245. syslog(LOG_INFO,"%s, Failed to publish message: error msg : %s\n",
  6246. __func__,MQTTClient_strerror(response.reasonCode));
  6247. goto leave;
  6248. }
  6249. rc = MQTTClient_waitForCompletion(m->s_paho_client,token,100000L);
  6250. if(rc != MQTTCLIENT_SUCCESS)
  6251. {
  6252. syslog(LOG_INFO,
  6253. "%s, MQTTClient_waitForCompletion Failed, error msg : %s\n",
  6254. __func__,MQTTClient_strerror(rc));
  6255. goto leave;
  6256. }
  6257. else
  6258. {
  6259. // syslog(LOG_INFO, "%s, Published message: topic %s, payload %s\n",
  6260. // __func__,
  6261. // szTopic, szPayload);
  6262. }
  6263. leave:
  6264. MQTTResponse_free(response);
  6265. }
  6266. static void* thrd_mqtt4(void* param)
  6267. {
  6268. int i,j;
  6269. struct Dtsd1352_t* gm = &APPL.GateMeter;
  6270. struct Dtsd1352_t* tm = &APPL.TransMeter;
  6271. // struct Dtsd1352_t* pm = &APPL.PvMeter;
  6272. struct Dtsd1352_t* cm = &APPL.CtnMeter;
  6273. struct Settings_t* set = &APPL.Set.s;
  6274. struct Ctl_t* ctl = &APPL.Ctl;
  6275. struct GaoteBms_t* bms = &APPL.GaoteBms;
  6276. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  6277. struct FireAlarm_t* fa = NULL;
  6278. struct Adl200_t* auxm = &APPL.Adl200;
  6279. struct Co_t* co = &APPL.Co;
  6280. struct Dehumi_t* dh = &APPL.Dehumi;
  6281. struct Dido_t* dido = &APPL.Dido;
  6282. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  6283. int ReconnChk = 0;
  6284. char buf[8196];
  6285. char msg[8196];
  6286. char kv[8196];
  6287. struct chanmqtt_t* m = &APPL.chanmqtt[4];
  6288. double avgcellv;
  6289. mqtt4_connect();
  6290. while(1)
  6291. {
  6292. if(++ReconnChk > 10)
  6293. {
  6294. ReconnChk = 0;
  6295. if(m->bConnected == 0)
  6296. {
  6297. mqtt4_connect();
  6298. }
  6299. }
  6300. if(m->Cmd == CMD_MQTT_REGISTER)
  6301. {
  6302. m->Cmd = CMD_MQTT_DONE;
  6303. // // Register STA
  6304. // sprintf(msg,
  6305. // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":0,\"idx\":1}]}",
  6306. // set->szCloudUserName, (long long)time(NULL)*1000, set->szSN);
  6307. // pub_opts.message = mg_str(msg);
  6308. // pub_opts.qos = m->s_qos, pub_opts.retain = false;
  6309. // pub_opts.topic = mg_str("register");
  6310. // mg_mqtt_pub(m->s_conn, &pub_opts);
  6311. // m->TotalSendCnt++;
  6312. // Register CTN
  6313. sprintf(msg,
  6314. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6315. "id\":\"%s\",\"type\":1,\"idx\":1}]}",
  6316. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN);
  6317. mqtt4_pub("register",msg);
  6318. m->TotalSendCnt++;
  6319. // Register PCS
  6320. sprintf(msg,
  6321. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6322. "id\":\"%s-PCS\",\"pid\":\"%s\",\"type\":2,\"idx\":1}]}",
  6323. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  6324. set->szSN);
  6325. mqtt4_pub("register",msg);
  6326. m->TotalSendCnt++;
  6327. // Register BMS
  6328. sprintf(msg,
  6329. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6330. "id\":\"%s-BMS\",\"pid\":\"%s\",\"type\":3,\"idx\":1}]}",
  6331. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  6332. set->szSN);
  6333. mqtt4_pub("register",msg);
  6334. m->TotalSendCnt++;
  6335. // Register AC
  6336. sprintf(msg,
  6337. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6338. "id\":\"%s-AC\",\"pid\":\"%s\",\"type\":4,\"idx\":1}]}",
  6339. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  6340. set->szSN);
  6341. mqtt4_pub("register",msg);
  6342. m->TotalSendCnt++;
  6343. // Register FA, FireAlarm
  6344. for(i = 1; i <= 5; i++)
  6345. {
  6346. sprintf(msg,
  6347. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6348. "id\":\"%s-FA%d\",\"pid\":\"%s\",\"type\":14,\"idx\":1}]}",
  6349. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  6350. i,set->szSN);
  6351. mqtt4_pub("register",msg);
  6352. m->TotalSendCnt++;
  6353. }
  6354. // Register AM, Aux Meter
  6355. sprintf(msg,
  6356. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6357. "id\":\"%s-AM\",\"pid\":\"%s\",\"type\":10,\"idx\":1}]}",
  6358. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  6359. set->szSN);
  6360. mqtt4_pub("register",msg);
  6361. m->TotalSendCnt++;
  6362. // Register CO, Co Sensor
  6363. sprintf(msg,
  6364. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6365. "id\":\"%s-CO\",\"pid\":\"%s\",\"type\":8,\"idx\":1}]}",
  6366. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  6367. set->szSN);
  6368. mqtt4_pub("register",msg);
  6369. m->TotalSendCnt++;
  6370. // Register DH, Dehumi
  6371. sprintf(msg,
  6372. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6373. "id\":\"%s-DH\",\"pid\":\"%s\",\"type\":7,\"idx\":1}]}",
  6374. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  6375. set->szSN);
  6376. mqtt4_pub("register",msg);
  6377. m->TotalSendCnt++;
  6378. // Register DIDO
  6379. sprintf(msg,
  6380. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
  6381. "id\":\"%s-DIDO\",\"pid\":\"%s\",\"type\":9,\"idx\":1}]}",
  6382. set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
  6383. set->szSN);
  6384. mqtt4_pub("register",msg);
  6385. m->TotalSendCnt++;
  6386. }
  6387. avgcellv = bms->AvgCellV;
  6388. // ******************************************
  6389. // Upload Fast Data
  6390. // ******************************************
  6391. if(mg_millis() - m->LastFastUpload > set->UploadHighSpeed)
  6392. {
  6393. m->LastFastUpload = mg_millis();
  6394. if(m->bConnected)
  6395. {
  6396. // CTN
  6397. kv[0] = 0;
  6398. sprintf(buf,
  6399. "\"device_id\":\"%s\",\"type\":1,\"state\":%d,\"err\":\"%s\",",
  6400. set->szSN,ctl->State,ctl->szErr);
  6401. strcat(kv,buf);
  6402. if(pcs->CommState == ST_COMM_NORM)
  6403. {
  6404. sprintf(buf,"\"ap\":%d,",ctl->Ap);
  6405. strcat(kv,buf);
  6406. }
  6407. if(bms->CommState == ST_COMM_NORM)
  6408. {
  6409. sprintf(buf,"\"soc\":%.4f,",bms->Soc);
  6410. strcat(kv,buf);
  6411. }
  6412. if(bms->CommState == ST_COMM_NORM)
  6413. {
  6414. sprintf(buf,"\"soh\":%.4f,",bms->Soh);
  6415. strcat(kv,buf);
  6416. }
  6417. strcat(kv,"\"end\":0");
  6418. sprintf(msg,
  6419. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6420. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6421. mqtt4_pub(m->szs_pub_topic,msg);
  6422. m->TotalSendCnt++;
  6423. // PCS
  6424. kv[0] = 0;
  6425. sprintf(buf,"\"device_id\":\"%s-PCS\",\"type\":2,",set->szSN);
  6426. strcat(kv,buf);
  6427. if(pcs->CommState == ST_COMM_NORM)
  6428. {
  6429. sprintf(buf,
  6430. "\"ap\":%.1f,\"aps\":%.1f,\"rap\":%.1f,\"dcv\":%.1f,\"dcc\":%"
  6431. ".1f,\"errstat\":%d,\"runstat\":%d,",
  6432. pcs->Ap,pcs->Aps,pcs->Rap,pcs->BatV,pcs->BatC,
  6433. pcs->ErrState,pcs->WorkState);
  6434. strcat(kv,buf);
  6435. }
  6436. strcat(kv,"\"end\":0");
  6437. sprintf(msg,
  6438. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6439. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6440. mqtt4_pub(m->szs_pub_topic,msg);
  6441. m->TotalSendCnt++;
  6442. // BMS
  6443. kv[0] = 0;
  6444. if(bms->CommState == ST_COMM_NORM)
  6445. {
  6446. sprintf(buf,"\"device_id\":\"%s-BMS\",\"type\":3,",set->szSN);
  6447. strcat(kv,buf);
  6448. sprintf(buf,
  6449. "\"hv\":%d,\"v\":%.1f,\"c\":%.1f,\"cell_max_v\":%.3f,\"cell_"
  6450. "ave_v\":%.3f,\"cell_min_v\":%.3f,",
  6451. bms->HvState,bms->BatV,bms->BatI,bms->MaxCellV,
  6452. bms->AvgCellV,bms->MinCellV);
  6453. strcat(kv,buf);
  6454. if(avgcellv < 3.0 || avgcellv > 3.45)
  6455. {
  6456. for(i = 1; i <= PACK_NBR; i++)
  6457. {
  6458. for(j = 1; j <= PACK_CELL_NBR; j++)
  6459. {
  6460. sprintf(buf,"\"p%d_v%d\":%.3f,",i,j,bms->CellVolt[i][j]);
  6461. strcat(kv,buf);
  6462. }
  6463. }
  6464. }
  6465. }
  6466. strcat(kv,"\"end\":0");
  6467. sprintf(msg,
  6468. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6469. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6470. mqtt4_pub(m->szs_pub_topic,msg);
  6471. m->TotalSendCnt++;
  6472. }
  6473. }
  6474. // ******************************************
  6475. // Upload Medium Data
  6476. // ******************************************
  6477. if(mg_millis() - m->LastMediumUpload > set->UploadMediumSpeed)
  6478. {
  6479. m->LastMediumUpload = mg_millis();
  6480. if(m->bConnected)
  6481. {
  6482. // PCS
  6483. kv[0] = 0;
  6484. if(pcs->CommState == ST_COMM_NORM)
  6485. {
  6486. sprintf(buf,"\"device_id\":\"%s-PCS\",\"type\":2,",set->szSN);
  6487. strcat(kv,buf);
  6488. sprintf(buf,
  6489. "\"t_igbt\":%.1f,\"t_env\":%.1f,\"uab\":%.1f,\"ubc\":%.1f,"
  6490. "\"uca\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f",
  6491. pcs->Tigbt,pcs->Tenv,pcs->Uab,pcs->Ubc,pcs->Uca,pcs->Ia,
  6492. pcs->Ib,pcs->Ic);
  6493. strcat(kv,buf);
  6494. }
  6495. sprintf(msg,
  6496. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6497. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6498. mqtt4_pub(m->szs_pub_topic,msg);
  6499. m->TotalSendCnt++;
  6500. // BMS
  6501. kv[0] = 0;
  6502. if(bms->CommState == ST_COMM_NORM)
  6503. {
  6504. sprintf(buf,"\"device_id\":\"%s-BMS\",\"type\":3,",set->szSN);
  6505. strcat(kv,buf);
  6506. sprintf(
  6507. buf,
  6508. "\"cell_max_t\":%.1f,\"cell_ave_t\":%.1f,\"cell_min_t\":%.1f,\"soc\":%.3f,\"soh\":%.3f,\
  6509. \"cell_v_diff\":%.3f,\"cell_t_diff\":%.3f,\"cell_max_v_index\":%d,\"cell_min_v_index\":%d,\"cell_max_t_index\":%d,\"cell_min_t_index\":%d,\
  6510. \"pos_ins\":%.0f,\"neg_ins\":%.0f,",
  6511. bms->MaxCellT,bms->AvgCellT,bms->MinCellT,bms->Soc,bms->Soh,
  6512. bms->CellVDiff,bms->CellTDiff,bms->MaxCellVIdx,
  6513. bms->MinCellVIdx,bms->MaxCellTIdx,bms->MinCellTIdx,bms->PosRes,
  6514. bms->NegRes);
  6515. strcat(kv,buf);
  6516. if(avgcellv >= 3.0 && avgcellv <= 3.45)
  6517. {
  6518. for(i = 1; i <= PACK_NBR; i++)
  6519. {
  6520. for(j = 1; j <= PACK_CELL_NBR; j++)
  6521. {
  6522. sprintf(buf,"\"p%d_v%d\":%.3f,",i,j,bms->CellVolt[i][j]);
  6523. strcat(kv,buf);
  6524. }
  6525. }
  6526. }
  6527. for(i = 1; i <= PACK_NBR; i++)
  6528. {
  6529. for(j = 1; j <= PACK_CELL_NBR; j++)
  6530. {
  6531. sprintf(buf,"\"p%d_t%d\":%.1f,",i,j,bms->CellTemp[i][j]);
  6532. strcat(kv,buf);
  6533. }
  6534. }
  6535. strcat(kv,"\"end\":0");
  6536. sprintf(msg,
  6537. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6538. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6539. mqtt4_pub(m->szs_pub_topic,msg);
  6540. m->TotalSendCnt++;
  6541. }
  6542. // AC
  6543. kv[0] = 0;
  6544. if(ac->CommState == ST_COMM_NORM)
  6545. {
  6546. sprintf(buf,"\"device_id\":\"%s-AC\",\"type\":4,",set->szSN);
  6547. strcat(kv,buf);
  6548. sprintf(buf,
  6549. "\"work_mode\":%d,\"outwater_t\":%d,\"rtnwater_t\":%d,"
  6550. "\"outwater_pre\":%.1f,\"rtnwater_pre\":%.1f,\"err_code\":%d,"
  6551. "\"err_level\":%d",
  6552. ac->WorkMode,ac->OutWaterTemp,ac->InWaterTemp,
  6553. ac->OutWaterPre,ac->InWaterPre,ac->ErrCode,ac->ErrLevel);
  6554. strcat(kv,buf);
  6555. }
  6556. sprintf(msg,
  6557. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6558. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6559. mqtt4_pub(m->szs_pub_topic,msg);
  6560. m->TotalSendCnt++;
  6561. }
  6562. }
  6563. // ******************************************
  6564. // Upload SLow Data
  6565. // ******************************************
  6566. if(mg_millis() - m->LastSlowUpload > set->UploadSlowSpeed)
  6567. {
  6568. m->LastSlowUpload = mg_millis();
  6569. if(m->bConnected)
  6570. {
  6571. // FA
  6572. for(i = 1; i <= 5; i++)
  6573. {
  6574. fa = &APPL.Fa[i];
  6575. kv[0] = 0;
  6576. if(fa->CommState == ST_COMM_NORM)
  6577. {
  6578. sprintf(buf,"\"device_id\":\"%s-FA%d\",\"type\":14,",set->szSN,
  6579. i);
  6580. strcat(kv,buf);
  6581. sprintf(buf,
  6582. "\"T1\":%d,\"T2\":%d,\"Co\":%d,\"Voc\":%d,\"SmokeFlag\":%d,"
  6583. "\"Level\":%d,\"ErrCode\":%d",
  6584. fa->T1,fa->T2,fa->Co,fa->Voc,fa->SmokeFlagVal,
  6585. fa->LevelVal,fa->ErrCodeVal);
  6586. strcat(kv,buf);
  6587. sprintf(
  6588. msg,
  6589. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6590. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6591. mqtt4_pub(m->szs_pub_topic,msg);
  6592. m->TotalSendCnt++;
  6593. }
  6594. }
  6595. // AM
  6596. if(auxm->CommState == ST_COMM_NORM)
  6597. {
  6598. kv[0] = 0;
  6599. sprintf(buf,"\"device_id\":\"%s-AM\",\"type\":10,",set->szSN);
  6600. strcat(kv,buf);
  6601. sprintf(buf,"\"pos_ae\":%.1f,\"neg_ae\":%.1f,\"ap\":%.1f",
  6602. auxm->PosAe,auxm->NegAe,auxm->Ap);
  6603. strcat(kv,buf);
  6604. sprintf(msg,
  6605. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6606. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6607. mqtt4_pub(m->szs_pub_topic,msg);
  6608. m->TotalSendCnt++;
  6609. }
  6610. // // CO
  6611. // if(co->CommState == ST_COMM_NORM){
  6612. // kv[0] = 0;
  6613. // sprintf(buf,"\"device_id\":\"%s-CO\",\"type\":8,", set->szSN);
  6614. // strcat(kv,buf);
  6615. // sprintf(buf,"\"Density\":%u,", co->Density);
  6616. // strcat(kv,buf);
  6617. // sprintf(msg,
  6618. // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6619. // set->szCloudUserName, (long long)time(NULL)*1000, kv);
  6620. // pub_opts.message = mg_str(msg);
  6621. // pub_opts.qos = m->s_qos, pub_opts.retain = false;
  6622. // pub_opts.topic = pubt;
  6623. // mg_mqtt_pub(m->s_conn, &pub_opts);
  6624. // m->TotalSendCnt++;
  6625. // }
  6626. // DH
  6627. if(dh->CommState)
  6628. {
  6629. kv[0] = 0;
  6630. sprintf(buf,"\"device_id\":\"%s-DH\",\"type\":7,",set->szSN);
  6631. strcat(kv,buf);
  6632. sprintf(buf,"\"temp\":%.1f,\"humi\":%.1f,\"heat_state\":%d, \"work_state\":%d,",dh->Temp,dh->Humi,dh->HeatState,dh->WorkState);
  6633. strcat(kv,buf);
  6634. sprintf(msg,
  6635. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6636. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6637. mqtt4_pub(m->szs_pub_topic,msg);
  6638. m->TotalSendCnt++;
  6639. }
  6640. // DIDO
  6641. kv[0] = 0;
  6642. sprintf(buf,"\"device_id\":\"%s-DIDO\",\"type\":9,",set->szSN);
  6643. strcat(kv,buf);
  6644. sprintf(buf,
  6645. "\"WaterDec1\":%d,\"WaterDec2\":%d,\"FrontDoor\":%d,"
  6646. "\"BackDoor\":%d,\"EmgStop\":%d,\"FeEruptFb\":%d",
  6647. dido->WaterDec1,dido->WaterDec2,dido->FrontDoor,
  6648. dido->BackDoor,dido->EmgStop,dido->FeEruptFb);
  6649. strcat(kv,buf);
  6650. sprintf(msg,
  6651. "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
  6652. set->szCloudUserName,(long long)time(NULL) * 1000,kv);
  6653. mqtt4_pub(m->szs_pub_topic,msg);
  6654. m->TotalSendCnt++;
  6655. }
  6656. }
  6657. if(mg_millis() - gm->LastUpdate > 15000)
  6658. {
  6659. gm->CommState = ST_COMM_ERR;
  6660. strcpy(gm->szCommState,"故障");
  6661. }
  6662. else
  6663. {
  6664. gm->CommState = ST_COMM_NORM;
  6665. strcpy(gm->szCommState,"正常");
  6666. }
  6667. if(mg_millis() - tm->LastUpdate > 15000)
  6668. {
  6669. tm->CommState = ST_COMM_ERR;
  6670. strcpy(tm->szCommState,"故障");
  6671. }
  6672. else
  6673. {
  6674. tm->CommState = ST_COMM_NORM;
  6675. strcpy(tm->szCommState,"正常");
  6676. }
  6677. if(mg_millis() - cm->LastUpdate > 15000)
  6678. {
  6679. cm->CommState = ST_COMM_ERR;
  6680. strcpy(cm->szCommState,"故障");
  6681. }
  6682. else
  6683. {
  6684. cm->CommState = ST_COMM_NORM;
  6685. strcpy(cm->szCommState,"正常");
  6686. }
  6687. // if( mg_millis() - pm->LastUpdate > 15000){
  6688. // pm->CommState = ST_COMM_ERR;
  6689. // strcpy(pm->szCommState,"故障");
  6690. // }else{
  6691. // pm->CommState = ST_COMM_NORM;
  6692. // strcpy(pm->szCommState,"正常");
  6693. // }
  6694. // sleep(1);
  6695. //}
  6696. }
  6697. }
  6698. void appl_snap_set_err(void)
  6699. {
  6700. APPL.Snap.bErr = 1;
  6701. strcpy(APPL.Snap.szState,"故障");
  6702. }
  6703. void appl_snap_reset_err(void)
  6704. {
  6705. APPL.Snap.bErr = 0;
  6706. strcpy(APPL.Snap.szState,"正常");
  6707. }
  6708. static int appl_snap_day_diff(int year_start,int month_start,int day_start,
  6709. int year_end,int month_end,int day_end)
  6710. {
  6711. int y2,m2,d2;
  6712. int y1,m1,d1;
  6713. m1 = (month_start + 9) % 12;
  6714. y1 = year_start - m1 / 10;
  6715. d1 = 365 * y1 + y1 / 4 - y1 / 100 + y1 / 400 + (m1 * 306 + 5) / 10 +
  6716. (day_start - 1);
  6717. m2 = (month_end + 9) % 12;
  6718. y2 = year_end - m2 / 10;
  6719. d2 = 365 * y2 + y2 / 4 - y2 / 100 + y2 / 400 + (m2 * 306 + 5) / 10 +
  6720. (day_end - 1);
  6721. return (d2 - d1);
  6722. }
  6723. int appl_snap_rmdir(const char* path)
  6724. {
  6725. DIR* d = opendir(path);
  6726. size_t path_len = strlen(path);
  6727. int r = -1;
  6728. if(d)
  6729. {
  6730. struct dirent* p;
  6731. r = 0;
  6732. while(!r && (p = readdir(d)))
  6733. {
  6734. int r2 = -1;
  6735. char* buf;
  6736. size_t len;
  6737. /* Skip the names "." and ".." as we don't want to recurse on them. */
  6738. if(!strcmp(p->d_name,".") || !strcmp(p->d_name,"..")) continue;
  6739. len = path_len + strlen(p->d_name) + 2;
  6740. buf = malloc(len);
  6741. if(buf)
  6742. {
  6743. struct stat statbuf;
  6744. snprintf(buf,len,"%s/%s",path,p->d_name);
  6745. if(!stat(buf,&statbuf))
  6746. {
  6747. if(S_ISDIR(statbuf.st_mode))
  6748. r2 = appl_snap_rmdir(buf);
  6749. else
  6750. r2 = unlink(buf);
  6751. }
  6752. free(buf);
  6753. }
  6754. r = r2;
  6755. }
  6756. closedir(d);
  6757. }
  6758. if(!r) r = rmdir(path);
  6759. return r;
  6760. }
  6761. static void* thrd_snap(void* param)
  6762. {
  6763. struct Settings_t* set = &APPL.Set.s;
  6764. struct Snap_t* s = &APPL.Snap;
  6765. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  6766. struct GaoteBms_t* bms = &APPL.GaoteBms;
  6767. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  6768. struct Ctl_t* ctl = &APPL.Ctl;
  6769. struct Dtsd1352_t* cm = &APPL.CtnMeter[set->CtnMeterId];
  6770. struct Dtsd1352_t* tm = &APPL.TransMeter;
  6771. struct Dtsd1352_t* gm = &APPL.GateMeter;
  6772. struct Adl200_t* aum = &APPL.Adl200;
  6773. struct FireAlarm_t* fa = NULL;
  6774. struct Dido_t* dido = &APPL.Dido;
  6775. char buf[128];
  6776. char szfn[128];
  6777. int y,m,d,h,min,ss; // current
  6778. int yy,mm,dd; // dir
  6779. int diff_day;
  6780. int rc;
  6781. DIR* dir;
  6782. struct dirent* ptr;
  6783. char szyy[8];
  6784. char szmm[8];
  6785. char szdd[8];
  6786. int i,j;
  6787. sleep(5);
  6788. syslog(LOG_INFO,"%s, ++",__func__);
  6789. while(1)
  6790. {
  6791. usleep(300000);
  6792. if(s->bErr || set->bErr)
  6793. {
  6794. continue;
  6795. }
  6796. if(s->bStart == 0)
  6797. {
  6798. appl_get_datetime_num(&y,&m,&d,&h,&min,&ss);
  6799. // 建立与序列号对应的文件夹
  6800. sprintf(buf,"./snap_%s",set->szSN);
  6801. if(access(buf,NULL) != 0)
  6802. { // directory does not exists
  6803. if(mkdir(buf,0755) < 0)
  6804. {
  6805. s->bErr = 1;
  6806. continue;
  6807. }
  6808. }
  6809. // 建立与日期对应的文件夹
  6810. sprintf(s->szcurrDatePath,"./snap_%s/%04d-%02d-%02d",set->szSN,y,m,
  6811. d);
  6812. if(access(s->szcurrDatePath,NULL) != 0)
  6813. { // directory does not exists
  6814. if(mkdir(s->szcurrDatePath,0755) < 0)
  6815. {
  6816. s->bErr = 1;
  6817. continue;
  6818. }
  6819. }
  6820. // PCS Snap Start
  6821. sprintf(szfn,"%s/PCS_%04d-%02d-%02d %02d-%02d-%02d.csv",
  6822. s->szcurrDatePath,y,m,d,h,min,ss);
  6823. s->fpcs = fopen(szfn,"w+");
  6824. if(s->fpcs == NULL)
  6825. {
  6826. s->bErr = 1;
  6827. continue;
  6828. }
  6829. else
  6830. {
  6831. rc = fprintf(
  6832. s->fpcs,
  6833. "ts,Uab,Ubc,Uca,Ia,Ib,Ic,Ap,Rap,BatV,BatC,Tigbt,Tenv,Tind,WorkState,ErrState,Aps,TotalBusVolt,CommState,\
  6834. HwFault1,HwFault2,GridFault,BusFault,AcCapFault,SysFault,OnOffFault,OtherFault\n");
  6835. if(rc < 0)
  6836. {
  6837. s->bErr = 1;
  6838. continue;
  6839. }
  6840. }
  6841. // BMS Snap Start
  6842. sprintf(szfn,"%s/BMS_%04d-%02d-%02d %02d-%02d-%02d.csv",
  6843. s->szcurrDatePath,y,m,d,h,min,ss);
  6844. s->fbms = fopen(szfn,"w+");
  6845. if(s->fbms == NULL)
  6846. {
  6847. s->bErr = 1;
  6848. continue;
  6849. }
  6850. else
  6851. {
  6852. rc = fprintf(s->fbms,
  6853. "ts,CommState,BatV,BatI,Soc,Soh,BatState,PosRes,NegRes,\
  6854. MaxCellV,AvgCellV,MinCellV,MaxCellT,AvgCellT,MinCellT,\
  6855. CellVDiff,CellTDiff,\
  6856. HvState,MaxCellVIdx,MinCellVIdx,MaxCellTIdx,MinCellTIdx,\
  6857. MaxChgCurr,MaxDhgCurr\n");
  6858. if(rc < 0)
  6859. {
  6860. s->bErr = 1;
  6861. continue;
  6862. }
  6863. }
  6864. // PACK Snap Start
  6865. for(i = 1; i <= PACK_NBR; i++)
  6866. {
  6867. sprintf(szfn,"%s/PACK%d_%04d-%02d-%02d %02d-%02d-%02d.csv",
  6868. s->szcurrDatePath,i,y,m,d,h,min,ss);
  6869. s->fpack[i] = fopen(szfn,"w+");
  6870. if(s->fpack[i] == NULL)
  6871. {
  6872. s->bErr = 1;
  6873. continue;
  6874. }
  6875. else
  6876. {
  6877. rc = fprintf(s->fpack[i],"ts,");
  6878. if(rc < 0)
  6879. {
  6880. s->bErr = 1;
  6881. continue;
  6882. }
  6883. for(j = 1; j <= PACK_CELL_NBR; j++)
  6884. {
  6885. rc = fprintf(s->fpack[i],"v%d,",j);
  6886. if(rc < 0)
  6887. {
  6888. s->bErr = 1;
  6889. continue;
  6890. }
  6891. }
  6892. for(j = 1; j <= PACK_CELL_NBR; j++)
  6893. {
  6894. rc = fprintf(s->fpack[i],"t%d,",j);
  6895. if(rc < 0)
  6896. {
  6897. s->bErr = 1;
  6898. continue;
  6899. }
  6900. }
  6901. rc = fprintf(s->fpack[i],"CommState\n");
  6902. if(rc < 0)
  6903. {
  6904. s->bErr = 1;
  6905. continue;
  6906. }
  6907. }
  6908. }
  6909. // FireAlarm Snap Start
  6910. sprintf(szfn,"%s/FA_%04d-%02d-%02d %02d-%02d-%02d.csv",
  6911. s->szcurrDatePath,y,m,d,h,min,ss);
  6912. s->ffa = fopen(szfn,"w+");
  6913. if(s->ffa == NULL)
  6914. {
  6915. s->bErr = 1;
  6916. continue;
  6917. }
  6918. else
  6919. {
  6920. rc = fprintf(s->ffa,"ts,");
  6921. for(i = 1; i <= PACK_NBR; i++)
  6922. {
  6923. fprintf(s->ffa,
  6924. "Fa%d_CommState,Fa%d_t1,Fa%d_t2,Fa%d_co,Fa%d_voc,Fa%d_"
  6925. "ErrCode,Fa%d_SmokeFlag,Fa%d_Level,",
  6926. i,i,i,i,i,i,i,i);
  6927. }
  6928. fprintf(s->ffa,"dummy\n");
  6929. }
  6930. // AC Snap Start
  6931. sprintf(szfn,"%s/AC_%04d-%02d-%02d %02d-%02d-%02d.csv",
  6932. s->szcurrDatePath,y,m,d,h,min,ss);
  6933. s->fac = fopen(szfn,"w+");
  6934. if(s->fac == NULL)
  6935. {
  6936. s->bErr = 1;
  6937. continue;
  6938. }
  6939. else
  6940. {
  6941. rc = fprintf(s->fac,
  6942. "ts,SetTemp,SetMode,CoolTemp,CoolGap,HeatTemp,HeatGap,\
  6943. WorkMode,OutWaterTemp,InWaterTemp,OutWaterPre,InWaterPre,\
  6944. EnvTemp,ErrCode,ErrLevel,\
  6945. CompState,CompHeatStripState,ElecHeatState,PumpState,\
  6946. Fan1State,Fan2State,Fan3State,CompRpm,PumpRpm,\
  6947. CommState,CtlMode\n");
  6948. if(rc < 0)
  6949. {
  6950. s->bErr = 1;
  6951. continue;
  6952. }
  6953. }
  6954. // **************************
  6955. // CTL Snap Start
  6956. // **************************
  6957. sprintf(szfn,"%s/CTL_%04d-%02d-%02d %02d-%02d-%02d.csv",
  6958. s->szcurrDatePath,y,m,d,h,min,ss);
  6959. s->fctl = fopen(szfn,"w+");
  6960. if(s->fctl == NULL)
  6961. {
  6962. s->bErr = 1;
  6963. continue;
  6964. }
  6965. else
  6966. {
  6967. rc = fprintf(s->fctl,
  6968. "ts,State,Step,WorkMode,Err,Cmd,bChgAble,bDhgAble,\
  6969. Ap,GmAp,TransAp,CtnMeterAp,ChgGateLim,ChgTransLim,DhgGateLim,DhgTransLim\n");
  6970. if(rc < 0)
  6971. {
  6972. s->bErr = 1;
  6973. continue;
  6974. }
  6975. }
  6976. // MISC Snap Start
  6977. sprintf(szfn,"%s/MISC_%04d-%02d-%02d %02d-%02d-%02d.csv",
  6978. s->szcurrDatePath,y,m,d,h,min,ss);
  6979. s->fmisc = fopen(szfn,"w+");
  6980. if(s->fmisc == NULL)
  6981. {
  6982. s->bErr = 1;
  6983. continue;
  6984. }
  6985. else
  6986. {
  6987. rc = fprintf(s->fmisc,
  6988. "ts,GmAp,TmAp,\
  6989. AuxmAp,AuxmPosAe,AuxmNegAe,AuxmCommState,\
  6990. DhTemp,DhHumi,DhCommState,\
  6991. CoDensity,CoFlag,CoCommState,\
  6992. DidoWaterDec1,DidoWaterDec2,DidoEmgStop,DidoFrontDoor,DidoBackDoor,FeEruptFb,DidoLedMode\n");
  6993. if(rc < 0)
  6994. {
  6995. s->bErr = 1;
  6996. continue;
  6997. }
  6998. }
  6999. s->LastSnap = 0;
  7000. s->bStart = 1;
  7001. }
  7002. else
  7003. {
  7004. if(mg_millis() - s->LastSnap > 5000)
  7005. { /* snap every 5 seconds */
  7006. s->LastSnap = mg_millis();
  7007. appl_get_datetime_num(&y,&m,&d,&h,&min,&ss);
  7008. sprintf(buf,"./snap_%s/%04d-%02d-%02d",set->szSN,y,m,d);
  7009. if(strcmp(buf,s->szcurrDatePath) != 0)
  7010. { /* New Date or New SN*/
  7011. // syslog(LOG_INFO,"%s, New Date Or New SN, Detected", __func__);
  7012. if(s->fpcs != NULL)
  7013. {
  7014. fclose(s->fpcs);
  7015. s->fpcs = NULL;
  7016. }
  7017. // syslog(LOG_INFO,"%s, pcs Closed", __func__);
  7018. if(s->fbms != NULL)
  7019. {
  7020. fclose(s->fbms);
  7021. s->fbms = NULL;
  7022. }
  7023. // syslog(LOG_INFO,"%s, bms Closed", __func__);
  7024. for(i = 1; i <= PACK_NBR; i++)
  7025. {
  7026. if(s->fpack[i] != NULL)
  7027. {
  7028. fclose(s->fpack[i]);
  7029. s->fpack[i] = NULL;
  7030. }
  7031. }
  7032. // syslog(LOG_INFO,"%s, pack Closed", __func__);
  7033. if(s->ffa != NULL)
  7034. {
  7035. fclose(s->ffa);
  7036. s->ffa = NULL;
  7037. }
  7038. // syslog(LOG_INFO,"%s, ffa Closed", __func__);
  7039. if(s->fac != NULL)
  7040. {
  7041. fclose(s->fac);
  7042. s->fac = NULL;
  7043. }
  7044. // syslog(LOG_INFO,"%s, ac Closed", __func__);
  7045. if(s->fctl != NULL)
  7046. {
  7047. fclose(s->fctl);
  7048. s->fctl = NULL;
  7049. }
  7050. // syslog(LOG_INFO,"%s, ctl Closed", __func__);
  7051. if(s->fmisc != NULL)
  7052. {
  7053. fclose(s->fmisc);
  7054. s->fmisc = NULL;
  7055. }
  7056. // syslog(LOG_INFO,"%s, misc Done", __func__);
  7057. // del outofdate dir
  7058. sprintf(buf,"./snap_%s",set->szSN);
  7059. if((dir = opendir(buf)) == NULL)
  7060. {
  7061. // s->bErr = 1;
  7062. // syslog(LOG_INFO,"%s, opendir : %s to del Fail, Maybe New SN",
  7063. // __func__, buf); continue; // Maybe New SN
  7064. }
  7065. else
  7066. {
  7067. // syslog(LOG_INFO,"%s, Begin To Del Outofdate File", __func__);
  7068. while((ptr = readdir(dir)) != NULL)
  7069. {
  7070. if(strcmp(ptr->d_name,".") == 0 ||
  7071. strcmp(ptr->d_name,"..") ==
  7072. 0)
  7073. { /// current dir OR parrent dir
  7074. continue;
  7075. }
  7076. else if(ptr->d_type == 8)
  7077. { /// file
  7078. }
  7079. else if(ptr->d_type == 10)
  7080. { /// link file
  7081. // printf("d_name:%s/%s\n",basePath,ptr->d_name);
  7082. }
  7083. else if(ptr->d_type == 4)
  7084. { /// dir
  7085. if(strlen(ptr->d_name) == 10 && ptr->d_name[4] == '-' &&
  7086. ptr->d_name[7] == '-')
  7087. { // target dir
  7088. // syslog(LOG_INFO,"%s, Target Dir:%s Detedted", __func__,
  7089. // ptr->d_name);
  7090. strncpy(szyy,ptr->d_name,4);
  7091. strncpy(szmm,ptr->d_name + 5,2);
  7092. strncpy(szdd,ptr->d_name + 8,2);
  7093. yy = atoi(szyy);
  7094. mm = atoi(szmm);
  7095. dd = atoi(szdd);
  7096. diff_day = appl_snap_day_diff(yy,mm,dd,y,m,d);
  7097. if(diff_day > set->DataKeepDay)
  7098. {
  7099. sprintf(buf,"./snap_%s/%s",set->szSN,ptr->d_name);
  7100. rc = appl_snap_rmdir(buf);
  7101. if(rc < 0)
  7102. {
  7103. syslog(LOG_INFO,"%s, Target Dir:%s Del Fail",__func__,
  7104. ptr->d_name);
  7105. s->bErr = 1;
  7106. continue;
  7107. }
  7108. else
  7109. {
  7110. syslog(LOG_INFO,"%s, Target Dir:%s Del Ok",__func__,
  7111. ptr->d_name);
  7112. }
  7113. }
  7114. }
  7115. }
  7116. }
  7117. closedir(dir);
  7118. }
  7119. s->bStart = 0; /* start again at next loop */
  7120. continue;
  7121. }
  7122. else
  7123. {
  7124. s->LastSnap = mg_millis();
  7125. strcpy(buf,appl_get_datetime_short());
  7126. // PCS Snap
  7127. // HwFault1,HwFault2,GridFault,BusFault,AcCapFault,SysFault,OnOffFault,OtherFault
  7128. if(s->fpcs != NULL && pcs->CommState == ST_COMM_NORM)
  7129. {
  7130. fprintf(s->fpcs,
  7131. "%s,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,\
  7132. %.1f,%.1f,%.1f,%.1f,\
  7133. %.1f,%.1f,%.1f,\
  7134. %d,%d,%.1f,%.1f,%d,\
  7135. %u,%u,%u,%u,%u,%u,%u,%u\n",
  7136. buf,pcs->Uab,pcs->Ubc,pcs->Uca,pcs->Ia,pcs->Ib,
  7137. pcs->Ic,pcs->Ap,pcs->Rap,pcs->BatV,pcs->BatC,
  7138. pcs->Tigbt,pcs->Tenv,pcs->Tind,pcs->WorkState,
  7139. pcs->ErrState,pcs->Aps,pcs->TotalBusVolt,pcs->CommState,
  7140. pcs->HwFault1,pcs->HwFault2,pcs->GridFault,pcs->BusFault,
  7141. pcs->AcCapFault,pcs->SysFault,pcs->OnOffFault,
  7142. pcs->OtherFault);
  7143. fflush(s->fpcs);
  7144. }
  7145. // BMS Snap
  7146. if(s->fbms != NULL && bms->CommState == ST_COMM_NORM)
  7147. {
  7148. fprintf(s->fbms,
  7149. "%s,%d,%.1f,%.1f,%.1f,%.1f,%d,%.1f,%.1f,\
  7150. %.3f,%.3f,%.3f,%.1f,%.1f,%.1f,\
  7151. %.1f,%.1f,\
  7152. %d,%d,%d,%d,%d,\
  7153. %.1f,%.1f\n",
  7154. buf,bms->CommState,bms->BatV,bms->BatI,bms->Soc,
  7155. bms->Soh,bms->BatState,bms->PosRes,bms->NegRes,
  7156. bms->MaxCellV,bms->AvgCellV,bms->MinCellV,bms->MaxCellT,
  7157. bms->AvgCellT,bms->MinCellT,bms->CellVDiff,
  7158. bms->CellTDiff,bms->HvState,bms->MaxCellVIdx,
  7159. bms->MinCellVIdx,bms->MaxCellTIdx,bms->MinCellTIdx,
  7160. bms->MaxChgCurr,bms->MaxDhgCurr);
  7161. fflush(s->fbms);
  7162. }
  7163. // PACK Snap
  7164. for(i = 1; i <= PACK_NBR; i++)
  7165. {
  7166. if(s->fpack[i] != NULL && bms->CommState == ST_COMM_NORM)
  7167. {
  7168. fprintf(s->fpack[i],"%s,",buf);
  7169. for(j = 1; j <= PACK_CELL_NBR; j++)
  7170. {
  7171. fprintf(s->fpack[i],"%f,",bms->CellVolt[i][j]);
  7172. }
  7173. for(j = 1; j <= PACK_CELL_NBR; j++)
  7174. {
  7175. fprintf(s->fpack[i],"%f,",bms->CellTemp[i][j]);
  7176. }
  7177. fprintf(s->fpack[i],"%d\n",bms->CommState);
  7178. }
  7179. }
  7180. // FireAlarm Snap
  7181. if(s->ffa != NULL)
  7182. {
  7183. fprintf(s->ffa,"%s,",buf);
  7184. for(i = 1; i <= PACK_NBR; i++)
  7185. {
  7186. fa = &APPL.Fa[i];
  7187. fprintf(s->ffa,"%d,%d,%d,%d,%d,%d,%d,%d,",fa->CommState,fa->T1,
  7188. fa->T2,fa->Co,fa->Voc,fa->ErrCodeVal,fa->SmokeFlagVal,
  7189. fa->LevelVal);
  7190. }
  7191. fprintf(s->ffa,"%d\n",0);
  7192. fflush(s->ffa);
  7193. }
  7194. // AC Snap
  7195. if(s->fac != NULL && ac->CommState == ST_COMM_NORM)
  7196. {
  7197. fprintf(s->fac,
  7198. "%s,%d,%d,%d,%d,%d,%d,\
  7199. %d,%d,%d,%.1f,%.1f,\
  7200. %d,%d,%d,\
  7201. %d,%d,%d,%d,\
  7202. %d,%d,%d,%d,%d,\
  7203. %d,%d\n",
  7204. buf,ac->SetTemp,ac->SetMode,set->CoolTemp,set->CoolGap,
  7205. set->HeatTemp,set->HeatGap,ac->WorkMode,ac->OutWaterTemp,
  7206. ac->InWaterTemp,ac->OutWaterPre,ac->InWaterPre,
  7207. ac->EnvTemp,ac->ErrCode,ac->ErrLevel,ac->CompState,
  7208. ac->CompHeatStripState,ac->ElecHeatState,ac->PumpState,
  7209. ac->Fan1State,ac->Fan2State,ac->Fan3State,ac->CompRpm,
  7210. ac->PumpRpm,ac->CommState,ac->CtlMode);
  7211. fflush(s->fac);
  7212. }
  7213. // Ap,GmAp,TransAp,CtnMeterAp,ChgGateLim,ChgTransLim,DhgGateLim,DhgTransLim
  7214. // CTL Snap
  7215. if(s->fctl != NULL)
  7216. {
  7217. fprintf(s->fctl,
  7218. "%s,%d,%d,%d,%d,%d,%d,%d,\
  7219. %d,%d,%d,%d,%d,%d,%d,%d\n",
  7220. buf,ctl->State,ctl->Step,ctl->WorkMode,ctl->Err,
  7221. ctl->Cmd,ctl->bChgAble,ctl->bDhgAble,ctl->Ap,
  7222. (int)gm->com_active_p,(int)tm->com_active_p,
  7223. (int)APPL.CtnMeter[set->CtnMeterId].com_active_p,
  7224. set->ChgGateLim,set->ChgTransLim,set->DhgGateLim,
  7225. set->DhgTransLim);
  7226. fflush(s->fctl);
  7227. }
  7228. // MISC Snap
  7229. if(s->fmisc != NULL)
  7230. {
  7231. fprintf(s->fmisc,
  7232. "%s,%.1f,%.1f,\
  7233. %.1f,%.1f,%.1f,%d,\
  7234. %.1f,%.1f,%d,\
  7235. %d,%d,%d,\
  7236. %d,%d,%d,%d,%d,%d,%d\n",
  7237. /*1*/ buf,gm->com_active_p,tm->com_active_p,
  7238. /*2*/ aum->Ap,aum->PosAe,aum->NegAe,aum->CommState,
  7239. /*3*/ APPL.Dehumi.Temp,APPL.Dehumi.Humi,
  7240. APPL.Dehumi.CommState,
  7241. /*4*/ APPL.Co.Density,APPL.Co.Flag,APPL.Co.CommState,
  7242. /*5*/ dido->WaterDec1,dido->WaterDec2,dido->EmgStop,
  7243. dido->FrontDoor,dido->BackDoor,dido->FeEruptFb,
  7244. dido->LedMode);
  7245. fflush(s->fmisc);
  7246. }
  7247. }
  7248. }
  7249. }
  7250. }
  7251. syslog(LOG_INFO,"%s, --",__func__);
  7252. }
  7253. void appl_start(void)
  7254. {
  7255. pthread_t hthrd_485_1;
  7256. pthread_t hthrd_485_2;
  7257. pthread_t hthrd_485_3;
  7258. pthread_t hthrd_485_4;
  7259. pthread_t hthrd_can_1;
  7260. pthread_t hthrd_can_2;
  7261. pthread_t hthrd_dido;
  7262. pthread_t hthrd_ctl;
  7263. pthread_t hthrd_mqtt1;
  7264. pthread_t hthrd_mqtt2;
  7265. pthread_t hthrd_mqtt3;
  7266. pthread_t hthrd_mqtt4;
  7267. pthread_t hthrd_snap;
  7268. struct Settings_t* set = &APPL.Set.s;
  7269. struct Ctl_t* ctl = &APPL.Ctl;
  7270. struct chan485_t* c1 = &APPL.chan485[1];
  7271. struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
  7272. struct GaoteBms_t* bms = &APPL.GaoteBms;
  7273. struct Envicool5kW_t* ac = &APPL.Envicool5kW;
  7274. struct chanmqtt_t* m = NULL;
  7275. struct Snap_t* snap = &APPL.Snap;
  7276. char buf[128];
  7277. char buf2[128];
  7278. int len;
  7279. int i;
  7280. syslog(LOG_INFO,"%s, ++",__func__);
  7281. // Set
  7282. if(appl_cfg_read() != 0)
  7283. {
  7284. appl_cfg_set_err();
  7285. syslog(LOG_INFO,"%s, appl_cfg_read fail",__func__);
  7286. // Set Default Settings
  7287. strcpy(set->szSN,"DefaultSN");
  7288. set->ChgCellV = 3.45;
  7289. set->DhgCellV = 3.00;
  7290. set->ChgGateLim = 10000;
  7291. set->DhgGateLim = 200;
  7292. set->ChgTransLim = 2000;
  7293. set->DhgTransLim = -2000;
  7294. set->CtnMeterNbr = 2;
  7295. strcpy(set->szCloudUserName,"6adc9339ae5944ca900e53501e7f1535");
  7296. strcpy(set->szCloudPasswd,"JSXJd!Q#c@");
  7297. strcpy(set->szCloudUrl,"119.45.116.112:18883");
  7298. set->UploadHighSpeed = 5000;
  7299. set->UploadMediumSpeed = 60000;
  7300. set->UploadSlowSpeed = 180000;
  7301. // init AC Cfg
  7302. set->HeatTemp = 15;
  7303. set->HeatGap = 3;
  7304. set->CoolTemp = 23;
  7305. set->CoolGap = 3;
  7306. set->CoolTempSet = 18;
  7307. set->HeatTempSet = 25;
  7308. // init Snap Cfg
  7309. set->DataKeepDay = 7;
  7310. for(i = 0; i <= 31; i++)
  7311. {
  7312. set->pcurv[i] = 35;
  7313. }
  7314. for(i = 32; i <= 43; i++)
  7315. {
  7316. set->pcurv[i] = -70;
  7317. }
  7318. for(i = 44; i <= 67; i++)
  7319. {
  7320. set->pcurv[i] = 45;
  7321. }
  7322. for(i = 68; i <= 87; i++)
  7323. {
  7324. set->pcurv[i] = -70;
  7325. }
  7326. for(i = 88; i <= 95; i++)
  7327. {
  7328. set->pcurv[i] = 0;
  7329. }
  7330. }
  7331. else
  7332. {
  7333. syslog(LOG_INFO,"%s, appl_cfg_read Ok",__func__);
  7334. appl_cfg_reset_err();
  7335. // //1# MQTT thingsboard
  7336. // m = &APPL.chanmqtt[1];
  7337. // m->s_conn = NULL;
  7338. // strcpy(m->szs_url,"124.222.45.156:1883");
  7339. // strcpy(m->szs_pub_topic,"v1/devices/me/telemetry");
  7340. // strcpy(m->szs_sub_topic,"v1/devices/me/ctl");
  7341. // m->s_qos = 1;
  7342. // //测试设备
  7343. // //strcpy(m->szusrname,"gFCNk8oSxC6VlYXkhs3a");
  7344. // strcpy(m->szusrname,"DZHbY2HAGeATfRCfhlW7");
  7345. // m->bConnected = 0;
  7346. // 2# MQTT Cloud
  7347. m = &APPL.chanmqtt[4];
  7348. m->s_conn = NULL;
  7349. strncpy(m->szusrname,set->szCloudUserName,sizeof(m->szusrname) - 1);
  7350. strncpy(m->szpasswd,set->szCloudPasswd,sizeof(m->szpasswd) - 1);
  7351. strncpy(m->szs_url,set->szCloudUrl,sizeof(m->szs_url) - 1);
  7352. strncpy(m->szclientid,set->szClientId,sizeof(m->szclientid) - 1);
  7353. sprintf(m->szs_pub_topic,"sequential/%s",m->szusrname);
  7354. sprintf(m->szs_sub_topic[0],"control");
  7355. sprintf(m->szs_sub_topic[1],"sequential/%s/%s",m->szusrname,"GateMeter");
  7356. sprintf(m->szs_sub_topic[2],"sequential/%s/TransMeter%d",m->szusrname,
  7357. set->TransId);
  7358. for(i = 0; i < set->CtnMeterNbr; i++)
  7359. {
  7360. sprintf(m->szs_sub_topic[3 + i],"sequential/%s/CtnMeter%d",m->szusrname,
  7361. i + 1);
  7362. }
  7363. m->s_qos = 1;
  7364. m->bConnected = 0;
  7365. m->LastRecv = 0;
  7366. m->TotalReconnCnt = 0;
  7367. // // 3# MQTT mosquitto server
  7368. // m = &APPL.chanmqtt[3];
  7369. // m->s_conn = NULL;
  7370. // strcpy(m->szs_url,"119.45.101.222:1883");
  7371. // strcpy(m->szs_pub_topic,"qcd215");
  7372. // strcpy(m->szs_sub_topic[0],"zh_gate_m");
  7373. // //strcpy(m->szs_sub_topic[1],"zh_testarea_m");
  7374. // m->s_qos = 1;
  7375. // m->bConnected = 0;
  7376. // // 4# MQTT EMQ server by paho
  7377. // // 获取关口表等电表的数据
  7378. // m = &APPL.chanmqtt[4];
  7379. // m->s_conn = NULL;
  7380. // strcpy(m->szs_url,"119.45.116.112:18883");
  7381. // strcpy(m->szusrname,"bms");
  7382. // strcpy(m->szpasswd,"KkK1iA71");
  7383. // //strcpy(m->szclientid,APPL.Set.s.szSN);
  7384. // strcpy(m->szclientid,"ZHES233230008");
  7385. // strcpy(m->szs_pub_topic,"duolengduo_ctn");
  7386. // strcpy(m->szs_sub_topic[0],"duolengduo_meter");
  7387. // m->s_qos = 1;
  7388. // m->bConnected = 0;
  7389. // m->MaxIntv = 0;
  7390. // m->AvgIntv = 0;
  7391. // m->LastRecv = 0;
  7392. // pthread_create(&hthrd_mqtt2, NULL, thrd_mqtt_2, NULL);
  7393. // pthread_create(&hthrd_mqtt3, NULL, thrd_mqtt_3, NULL);
  7394. pthread_create(&hthrd_mqtt4,NULL,thrd_mqtt4,NULL);
  7395. }
  7396. appl_485_set_485mode();
  7397. // CHAN 485 1
  7398. strcpy(APPL.chan485[1].szdev,"/dev/ttymxc1");
  7399. APPL.chan485[1].baud = 9600;
  7400. APPL.chan485[1].parity = 'N';
  7401. strcpy(APPL.chan485[1].szinfo,"PCS 辅助电表");
  7402. // CHAN 485 2
  7403. strcpy(APPL.chan485[2].szdev,"/dev/ttymxc2");
  7404. APPL.chan485[2].baud = 9600;
  7405. APPL.chan485[2].parity = 'N';
  7406. strcpy(APPL.chan485[2].szinfo,"BMS");
  7407. // CHAN 485 3
  7408. strcpy(APPL.chan485[3].szdev,"/dev/ttymxc3");
  7409. APPL.chan485[3].baud = 9600;
  7410. APPL.chan485[3].parity = 'N';
  7411. strcpy(APPL.chan485[3].szinfo,"未使用");
  7412. // CHAN 485 4
  7413. strcpy(APPL.chan485[4].szdev,"/dev/ttymxc5");
  7414. APPL.chan485[4].baud = 9600;
  7415. APPL.chan485[4].parity = 'N';
  7416. strcpy(APPL.chan485[4].szinfo,"一氧化碳 除湿机 消防主机");
  7417. // CHAN CAN 1
  7418. strcpy(APPL.chancan[1].szdev,"can0");
  7419. strcpy(APPL.chancan[1].szinfo,"电池包火灾探测器");
  7420. // CHAN CAN 2
  7421. strcpy(APPL.chancan[2].szdev,"can1");
  7422. strcpy(APPL.chancan[2].szinfo,"液冷空调");
  7423. // init PCS
  7424. pcs->Adr = 1;
  7425. pcs->LastUpdate = 0;
  7426. pcs->CommFailTotalCnt = 0;
  7427. // init BMS
  7428. bms->Adr = 1;
  7429. bms->LastUpdate = 0;
  7430. bms->CommFailTotalCnt = 0;
  7431. // init Envicool5kW
  7432. ac->LastUpdate1 = 0;
  7433. ac->LastUpdate2 = 0;
  7434. appl_ac_set_ctlmod(AC_CTLMOD_EMS);
  7435. // init AUXM
  7436. APPL.Adl200.Adr = 7;
  7437. APPL.Adl200.LastUpdate = 0;
  7438. APPL.Adl200.CommFailTotalCnt = 0;
  7439. // Dehumi
  7440. APPL.Dehumi.Adr = 1;
  7441. // Co
  7442. APPL.Co.Adr = 5;
  7443. // Dido
  7444. appl_dido_set_led(LEDMODE_WHITE);
  7445. // CTL
  7446. ctl->bChgAble = 1;
  7447. ctl->bDhgAble = 1;
  7448. ctl->Cmd = CTL_CMD_DONE;
  7449. appl_ctl_set_workmode(CTL_WORKMODE_SLAVE);
  7450. // Snap
  7451. appl_snap_reset_err();
  7452. snap->bStart = 0;
  7453. pthread_create(&hthrd_485_1,NULL,thrd_485_1,NULL);
  7454. pthread_create(&hthrd_485_2,NULL,thrd_485_2,NULL);
  7455. pthread_create(&hthrd_485_3,NULL,thrd_485_3,NULL);
  7456. pthread_create(&hthrd_485_3,NULL,thrd_485_4,NULL);
  7457. pthread_create(&hthrd_can_1,NULL,thrd_can1,NULL);
  7458. pthread_create(&hthrd_can_2,NULL,thrd_can2,NULL);
  7459. pthread_create(&hthrd_dido,NULL,thrd_dido,NULL);
  7460. pthread_create(&hthrd_ctl,NULL,thrd_ctl,NULL);
  7461. pthread_create(&hthrd_snap,NULL,thrd_snap,NULL);
  7462. }