12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796 |
- #include "appl.h"
- #define EXPORT_PATH "/sys/class/gpio/export" // GPIO设备导出设备
- #define DIR_OUT "out"
- #define DIR_IN "in"
- char* VERSION = "常宝股份 1.0";
- struct appl_t APPL;
- struct mg_mgr mgr_mqtt1; // thingsboard
- struct mg_mgr mgr_mqtt2; // cloud
- struct mg_mgr mgr_mqtt3; // gate and trans meter
- void appl_ac_set_ctlmod(int m)
- {
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- ac->Step = 0;
- switch(m)
- {
- case AC_CTLMOD_EMS:
- strcpy(ac->szCtlMode,"EMS控制");
- break;
- case AC_CTLMOD_NON_EMS:
- strcpy(ac->szCtlMode,"非EMS控制");
- break;
- default:
- strcpy(ac->szCtlMode,"未知");
- break;
- }
- ac->CtlMode = m;
- syslog(LOG_INFO,"%s, CtlMode is Set To %s",__func__,ac->szCtlMode);
- }
- #if 0
- int appl_cfg_save(void)
- {
- long long chksum = 0;
- FILE* fp = NULL;
- int rc,i;
- fp = fopen("./cfg.bin","wb");
- if(fp == NULL)
- {
- syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail",__func__);
- return -1;
- }
- else
- {
- for(i = 0; i < sizeof(APPL.Set.buf - 8); i++)
- {
- chksum += APPL.Set.buf[8 + i];
- }
- APPL.Set.s.chksum = chksum;
- rc = fwrite(APPL.Set.buf,sizeof(char),sizeof(APPL.Set.buf),fp);
- if(rc != sizeof(APPL.Set.buf))
- {
- syslog(LOG_INFO,"%s, fwrite ./cfg.bin Fail, rc:%d",__func__,rc);
- return -1;
- }
- else
- {
- return 0;
- }
- }
- }
- int appl_cfg_read(void)
- {
- long long chksum = 0;
- FILE* fp = NULL;
- int rc,i;
- fp = fopen("./cfg.bin","rb");
- if(fp == NULL)
- {
- syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail",__func__);
- return -1;
- }
- else
- {
- rc = fread(APPL.Set.buf,sizeof(char),sizeof(APPL.Set.buf),fp);
- if(rc != sizeof(APPL.Set.buf))
- {
- syslog(LOG_INFO,"%s, fread ./cfg.bin Fail, rc:%d",__func__,rc);
- return -1;
- }
- else
- {
- for(i = 0; i < sizeof(APPL.Set.buf - 8); i++)
- {
- chksum += APPL.Set.buf[8 + i];
- }
- if(chksum == APPL.Set.s.chksum)
- {
- return 0;
- }
- else
- {
- syslog(LOG_INFO,"%s, Chksum Fail, rc:%d",__func__,rc);
- return -1;
- }
- }
- }
- }
- #else
- int appl_cfg_save(void)
- {
- FILE* fp = NULL;
- int rc,i;
- fp = fopen("./cfg.bin","wb");
- if(fp == NULL)
- {
- syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail",__func__);
- return -1;
- }
- else
- {
- rc = fwrite(APPL.Set.buf,sizeof(char),sizeof(APPL.Set.buf),fp);
- if(rc != sizeof(APPL.Set.buf))
- {
- syslog(LOG_INFO,"%s, fwrite ./cfg.bin Fail, rc:%d",__func__,rc);
- return -1;
- }
- else
- {
- return 0;
- }
- }
- }
- int appl_cfg_read(void)
- {
- FILE* fp = NULL;
- int rc,i;
- fp = fopen("./cfg.bin","rb");
- if(fp == NULL)
- {
- syslog(LOG_INFO,"%s, fopen ./cfg.bin Fail",__func__);
- return -1;
- }
- else
- {
- rc = fread(APPL.Set.buf,sizeof(char),sizeof(APPL.Set.buf),fp);
- if(rc != sizeof(APPL.Set.buf))
- {
- syslog(LOG_INFO,"%s, fread ./cfg.bin Fail, rc:%d",__func__,rc);
- return -1;
- }
- else
- {
- return 0;
- }
- }
- }
- #endif
- void appl_cfg_set_err(void)
- {
- APPL.Set.s.bErr = 1;
- strcpy(APPL.Set.s.szState,"故障");
- }
- void appl_cfg_reset_err(void)
- {
- APPL.Set.s.bErr = 0;
- strcpy(APPL.Set.s.szState,"正常");
- }
- void appl_dido_set_state(int s,int e)
- {
- struct Dido_t* dido = &APPL.Dido;
- dido->State = s;
- switch(s)
- {
- case ST_DIDO_INIT:
- strcpy(dido->szState,"初始化");
- break;
- case ST_DIDO_RUN:
- strcpy(dido->szState,"运行");
- break;
- case ST_DIDO_ERR:
- strcpy(dido->szState,"故障");
- break;
- default:
- strcpy(dido->szState,"未知");
- break;
- }
- dido->ErrCode = e;
- switch(e)
- {
- case ERR_DIDO_NONE:
- strcpy(dido->szErrCode,"无");
- break;
- case ERR_DIDO_INIT_FAIL:
- strcpy(dido->szErrCode,"初始化失败");
- break;
- default:
- strcpy(dido->szErrCode,"未知");
- break;
- }
- }
- char* appl_get_datetime_long(void)
- {
- time_t timep;
- struct tm* tsp;
- static char buf[128];
- time(&timep);
- // tsp = gmtime(&timep);
- tsp = localtime(&timep);
- sprintf(buf,"%04d-%02d-%02d %02d:%02d:%02d",tsp->tm_year + 1900,
- tsp->tm_mon + 1,tsp->tm_mday,tsp->tm_hour,tsp->tm_min,
- (short)tsp->tm_sec);
- return buf;
- }
- static char* appl_get_datetime_short(void)
- {
- static char buf[128];
- time_t timep;
- struct tm* tsp;
- time(&timep);
- // tsp = gmtime(&timep);
- tsp = localtime(&timep);
- sprintf(buf,"%02d:%02d:%02d",tsp->tm_hour,tsp->tm_min,
- (short)tsp->tm_sec);
- return buf;
- }
- static void appl_get_datetime_num(int* y,int* m,int* d,int* h,int* min,
- int* s)
- {
- time_t timep;
- struct tm* tsp;
- time(&timep);
- // tsp = gmtime(&timep);
- tsp = localtime(&timep);
- *y = 1900 + tsp->tm_year;
- *m = 1 + tsp->tm_mon;
- *d = tsp->tm_mday;
- *h = tsp->tm_hour;
- *min = tsp->tm_min;
- *s = tsp->tm_sec;
- }
- static void* thrd_485_1(void* param)
- {
- char buf[128];
- modbus_t* ctx = NULL;
- struct timeval t;
- int rc;
- unsigned short data[256];
- unsigned short start;
- unsigned short nbr;
- int chidx = 1;
- struct chan485_t* ch = &APPL.chan485[chidx];
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct Adl200_t* auxm = &APPL.Adl200;
- int64_t startts;
- int trycnt;
- MG_INFO(("%s ENTER",__func__));
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- while(1)
- {
- startts = mg_millis();
- switch(ch->state)
- {
- case ST_485_INIT:
- ctx = modbus_new_rtu(ch->szdev,ch->baud,'N',8,1);
- if(ctx == NULL)
- {
- MG_INFO(("%s, modbus rtu new fail",__func__));
- appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
- }
- else if(modbus_connect(ctx) == -1)
- {
- MG_INFO(("%s, modbus rtu connect fail",__func__));
- modbus_free(ctx);
- ctx = NULL;
- appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
- }
- else
- {
- // t.tv_sec = 0;
- // t.tv_usec = 500000; // 500ms
- // modbus_set_response_timeout(ctx, 0, 500000);
- ch->reqcnt = 0;
- ch->failcnt = 0;
- appl_485_set_state(chidx,ST_485_RUN,ERR_485_NONE);
- }
- break;
- case ST_485_RUN:
- // Process Cmd
- if(ch->Cmd == CMD_485_PCS_START)
- {
- ch->Cmd = CMD_485_DONE;
- trycnt = 3;
- while(trycnt-- > 0)
- {
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,pcs->Adr);
- rc = modbus_write_register(ctx,0x0291,1);
- appl_chan485_unlock(chidx);
- if(rc >= 0)
- {
- break;
- }
- else
- {
- modbus_flush(ctx);
- }
- }
- }
- else if(ch->Cmd == CMD_485_PCS_STOP)
- {
- ch->Cmd = CMD_485_DONE;
- trycnt = 3;
- while(trycnt-- > 0)
- {
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,pcs->Adr);
- rc = modbus_write_register(ctx,0x0291,0);
- appl_chan485_unlock(chidx);
- if(rc >= 0)
- {
- break;
- }
- else
- {
- modbus_flush(ctx);
- }
- }
- }
- else if(ch->Cmd == CMD_485_PCS_SET_APS)
- {
- ch->Cmd = CMD_485_DONE;
- trycnt = 3;
- while(trycnt-- > 0)
- {
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,pcs->Adr);
- rc = modbus_write_register(ctx,0x0D57,(0 - ch->CmdParam) * 10);
- appl_chan485_unlock(chidx);
- if(rc >= 0)
- {
- break;
- }
- else
- {
- modbus_flush(ctx);
- }
- }
- }
- else if(ch->Cmd == CMD_485_RESET)
- {
- ch->Cmd = CMD_485_DONE;
- if(ctx != NULL)
- {
- modbus_close(ctx);
- modbus_free(ctx);
- ctx = NULL;
- }
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- break;
- }
- // ****************************************
- // Comm With PCS
- // ****************************************
- if(mg_millis() - pcs->LastUpdate > 5000)
- {
- pcs->CommState = ST_COMM_ERR;
- strcpy(pcs->szCommState,"故障");
- }
- else
- {
- pcs->CommState = ST_COMM_NORM;
- strcpy(pcs->szCommState,"正常");
- }
- // Part1
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,pcs->Adr);
- start = 0x6020;
- nbr = 60;
- rc = modbus_read_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- pcs->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- pcs->Uab = (short)data[0x6020 - start] / 10.0;
- pcs->Ubc = (short)data[0x6021 - start] / 10.0;
- pcs->Uca = (short)data[0x6022 - start] / 10.0;
- pcs->Ia = (short)data[0x6026 - start] / 10.0;
- pcs->Ib = (short)data[0x6027 - start] / 10.0;
- pcs->Ic = (short)data[0x6028 - start] / 10.0;
- pcs->Ap = 0 - (short)data[0x6039 - start] / 10.0;
- pcs->Rap = (short)data[0x603A - start] / 10.0;
- pcs->TotalBusVolt = (short)data[0x6050 - start] / 10.0;
- pcs->BatV = (short)data[0x6053 - start] / 10.0;
- pcs->BatC = (short)data[0x6054 - start] / 10.0;
- //syslog(LOG_INFO,"pcs state : %d",data[0x6057 - start]);
- if((data[0x6057 - start] & 0xffff) == 0)
- {
- pcs->WorkState = 0;
- strcpy(pcs->szWorkState,"停机");
- }
- else if(data[0x6057 - start] == 3)
- {
- pcs->WorkState = 2;
- strcpy(pcs->szWorkState,"启动中");
- }
- else if(data[0x6057 - start] == 5)
- {
- pcs->WorkState = 1;
- strcpy(pcs->szWorkState,"待机");
- }
- else if((data[0x6057 - start] == 9) ||
- (data[0x6057 - start] == 257))
- {
- pcs->WorkState = 1;
- strcpy(pcs->szWorkState,"运行");
- }
- else if((data[0x6057 - start] & 0b1000000) == 0b1000000)
- {
- pcs->WorkState = 3;
- strcpy(pcs->szWorkState,"故障");
- pcs->ErrState = data[0x6057 - start] >> 6 & 0x0001;
- }
- if(pcs->ErrState == 0)
- {
- strcpy(pcs->szErrState,"否");
- }
- else
- {
- strcpy(pcs->szErrState,"是");
- }
- pcs->Tigbt = (short)data[0x6058 - start] / 10.0;
- pcs->Tenv = (short)data[0x6059 - start] / 10.0;
- pcs->Tind = (short)data[0x605A - start] / 10.0;
- // Part2
- appl_chan485_lock(chidx);
- usleep(30000);
- start = 0x0D57;
- nbr = 1;
- rc = modbus_read_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- pcs->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- pcs->Aps = (short)data[0x0D57 - start] / 10.0;
- // Part3
- appl_chan485_lock(chidx);
- usleep(30000);
- start = 0x1700;
- nbr = 8;
- rc = modbus_read_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- pcs->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- // 硬件故障字 1 0x1700
- pcs->szHwFault1[0] = 0;
- pcs->HwFault1 = data[0x1700 - start];
- if((pcs->HwFault1 >> 0) & 0x0001)
- {
- strcat(pcs->szHwFault1,"EPO 故障");
- }
- if((pcs->HwFault1 >> 1) & 0x0001)
- {
- strcat(pcs->szHwFault1,"IGBT 硬件过流");
- }
- if((pcs->HwFault1 >> 2) & 0x0001)
- {
- strcat(pcs->szHwFault1,"母线硬件过压");
- }
- if((pcs->HwFault1 >> 4) & 0x0001)
- {
- strcat(pcs->szHwFault1,"功率模块逐波限流");
- }
- // 硬件故障字 2 0x1701
- pcs->szHwFault2[0] = 0;
- pcs->HwFault2 = data[0x1701 - start];
- if((pcs->HwFault2 >> 0) & 0x0001)
- {
- strcat(pcs->szHwFault2,"24V 电源故障");
- }
- if((pcs->HwFault2 >> 1) & 0x0001)
- {
- strcat(pcs->szHwFault2,"风扇故障");
- }
- if((pcs->HwFault2 >> 2) & 0x0001)
- {
- strcat(pcs->szHwFault2,"连接故障");
- }
- if((pcs->HwFault2 >> 6) & 0x0001)
- {
- strcat(pcs->szHwFault2,"防雷器故障");
- }
- if((pcs->HwFault2 >> 8) & 0x0001)
- {
- strcat(pcs->szHwFault2,"功率模块过温");
- }
- if((pcs->HwFault2 >> 10) & 0x0001)
- {
- strcat(pcs->szHwFault2,"15V 电源故障");
- }
- // 电网故障字 0x1702
- pcs->szGridFault[0] = 0;
- pcs->GridFault = data[0x1702 - start];
- if((pcs->GridFault >> 0) & 0x0001)
- {
- strcat(pcs->szGridFault,"A 相过压故障");
- }
- if((pcs->GridFault >> 1) & 0x0001)
- {
- strcat(pcs->szGridFault,"B 相过压故障");
- }
- if((pcs->GridFault >> 2) & 0x0001)
- {
- strcat(pcs->szGridFault,"C 相过压故障");
- }
- if((pcs->GridFault >> 3) & 0x0001)
- {
- strcat(pcs->szGridFault,"A 相欠压故障");
- }
- if((pcs->GridFault >> 4) & 0x0001)
- {
- strcat(pcs->szGridFault,"B 相欠压故障");
- }
- if((pcs->GridFault >> 5) & 0x0001)
- {
- strcat(pcs->szGridFault,"C 相欠压故障");
- }
- if((pcs->GridFault >> 6) & 0x0001)
- {
- strcat(pcs->szGridFault,"电网过频");
- }
- if((pcs->GridFault >> 7) & 0x0001)
- {
- strcat(pcs->szGridFault,"电网欠频");
- }
- if((pcs->GridFault >> 8) & 0x0001)
- {
- strcat(pcs->szGridFault,"电网相序错误");
- }
- if((pcs->GridFault >> 9) & 0x0001)
- {
- strcat(pcs->szGridFault,"A 相软件过流");
- }
- if((pcs->GridFault >> 10) & 0x0001)
- {
- strcat(pcs->szGridFault,"B 相软件过流");
- }
- if((pcs->GridFault >> 11) & 0x0001)
- {
- strcat(pcs->szGridFault,"C 相软件过流");
- }
- if((pcs->GridFault >> 12) & 0x0001)
- {
- strcat(pcs->szGridFault,"电网电压不平衡");
- }
- if((pcs->GridFault >> 13) & 0x0001)
- {
- strcat(pcs->szGridFault,"电网电流不平衡");
- }
- if((pcs->GridFault >> 14) & 0x0001)
- {
- strcat(pcs->szGridFault,"电网缺相");
- }
- if((pcs->GridFault >> 15) & 0x0001)
- {
- strcat(pcs->szGridFault,"N 线过流");
- }
- // 母线故障字 0x1703
- pcs->szBusFault[0] = 0;
- pcs->BusFault = data[0x1703 - start];
- if((pcs->BusFault >> 0) & 0x0001)
- {
- strcat(pcs->szBusFault,"预充母线过压");
- }
- if((pcs->BusFault >> 1) & 0x0001)
- {
- strcat(pcs->szBusFault,"预充母线欠压");
- }
- if((pcs->BusFault >> 2) & 0x0001)
- {
- strcat(pcs->szBusFault,"不控整流母线过压");
- }
- if((pcs->BusFault >> 3) & 0x0001)
- {
- strcat(pcs->szBusFault,"不控整流母线欠压");
- }
- if((pcs->BusFault >> 4) & 0x0001)
- {
- strcat(pcs->szBusFault,"运行母线过压");
- }
- if((pcs->BusFault >> 5) & 0x0001)
- {
- strcat(pcs->szBusFault,"运行母线欠压");
- }
- if((pcs->BusFault >> 6) & 0x0001)
- {
- strcat(pcs->szBusFault,"正负母线不平衡");
- }
- if((pcs->BusFault >> 7) & 0x0001)
- {
- strcat(pcs->szBusFault,"电池欠压");
- }
- if((pcs->BusFault >> 8) & 0x0001)
- {
- strcat(pcs->szBusFault,"电流模式母线欠压");
- }
- if((pcs->BusFault >> 9) & 0x0001)
- {
- strcat(pcs->szBusFault,"电池过压");
- }
- if((pcs->BusFault >> 10) & 0x0001)
- {
- strcat(pcs->szBusFault,"直流预充电过流");
- }
- if((pcs->BusFault >> 11) & 0x0001)
- {
- strcat(pcs->szBusFault,"直流过流");
- }
- // 交流电容故障字 0x1704
- pcs->szAcCapFault[0] = 0;
- pcs->AcCapFault = data[0x1704 - start];
- if((pcs->AcCapFault >> 0) & 0x0001)
- {
- strcat(pcs->szAcCapFault,"预充电超时");
- }
- if((pcs->AcCapFault >> 1) & 0x0001)
- {
- strcat(pcs->szAcCapFault,"预充电 A 相过流");
- }
- if((pcs->AcCapFault >> 2) & 0x0001)
- {
- strcat(pcs->szAcCapFault,"预充电 B 相过流");
- }
- if((pcs->AcCapFault >> 3) & 0x0001)
- {
- strcat(pcs->szAcCapFault,"预充电 C 相过流");
- }
- // 系统故障字 0x1705
- pcs->szSysFault[0] = 0;
- pcs->SysFault = data[0x1705 - start];
- if((pcs->SysFault >> 2) & 0x0001)
- {
- strcat(pcs->szSysFault,"AD 采样零漂");
- }
- if((pcs->SysFault >> 11) & 0x0001)
- {
- strcat(pcs->szSysFault,"STS 通信故障");
- }
- if((pcs->SysFault >> 12) & 0x0001)
- {
- strcat(pcs->szSysFault,"电池系统告警或故障");
- }
- if((pcs->SysFault >> 13) & 0x0001)
- {
- strcat(pcs->szSysFault,"BMS 通讯故障");
- }
- if((pcs->SysFault >> 14) & 0x0001)
- {
- strcat(pcs->szSysFault,"从模块 CAN 通信故障");
- }
- if((pcs->SysFault >> 15) & 0x0001)
- {
- strcat(pcs->szSysFault,"EMS 通信故障");
- }
- // 开关故障字 0x1706
- pcs->szOnOffFault[0] = 0;
- pcs->OnOffFault = data[0x1706 - start];
- if((pcs->OnOffFault >> 0) & 0x0001)
- {
- strcat(pcs->szOnOffFault,"预充电继电器闭合失败");
- }
- if((pcs->OnOffFault >> 1) & 0x0001)
- {
- strcat(pcs->szOnOffFault,"预充电继电器断开失败");
- }
- if((pcs->OnOffFault >> 2) & 0x0001)
- {
- strcat(pcs->szOnOffFault,"预充电继电器闭合状态错误");
- }
- if((pcs->OnOffFault >> 3) & 0x0001)
- {
- strcat(pcs->szOnOffFault,"预充电继电器断开状态错误");
- }
- if((pcs->OnOffFault >> 4) & 0x0001)
- {
- strcat(pcs->szOnOffFault,"主继电器闭合失败");
- }
- if((pcs->OnOffFault >> 5) & 0x0001)
- {
- strcat(pcs->szOnOffFault,"主继电器断开失败");
- }
- if((pcs->OnOffFault >> 6) & 0x0001)
- {
- strcat(pcs->szOnOffFault,"主继电器闭合状态错误");
- }
- if((pcs->OnOffFault >> 7) & 0x0001)
- {
- strcat(pcs->szOnOffFault,"主继电器断开状态错误");
- }
- // 其他故障字 0x1707
- pcs->szOtherFault[0] = 0;
- pcs->OtherFault = data[0x1707 - start];
- if((pcs->OtherFault >> 0) & 0x0001)
- {
- strcat(pcs->szOtherFault,"逆变电压 A 相过压故障");
- }
- if((pcs->OtherFault >> 1) & 0x0001)
- {
- strcat(pcs->szOtherFault,"逆变电压 B 相过压故障");
- }
- if((pcs->OtherFault >> 2) & 0x0001)
- {
- strcat(pcs->szOtherFault,"逆变电压 C 相过压故障");
- }
- if((pcs->OtherFault >> 3) & 0x0001)
- {
- strcat(pcs->szOtherFault,"电网孤岛故障");
- }
- if((pcs->OtherFault >> 5) & 0x0001)
- {
- strcat(pcs->szOtherFault,"系统谐振故障");
- }
- if((pcs->OtherFault >> 6) & 0x0001)
- {
- strcat(pcs->szOtherFault,"软件过压过流");
- }
- if((pcs->OtherFault >> 8) & 0x0001)
- {
- strcat(pcs->szOtherFault,"模块拨码地址错误");
- }
- if((pcs->OtherFault >> 9) & 0x0001)
- {
- strcat(pcs->szOtherFault,"逆变电压 A 相欠压故障");
- }
- if((pcs->OtherFault >> 10) & 0x0001)
- {
- strcat(pcs->szOtherFault,"逆变电压 B 相欠压故障");
- }
- if((pcs->OtherFault >> 11) & 0x0001)
- {
- strcat(pcs->szOtherFault,"逆变电压 C 相欠压故障");
- }
- if((pcs->OtherFault >> 12) & 0x0001)
- {
- strcat(pcs->szOtherFault,"离网无同步信号故障");
- }
- if((pcs->OtherFault >> 14) & 0x0001)
- {
- strcat(pcs->szOtherFault,"离网短路故障");
- }
- pcs->LastUpdate = mg_millis();
- strcpy(pcs->szLastUpdate,appl_get_datetime_long());
- }
- }
- }
- // comm with AUXM
- if(mg_millis() - auxm->LastUpdate > 5000)
- {
- auxm->CommState = ST_COMM_ERR;
- strcpy(auxm->szCommState,"故障");
- }
- else
- {
- auxm->CommState = ST_COMM_NORM;
- strcpy(auxm->szCommState,"正常");
- }
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,auxm->Adr);
- start = 0x000B;
- nbr = 7;
- rc = modbus_read_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- auxm->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- auxm->Volt = data[0x000B - start] * 0.1;
- auxm->Curr = data[0x000C - start] * 0.01;
- auxm->Ap = data[0x000D - start] * 0.001;
- auxm->Rap = data[0x000E - start] * 0.001;
- auxm->Pf = data[0x0010 - start] * 0.001;
- auxm->Gf = data[0x0011 - start] * 0.01;
- appl_chan485_lock(chidx);
- usleep(30000);
- start = 0x0068;
- nbr = 24;
- rc = modbus_read_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- auxm->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- auxm->PosAe =
- (data[0x0069 - start] | data[0x0068 - start] << 16) * 0.01;
- auxm->NegAe =
- (data[0x0073 - start] | data[0x0072 - start] << 16) * 0.01;
- auxm->LastUpdate = mg_millis();
- strcpy(auxm->szLastUpdate,appl_get_datetime_long());
- }
- }
- break;
- case ST_485_ERR:
- if(ch->Cmd == CMD_485_RESET)
- {
- ch->Cmd = CMD_485_DONE;
- if(ctx != NULL)
- {
- modbus_close(ctx);
- modbus_free(ctx);
- ctx = NULL;
- }
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- }
- else
- {
- usleep(300000);
- }
- break;
- default:
- // never reach here
- break;
- }
- usleep(100000);
- ch->loopcnt += 1;
- ch->looptime = mg_millis() - startts;
- }
- MG_INFO(("%s EXIT",__func__));
- }
- static void* thrd_485_2(void* param)
- {
- char buf[128];
- modbus_t* ctx = NULL;
- struct timeval t;
- int rc;
- unsigned short data[256];
- unsigned char bits[256];
- unsigned short start;
- unsigned short nbr;
- int chidx = 2;
- struct chan485_t* ch = &APPL.chan485[chidx];
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- int step = 1;
- int i;
- int64_t startts;
- MG_INFO(("%s ENTER",__func__));
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- while(1)
- {
- startts = mg_millis();
- switch(ch->state)
- {
- case ST_485_INIT:
- ctx = modbus_new_rtu(ch->szdev,ch->baud,'N',8,1);
- if(ctx == NULL)
- {
- MG_INFO(("%s, modbus rtu new fail",__func__));
- appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
- }
- else if(modbus_connect(ctx) == -1)
- {
- MG_INFO(("%s, modbus rtu connect fail",__func__));
- modbus_free(ctx);
- ctx = NULL;
- appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
- }
- else
- {
- t.tv_sec = 0;
- t.tv_usec = 500000;
- modbus_set_response_timeout(ctx,0,500000);
- ch->reqcnt = 0;
- ch->failcnt = 0;
- appl_485_set_state(chidx,ST_485_RUN,ERR_485_NONE);
- }
- break;
- case ST_485_RUN:
- // Process Cmd
- if(ch->Cmd == CMD_485_RESET)
- {
- ch->Cmd = CMD_485_DONE;
- if(ctx != NULL)
- {
- modbus_close(ctx);
- modbus_free(ctx);
- ctx = NULL;
- }
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- break;
- }
- // comm with BMS
- if(mg_millis() - bms->LastUpdate > 5000)
- {
- bms->CommState = ST_COMM_ERR;
- strcpy(bms->szCommState,"故障");
- }
- else
- {
- bms->CommState = ST_COMM_NORM;
- strcpy(bms->szCommState,"正常");
- }
- // ****** PART 1 ******************
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,bms->Adr);
- start = 1;
- nbr = 64;
- rc = modbus_read_input_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- bms->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- bms->BatV = data[1 - start] / 10.0;
- bms->BatI = data[2 - start] / 10.0 - 1600;
- bms->Soc = data[3 - start];
- bms->Soh = data[4 - start];
- bms->PosRes = data[5 - start];
- bms->NegRes = data[6 - start];
- bms->BatState = data[7 - start];
- if(bms->BatState == 1)
- {
- strcpy(bms->szBatState,"充电");
- }
- else if(bms->BatState == 2)
- {
- strcpy(bms->szBatState,"放电");
- }
- else if(bms->BatState == 3)
- {
- strcpy(bms->szBatState,"开路");
- }
- else
- {
- strcpy(bms->szBatState,"未知");
- }
- bms->DI = data[8 - start];
- if((bms->DI & 0x00000025) == 0x00000025)
- {
- bms->HvState = 1;
- strcpy(bms->szHvState,"ON");
- }
- else
- {
- bms->HvState = 0;
- strcpy(bms->szHvState,"OFF");
- }
- bms->MaxCellT = data[11 - start] - 40;
- bms->MaxCellTModIdx = data[12 - start];
- bms->MaxCellTIdx = data[13 - start];
- bms->MinCellT = data[14 - start] - 40;
- bms->MinCellTModIdx = data[15 - start];
- bms->MinCellTIdx = data[16 - start];
- bms->AvgCellT = data[17 - start] - 40;
- bms->MaxCellV = data[20 - start] / 1000.0;
- bms->MaxCellVModIdx = data[21 - start];
- bms->MaxCellVIdx = data[22 - start];
- bms->AvgCellV = data[19 - start] / 1000.0;
- bms->MinCellV = data[23 - start] / 1000.0;
- bms->MinCellVModIdx = data[24 - start];
- bms->MinCellVIdx = data[25 - start];
- bms->MaxChgCurr = data[59 - start] / 10.0;
- bms->MaxDhgCurr = data[60 - start] / 10.0;
- if(data[61 - start] & 0x0001)
- {
- bms->bChgNotAllowed = 1;
- }
- else
- {
- bms->bChgNotAllowed = 0;
- }
- if((data[61 - start] >> 1) & 0x0001)
- {
- bms->bDhgNotAllowed = 1;
- }
- else
- {
- bms->bDhgNotAllowed = 0;
- }
- if((data[61 - start] >> 2) & 0x0001)
- {
- bms->bTotalFatalErr = 1;
- }
- else
- {
- bms->bTotalFatalErr = 0;
- }
- if((data[61 - start] >> 2) & 0x0001)
- {
- bms->bWarning = 1;
- }
- else
- {
- bms->bWarning = 0;
- }
- bms->CellVDiff = data[62 - start];
- bms->CellTDiff = data[63 - start] - 40;
- // ****** PART 2 ******************
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,bms->Adr);
- start = 1;
- nbr = 58;
- rc = modbus_read_input_bits(ctx,start,nbr,bits);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- bms->CommFailTotalCnt += 1;
- }
- else
- {
- bms->szErrMsg[0] = 0;
- if(bits[1 - start])
- {
- bms->bTotalOv = 1;
- strcpy(bms->szErrMsg,"组端过压3级报警");
- }
- else
- {
- bms->bTotalOv = 0;
- }
- if(bits[6 - start])
- {
- bms->bTotalUv = 1;
- strcpy(bms->szErrMsg,"组端欠压3级报警");
- }
- else
- {
- bms->bTotalUv = 0;
- }
- if(bits[9 - start])
- {
- bms->bTotalDhgOc = 1;
- strcpy(bms->szErrMsg,"组端放电过流 3 级报警");
- }
- else
- {
- bms->bTotalDhgOc = 0;
- }
- if(bits[12 - start])
- {
- bms->bTotalChgOc = 1;
- strcpy(bms->szErrMsg,"组端充电过流 3 级报警");
- }
- else
- {
- bms->bTotalChgOc = 0;
- }
- if(bits[15 - start])
- {
- bms->bTotalResWarn = 1;
- strcpy(bms->szErrMsg,"组端绝缘 3 级报警");
- }
- else
- {
- bms->bTotalResWarn = 0;
- }
- if(bits[18 - start])
- {
- bms->bCellOt = 1;
- strcpy(bms->szErrMsg,"单体电池过温 3 级报警");
- }
- else
- {
- bms->bCellOt = 0;
- }
- if(bits[21 - start])
- {
- bms->bCellUt = 1;
- strcpy(bms->szErrMsg,"单体电池欠温 3 级报警");
- }
- else
- {
- bms->bCellUt = 0;
- }
- if(bits[24 - start])
- {
- bms->bCellOv = 1;
- strcpy(bms->szErrMsg,"单体电压过压 3 级报警");
- }
- else
- {
- bms->bCellOv = 0;
- }
- if(bits[27 - start])
- {
- bms->bCellUv = 1;
- strcpy(bms->szErrMsg,"单体电压欠压 3 级报警");
- }
- else
- {
- bms->bCellUv = 0;
- }
- if(bits[30 - start])
- {
- bms->bCellVDiffErr = 1;
- strcpy(bms->szErrMsg,"单体压差过高 3 级报警");
- }
- else
- {
- bms->bCellVDiffErr = 0;
- }
- if(bits[33 - start])
- {
- bms->bCellTDiffErr = 1;
- strcpy(bms->szErrMsg,"单体温差过高 3 级报警");
- }
- else
- {
- bms->bCellTDiffErr = 0;
- }
- if(bits[36 - start])
- {
- bms->bSocLowErr = 1;
- strcpy(bms->szErrMsg,"SOC 过低 3 级告警");
- }
- else
- {
- bms->bSocLowErr = 0;
- }
- if(bits[39 - start])
- {
- bms->bPowerPackOtErr = 1;
- strcpy(bms->szErrMsg,"动力插箱温度过高 3 级报警");
- }
- else
- {
- bms->bPowerPackOtErr = 0;
- }
- if(bits[42 - start])
- {
- bms->bPackOv = 1;
- strcpy(bms->szErrMsg,"电池模组过压 3 级报警");
- }
- else
- {
- bms->bPackOv = 0;
- }
- if(bits[45 - start])
- {
- bms->bPackUv = 1;
- strcpy(bms->szErrMsg,"电池模组欠压 3 级报警");
- }
- else
- {
- bms->bPackUv = 0;
- }
- if(bits[46 - start])
- {
- bms->bDI1Err = 1;
- strcpy(bms->szErrMsg,"DI1故障");
- }
- else
- {
- bms->bDI1Err = 0;
- }
- if(bits[47 - start])
- {
- bms->bDI2Err = 1;
- strcpy(bms->szErrMsg,"DI2故障");
- }
- else
- {
- bms->bDI2Err = 0;
- }
- if(bits[48 - start])
- {
- bms->bDI3Err = 1;
- strcpy(bms->szErrMsg,"DI3故障");
- }
- else
- {
- bms->bDI3Err = 0;
- }
- if(bits[49 - start])
- {
- bms->bDI4Err = 1;
- strcpy(bms->szErrMsg,"DI4故障");
- }
- else
- {
- bms->bDI4Err = 0;
- }
- if(bits[50 - start])
- {
- bms->bDI5Err = 1;
- strcpy(bms->szErrMsg,"DI5故障");
- }
- else
- {
- bms->bDI5Err = 0;
- }
- if(bits[51 - start])
- {
- bms->bDI6Err = 1;
- strcpy(bms->szErrMsg,"DI6故障");
- }
- else
- {
- bms->bDI6Err = 0;
- }
- if(bits[52 - start])
- {
- bms->bDI7Err = 1;
- strcpy(bms->szErrMsg,"DI7故障");
- }
- else
- {
- bms->bDI7Err = 0;
- }
- if(bits[53 - start])
- {
- bms->bDI8Err = 1;
- strcpy(bms->szErrMsg,"DI8故障");
- }
- else
- {
- bms->bDI8Err = 0;
- }
- if(bits[54 - start])
- {
- bms->bMasterSlaveCommErr = 1;
- strcpy(bms->szErrMsg,"主从内网通讯失联");
- }
- else
- {
- bms->bMasterSlaveCommErr = 0;
- }
- if(bits[55 - start])
- {
- bms->bCellVoltDacErr = 1;
- strcpy(bms->szErrMsg,"单体电压采集故障");
- }
- else
- {
- bms->bCellVoltDacErr = 0;
- }
- if(bits[56 - start])
- {
- bms->bCellTempDacErr = 1;
- strcpy(bms->szErrMsg,"单体温度采集故障");
- }
- else
- {
- bms->bCellTempDacErr = 0;
- }
- if(bits[57 - start])
- {
- bms->bJumpErr = 1;
- strcpy(bms->szErrMsg,"跳机故障");
- }
- else
- {
- bms->bJumpErr = 0;
- }
- if(bits[58 - start])
- {
- bms->bBatLimErr = 1;
- strcpy(bms->szErrMsg,"电池极限故障");
- }
- else
- {
- bms->bBatLimErr = 0;
- }
- // ****** PART 3 ******************
- if(step == 1)
- {
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,bms->Adr);
- start = 100;
- nbr = 52 * 2;
- rc = modbus_read_input_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- bms->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- for(i = 1; i <= 52; i++)
- { // pack1 cell volt
- bms->CellVolt[1][i] = data[100 + i - 1 - start] / 1000.0;
- }
- for(i = 1; i <= 52; i++)
- { // pack2 cell volt
- bms->CellVolt[2][i] = data[100 + i - 1 + 52 - start] / 1000.0;
- }
- // ****** PART 4 ******************
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,bms->Adr);
- start = 204;
- nbr = 52 * 2;
- rc = modbus_read_input_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- bms->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- for(i = 1; i <= 52; i++)
- { // pack3 cell volt
- bms->CellVolt[3][i] = data[i - 1] / 1000.0;
- }
- for(i = 1; i <= 52; i++)
- { // pack4 cell volt
- bms->CellVolt[4][i] = data[i - 1 + 52] / 1000.0;
- }
- step = 2;
- bms->LastUpdate = mg_millis();
- strcpy(bms->szLastUpdate,appl_get_datetime_long());
- }
- }
- }
- else if(step == 2)
- {
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,bms->Adr);
- start = 308;
- nbr = 52;
- rc = modbus_read_input_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- bms->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- for(i = 1; i <= 52; i++)
- {
- bms->CellVolt[5][i] = data[i - 1] / 1000.0;
- }
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,bms->Adr);
- start = 600;
- nbr = 52 * 2;
- rc = modbus_read_input_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- bms->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- for(i = 1; i <= 52; i++)
- { // pack1 temp
- bms->CellTemp[1][i] = data[i - 1] - 40;
- }
- for(i = 1; i <= 52; i++)
- { // pack2 temp
- bms->CellTemp[2][i] = data[i - 1 + 52] - 40;
- }
- step = 3;
- bms->LastUpdate = mg_millis();
- strcpy(bms->szLastUpdate,appl_get_datetime_long());
- }
- }
- }
- else if(step == 3)
- {
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,bms->Adr);
- start = 704;
- nbr = 52 * 2;
- rc = modbus_read_input_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- bms->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- for(i = 1; i <= 52; i++)
- { // pack3 temp
- bms->CellTemp[3][i] = data[i - 1] - 40;
- }
- for(i = 1; i <= 52; i++)
- { // pack4 temp
- bms->CellTemp[4][i] = data[i - 1 + 52] - 40;
- }
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,bms->Adr);
- start = 808;
- nbr = 52;
- rc = modbus_read_input_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- bms->CommFailTotalCnt += 1;
- modbus_flush(ctx);
- }
- else
- {
- for(i = 1; i <= 52; i++)
- { // pack5 temp
- bms->CellTemp[5][i] = data[i - 1] - 40;
- }
- step = 1;
- bms->LastUpdate = mg_millis();
- strcpy(bms->szLastUpdate,appl_get_datetime_long());
- }
- }
- }
- }
- }
- break;
- case ST_485_ERR:
- if(ch->Cmd == CMD_485_RESET)
- {
- ch->Cmd = CMD_485_DONE;
- if(ctx != NULL)
- {
- modbus_close(ctx);
- modbus_free(ctx);
- ctx = NULL;
- }
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- }
- else
- {
- usleep(300000);
- }
- break;
- default:
- // never reach here
- break;
- }
- usleep(100000);
- ch->loopcnt += 1;
- ch->looptime = mg_millis() - startts;
- }
- MG_INFO(("%s EXIT",__func__));
- }
- static void* thrd_485_3(void* param)
- {
- char buf[128];
- modbus_t* ctx = NULL;
- struct timeval t;
- int rc;
- unsigned short data[256];
- unsigned short start;
- unsigned short nbr;
- int chidx = 3;
- struct chan485_t* ch = &APPL.chan485[chidx];
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- int64_t startts;
- int trycnt;
- syslog(LOG_INFO,"%s ENTER",__func__);
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- while(1)
- {
- startts = mg_millis();
- switch(ch->state)
- {
- case ST_485_INIT:
- ctx = modbus_new_rtu(ch->szdev,ch->baud,'N',8,1);
- if(ctx == NULL)
- {
- MG_INFO(("%s, modbus rtu new fail",__func__));
- appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
- }
- else if(modbus_connect(ctx) == -1)
- {
- MG_INFO(("%s, modbus rtu connect fail",__func__));
- modbus_free(ctx);
- ctx = NULL;
- appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
- }
- else
- {
- t.tv_sec = 0;
- t.tv_usec = 500000;
- modbus_set_response_timeout(ctx,0,500000);
- ch->reqcnt = 0;
- ch->failcnt = 0;
- appl_485_set_state(chidx,ST_485_RUN,ERR_485_NONE);
- }
- break;
- case ST_485_RUN:
- // ****************************
- // Process Cmd
- // ****************************
- if(ch->Cmd == CMD_485_RESET)
- {
- ch->Cmd = CMD_485_DONE;
- if(ctx != NULL)
- {
- modbus_close(ctx);
- modbus_free(ctx);
- ctx = NULL;
- }
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- break;
- }
- break;
- case ST_485_ERR:
- if(ch->Cmd == CMD_485_RESET)
- {
- ch->Cmd = CMD_485_DONE;
- if(ctx != NULL)
- {
- modbus_close(ctx);
- modbus_free(ctx);
- ctx = NULL;
- }
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- }
- else
- {
- usleep(300000);
- }
- break;
- default:
- // never reach here
- break;
- }
- usleep(100000);
- ch->loopcnt += 1;
- ch->looptime = mg_millis() - startts;
- }
- MG_INFO(("%s EXIT",__func__));
- }
- static void* thrd_485_4(void* param)
- {
- char buf[128];
- modbus_t* ctx = NULL;
- struct timeval t;
- int rc;
- unsigned short data[256];
- unsigned char uc[128];
- unsigned short start;
- unsigned short nbr;
- int chidx = 4;
- struct chan485_t* ch = &APPL.chan485[chidx];
- struct Dehumi_t* dh = &APPL.Dehumi;
- struct Co_t* co = &APPL.Co;
- int64_t startts;
- int trycnt;
- MG_INFO(("%s ENTER",__func__));
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- while(1)
- {
- startts = mg_millis();
- switch(ch->state)
- {
- case ST_485_INIT:
- ctx = modbus_new_rtu(ch->szdev,ch->baud,'N',8,1);
- if(ctx == NULL)
- {
- MG_INFO(("%s, modbus rtu new fail",__func__));
- appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
- }
- else if(modbus_connect(ctx) == -1)
- {
- MG_INFO(("%s, modbus rtu connect fail",__func__));
- modbus_free(ctx);
- ctx = NULL;
- appl_485_set_state(chidx,ST_485_ERR,ERR_485_INIT_FAIL);
- }
- else
- {
- t.tv_sec = 0;
- t.tv_usec = 500000;
- modbus_set_response_timeout(ctx,0,500000);
- ch->reqcnt = 0;
- ch->failcnt = 0;
- appl_485_set_state(chidx,ST_485_RUN,ERR_485_NONE);
- }
- break;
- case ST_485_RUN:
- // Process Cmd
- if(ch->Cmd == CMD_485_RESET)
- {
- ch->Cmd = CMD_485_DONE;
- if(ctx != NULL)
- {
- modbus_close(ctx);
- modbus_free(ctx);
- ctx = NULL;
- }
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- break;
- }
- else if(ch->Cmd == CMD_485_DH_SET_HUMISTART)
- {
- ch->Cmd = CMD_485_DONE;
- trycnt = 3;
- while(trycnt-- > 0)
- {
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,dh->Adr);
- rc = modbus_write_register(ctx,2,ch->CmdParam);
- appl_chan485_unlock(chidx);
- if(rc >= 0)
- {
- break;
- }
- else
- {
- modbus_flush(ctx);
- }
- }
- }
- else if(ch->Cmd == CMD_485_DH_SET_HUMISTOP)
- {
- ch->Cmd = CMD_485_DONE;
- trycnt = 3;
- while(trycnt-- > 0)
- {
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,dh->Adr);
- rc = modbus_write_register(ctx,3,ch->CmdParam);
- appl_chan485_unlock(chidx);
- if(rc >= 0)
- {
- break;
- }
- else
- {
- modbus_flush(ctx);
- }
- }
- }
- // comm with DH
- if(mg_millis() - dh->LastUpdate > 5000)
- {
- dh->CommState = ST_COMM_ERR;
- strcpy(dh->szCommState,"故障");
- }
- else
- {
- dh->CommState = ST_COMM_NORM;
- strcpy(dh->szCommState,"正常");
- }
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,dh->Adr);
- start = 0;
- nbr = 12;
- rc = modbus_read_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- dh->CommFailTotalCnt += 1;
- }
- else
- {
- dh->Temp = (short)data[0 - start] / 10.0;
- dh->Humi = (short)data[1 - start] / 10.0;
- dh->HumiStart = (short)data[2 - start];
- dh->HumiStop = (short)data[3 - start];
- dh->HeatStart = (short)data[4 - start];
- dh->HeatState = data[7 - start];
- if(dh->HeatState == 0)
- {
- strcpy(dh->szHeatState,"未加热");
- }
- else if(dh->HeatState == 1)
- {
- strcpy(dh->szHeatState,"正在加热");
- }
- else
- {
- strcpy(dh->szHeatState,"未知");
- }
- dh->WorkState = data[8 - start];
- if(dh->WorkState == 0)
- {
- strcpy(dh->szWorkState,"待机");
- }
- else if(dh->WorkState == 1)
- {
- strcpy(dh->szWorkState,"正在除湿");
- }
- else if(dh->WorkState >= 2 || dh->WorkState <= 9)
- {
- strcpy(dh->szWorkState,"故障");
- }
- else
- {
- strcpy(dh->szWorkState,"未知");
- }
- dh->ManOrAuto = data[9 - start];
- if(dh->ManOrAuto == 0)
- {
- strcpy(dh->szManOrAuto,"自动");
- }
- else if(dh->ManOrAuto == 1)
- {
- strcpy(dh->szManOrAuto,"手动");
- }
- else
- {
- strcpy(dh->szManOrAuto,"未知");
- }
- dh->ManHumi = data[0x0A - start];
- dh->ManHeat = data[0x0B - start];
- dh->LastUpdate = mg_millis();
- strcpy(dh->szLastUpdate,appl_get_datetime_long());
- }
- // comm with CO
- if(mg_millis() - co->LastUpdate > 5000)
- {
- co->CommState = ST_COMM_ERR;
- strcpy(co->szCommState,"故障");
- }
- else
- {
- co->CommState = ST_COMM_NORM;
- strcpy(co->szCommState,"正常");
- }
- appl_chan485_lock(chidx);
- usleep(30000);
- modbus_set_slave(ctx,co->Adr);
- start = 1;
- nbr = 2;
- rc = modbus_read_registers(ctx,start,nbr,data);
- appl_chan485_unlock(chidx);
- ch->reqcnt += 1;
- if(rc != nbr)
- {
- ch->failcnt += 1;
- co->CommFailTotalCnt += 1;
- }
- else
- {
- co->Flag = data[1 - start] & 0x000F;
- if(co->Flag == 0x00)
- {
- strcpy(co->szFlag,"无报警");
- }
- else if(co->Flag == 0xFF)
- {
- strcpy(co->szFlag,"气体告警");
- }
- else if(co->Flag == 0xFE)
- {
- strcpy(co->szFlag,"传感器故障");
- }
- else if(co->Flag == 0xFD)
- {
- strcpy(co->szFlag,"传感器预热");
- }
- else
- {
- strcpy(co->szFlag,"未知");
- }
- co->Density = data[2 - start];
- co->LastUpdate = mg_millis();
- strcpy(co->szLastUpdate,appl_get_datetime_long());
- }
- break;
- case ST_485_ERR:
- if(ch->Cmd == CMD_485_RESET)
- {
- ch->Cmd = CMD_485_DONE;
- if(ctx != NULL)
- {
- modbus_close(ctx);
- modbus_free(ctx);
- ctx = NULL;
- }
- appl_485_set_state(chidx,ST_485_INIT,ERR_485_NONE);
- }
- else
- {
- usleep(300000);
- }
- break;
- default:
- // never reach here
- break;
- }
- usleep(200000);
- ch->loopcnt += 1;
- ch->looptime = mg_millis() - startts;
- }
- MG_INFO(("%s EXIT",__func__));
- }
- #define PF_CAN 29
- #define AF_CAN PF_CAN
- #define SIOCSCANBAUDRATE (SIOCDEVPRIVATE + 0)
- #define SIOCGCANBAUDRATE (SIOCDEVPRIVATE + 1)
- #define SOL_CAN_RAW (SOL_CAN_BASE + CAN_RAW)
- #define CAN_RAW_FILTER 1
- #define CAN_RAW_RECV_OWN_MSGS 0x4
- typedef __u32 can_baudrate_t;
- struct ifreq ifr[CHANCAN_NBR + 1];
- static void* thrd_can1_rx(void* thrdparam)
- {
- int i = 0;
- int rc = 0;
- struct can_frame frame;
- int chidx = 1;
- struct chancan_t* ch = &APPL.chancan[chidx];
- int is_ext_frm = 0;
- unsigned int id = 0;
- int pidx;
- struct FireAlarm_t* fa = NULL;
- syslog(LOG_INFO,"%s ENTER",__func__);
- while(1)
- {
- if(ch->sock <= 0)
- {
- usleep(100000);
- continue;
- }
- memset(&frame,0,sizeof(struct can_frame));
- rc = read(ch->sock,&frame,sizeof(struct can_frame));
- if(rc > 0)
- {
- ch->RdCnt += 1;
- if(frame.can_dlc)
- {
- is_ext_frm = (frame.can_id & CAN_EFF_FLAG) ? 1 : 0;
- if(is_ext_frm)
- {
- id = frame.can_id & CAN_EFF_MASK;
- }
- else
- {
- id = frame.can_id & CAN_SFF_MASK;
- }
- if(((id >> 16) & 0xFF) == 0xB0)
- {
- pidx = id & 0xFF;
- fa = &APPL.Fa[pidx];
- fa->T1 = frame.data[0] - 40;
- fa->T2 = frame.data[1] - 40;
- fa->Co = frame.data[2] * 256 + frame.data[3];
- fa->Voc = frame.data[4] * 256 + frame.data[5];
- if(frame.data[6] == 0xAA)
- {
- strcpy(fa->szSmokeFlag,"正常");
- fa->SmokeFlagVal = 0;
- }
- else if(frame.data[6] == 0x55)
- {
- strcpy(fa->szSmokeFlag,"预警");
- fa->SmokeFlagVal = 1;
- }
- else
- {
- strcpy(fa->szSmokeFlag,"未知");
- fa->SmokeFlagVal = -1;
- }
- fa->LevelVal = ((frame.data[7] >> 4) & 0x0F);
- if(fa->LevelVal == 0x00)
- {
- strcpy(fa->szLevel,"正常");
- }
- else if(fa->LevelVal == 0x01)
- {
- strcpy(fa->szLevel,"一级");
- }
- else if(fa->LevelVal == 0x02)
- {
- strcpy(fa->szLevel,"二级");
- }
- else if(fa->LevelVal == 0x03)
- {
- strcpy(fa->szLevel,"三级");
- }
- else if(fa->LevelVal == 0x04)
- {
- strcpy(fa->szLevel,"四级");
- }
- else
- {
- strcpy(fa->szLevel,"未知");
- }
- fa->ErrCodeVal = (frame.data[7] & 0x0F);
- if(fa->ErrCodeVal == 0x00)
- {
- strcpy(fa->szErrCode,"正常");
- }
- else if(fa->ErrCodeVal == 0x01)
- {
- strcpy(fa->szErrCode,"灭火器已启动");
- }
- else if(fa->ErrCodeVal == 0x02)
- {
- strcpy(fa->szErrCode,"传感器故障");
- }
- else if(fa->ErrCodeVal == 0x03)
- {
- strcpy(fa->szErrCode,"硬件故障");
- }
- else
- {
- strcpy(fa->szErrCode,"未知");
- }
- fa->LastUpdate = mg_millis();
- }
- }
- }
- else
- {
- APPL.chancan[chidx].RdFailcnt += 1;
- }
- }
- return NULL;
- }
- static void* thrd_can1(void* param)
- {
- int chidx = 1;
- struct chancan_t* ch = &APPL.chancan[chidx];
- struct sockaddr_can addr;
- int recv_own_msgs = 0; // set loop back: 1 enable 0 disable
- int rc = 0;
- pthread_t thrd_rx;
- struct can_frame frame;
- int64_t startts;
- unsigned char FaAdr = 1;
- int i;
- struct FireAlarm_t* fa = NULL;
- MG_INFO(("%s ENTER",__func__));
- appl_can_set_state(chidx,ST_CAN_INIT,ERR_CAN_NONE);
- while(1)
- {
- startts = mg_millis();
- for(i = 1; i <= 5; i++)
- {
- fa = &APPL.Fa[i];
- if(mg_millis() - fa->LastUpdate > 5000)
- {
- fa->CommState = ST_COMM_ERR;
- strcpy(fa->szCommState,"故障");
- }
- else
- {
- fa->CommState = ST_COMM_NORM;
- strcpy(fa->szCommState,"正常");
- }
- }
- switch(appl_can_get_state(chidx))
- {
- case ST_CAN_INIT:
- ch->sock = socket(PF_CAN,SOCK_RAW,CAN_RAW);
- if(ch->sock < 0)
- {
- appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
- }
- else
- {
- addr.can_family = AF_CAN;
- strcpy(ifr[chidx].ifr_name,ch->szdev);
- rc = ioctl(ch->sock,SIOCGIFINDEX,&ifr[chidx]);
- if(rc && ifr[chidx].ifr_ifindex == 0)
- {
- close(ch->sock);
- ch->sock = 0;
- appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
- }
- else
- {
- addr.can_ifindex = ifr[chidx].ifr_ifindex;
- setsockopt(ch->sock,SOL_CAN_RAW,CAN_RAW_RECV_OWN_MSGS,
- &recv_own_msgs,sizeof(recv_own_msgs));
- if(bind(ch->sock,(struct sockaddr*)&addr,sizeof(addr)) < 0)
- {
- close(ch->sock);
- ch->sock = 0;
- appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
- }
- else
- {
- if(pthread_create(&thrd_rx,NULL,thrd_can1_rx,NULL) != 0)
- {
- close(ch->sock);
- ch->sock = 0;
- appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
- }
- else
- {
- appl_can_set_state(chidx,ST_CHANCAN_RUN,ERR_CAN_NONE);
- }
- }
- }
- }
- break;
- case ST_CHANCAN_RUN:
- usleep(200000); // 200ms
- frame.can_id = 0x18A200F6 | (FaAdr << 8);
- FaAdr++;
- if(FaAdr > 5)
- {
- FaAdr = 1;
- }
- // e.frame.can_id = 0x18A200F6 | (0xFF << 8); //发送广播消息
- frame.can_id |= CAN_EFF_FLAG;
- frame.can_dlc = 2;
- frame.data[0] = 0x5A;
- frame.data[1] = 0x4E;
- frame.data[2] = 0;
- frame.data[3] = 0;
- frame.data[4] = 0;
- frame.data[5] = 0;
- frame.data[6] = 0;
- frame.data[7] = 0;
- write(ch->sock,(char*)&frame,sizeof(frame));
- ch->WrCnt += 1;
- break;
- case ST_CHANCAN_ERR:
- usleep(100000);
- break;
- default:
- // NEVER REACH HERE
- usleep(100000);
- break;
- }
- ch->Loopcnt += 1;
- ch->LoopTime = mg_millis() - startts;
- }
- MG_INFO(("%s EXIT",__func__));
- }
- static void* thrd_can2_rx(void* thrdparam)
- {
- int i = 0;
- int rc = 0;
- struct can_frame frame;
- int chidx = 2;
- struct chancan_t* ch = &APPL.chancan[chidx];
- int is_ext_frm = 0;
- unsigned int id = 0;
- struct Envicool5kW_t* dev = &APPL.Envicool5kW;
- syslog(LOG_INFO,"%s ENTER",__func__);
- while(1)
- {
- if(ch->sock <= 0)
- {
- syslog(LOG_INFO,"ch->sock <= 0");
- usleep(100000); // 100ms
- continue;
- }
- memset(&frame,0,sizeof(struct can_frame));
- rc = read(ch->sock,&frame,sizeof(struct can_frame));
- if(rc > 0)
- {
- ch->RdCnt += 1;
- if(frame.can_dlc)
- {
- is_ext_frm = (frame.can_id & CAN_EFF_FLAG) ? 1 : 0;
- if(is_ext_frm)
- {
- id = frame.can_id & CAN_EFF_MASK;
- }
- else
- {
- id = frame.can_id & CAN_SFF_MASK;
- }
- if(id == 0x18008040)
- {
- // syslog(LOG_INFO,"id=0x18008040");
- dev->LastUpdate1 = mg_millis();
- strcpy(dev->szLastUpdate1,appl_get_datetime_long());
- dev->WorkMode = frame.data[0] & 0x03; // byte1
- if(dev->WorkMode == 0)
- {
- strcpy(dev->szWorkMode,"停机");
- }
- else if(dev->WorkMode == 1)
- {
- strcpy(dev->szWorkMode,"制冷");
- }
- else if(dev->WorkMode == 2)
- {
- strcpy(dev->szWorkMode,"加热");
- }
- else if(dev->WorkMode == 3)
- {
- strcpy(dev->szWorkMode,"自循环");
- }
- else
- {
- strcpy(dev->szWorkMode,"未知");
- }
- dev->OutWaterTemp = frame.data[1] - 40;
- dev->InWaterTemp = frame.data[2] - 40;
- dev->EnvTemp = frame.data[3] - 40;
- dev->InWaterPre = frame.data[4] / 10.0;
- dev->OutWaterPre = frame.data[5] / 10.0;
- dev->ErrCode = frame.data[7] & 0x1f;
- dev->ErrLevel = (frame.data[7] >> 6) & 0x03;
- }
- else if(id == 0x18018040)
- {
- // syslog(LOG_INFO,"id=0x18018040");
- dev->LastUpdate2 = mg_millis();
- strcpy(dev->szLastUpdate2,appl_get_datetime_long());
- if((frame.data[0] & 0x01) == 0x01)
- {
- dev->CompState = 1;
- strcpy(dev->szCompState,"打开");
- }
- else
- {
- dev->CompState = 0;
- strcpy(dev->szCompState,"关闭");
- }
- if(((frame.data[0] >> 1) & 0x01) == 0x01)
- {
- dev->CompHeatStripState = 1;
- }
- else
- {
- dev->CompHeatStripState = 0;
- }
- if(((frame.data[0] >> 2) & 0x01) == 0x01)
- {
- dev->ElecHeatState = 1;
- strcpy(dev->szElecHeatState,"打开");
- }
- else
- {
- dev->ElecHeatState = 0;
- strcpy(dev->szElecHeatState,"关闭");
- }
- if(((frame.data[0] >> 3) & 0x01) == 0x01)
- {
- dev->PumpState = 1;
- strcpy(dev->szPumpState,"打开");
- }
- else
- {
- dev->PumpState = 0;
- strcpy(dev->szPumpState,"关闭");
- }
- if(((frame.data[0] >> 4) & 0x01) == 0x01)
- {
- dev->Fan1State = 1;
- strcpy(dev->szFan1State,"打开");
- }
- else
- {
- dev->Fan1State = 0;
- strcpy(dev->szFan1State,"关闭");
- }
- if(((frame.data[0] >> 5) & 0x01) == 0x01)
- {
- dev->Fan2State = 1;
- strcpy(dev->szFan2State,"打开");
- }
- else
- {
- dev->Fan2State = 0;
- strcpy(dev->szFan2State,"关闭");
- }
- if(((frame.data[0] >> 6) & 0x01) == 0x01)
- {
- dev->Fan3State = 1;
- strcpy(dev->szFan3State,"打开");
- }
- else
- {
- dev->Fan3State = 0;
- strcpy(dev->szFan3State,"关闭");
- }
- dev->CompRpm = frame.data[1] * 100;
- dev->PumpRpm = frame.data[2] * 100;
- }
- else if(id == 0x18068040)
- {
- // syslog(LOG_INFO,"id=0x18068040, err");
- dev->szErrMsg1[0] = 0;
- if((frame.data[0] >> 0) & 0x01)
- {
- strcat(dev->szErrMsg1,"出水压力传感器故障(进、出均故障)");
- }
- if((frame.data[0] >> 1) & 0x01)
- {
- strcat(dev->szErrMsg1,"交流过压告警");
- }
- if((frame.data[0] >> 2) & 0x01)
- {
- strcat(dev->szErrMsg1,"交流欠压告警");
- }
- if((frame.data[0] >> 3) & 0x01)
- {
- strcat(dev->szErrMsg1,"水箱缺水告警");
- }
- if((frame.data[0] >> 4) & 0x01)
- {
- strcat(dev->szErrMsg1,"水泵故障");
- }
- if((frame.data[0] >> 5) & 0x01)
- {
- strcat(dev->szErrMsg1,"水泵故障锁定");
- }
- }
- else if(id == 0x18078040)
- {
- // syslog(LOG_INFO,"id=0x18078040, err");
- dev->szErrMsg2[0] = 0;
- // byte1
- if((frame.data[0] >> 0) & 0x01)
- {
- strcat(dev->szErrMsg2,"出水压力传感器故障");
- }
- if((frame.data[0] >> 1) & 0x01)
- {
- strcat(dev->szErrMsg2,"回水压力传感器故障");
- }
- if((frame.data[0] >> 2) & 0x01)
- {
- strcat(dev->szErrMsg2,"低压传感器故障");
- }
- if((frame.data[0] >> 3) & 0x01)
- {
- strcat(dev->szErrMsg2,"出水温感故障");
- }
- if((frame.data[0] >> 4) & 0x01)
- {
- strcat(dev->szErrMsg2,"系统低压告警");
- }
- if((frame.data[0] >> 5) & 0x01)
- {
- strcat(dev->szErrMsg2,"系统高压开关告警");
- }
- if((frame.data[0] >> 6) & 0x01)
- {
- strcat(dev->szErrMsg2,"排气温度过高告警");
- }
- if((frame.data[0] >> 7) & 0x01)
- {
- strcat(dev->szErrMsg2,"CAN 通讯故障告警");
- }
- // byte2
- if((frame.data[1] >> 0) & 0x01)
- {
- strcat(dev->szErrMsg2,"吸气温感故障");
- }
- if((frame.data[1] >> 1) & 0x01)
- {
- strcat(dev->szErrMsg2,"制冷系统异常");
- }
- if((frame.data[1] >> 2) & 0x01)
- {
- strcat(dev->szErrMsg2,"低吸气过热度告警");
- }
- if((frame.data[1] >> 3) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器过压告警");
- }
- if((frame.data[1] >> 4) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器欠压告警");
- }
- if((frame.data[1] >> 5) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器过流告警");
- }
- if((frame.data[1] >> 6) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器过温告警");
- }
- if((frame.data[1] >> 7) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器通讯故障告警");
- }
- // byte3
- if((frame.data[2] >> 0) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器缺相告警");
- }
- if((frame.data[2] >> 1) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器其他故障告警");
- }
- if((frame.data[2] >> 2) & 0x01)
- {
- strcat(dev->szErrMsg2,"水泵压差低告警");
- }
- if((frame.data[2] >> 3) & 0x01)
- {
- strcat(dev->szErrMsg2,"排气温度过高锁定");
- }
- if((frame.data[2] >> 4) & 0x01)
- {
- strcat(dev->szErrMsg2,"系统高压锁定");
- }
- if((frame.data[2] >> 5) & 0x01)
- {
- strcat(dev->szErrMsg2,"系统低压锁定");
- }
- if((frame.data[2] >> 6) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器过流锁定");
- }
- if((frame.data[2] >> 7) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器过压锁定");
- }
- // byte4
- if((frame.data[3] >> 0) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器欠压锁定");
- }
- if((frame.data[3] >> 1) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器过温锁定");
- }
- if((frame.data[3] >> 2) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器缺相锁定");
- }
- if((frame.data[3] >> 3) & 0x01)
- {
- strcat(dev->szErrMsg2,"压缩机变频器其他故障锁定");
- }
- }
- else if(id == 0x18088040)
- {
- // syslog(LOG_INFO,"id=0x18088040, err");
- dev->szErrMsg3[0] = 0;
- // byte1
- if((frame.data[0] >> 0) & 0x01)
- {
- strcat(dev->szErrMsg3,"高压压力传感器故障");
- }
- if((frame.data[0] >> 1) & 0x01)
- {
- strcat(dev->szErrMsg3,"环境温感故障");
- }
- if((frame.data[0] >> 2) & 0x01)
- {
- strcat(dev->szErrMsg3,"回水温感故障");
- }
- if((frame.data[0] >> 3) & 0x01)
- {
- strcat(dev->szErrMsg3,"排气温感故障");
- }
- if((frame.data[0] >> 4) & 0x01)
- {
- strcat(dev->szErrMsg3,"冷凝温感故障");
- }
- if((frame.data[0] >> 5) & 0x01)
- {
- strcat(dev->szErrMsg3,"异常掉电告警");
- }
- if((frame.data[0] >> 6) & 0x01)
- {
- strcat(dev->szErrMsg3,"出水低温告警");
- }
- if((frame.data[0] >> 7) & 0x01)
- {
- strcat(dev->szErrMsg3,"出水高温告警");
- }
- // byte2
- if((frame.data[1] >> 0) & 0x01)
- {
- strcat(dev->szErrMsg3,"出水压力过高告警");
- }
- }
- }
- }
- else
- {
- APPL.chancan[chidx].RdFailcnt += 1;
- syslog(LOG_INFO,"can2 read fail");
- }
- }
- return NULL;
- }
- static void* thrd_can2(void* param)
- {
- int chidx = 2;
- struct Settings_t* set = &APPL.Set.s;
- struct chancan_t* ch = &APPL.chancan[chidx];
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- int* step = &ac->Step;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct sockaddr_can addr;
- int recv_own_msgs = 0; // set loop back: 1 enable 0 disable
- int rc = 0;
- pthread_t thrd_rx;
- struct can_frame frame;
- int64_t startts;
- int64_t Update1Intv;
- int64_t Update2Intv;
- int ret;
- syslog(LOG_INFO,"%s ENTER",__func__);
- ac->MaxUpdate1Intv = 0;
- ac->MaxUpdate2Intv = 0;
- appl_can_set_state(chidx,ST_CAN_INIT,ERR_CAN_NONE);
- while(1)
- {
- startts = mg_millis();
- Update1Intv = mg_millis() - ac->LastUpdate1;
- if(Update1Intv > ac->MaxUpdate1Intv)
- {
- ac->MaxUpdate1Intv = Update1Intv;
- }
- Update2Intv = mg_millis() - ac->LastUpdate2;
- if(Update2Intv > ac->MaxUpdate2Intv)
- {
- ac->MaxUpdate2Intv = Update2Intv;
- }
- if(Update1Intv < 900000 && Update2Intv < 900000)
- {
- ac->CommState = ST_COMM_NORM;
- strcpy(ac->szCommState,"正常");
- }
- else
- {
- ac->CommState = ST_COMM_ERR;
- strcpy(ac->szCommState,"故障");
- }
- switch(appl_can_get_state(chidx))
- {
- case ST_CAN_INIT:
- ch->sock = socket(PF_CAN,SOCK_RAW,CAN_RAW);
- if(ch->sock < 0)
- {
- appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
- }
- else
- {
- addr.can_family = AF_CAN;
- strcpy(ifr[chidx].ifr_name,ch->szdev);
- rc = ioctl(ch->sock,SIOCGIFINDEX,&ifr[chidx]);
- if(rc && ifr[chidx].ifr_ifindex == 0)
- {
- close(ch->sock);
- ch->sock = 0;
- appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
- }
- else
- {
- addr.can_ifindex = ifr[chidx].ifr_ifindex;
- setsockopt(ch->sock,SOL_CAN_RAW,CAN_RAW_RECV_OWN_MSGS,
- &recv_own_msgs,sizeof(recv_own_msgs));
- if(bind(ch->sock,(struct sockaddr*)&addr,sizeof(addr)) < 0)
- {
- close(ch->sock);
- ch->sock = 0;
- appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
- }
- else
- {
- if(pthread_create(&thrd_rx,NULL,thrd_can2_rx,NULL) != 0)
- {
- close(ch->sock);
- ch->sock = 0;
- appl_can_set_state(chidx,ST_CHANCAN_ERR,ERR_CAN_INIT_FAIL);
- }
- else
- {
- appl_can_set_state(chidx,ST_CHANCAN_RUN,ERR_CAN_NONE);
- }
- }
- }
- }
- break;
- case ST_CHANCAN_RUN:
- usleep(1000 * 1000);
- frame.can_id = 0x04904000;
- frame.can_id |= CAN_EFF_FLAG;
- frame.can_dlc = 8;
- frame.data[1] = 0;
- frame.data[2] = 0;
- frame.data[3] = 0;
- frame.data[5] = 0;
- frame.data[6] = 0;
- frame.data[7] = 0;
- if(ac->CtlMode == AC_CTLMOD_NON_EMS)
- {
- frame.data[0] = ac->SetMode;
- frame.data[4] = ac->SetTemp + 40;
- ret = write(ch->sock,(char*)&frame,sizeof(frame));
- // syslog(LOG_INFO,"write ret=%d",ret);
- ch->WrCnt += 1;
- }
- else if(ac->CtlMode == AC_CTLMOD_EMS)
- {
- if(bms->CommState == ST_COMM_NORM)
- {
- switch(*step)
- {
- case 0:
- if(bms->AvgCellT < set->HeatTemp)
- {
- frame.data[0] = 2; // Heat
- frame.data[4] = set->HeatTempSet + 40;
- *step = 1;
- }
- else if(bms->AvgCellT > set->CoolTemp)
- {
- frame.data[0] = 1; // cool
- frame.data[4] = set->CoolTempSet + 40;
- *step = 2;
- }
- else
- {
- frame.data[0] = 3; // circulate
- }
- ret = write(ch->sock,(char*)&frame,sizeof(frame));
- // syslog(LOG_INFO,"write ret=%d",ret);
- ch->WrCnt += 1;
- break;
- case 1: // heat
- if(bms->AvgCellT > set->HeatTemp + set->HeatGap)
- {
- frame.data[0] = 3;
- *step = 0;
- }
- ret = write(ch->sock,(char*)&frame,sizeof(frame));
- // syslog(LOG_INFO,"write ret=%d",ret);
- ch->WrCnt += 1;
- break;
- case 2: // cool
- if(bms->AvgCellT < set->CoolTemp - set->CoolGap)
- {
- frame.data[0] = 3;
- *step = 0;
- }
- ret = write(ch->sock,(char*)&frame,sizeof(frame));
- // syslog(LOG_INFO, "write ret=%d", ret);
- ch->WrCnt += 1;
- break;
- default:
- // NEVER REACH HERE
- break;
- }
- }
- }
- break;
- case ST_CHANCAN_ERR:
- usleep(100000);
- break;
- default:
- // NEVER REACH HERE
- usleep(100000);
- break;
- }
- ch->Loopcnt += 1;
- ch->LoopTime = mg_millis() - startts;
- }
- MG_INFO(("%s EXIT",__func__));
- }
- static void* thrd_dido(void* param)
- {
- struct stat file_info;
- char buf[128] = { 0 };
- int rdsize;
- int exported;
- int fd_value;
- int fd_export;
- int fd_direction;
- struct Dido_t* dido = &APPL.Dido;
- struct Ctl_t* ctl = &APPL.Ctl;
- syslog(LOG_INFO,"%s ENTER",__func__);
- appl_dido_set_state(ST_DIDO_INIT,ERR_DIDO_NONE);
- while(1)
- {
- usleep(1000000); // 1s
- switch(dido->State)
- {
- case ST_DIDO_INIT:
- // *************************************
- // set gpio488 1#水浸
- // *************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio488");
- if(stat(buf,&file_info) != -1)
- {
- printf("gpio480 already exported\n");
- exported = 1;
- }
- else
- {
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open gpio488 fail when export\n");
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- if(write(fd_export,"488",3) == -1)
- {
- printf("write path %s fail:%s\n",buf,strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- }
- if(exported == 1)
- {
- // 设置gpio方向
- sprintf(buf,"/sys/class/gpio/gpio488/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction %s fail: %s\n",buf,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_IN);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction %s fail:%s\n",buf,strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_direction);
- printf("gpio480 ok\n");
- }
- }
- }
- // ***********************************************
- // set gpio489 2#水浸
- // ***********************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio489");
- if(stat(buf,&file_info) != -1)
- {
- printf("stat : gpio489 path exported: %s\n",buf);
- exported = 1;
- }
- else
- {
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- if(write(fd_export,"489",3) == -1)
- {
- printf("write path fail:%s\n",strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- }
- if(exported == 1)
- {
- // 设置gpio489方向
- sprintf(buf,"/sys/class/gpio/gpio489/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction fail: %s\n",strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_IN);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction fail:%s\n",strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_direction);
- }
- }
- }
- // ***************************************
- // set gpio491 及安盾消防触发反馈
- // ***************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio491");
- if(stat(buf,&file_info) != -1)
- {
- printf("stat : gpio491 path exported: %s\n",buf);
- exported = 1;
- }
- else
- {
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- if(write(fd_export,"491",3) == -1)
- {
- printf("write path %s fail\n",strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- }
- if(exported == 1)
- {
- // 设置gpio方向
- sprintf(buf,"/sys/class/gpio/gpio491/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction fail: %s\n",strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_IN);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction %s fail\n",strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_direction);
- }
- }
- }
- // ********************************************
- // set gpio134 前门磁
- // ********************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio134");
- if(stat(buf,&file_info) != -1)
- {
- printf("gpio134 already exported\n");
- exported = 1;
- }
- else
- {
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- if(write(fd_export,"134",3) == -1)
- {
- printf("write path %s fail\n",strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- if(exported == 1)
- {
- // 设置gpio方向
- sprintf(buf,"/sys/class/gpio/gpio134/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction fail: %s\n",strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_IN);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction %s fail\n",strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_direction);
- }
- }
- }
- // ***************************************
- // set gpio135 后门磁
- // ***************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio135");
- if(stat(buf,&file_info) != -1)
- {
- printf("stat : gpio135 path exported: %s\n",buf);
- exported = 1;
- }
- else
- {
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- if(write(fd_export,"135",3) == -1)
- {
- printf("write path %s fail\n",strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- }
- if(exported == 1)
- {
- // 设置gpio方向
- sprintf(buf,"/sys/class/gpio/gpio135/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction fail: %s\n",strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_IN);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction %s fail\n",strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_direction);
- }
- }
- }
- // **************************************************
- // set gpio137 急停
- // **************************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio137");
- if(stat(buf,&file_info) != -1)
- {
- printf("stat : gpio137 path exported: %s\n",buf);
- exported = 1;
- }
- else
- {
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- if(write(fd_export,"137",3) == -1)
- {
- printf("write path %s fail\n",strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- }
- if(exported == 1)
- {
- // 设置gpio方向
- sprintf(buf,"/sys/class/gpio/gpio137/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction fail: %s\n",strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_IN);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction %s fail\n",strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_direction);
- }
- }
- }
- // ************************************************
- // set gpio480 红灯
- // ************************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio480");
- if(stat(buf,&file_info) != -1)
- {
- printf("gpio480 already exported\n");
- exported = 1;
- }
- else
- {
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- if(write(fd_export,"480",3) == -1)
- {
- printf("write path %s fail\n",strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- }
- if(exported == 1)
- {
- // 设置gpio方向
- sprintf(buf,"/sys/class/gpio/gpio480/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction fail: %s\n",strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_OUT);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction %s fail\n",strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- printf("gpio480 set ok");
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_RUN,ERR_DIDO_NONE);
- }
- }
- }
- // ************************************************
- // set gpio481 绿灯
- // ************************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio481");
- if(stat(buf,&file_info) != -1)
- {
- printf("stat : gpio481 path exported: %s\n",buf);
- exported = 1;
- }
- else
- {
- printf("%s, exporting gpio481\n",__func__);
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- if(write(fd_export,"481",3) == -1)
- {
- printf("write path %s fail\n",strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- }
- if(exported == 1)
- {
- // 设置gpio方向
- sprintf(buf,"/sys/class/gpio/gpio481/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction fail: %s\n",strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_OUT);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction %s fail\n",strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_direction);
- }
- }
- }
- // ************************************************
- // set gpio482 蓝灯
- // ************************************************
- exported = 0;
- sprintf(buf,"/sys/class/gpio/gpio482");
- if(stat(buf,&file_info) != -1)
- {
- printf("stat : gpio482 path exported: %s\n",buf);
- exported = 1;
- }
- else
- {
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export == -1)
- {
- printf("open path %s failed : %s\n",EXPORT_PATH,strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- if(write(fd_export,"482",3) == -1)
- {
- printf("write path %s fail\n",strerror(errno));
- close(fd_export);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_export);
- exported = 1;
- }
- }
- }
- if(exported == 1)
- {
- // 设置gpio方向
- sprintf(buf,"/sys/class/gpio/gpio482/direction");
- fd_direction = open(buf,O_RDWR);
- if(fd_direction == -1)
- {
- printf("open direction fail: %s\n",strerror(errno));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- sprintf(buf,"%s",DIR_OUT);
- if(write(fd_direction,buf,strlen(buf)) == -1)
- {
- printf("write direction %s fail\n",strerror(errno));
- close(fd_direction);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_INIT_FAIL);
- continue;
- }
- else
- {
- close(fd_direction);
- }
- }
- }
- // *************************************
- // set gpio483 蜂鸣器
- // *************************************
- // exported = 0;
- // sprintf(buf, "/sys/class/gpio/gpio483");
- // if (stat(buf, &file_info) != -1){
- // printf("stat : gpio483 path exported: %s\n", buf);
- // exported = 1;
- // }else{
- // fd_export = open(EXPORT_PATH, O_WRONLY);
- // if (fd_export == -1){
- // printf("open path %s failed : %s\n", EXPORT_PATH,
- // strerror(errno)); appl_dido_set_state(ST_DIDO_ERR,
- // ERR_DIDO_INIT_FAIL); continue;
- // }else{
- // if (write(fd_export, "483", 3) == -1){
- // printf("write path %s fail\n", strerror(errno));
- // close(fd_export);
- // appl_dido_set_state(ST_DIDO_ERR, ERR_DIDO_INIT_FAIL);
- // continue;
- // }else{
- // close(fd_export);
- // exported = 1;
- // }
- // }
- // }
- // if(exported == 1){
- // // 设置gpio方向
- // sprintf(buf, "/sys/class/gpio/gpio483/direction");
- // fd_direction = open(buf, O_RDWR);
- // if (fd_direction == -1){
- // printf("open direction fail: %s\n", strerror(errno));
- // appl_dido_set_state(ST_DIDO_ERR, ERR_DIDO_INIT_FAIL);
- // continue;
- // }else{
- // sprintf(buf, "%s", DIR_OUT);
- // if (write(fd_direction, buf, strlen(buf)) == -1){
- // printf("write direction %s fail\n", strerror(errno));
- // close(fd_direction);
- // appl_dido_set_state(ST_DIDO_ERR, ERR_DIDO_INIT_FAIL);
- // continue;
- // }else{
- // close(fd_direction);
- // appl_dido_set_state(ST_DIDO_RUN, ERR_DIDO_NONE);
- // MG_INFO(("%s Goto Run State",__func__));
- // }
- // }
- // }
- break;
- case ST_DIDO_RUN:
- if(dido->Cmd == CMD_DIDO_SET_LEDMOD)
- {
- dido->Cmd = CMD_DIDO_DONE;
- appl_dido_set_led(dido->CmdParam);
- }
- if(ctl->State == CTL_ST_RUN)
- {
- if(ctl->Ap > 0)
- { // CHG
- appl_dido_set_led(LEDMODE_BLUE);
- }
- else if(ctl->Ap < 0)
- { // DHG
- appl_dido_set_led(LEDMODE_GREEN);
- }
- else
- {
- appl_dido_set_led(LEDMODE_WHITE);
- }
- }
- else if(ctl->State == CTL_ST_ERR)
- {
- appl_dido_set_led(LEDMODE_RED);
- }
- else if(ctl->State == CTL_ST_STOP)
- {
- appl_dido_set_led(LEDMODE_OFF);
- }
- // read 488 1#水浸
- sprintf(buf,"/sys/class/gpio/gpio488/value");
- fd_value = open(buf,O_RDONLY);
- if(fd_value == -1)
- {
- MG_INFO(("%s 488 open fail, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- rdsize = read(fd_value,buf,sizeof(buf));
- if(rdsize < 0)
- {
- MG_INFO(("%s 488 read fail, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- dido->WaterDec1 = 1 - atoi(buf);
- if(dido->WaterDec1 == 1)
- {
- strcpy(dido->szWaterDec1,"有水");
- }
- else if(dido->WaterDec1 == 0)
- {
- strcpy(dido->szWaterDec1,"无水");
- }
- else
- {
- strcpy(dido->szWaterDec1,"未知");
- MG_INFO(("%s 488 unknown value, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- }
- close(fd_value);
- }
- // read 489 2#水浸
- sprintf(buf,"/sys/class/gpio/gpio489/value");
- fd_value = open(buf,O_RDONLY);
- if(fd_value == -1)
- {
- syslog(LOG_INFO,"%s 489 open fail, Goto Err State",__func__);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- rdsize = read(fd_value,buf,sizeof(buf));
- if(rdsize < 0)
- {
- syslog(LOG_INFO,"%s 489 read fail, Goto Err State",__func__);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- dido->WaterDec2 = 1 - atoi(buf);
- if(dido->WaterDec2 == 1)
- {
- strcpy(dido->szWaterDec2,"有水");
- }
- else if(dido->WaterDec2 == 0)
- {
- strcpy(dido->szWaterDec2,"无水");
- }
- else
- {
- strcpy(dido->szWaterDec2,"未知");
- syslog(LOG_INFO,"%s 489 unknown value, Goto Err State",
- __func__);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- }
- close(fd_value);
- }
- // read 491, 及安盾消防触发反馈
- sprintf(buf,"/sys/class/gpio/gpio491/value");
- fd_value = open(buf,O_RDONLY);
- if(fd_value == -1)
- {
- syslog(LOG_INFO,"%s 491 open fail, Goto Err State",__func__);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- rdsize = read(fd_value,buf,sizeof(buf));
- if(rdsize < 0)
- {
- syslog(LOG_INFO,"%s 491 read fail, Goto Err State",__func__);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- dido->FeEruptFb = atoi(buf);
- if(dido->FeEruptFb == 1)
- {
- strcpy(dido->szFeEruptFb,"触发");
- }
- else if(dido->FeEruptFb == 0)
- {
- strcpy(dido->szFeEruptFb,"未触发");
- }
- else
- {
- strcpy(dido->szFeEruptFb,"未知");
- syslog(LOG_INFO,"%s 491 unknown value, Goto Err State",
- __func__);
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- }
- close(fd_value);
- }
- // read 134 前门磁
- sprintf(buf,"/sys/class/gpio/gpio134/value");
- fd_value = open(buf,O_RDONLY);
- if(fd_value == -1)
- {
- MG_INFO(("%s 134 open fail, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- rdsize = read(fd_value,buf,sizeof(buf));
- if(rdsize < 0)
- {
- MG_INFO(("%s 134 read fail, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- dido->FrontDoor = atoi(buf);
- if(dido->FrontDoor == 0)
- {
- strcpy(dido->szFrontDoor,"关");
- }
- else if(dido->FrontDoor == 1)
- {
- strcpy(dido->szFrontDoor,"开");
- }
- else
- {
- strcpy(dido->szFrontDoor,"未知");
- MG_INFO(("%s 134 unknown value, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- }
- close(fd_value);
- }
- // read 135 后门磁
- sprintf(buf,"/sys/class/gpio/gpio135/value");
- fd_value = open(buf,O_RDONLY);
- if(fd_value == -1)
- {
- MG_INFO(("%s 135 open fail, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- rdsize = read(fd_value,buf,sizeof(buf));
- if(rdsize < 0)
- {
- MG_INFO(("%s 113534 read fail, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- dido->BackDoor = atoi(buf);
- if(dido->BackDoor == 0)
- {
- strcpy(dido->szBackDoor,"关");
- }
- else if(dido->BackDoor == 1)
- {
- strcpy(dido->szBackDoor,"开");
- }
- else
- {
- strcpy(dido->szBackDoor,"未知");
- MG_INFO(("%s 135 invalid value, Goto Err State",__func__));
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- }
- close(fd_value);
- }
- // read 137 急停
- sprintf(buf,"/sys/class/gpio/gpio137/value");
- fd_value = open(buf,O_RDONLY);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- rdsize = read(fd_value,buf,sizeof(buf));
- if(rdsize < 0)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- else
- {
- dido->EmgStop = atoi(buf);
- if(dido->EmgStop == 0)
- {
- strcpy(dido->szEmgStop,"按下");
- }
- else if(dido->EmgStop == 1)
- {
- strcpy(dido->szEmgStop,"未按下");
- }
- else
- {
- strcpy(dido->szEmgStop,"未知");
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_READ_FAIL);
- continue;
- }
- }
- close(fd_value);
- }
- dido->LastUpdate = mg_millis();
- strcpy(dido->szLastUpdate,appl_get_datetime_long());
- break;
- case ST_DIDO_ERR:
- break;
- default:
- break;
- }
- }
- }
- void appl_chan485_lock(int idx)
- {
- // pthread_mutex_lock(&APPL.chan485[idx].mutex);
- }
- void appl_chan485_unlock(int idx)
- {
- // pthread_mutex_unlock(&APPL.chan485[idx].mutex);
- }
- void appl_485_set_state(int idx,int s,int e)
- {
- struct chan485_t* c = &APPL.chan485[idx];
- c->state = s;
- switch(c->state)
- {
- case ST_485_INIT:
- strcpy(c->szstate,"初始化");
- break;
- case ST_485_RUN:
- strcpy(c->szstate,"运行");
- break;
- case ST_485_ERR:
- strcpy(c->szstate,"故障");
- break;
- default:
- strcpy(c->szstate,"未知");
- break;
- }
- c->err = e;
- switch(e)
- {
- case ERR_485_NONE:
- strcpy(c->szerr,"无");
- break;
- case ERR_485_INIT_FAIL:
- strcpy(c->szerr,"初始化失败");
- break;
- default:
- strcpy(c->szerr,"未知");
- break;
- }
- }
- int appl_chan485_get_state(int idx)
- {
- return APPL.chan485[idx].state;
- }
- void appl_can_set_state(int idx,int s,int e)
- {
- struct chancan_t* c = &APPL.chancan[idx];
- c->State = s;
- switch(c->State)
- {
- case ST_CAN_INIT:
- strcpy(c->szState,"初始化");
- break;
- case ST_CHANCAN_RUN:
- strcpy(c->szState,"运行");
- break;
- case ST_CHANCAN_ERR:
- strcpy(c->szState,"故障");
- break;
- default:
- strcpy(c->szState,"未知");
- break;
- }
- c->Err = e;
- switch(e)
- {
- case ERR_CAN_NONE:
- strcpy(c->szErr,"无");
- break;
- case ERR_CAN_INIT_FAIL:
- strcpy(c->szErr,"初始化失败");
- break;
- default:
- break;
- }
- }
- // 声光报警
- void appl_dido_set_alarm(int en)
- {
- struct Dido_t* dido = &APPL.Dido;
- char buf[128] = { 0 };
- int fd_value;
- int ret = -1;
- // write 482
- sprintf(buf,"/sys/class/gpio/gpio482/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- ret = -1;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",en); // 0 : 不叫 1:叫
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- ret = 0;
- }
- syslog(LOG_INFO,"%s, En:%d, ret:%d",__func__,en,ret);
- }
- // 消防喷发确认
- void appl_dido_set_fe_confirm(int en)
- {
- struct Dido_t* dido = &APPL.Dido;
- char buf[128] = { 0 };
- int fd_value;
- int ret = -1;
- // write 480
- sprintf(buf,"/sys/class/gpio/gpio480/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- ret = -1;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",en);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- ret = 0;
- }
- syslog(LOG_INFO,"%s, En:%d, ret:%d",__func__,en,ret);
- }
- void appl_dido_set_led(int m)
- {
- struct Dido_t* dido = &APPL.Dido;
- char buf[128] = { 0 };
- int fd_value;
- int rc;
- dido->LedMode = m;
- switch(m)
- {
- case LEDMODE_OFF:
- strcpy(dido->szLedMode,"灭");
- // write 480 Red
- sprintf(buf,"/sys/class/gpio/gpio480/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1); // !!!
- rc = write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 481 Green
- sprintf(buf,"/sys/class/gpio/gpio481/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1); // !!!
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 482 Blue Blue
- sprintf(buf,"/sys/class/gpio/gpio482/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- ;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1); // !!!
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- break;
- case LEDMODE_WHITE:
- strcpy(dido->szLedMode,"白");
- // write 480 Red
- sprintf(buf,"/sys/class/gpio/gpio480/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- printf("fd_value -1\n");
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",0); // !!!
- rc = write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 481 Green
- sprintf(buf,"/sys/class/gpio/gpio481/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",0);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 482 Blue
- sprintf(buf,"/sys/class/gpio/gpio482/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- ;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",0);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- break;
- case LEDMODE_RED:
- strcpy(dido->szLedMode,"红");
- // write 480 Red
- sprintf(buf,"/sys/class/gpio/gpio480/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",0);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 481 Green
- sprintf(buf,"/sys/class/gpio/gpio481/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 482 Blue
- sprintf(buf,"/sys/class/gpio/gpio482/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- ;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- break;
- case LEDMODE_GREEN:
- strcpy(dido->szLedMode,"绿");
- // write 480 Red
- sprintf(buf,"/sys/class/gpio/gpio480/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1); // !!
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 481 Green
- sprintf(buf,"/sys/class/gpio/gpio481/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",0); // !!
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 482 Blue
- sprintf(buf,"/sys/class/gpio/gpio482/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- ;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- break;
- case LEDMODE_BLUE:
- strcpy(dido->szLedMode,"蓝");
- // write 480 Red
- sprintf(buf,"/sys/class/gpio/gpio480/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 481 Green
- sprintf(buf,"/sys/class/gpio/gpio481/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- appl_dido_set_state(ST_DIDO_ERR,ERR_DIDO_WRITE_FAIL);
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",1);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- // write 482 Blue
- sprintf(buf,"/sys/class/gpio/gpio482/value");
- fd_value = open(buf,O_RDWR);
- if(fd_value == -1)
- {
- ;
- }
- else
- {
- memset(buf,0,sizeof(buf));
- lseek(fd_value,0,SEEK_SET);
- sprintf(buf,"%d",0);
- write(fd_value,buf,strlen(buf));
- close(fd_value);
- }
- break;
- default:
- break;
- }
- }
- int appl_can_get_state(int idx)
- {
- return APPL.chancan[idx].State;
- }
- eMBErrorCode eMBRegInputCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
- USHORT usAddress,USHORT usNRegs)
- {
- eMBErrorCode eStatus = MB_ENOERR;
- int iRegIndex;
- return MB_ENOREG;
- }
- eMBErrorCode eMBRegHoldingCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
- USHORT usAddress,USHORT usNRegs,
- eMBRegisterMode eMode)
- {
- eMBErrorCode eStatus = MB_ENOERR;
- int iRegIndex;
- int i = 0;
- return eStatus;
- }
- eMBErrorCode eMBRegCoilsCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
- USHORT usAddress,USHORT usNCoils,
- eMBRegisterMode eMode)
- {
- return MB_ENOREG;
- }
- eMBErrorCode eMBRegDiscreteCB(fmodbus_t* ctx,UCHAR* pucRegBuffer,
- USHORT usAddress,USHORT usNDiscrete)
- {
- return MB_ENOREG;
- }
- static void appl_ctl_set_workmode(int m)
- {
- struct Ctl_t* ctl = &APPL.Ctl;
- ctl->WorkMode = m;
- switch(m)
- {
- case CTL_WORKMODE_SLAVE:
- strcpy(ctl->szWorkMode,"从机");
- break;
- case CTL_WORKMODE_PCURV:
- strcpy(ctl->szWorkMode,"功率曲线");
- break;
- default:
- break;
- }
- syslog(LOG_INFO,"%s, Ctl Workmode is Set To %s",__func__,ctl->szWorkMode);
- }
- void appl_485_set_485mode(void)
- {
- int fd;
- struct serial_rs485 rs485conf = { 0 };
- int ret;
- // 1# 485
- fd = open("/dev/ttymxc1",O_RDWR | O_NOCTTY);
- if(fd <= 0)
- {
- syslog(LOG_INFO,"%s, Open ttymxc1 Fail",__func__);
- }
- else
- {
- /* get configure from device */
- ret = ioctl(fd,TIOCGRS485,&rs485conf);
- if(ret < 0)
- {
- // failed
- syslog(LOG_INFO,"%s, ioctl ttymxc1 Fail",__func__);
- }
- /* set enable rs485 mode in configure */
- /* Enable RS485 mode: */
- rs485conf.flags |= SER_RS485_ENABLED;
- /* Set logical level for RTS pin equal to 1 when sending: */
- rs485conf.flags |= SER_RS485_RTS_ON_SEND;
- /* Set logical level for RTS pin equal to 0 after sending: */
- rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
- /* Set this flag if you want to receive data even whilst sending data */
- rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
- /* Set rts delay before send, if needed: */
- rs485conf.delay_rts_before_send = 0; // in miliseconds
- /* Set rts delay after send, if needed: */
- rs485conf.delay_rts_after_send = 0; // in miliseconds
- ret = ioctl(fd,TIOCSRS485,&rs485conf);
- if(ret < 0)
- {
- /* Error handling. See errno. */
- syslog(LOG_INFO,"%s, Set ttymxc1 485 Fail",__func__);
- }
- close(fd);
- }
- // 2# 485
- fd = open("/dev/ttymxc2",O_RDWR | O_NOCTTY);
- if(fd <= 0)
- {
- syslog(LOG_INFO,"%s, Open ttymxc2 Fail",__func__);
- }
- else
- {
- /* get configure from device */
- ret = ioctl(fd,TIOCGRS485,&rs485conf);
- if(ret < 0)
- {
- // failed
- syslog(LOG_INFO,"%s, ioctl ttymxc2 Fail",__func__);
- }
- /* set enable rs485 mode in configure */
- /* Enable RS485 mode: */
- rs485conf.flags |= SER_RS485_ENABLED;
- /* Set logical level for RTS pin equal to 1 when sending: */
- rs485conf.flags |= SER_RS485_RTS_ON_SEND;
- /* Set logical level for RTS pin equal to 0 after sending: */
- rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
- /* Set this flag if you want to receive data even whilst sending data */
- rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
- /* Set rts delay before send, if needed: */
- rs485conf.delay_rts_before_send = 0; // in miliseconds
- /* Set rts delay after send, if needed: */
- rs485conf.delay_rts_after_send = 0; // in miliseconds
- ret = ioctl(fd,TIOCSRS485,&rs485conf);
- if(ret < 0)
- {
- /* Error handling. See errno. */
- syslog(LOG_INFO,"%s, Set ttymxc2 485 Fail",__func__);
- }
- close(fd);
- }
- // 3# 485
- fd = open("/dev/ttymxc3",O_RDWR | O_NOCTTY);
- if(fd <= 0)
- {
- syslog(LOG_INFO,"%s, Open ttymxc3 Fail",__func__);
- }
- else
- {
- /* get configure from device */
- ret = ioctl(fd,TIOCGRS485,&rs485conf);
- if(ret < 0)
- {
- // failed
- syslog(LOG_INFO,"%s, ioctl ttymxc3 Fail",__func__);
- }
- /* set enable rs485 mode in configure */
- /* Enable RS485 mode: */
- rs485conf.flags |= SER_RS485_ENABLED;
- /* Set logical level for RTS pin equal to 1 when sending: */
- rs485conf.flags |= SER_RS485_RTS_ON_SEND;
- /* Set logical level for RTS pin equal to 0 after sending: */
- rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
- /* Set this flag if you want to receive data even whilst sending data */
- rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
- /* Set rts delay before send, if needed: */
- rs485conf.delay_rts_before_send = 0; // in miliseconds
- /* Set rts delay after send, if needed: */
- rs485conf.delay_rts_after_send = 0; // in miliseconds
- ret = ioctl(fd,TIOCSRS485,&rs485conf);
- if(ret < 0)
- {
- /* Error handling. See errno. */
- syslog(LOG_INFO,"%s, Set ttymxc3 485 Fail",__func__);
- }
- close(fd);
- }
- // 4# 485
- fd = open("/dev/ttymxc5",O_RDWR | O_NOCTTY);
- if(fd <= 0)
- {
- syslog(LOG_INFO,"%s, Open ttymxc5 Fail",__func__);
- }
- else
- {
- /* get configure from device */
- ret = ioctl(fd,TIOCGRS485,&rs485conf);
- if(ret < 0)
- {
- // failed
- syslog(LOG_INFO,"%s, ioctl ttymxc5 Fail",__func__);
- }
- /* set enable rs485 mode in configure */
- /* Enable RS485 mode: */
- rs485conf.flags |= SER_RS485_ENABLED;
- /* Set logical level for RTS pin equal to 1 when sending: */
- rs485conf.flags |= SER_RS485_RTS_ON_SEND;
- /* Set logical level for RTS pin equal to 0 after sending: */
- rs485conf.flags &= ~SER_RS485_RTS_AFTER_SEND;
- /* Set this flag if you want to receive data even whilst sending data */
- rs485conf.flags &= ~SER_RS485_RX_DURING_TX;
- /* Set rts delay before send, if needed: */
- rs485conf.delay_rts_before_send = 0; // in miliseconds
- /* Set rts delay after send, if needed: */
- rs485conf.delay_rts_after_send = 0; // in miliseconds
- ret = ioctl(fd,TIOCSRS485,&rs485conf);
- if(ret < 0)
- {
- /* Error handling. See errno. */
- syslog(LOG_INFO,"%s, Set ttymxc5 485 Fail",__func__);
- }
- close(fd);
- }
- }
- static void appl_ctl_set_state(int s,int e)
- {
- struct Ctl_t* ctl = &APPL.Ctl;
- ctl->Step = 0;
- ctl->State = s;
- switch(s)
- {
- case CTL_ST_LAUNCH:
- strcpy(ctl->szState,"启动");
- break;
- case CTL_ST_STDBY:
- strcpy(ctl->szState,"监控");
- break;
- case CTL_ST_STOP:
- strcpy(ctl->szState,"停机");
- break;
- case CTL_ST_RUN:
- strcpy(ctl->szState,"运行");
- break;
- case CTL_ST_ERR:
- strcpy(ctl->szState,"故障");
- break;
- default:
- strcpy(ctl->szState,"未知");
- break;
- }
- ctl->Err = e;
- switch(e)
- {
- case CTL_ERR_NONE:
- strcpy(ctl->szErr,"无");
- break;
- case CTL_ERR_LAUNCH_COMMERR_DETECTED:
- strcpy(ctl->szErr,"启动状态下检测到通信故障");
- break;
- case CTL_ERR_LAUNCH_CFGERR:
- strcpy(ctl->szErr,"启动状态下检测到参数配置故障");
- break;
- case CTL_ERR_STDBY_COMMERR_DETECTED:
- strcpy(ctl->szErr,"监控状态下检测到通信故障");
- break;
- case CTL_ERR_STDBY_WAIT_PCS_STOP_TIMEOUT:
- strcpy(ctl->szErr,"监控状态下等待PCS停机超时");
- break;
- case CTL_ERR_STDBY_WAIT_PCS_APS0_TIMEOUT:
- strcpy(ctl->szErr,"监控状态下等待PCS有功功率设定值为0超时");
- break;
- case CTL_ERR_STOP_COMMERR_DETECTED:
- strcpy(ctl->szErr,"停机状态下检测到通信故障");
- break;
- case CTL_ERR_STOP_PCS_NOT_STOP_DETECTED:
- strcpy(ctl->szErr,"停机状态下检测到PCS非停机");
- break;
- case CTL_ERR_STOP_WAIT_PCS_START_TIMEOUT:
- strcpy(ctl->szErr,"停机状态下等待PCS运行超时");
- break;
- case CTL_ERR_RUN_COMMERR_DETECTED:
- strcpy(ctl->szErr,"运行状态下检测到通信故障");
- break;
- case CTL_ERR_RUN_PCS_NOT_START_DETECTED:
- strcpy(ctl->szErr,"运行状态下检测到PCS非运行");
- break;
- case CTL_ERR_RUN_WAIT_PCS_STOP_TIMEOUT:
- strcpy(ctl->szErr,"运行状态下等待PCS停机超时");
- break;
- case CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT:
- strcpy(ctl->szErr,"运行状态下等待PCS有功功率设定值为0超时");
- break;
- case CTL_ERR_ERR_COMMERR_DETECTED:
- strcpy(ctl->szErr,"故障状态下检测到通信故障");
- break;
- default:
- strcpy(ctl->szErr,"未知");
- break;
- }
- }
- static int appl_ctl_check_comm_state_slave(void)
- {
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- static int bFirstErr = 1;
- if(pcs->CommState == ST_COMM_NORM && bms->CommState == ST_COMM_NORM &&
- ac->CommState == ST_COMM_NORM)
- {
- if(bFirstErr == 0)
- {
- bFirstErr = 1;
- }
- return 0;
- }
- else
- {
- if(bFirstErr == 1)
- {
- bFirstErr = 0;
- syslog(LOG_INFO,"%s, Err Detected, PCS:%d,BMS:%d,AC:%d",__func__,
- pcs->CommState,bms->CommState,ac->CommState);
- }
- return -1;
- }
- }
- static int appl_ctl_check_comm_state_pcurv(void)
- {
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- static int bFirstErr = 1;
- if(pcs->CommState == ST_COMM_NORM
- && bms->CommState == ST_COMM_NORM
- && ac->CommState == ST_COMM_NORM
- /*&& gm->CommState == ST_COMM_NORM
- && tm->CommState == ST_COMM_NORM*/)
- {
- if(bFirstErr == 0)
- {
- bFirstErr = 1;
- }
- return 0;
- }
- else
- {
- if(bFirstErr == 1)
- {
- bFirstErr = 0;
- syslog(LOG_INFO,
- "%s, Err Detected, PCS:%d,BMS:%d,AC:%d, MaxUpdate1Intv:%ld, "
- "MaxUpdate2Intv:%ld",
- __func__,pcs->CommState,bms->CommState,ac->CommState,
- ac->MaxUpdate1Intv,ac->MaxUpdate2Intv);
- }
- return -1;
- }
- }
- static void appl_ctl_update(void)
- {
- struct Settings_t* set = &APPL.Set.s;
- struct Ctl_t* ctl = &APPL.Ctl;
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- struct Dtsd1352_t* gm = &APPL.GateMeter;
- struct Dtsd1352_t* tm = &APPL.TransMeter;
- int i;
- int sum;
- ctl->Ap = pcs->Ap;
- sum = 0;
- for(i = 0; i < set->CtnMeterNbr; i++)
- {
- sum += APPL.CtnMeter[i + 1].com_active_p;
- }
- ctl->GateEsAp = sum;
- ctl->TransEsAp = APPL.CtnMeter[set->CtnMeterId].com_active_p;
- ctl->GateAp = gm->com_active_p;
- ctl->GateLoadAp = ctl->GateAp - ctl->GateEsAp;
- ctl->TransAp = tm->com_active_p;
- ctl->TransLoadAp = ctl->TransAp - ctl->TransEsAp;
- }
- static void appl_ctl_workmode_slave_run(void)
- {
- struct Settings_t* set = &APPL.Set.s;
- struct Ctl_t* ctl = &APPL.Ctl;
- struct chan485_t* c1 = &APPL.chan485[1];
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- switch(ctl->State)
- {
- case CTL_ST_LAUNCH:
- if(appl_ctl_check_comm_state_slave() == 0)
- {
- if(set->bErr)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_LAUNCH_CFGERR);
- syslog(LOG_INFO,"[LAUNCH] Comm Check Ok, Goto ERR");
- }
- else
- {
- appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
- syslog(LOG_INFO,"[LAUNCH] Comm Check Ok, Goto STDBY");
- }
- }
- else
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_LAUNCH_COMMERR_DETECTED);
- syslog(LOG_INFO,"[LAUNCH] Comm Check Fail, Goto ERR");
- }
- break;
- case CTL_ST_STDBY:
- if(appl_ctl_check_comm_state_slave() < 0)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_COMMERR_DETECTED);
- syslog(LOG_INFO,"[STDBY] Comm Check Fail, Goto ERR");
- }
- else
- {
- if(ctl->Step == 0)
- { // wait cmd
- if(ctl->Cmd == CTL_CMD_STOP)
- {
- ctl->Cmd = CTL_CMD_DONE;
- syslog(LOG_INFO,"[STDBY] Get CTL_CMD_STOP");
- if(pcs->WorkState == 0)
- {
- syslog(LOG_INFO,"[STDBY] Check PCS WorkState==0 Ok");
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 20;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Check");
- }
- }
- else
- {
- c1->Cmd = CMD_485_PCS_STOP;
- ctl->Step = 10;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[STDBY] Check PCS WorkState==0 Fail, Send Cmd And Check");
- }
- }
- else if(ctl->Cmd == CTL_CMD_SET_WORKMODE)
- {
- ctl->Cmd = CTL_CMD_DONE;
- appl_ctl_set_workmode(ctl->CmdPara);
- syslog(LOG_INFO,"[STDBY] Get CTL_CMD_SET_WORKMODE");
- }
- }
- else if(ctl->Step == 10)
- { // wait pcs stop
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_WAIT_PCS_STOP_TIMEOUT);
- syslog(LOG_INFO,
- "[STDBY] Check PCS WorkState==0 Timeout, Goto ERR");
- }
- else
- {
- if(pcs->WorkState == 0)
- {
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 20;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Check");
- }
- }
- else
- {
- syslog(LOG_INFO,"[STDBY] Waiting PCS WorkState==0");
- }
- }
- }
- else if(ctl->Step == 20)
- { // wait pcs aps = 0
- if(ctl->Cnt++ > 20)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_WAIT_PCS_APS0_TIMEOUT);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Timeout, Goto ERR");
- }
- else
- {
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- syslog(LOG_INFO,"[STDBY] Waiting PCS Aps==0");
- }
- }
- }
- }
- break;
- case CTL_ST_STOP:
- if(appl_ctl_check_comm_state_slave() < 0)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STOP_COMMERR_DETECTED);
- syslog(LOG_INFO,"[STOP] Comm Check Fail, Goto ERR");
- }
- else
- {
- if(ctl->Step == 0)
- { // wait cmd and check
- if(ctl->Cmd == CTL_CMD_RUN)
- {
- ctl->Cmd = CTL_CMD_DONE;
- c1->Cmd = CMD_485_PCS_START;
- ctl->Step = 10;
- ctl->Cnt = 0;
- syslog(LOG_INFO,"[STOP] Get CTL_CMD_RUN");
- }
- else if(ctl->Cmd == CTL_CMD_STDBY)
- {
- ctl->Cmd = CTL_CMD_DONE;
- appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STOP] Get CTL_CMD_STDBY, Goto STDBY");
- }
- else if(ctl->Cmd == CTL_CMD_SET_WORKMODE)
- {
- ctl->Cmd = CTL_CMD_DONE;
- appl_ctl_set_workmode(ctl->CmdPara);
- syslog(LOG_INFO,"[STOP] Get CTL_CMD_SET_WORKMODE");
- }
- else
- {
- if(pcs->WorkState != 0)
- {
- appl_ctl_set_state(CTL_ST_ERR,
- CTL_ERR_STOP_PCS_NOT_STOP_DETECTED);
- syslog(LOG_INFO,"[STOP] PCS NOT STOP Detected, Goto ERR");
- }
- }
- }
- else if(ctl->Step == 10)
- {
- if(ctl->Cnt++ > 55)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STOP_WAIT_PCS_START_TIMEOUT);
- syslog(LOG_INFO,"[STOP] Check PCS WorkState==1 Timeout, Goto ERR");
- }
- else
- {
- // syslog(LOG_INFO,"slave run : %d:", pcs->WorkState);
- if(pcs->WorkState == 1)
- {
- appl_ctl_set_state(CTL_ST_RUN,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STOP] Check PCS WorkState==1 Ok, Goto RUN");
- }
- else
- {
- syslog(LOG_INFO,"[STOP] Waiting PCS WorkState==1");
- }
- }
- }
- }
- break;
- case CTL_ST_RUN:
- if(appl_ctl_check_comm_state_slave() < 0)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_COMMERR_DETECTED);
- syslog(LOG_INFO,"[RUN] Comm Check Fail, Goto ERR");
- }
- else
- {
- if(ctl->Step == 0)
- { // wait cmd
- if(ctl->Cmd == CTL_CMD_STOP)
- {
- ctl->Cmd = CTL_CMD_DONE;
- c1->Cmd = CMD_485_PCS_STOP;
- ctl->Step = 10;
- ctl->Cnt = 0;
- syslog(LOG_INFO,"[RUN] Get CTL_CMD_STOP");
- }
- else if(ctl->Cmd == CTL_CMD_SET_APS)
- {
- ctl->Cmd = CTL_CMD_DONE;
- if(ctl->CmdPara < 0)
- { // dhg
- if(ctl->bDhgAble)
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = ctl->CmdPara;
- syslog(LOG_INFO,"[RUN]New Aps:%d",ctl->CmdPara);
- if(ctl->bChgAble == 0)
- {
- ctl->bChgAble = 1;
- }
- }
- else
- {
- syslog(LOG_INFO,"[RUN]New Aps:%d, BUT NOT DHGABLE",
- ctl->CmdPara);
- }
- }
- else if(ctl->CmdPara > 0)
- { // chg
- if(ctl->bChgAble)
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = ctl->CmdPara;
- syslog(LOG_INFO,"[RUN]New Aps:%d",ctl->CmdPara);
- if(ctl->bDhgAble == 0)
- {
- ctl->bDhgAble = 1;
- }
- }
- else
- {
- syslog(LOG_INFO,"[RUN]New Aps:%d, BUT NOT CHGABLE",
- ctl->CmdPara);
- }
- }
- else
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = ctl->CmdPara;
- syslog(LOG_INFO,"[RUN]New Aps:%d",ctl->CmdPara);
- }
- }
- else if(pcs->WorkState != 1)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_PCS_NOT_START_DETECTED);
- syslog(LOG_INFO,"[RUN] PCS NOT RUN Detected, Goto ERR");
- }
- else if(bms->MaxCellV >= set->ChgCellV)
- {
- ctl->bChgAble = 0;
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 20;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[RUN] MaxCellV(%.3f) >= ChgCellV(%.3f) Detected, Set PCS "
- "Aps=0, Wait And Check",
- bms->MaxCellV,set->ChgCellV);
- }
- else if(bms->MinCellV <= set->DhgCellV)
- {
- ctl->bDhgAble = 0;
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 20;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[RUN] MinCellV(%.3f) <= DhgCellV(%.3f) Detected, Set PCS "
- "Aps=0, Wait And Check",
- bms->MinCellV,set->DhgCellV);
- }
- }
- else if(ctl->Step == 10)
- { // wait pcs stop
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_STOP_TIMEOUT);
- syslog(LOG_INFO,"[RUN] Check PCS WorkState==0 Timeout, Goto ERR");
- }
- else
- {
- if(pcs->WorkState == 0)
- {
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 30;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Check");
- }
- }
- else
- {
- syslog(LOG_INFO,"[RUN] Waiting PCS WorkState==0");
- }
- }
- }
- else if(ctl->Step == 20)
- { // wait pcs aps = 0 and stay run
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT);
- syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Timeout, Goto ERR");
- }
- else
- {
- if(abs(pcs->Aps) < 0.1)
- {
- ctl->Step = 0;
- syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Ok, Stay RUN");
- }
- else
- {
- syslog(LOG_INFO,"[RUN] Waiting PCS Aps==0");
- }
- }
- }
- else if(ctl->Step == 30)
- { // wait pcs aps = 0 and goto stop
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT);
- syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Timeout, Goto ERR");
- }
- else
- {
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- syslog(LOG_INFO,"[RUN] Waiting PCS Aps==0");
- }
- }
- }
- }
- break;
- case CTL_ST_ERR:
- if(ctl->Step == 0)
- {
- c1->Cmd = CMD_485_PCS_STOP;
- ctl->Step = 10;
- }
- else if(ctl->Step == 10)
- {
- if(ctl->Cmd == CTL_CMD_STDBY)
- {
- ctl->Cmd = CTL_CMD_DONE;
- syslog(LOG_INFO,"[ERR] Get CTL_CMD_STDBY");
- if(appl_ctl_check_comm_state_slave() == 0)
- {
- appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
- syslog(LOG_INFO,"[ERR] Comm Check Ok, Goto STDBY");
- }
- else
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_ERR_COMMERR_DETECTED);
- syslog(LOG_INFO,"[ERR] Comm Check Fail, Goto ERR");
- }
- }
- }
- break;
- default:
- // NEVER REACH HERE
- break;
- }
- }
- static void appl_ctl_workmode_pcurv_run(void)
- {
- struct Ctl_t* ctl = &APPL.Ctl;
- struct Settings_t* set = &APPL.Set.s;
- struct chan485_t* c1 = &APPL.chan485[1];
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- struct Dtsd1352_t* gm = &APPL.GateMeter;
- struct Dtsd1352_t* tm = &APPL.TransMeter;
- int yy,mm,dd,hh,nn,ss;
- int tgtaps;
- int CommChkOk = 0;
- int i;
- switch(ctl->State)
- {
- case CTL_ST_LAUNCH:
- if(appl_ctl_check_comm_state_pcurv() == 0)
- {
- appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
- syslog(LOG_INFO,"[LAUNCH] Comm Check Ok, Goto STDBY");
- }
- else
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_LAUNCH_COMMERR_DETECTED);
- syslog(LOG_INFO,"[LAUNCH] Comm Check Fail, Goto ERR");
- }
- break;
- case CTL_ST_STDBY:
- if(appl_ctl_check_comm_state_pcurv() < 0)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_COMMERR_DETECTED);
- syslog(LOG_INFO,"[STDBY] Comm Check Fail, Goto ERR");
- }
- else
- {
- if(ctl->Step == 0)
- { // wait cmd
- if(ctl->Cmd == CTL_CMD_STOP)
- {
- ctl->Cmd = CTL_CMD_DONE;
- syslog(LOG_INFO,"[STDBY] Get CTL_CMD_STOP");
- if(pcs->WorkState == 0)
- {
- syslog(LOG_INFO,"[STDBY] Check PCS WorkState==0 Ok");
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 20;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Wait");
- }
- }
- else
- {
- c1->Cmd = CMD_485_PCS_STOP;
- ctl->Step = 10;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[STDBY] Check PCS WorkState==0 Fail, Send Cmd And Wait");
- }
- }
- else if(CTL_CMD_SET_WORKMODE)
- {
- ctl->Cmd = CTL_CMD_DONE;
- appl_ctl_set_workmode(ctl->CmdPara);
- syslog(LOG_INFO,"[STDBY] Get CTL_CMD_SET_WORKMODE");
- }
- }
- else if(ctl->Step == 10)
- { // wait pcs stop
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_WAIT_PCS_STOP_TIMEOUT);
- syslog(LOG_INFO,
- "[STDBY] Check PCS WorkState==0 Timeout, Goto ERR");
- }
- else
- {
- if(pcs->WorkState == 0)
- {
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 20;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[STDBY] Check PCS Aps==0 Fail, Send Cmd And Wait");
- }
- }
- else
- {
- syslog(LOG_INFO,"[STDBY] Waiting PCS WorkState==0");
- }
- }
- }
- else if(ctl->Step == 20)
- { // wait pcs aps = 0
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STDBY_WAIT_PCS_APS0_TIMEOUT);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Timeout, Goto ERR");
- }
- else
- {
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STDBY] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- syslog(LOG_INFO,"[STDBY] Waiting PCS Aps==0");
- }
- }
- }
- }
- break;
- case CTL_ST_STOP:
- if(appl_ctl_check_comm_state_pcurv() < 0)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STOP_COMMERR_DETECTED);
- syslog(LOG_INFO,"[STOP] Comm Check Fail, Goto ERR");
- }
- else
- {
- if(ctl->Step == 0)
- { // wait cmd and check
- if(ctl->Cmd == CTL_CMD_RUN)
- {
- ctl->Cmd = CTL_CMD_DONE;
- c1->Cmd = CMD_485_PCS_START;
- ctl->Step = 10;
- ctl->Cnt = 0;
- ctl->LastTune = 0;
- syslog(LOG_INFO,"[STOP] Get CTL_CMD_RUN");
- }
- else if(0)
- { // ctl->Cmd = CTL_CMD_STDBY !!NOT SUPPORTED
- ctl->Cmd = CTL_CMD_DONE;
- appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STOP] Get CTL_CMD_STDBY, Goto STDBY");
- }
- else if(ctl->Cmd == CTL_CMD_SET_WORKMODE)
- {
- ctl->Cmd = CTL_CMD_DONE;
- appl_ctl_set_workmode(ctl->CmdPara);
- syslog(LOG_INFO,"[STOP] Get CTL_CMD_SET_WORKMODE, Para:%d",
- ctl->CmdPara);
- }
- else
- {
- if(pcs->WorkState != 0)
- {
- appl_ctl_set_state(CTL_ST_ERR,
- CTL_ERR_STOP_PCS_NOT_STOP_DETECTED);
- syslog(LOG_INFO,"[STOP] PCS NOT STOP Detected, Goto ERR");
- }
- }
- }
- else if(ctl->Step == 10)
- { // wait PCS start
- if(ctl->Cnt++ > 45)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_STOP_WAIT_PCS_START_TIMEOUT);
- syslog(LOG_INFO,"[STOP] Check PCS WorkState==1 Timeout, Goto ERR");
- }
- else
- {
- if(pcs->WorkState == 1)
- {
- appl_ctl_set_state(CTL_ST_RUN,CTL_ERR_NONE);
- syslog(LOG_INFO,"[STOP] Check PCS WorkState==1 Ok, Goto RUN");
- }
- else
- {
- syslog(LOG_INFO,"[STOP] Waiting PCS WorkState==1");
- }
- }
- }
- }
- break;
- case CTL_ST_RUN:
- if(appl_ctl_check_comm_state_pcurv() < 0)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_COMMERR_DETECTED);
- syslog(LOG_INFO,"[RUN] Comm Check Fail, Goto ERR");
- }
- else
- {
- if(ctl->Step == 0)
- { // wait cmd and run
- if(ctl->Cmd == CTL_CMD_STOP)
- {
- ctl->Cmd = CTL_CMD_DONE;
- c1->Cmd = CMD_485_PCS_STOP;
- ctl->Step = 10;
- ctl->Cnt = 0;
- syslog(LOG_INFO,"[RUN] Get CTL_CMD_STOP");
- }
- else if(mg_millis() - ctl->LastTune > 10000)
- {
- ctl->LastTune = mg_millis();
- appl_get_datetime_num(&yy,&mm,&dd,&hh,&nn,&ss);
- tgtaps = set->pcurv[(hh * 60 + nn) / 15];
- // syslog(LOG_INFO,"%s, [RUN] Get Target Aps:%d", __func__, tgtaps);
- if(tgtaps < 0)
- { // DHG
- if(ctl->bDhgAble != 1)
- {
- // syslog(LOG_INFO,"%s, [RUN] NOT DHGABLE", __func__);
- break;
- }
- else
- { // Aps Limit
- if(tgtaps * set->TransCoupleNbr + ctl->TransLoadAp <
- set->DhgTransLim)
- {
- tgtaps = (set->DhgTransLim - ctl->TransLoadAp) /
- set->TransCoupleNbr;
- if(tgtaps > 0)
- {
- tgtaps = 0;
- }
- }
- if(tgtaps * set->GateCoupleNbr + ctl->GateLoadAp <
- set->DhgGateLim)
- {
- tgtaps =
- (set->DhgGateLim - ctl->GateLoadAp) / set->GateCoupleNbr;
- if(tgtaps > 0)
- {
- tgtaps = 0;
- }
- }
- }
- }
- else if(tgtaps > 0)
- { // CHG
- if(ctl->bChgAble != 1)
- {
- // syslog(LOG_INFO,"%s, [RUN] NOT CHGABLE", __func__);
- break;
- }
- else
- {
- if(tgtaps * set->TransCoupleNbr + ctl->TransLoadAp >
- set->ChgTransLim)
- {
- tgtaps = (set->ChgTransLim - ctl->TransLoadAp) /
- set->TransCoupleNbr;
- if(tgtaps < 0)
- {
- tgtaps = 0;
- }
- }
- if(tgtaps * set->GateCoupleNbr + ctl->GateLoadAp >
- set->ChgGateLim)
- {
- tgtaps =
- (set->ChgGateLim - ctl->GateLoadAp) / set->GateCoupleNbr;
- if(tgtaps < 0)
- {
- tgtaps = 0;
- }
- }
- }
- }
- CommChkOk = 0;
- if(gm->CommState != ST_COMM_NORM ||
- tm->CommState != ST_COMM_NORM)
- {
- CommChkOk = -1;
- }
- for(i = 0; i < set->CtnMeterNbr; i++)
- {
- if(APPL.CtnMeter[i + 1].CommState != ST_COMM_NORM)
- {
- CommChkOk = -1;
- break;
- }
- }
- if(CommChkOk < 0)
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- }
- else
- {
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = tgtaps;
- }
- if(tgtaps < 0)
- { // DHG
- if(ctl->bChgAble == 0)
- {
- ctl->bChgAble = 1;
- }
- }
- if(tgtaps > 0)
- { // CHG
- if(ctl->bDhgAble == 0)
- {
- ctl->bDhgAble = 1;
- }
- }
- // syslog(LOG_INFO,"%s, [RUN] Target Aps Sent", __func__);
- }
- else if(pcs->WorkState != 1)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_PCS_NOT_START_DETECTED);
- syslog(LOG_INFO,"[RUN] PCS NOT RUN Detected, Goto ERR");
- }
- else if(bms->MaxCellV >= set->ChgCellV)
- {
- ctl->bChgAble = 0; // !!
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 20;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[RUN] MaxCellV(%.3f) >= ChgCellV(%.3f) Detected, Set PCS "
- "Aps=0, Wait And Check",
- bms->MaxCellV,set->ChgCellV);
- }
- else if(bms->MinCellV <= set->DhgCellV)
- {
- ctl->bDhgAble = 0;
- c1->Cmd = CMD_485_PCS_SET_APS;
- c1->CmdParam = 0;
- ctl->Step = 20;
- ctl->Cnt = 0;
- syslog(LOG_INFO,
- "[RUN] MinCellV(%.3f) <= DhgCellV(%.3f) Detected, Set PCS "
- "Aps=0, Wait And Check",
- bms->MinCellV,set->DhgCellV);
- }
- }
- else if(ctl->Step == 10)
- { // wait pcs stop
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_STOP_TIMEOUT);
- syslog(LOG_INFO,"[RUN] Check PCS WorkState==0 Timeout, Goto ERR");
- }
- else
- {
- if(pcs->WorkState == 0)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[RUN] Check PCS WorkState==0 Ok, Goto STOP");
- }
- else
- {
- syslog(LOG_INFO,"[RUN] Waiting PCS WorkState==0");
- }
- }
- }
- else if(ctl->Step == 20)
- { // wait pcs aps = 0 and stay run
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT);
- syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Timeout, Goto ERR");
- }
- else
- {
- if(abs(pcs->Aps) < 0.1)
- {
- ctl->Step = 0;
- syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Ok, Stay RUN");
- }
- else
- {
- syslog(LOG_INFO,"[RUN] Waiting PCS Aps==0");
- }
- }
- }
- else if(ctl->Step == 30)
- { // wait pcs aps = 0 and goto stop
- if(ctl->Cnt++ > 5)
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_RUN_WAIT_PCS_APS0_TIMEOUT);
- syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Timeout, Goto ERR");
- }
- else
- {
- if(abs(pcs->Aps) < 0.1)
- {
- appl_ctl_set_state(CTL_ST_STOP,CTL_ERR_NONE);
- syslog(LOG_INFO,"[RUN] Check PCS Aps==0 Ok, Goto STOP");
- }
- else
- {
- syslog(LOG_INFO,"[RUN] Waiting PCS Aps==0");
- }
- }
- }
- }
- break;
- case CTL_ST_ERR:
- if(ctl->Step == 0)
- {
- c1->Cmd = CMD_485_PCS_STOP;
- ctl->Step = 10;
- }
- else if(ctl->Step == 10)
- {
- if(ctl->Cmd == CTL_CMD_STDBY)
- {
- ctl->Cmd = CTL_CMD_DONE;
- syslog(LOG_INFO,"[ERR] Get CTL_CMD_STDBY");
- if(appl_ctl_check_comm_state_pcurv() == 0)
- {
- appl_ctl_set_state(CTL_ST_STDBY,CTL_ERR_NONE);
- syslog(LOG_INFO,"[ERR] Comm Check Ok, Goto STDBY");
- }
- else
- {
- appl_ctl_set_state(CTL_ST_ERR,CTL_ERR_ERR_COMMERR_DETECTED);
- syslog(LOG_INFO,"[ERR] Comm Check Fail, Goto ERR");
- }
- }
- }
- break;
- default:
- // NEVER REACH HERE
- break;
- }
- }
- static void* thrd_ctl(void* param)
- {
- struct Ctl_t* ctl = &APPL.Ctl;
- struct chan485_t* c1 = &APPL.chan485[1];
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- sleep(3);
- syslog(LOG_INFO,"%s ++",__func__);
- appl_ctl_set_state(CTL_ST_LAUNCH,CTL_ERR_NONE);
- ctl->Cmd = CTL_CMD_DONE;
- while(1)
- {
- appl_ctl_update();
- switch(ctl->WorkMode)
- {
- case CTL_WORKMODE_SLAVE:
- appl_ctl_workmode_slave_run();
- break;
- case CTL_WORKMODE_PCURV:
- appl_ctl_workmode_pcurv_run();
- break;
- default:
- break;
- }
- usleep(1000000);
- }
- syslog(LOG_INFO,"%s --",__func__);
- }
- static void fn_mqtt1(struct mg_connection* c,int ev,void* ev_data)
- {
- // struct chanmqtt_t* m = &APPL.chanmqtt[1];
- // if (ev == MG_EV_OPEN) {
- // MG_INFO(("%lu CREATED", c->id));
- // // c->is_hexdumping = 1;
- // } else if (ev == MG_EV_CONNECT) {
- // if (mg_url_is_ssl(m->szs_url)) {
- // struct mg_tls_opts opts = {.ca = mg_unpacked("/certs/ca.pem"),
- // .name = mg_url_host(m->szs_url)};
- // mg_tls_init(c, &opts);
- // }
- // } else if (ev == MG_EV_ERROR) {
- // // On error, log error message
- // MG_ERROR(("%lu ERROR %s", c->id, (char *) ev_data));
- // } else if (ev == MG_EV_MQTT_OPEN) {
- // m->bConnected = 1;
- // strcpy(m->szState,"正常");
- // // MQTT connect is successful
- // struct mg_str subt = mg_str(m->szs_sub_topic);
- // MG_INFO(("%lu CONNECTED to %s", c->id, m->szs_url));
- // struct mg_mqtt_opts sub_opts;
- // memset(&sub_opts, 0, sizeof(sub_opts));
- // sub_opts.topic = subt;
- // sub_opts.qos = m->s_qos;
- // mg_mqtt_sub(c, &sub_opts);
- // MG_INFO(("%lu SUBSCRIBED to %.*s", c->id, (int) subt.len, subt.ptr));
- // } else if (ev == MG_EV_MQTT_MSG) {
- // // When we get echo response, print it
- // struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
- // MG_INFO(("%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len,
- // mm->data.ptr, (int) mm->topic.len, mm->topic.ptr));
- // } else if (ev == MG_EV_CLOSE) {
- // MG_INFO(("%lu CLOSED", c->id));
- // m->s_conn = NULL; // Mark that we're closed
- // m->bConnected = 0;
- // strcpy(m->szState,"故障");
- // }
- }
- static void fn_mqtt2(struct mg_connection* c,int ev,void* ev_data)
- {
- struct Settings_t* set = &APPL.Set.s;
- struct chanmqtt_t* m = &APPL.chanmqtt[2];
- struct Ctl_t* ctl = &APPL.Ctl;
- struct Dtsd1352_t* gm = &APPL.GateMeter;
- struct Dtsd1352_t* tm = &APPL.TransMeter;
- struct Dtsd1352_t* cm = NULL;
- int i;
- if(ev == MG_EV_OPEN)
- {
- syslog(LOG_INFO,"%lu CREATED",c->id);
- // c->is_hexdumping = 1;
- }
- else if(ev == MG_EV_CONNECT)
- {
- if(mg_url_is_ssl(m->szs_url))
- {
- struct mg_tls_opts opts = { .ca = mg_unpacked("/certs/ca.pem"),
- .name = mg_url_host(m->szs_url) };
- mg_tls_init(c,&opts);
- }
- }
- else if(ev == MG_EV_ERROR)
- {
- // On error, log error message
- syslog(LOG_INFO,"%lu ERROR %s",c->id,(char*)ev_data);
- }
- else if(ev == MG_EV_MQTT_OPEN)
- {
- m->bConnected = 1;
- strcpy(m->szState,"正常");
- // MQTT connect is successful
- syslog(LOG_INFO,"%lu CONNECTED to %s",c->id,m->szs_url);
- struct mg_mqtt_opts sub_opts;
- struct mg_str subt;
- // Control
- memset(&sub_opts,0,sizeof(sub_opts));
- subt = mg_str(m->szs_sub_topic[0]);
- sub_opts.topic = subt;
- sub_opts.qos = m->s_qos;
- mg_mqtt_sub(c,&sub_opts);
- syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s",c->id,(int)subt.len,subt.ptr);
- // GateMeter
- memset(&sub_opts,0,sizeof(sub_opts));
- subt = mg_str(m->szs_sub_topic[1]);
- sub_opts.topic = subt;
- sub_opts.qos = m->s_qos;
- mg_mqtt_sub(c,&sub_opts);
- syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s",c->id,(int)subt.len,subt.ptr);
- // TransMeter
- memset(&sub_opts,0,sizeof(sub_opts));
- subt = mg_str(m->szs_sub_topic[2]);
- sub_opts.topic = subt;
- sub_opts.qos = m->s_qos;
- mg_mqtt_sub(c,&sub_opts);
- syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s",c->id,(int)subt.len,subt.ptr);
- // CtnMeter1
- for(i = 0; i < set->CtnMeterNbr; i++)
- {
- memset(&sub_opts,0,sizeof(sub_opts));
- subt = mg_str(m->szs_sub_topic[3 + i]);
- sub_opts.topic = subt;
- sub_opts.qos = m->s_qos;
- mg_mqtt_sub(c,&sub_opts);
- syslog(LOG_INFO,"%lu SUBSCRIBED to %.*s",c->id,(int)subt.len,
- subt.ptr);
- }
- }
- else if(ev == MG_EV_MQTT_MSG)
- {
- // When we get echo response, print it
- struct mg_mqtt_message* mm = (struct mg_mqtt_message*)ev_data;
- // syslog(LOG_INFO,"%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len,
- // mm->data.ptr, (int) mm->topic.len, mm->topic.ptr);
- struct mg_str json = mg_str(mm->data.ptr);
- struct mg_str new_json;
- int offset,length;
- char buf[512];
- char devid[128] = { 0 };
- char* str = NULL;
- double val;
- offset = mg_json_get(json,"$.data[0]",&length);
- if(offset > 0)
- {
- memset(buf,0,sizeof(buf));
- strncpy(buf,json.ptr + offset,length);
- // syslog(LOG_INFO,"%s, Get data[0]:%s", __func__, buf);
- new_json = mg_str(buf);
- str = mg_json_get_str(new_json,"$.device_id");
- if(str != NULL)
- {
- for(i = 0; i < set->CtnMeterNbr; i++)
- {
- sprintf(devid,"CtnMeter%d",i + 1);
- cm = &APPL.CtnMeter[i + 1];
- if(strcmp(str,devid) == 0)
- {
- if(mg_json_get_num(new_json,"$.com_ap",&val))
- {
- cm->com_active_p = val;
- cm->LastUpdate = mg_millis();
- }
- }
- }
- sprintf(devid,"TransMeter%d",set->TransId);
- if(strcmp(str,devid) == 0)
- {
- if(mg_json_get_num(new_json,"$.com_ap",&val))
- {
- tm->com_active_p = val;
- tm->LastUpdate = mg_millis();
- }
- }
- if(strcmp(str,"GateMeter") == 0)
- {
- if(mg_json_get_num(new_json,"$.com_ap",&val))
- {
- gm->com_active_p = val;
- gm->LastUpdate = mg_millis();
- if(m->LastRecv == 0)
- { // First Recv
- m->TotalRecvCnt = 0;
- m->LastRecv = mg_millis();
- m->TotalRecvIntv = 0;
- }
- else
- {
- m->TotalRecvCnt++;
- int64_t CurrIntv = mg_millis() - m->LastRecv;
- m->LastRecv = mg_millis();
- if(CurrIntv > m->MaxRecvIntv)
- {
- m->MaxRecvIntv = CurrIntv;
- }
- m->TotalRecvIntv += CurrIntv;
- m->AvgRecvIntv = m->TotalRecvIntv / m->TotalRecvCnt;
- }
- }
- }
- free(str);
- }
- }
- else
- {
- syslog(LOG_INFO,"%s, Fail to Get data[0]:%d",__func__,offset);
- }
- }
- else if(ev == MG_EV_CLOSE)
- {
- syslog(LOG_INFO,"%lu CLOSED",c->id);
- m->s_conn = NULL; // Mark that we're closed
- m->bConnected = 0;
- strcpy(m->szState,"故障");
- }
- }
- static void fn_mqtt3(struct mg_connection* c,int ev,void* ev_data)
- {
- // struct Dtsd1352_t* gm = &APPL.GateMeter;
- // struct Dtsd1352_t* tm = &APPL.TransMeter;
- // struct chanmqtt_t* m = &APPL.chanmqtt[3];
- // char buf[256];
- // if (ev == MG_EV_OPEN) {
- // syslog(LOG_INFO,"%s, %lu CREATED", __func__, c->id);
- // // c->is_hexdumping = 1;
- // } else if (ev == MG_EV_CONNECT) {
- // if (mg_url_is_ssl(m->szs_url)) {
- // struct mg_tls_opts opts = {.ca = mg_unpacked("/certs/ca.pem"),
- // .name = mg_url_host(m->szs_url)};
- // mg_tls_init(c, &opts);
- // }
- // } else if (ev == MG_EV_ERROR) {
- // // On error, log error message
- // syslog(LOG_INFO, "%s, %lu ERROR %s", __func__, c->id, (char *)
- // ev_data);
- // } else if (ev == MG_EV_MQTT_OPEN) {
- // m->bConnected = 1;
- // strcpy(m->szState,"正常");
- // // MQTT connect is successful
- // syslog(LOG_INFO,"%s, %lu CONNECTED to %s", __func__, c->id,
- // m->szs_url);
- // struct mg_str subt = mg_str(m->szs_sub_topic[0]);
- // struct mg_mqtt_opts sub_opts;
- // memset(&sub_opts, 0, sizeof(sub_opts));
- // sub_opts.topic = subt;
- // sub_opts.qos = m->s_qos;
- // mg_mqtt_sub(c, &sub_opts);
- // syslog(LOG_INFO,"%s, %lu SUBSCRIBED to %.*s", __func__, c->id,
- // (int) subt.len, subt.ptr);
- // // subt = mg_str(m->szs_sub_topic[1]);
- // // memset(&sub_opts, 0, sizeof(sub_opts));
- // // sub_opts.topic = subt;
- // // sub_opts.qos = m->s_qos;
- // // mg_mqtt_sub(c, &sub_opts);
- // // syslog(LOG_INFO,"%s, %lu SUBSCRIBED to %.*s", __func__, c->id,
- // (int) subt.len, subt.ptr);
- // } else if (ev == MG_EV_MQTT_MSG) {
- // // When we get echo response, print it
- // struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
- // //syslog(LOG_INFO,"%s, %lu RECEIVED %.*s <- %.*s", __func__, c->id,
- // (int) mm->data.len,
- // // mm->data.ptr, (int) mm->topic.len, mm->topic.ptr);
- // struct mg_str json = mg_str(mm->data.ptr);
- // double dval;
- // bool ok;
- // if( strcmp(mm->topic.ptr, m->szs_sub_topic[0]) == 0){ // gate meter
- // syslog(LOG_INFO,"%s, Get Gate Meter Data", __func__);
- // ok = mg_json_get_num(json,"$.m1_com_ap", &dval);
- // if( ok ){
- // gm->com_active_p = dval;
- // gm->LastUpdate = mg_millis();
- // strcpy(gm->szLastUpdate, appl_get_datetime_long());
- // }
- // ok = mg_json_get_num(json,"$.m2_com_ap", &dval);
- // if( ok ){
- // tm->com_active_p = dval;
- // tm->LastUpdate = mg_millis();
- // strcpy(tm->szLastUpdate, appl_get_datetime_long());
- // }
- // }
- // } else if (ev == MG_EV_CLOSE) {
- // syslog(LOG_INFO,"%s, %lu CLOSED", __func__, c->id);
- // m->s_conn = NULL; // Mark that we're closed
- // m->bConnected = 0;
- // strcpy(m->szState,"故障");
- // }
- }
- static void* thrd_mqtt_1(void* param)
- {
- // struct chanmqtt_t* m = &APPL.chanmqtt[1];
- // struct dtsd1352_t* meter = NULL;
- // struct mg_mqtt_opts opts = {.user = mg_str(m->szusrname),
- // .clean = true,
- // .qos = m->s_qos,
- // .topic = mg_str(m->szs_pub_topic),
- // .version = 4,
- // .message = mg_str("bye")};
- // struct mg_mqtt_opts pub_opts;
- // struct mg_str pubt = mg_str(m->szs_pub_topic);
- // char msg[2048];
- // char buf[2048];
- // int i;
- // mg_mgr_init(&mgr_mqtt1);
- // MG_INFO(("%s ENTER, idx:1", __func__));
- // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1,
- // m->szs_url, &opts, fn_mqtt1, NULL); while(1){
- // mg_mgr_poll(&mgr_mqtt1, 50);
- // if(mg_millis() - m->LastUpload > 5000){
- // m->LastUpload = mg_millis();
- // if(m->bConnected){
- // for(i = 1; i <= 2; i++){
- // meter = &APPL.Dtsd1352[i];
- // if( meter->CommState == ST_COMM_NORM ){
- // memset(&pub_opts, 0, sizeof(pub_opts));
- // pub_opts.topic = pubt;
- // sprintf(buf,
- // "\"m%d_pf\":%.3f,\
- // \"m%d_com_ap\":%.1f,\"m%d_com_ae\":%.1f,\"m%d_pos_ae\":%.1f,\"m%d_neg_ae\":%.1f,
- // \
- // \"m%d_ua\":%.1f,\"m%d_ub\":%.1f,\"m%d_uc\":%.1f, \
- // \"m%d_ia\":%.1f,\"m%d_ib\":%.1f,\"m%d_ic\":%.1f",
- // i, meter->pwr_factor,
- // i, meter->com_active_p,i, meter->com_active_e,i, meter->pos_active_e,i,
- // meter->neg_active_e, i, meter->ua,i, meter->ub,i, meter->uc, i,
- // meter->ia,i, meter->ib,i, meter->ic);
- // sprintf(msg,"{'ts':%lld,'values':{%s}}", (long
- // long)time(NULL)*1000, buf); pub_opts.message =
- // mg_str(msg); pub_opts.qos = m->s_qos,
- // pub_opts.retain = false; mg_mqtt_pub(m->s_conn,
- // &pub_opts);
- // }
- // }
- // }
- // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1,
- // m->szs_url, &opts, fn_mqtt1, NULL);
- // }
- // }
- // MG_INFO(("%s EXIT, idx:1", __func__));
- }
- static void* thrd_mqtt_2(void* param)
- {
- struct Dtsd1352_t* gm = &APPL.GateMeter;
- struct Dtsd1352_t* tm = &APPL.TransMeter;
- struct dtsd1352_t* meter = NULL;
- struct chanmqtt_t* m = &APPL.chanmqtt[2];
- struct Ctl_t* ctl = &APPL.Ctl;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- struct FireAlarm_t* fa = NULL;
- struct Adl200_t* auxm = &APPL.Adl200;
- struct Co_t* co = &APPL.Co;
- struct Dehumi_t* dh = &APPL.Dehumi;
- struct Dido_t* dido = &APPL.Dido;
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct Settings_t* set = &APPL.Set.s;
- struct mg_mqtt_opts opts = { .user = mg_str(m->szusrname),
- .pass = mg_str(m->szpasswd),
- .client_id = mg_str(set->szSN),
- .clean = true,
- .qos = m->s_qos,
- .topic = mg_str(m->szs_pub_topic),
- .version = 4 };
- struct mg_mqtt_opts pub_opts;
- struct mg_str pubt = mg_str(m->szs_pub_topic);
- struct Dtsd1352_t* cm = NULL;
- char msg[2048];
- char stakv[2048];
- char ctnkv[2048];
- char pcskv[2048];
- char bmskv[8192];
- char ackv[2048];
- char fakv[10][512];
- char amkv[512];
- char cokv[512];
- char dhkv[512];
- char buf[2048];
- char didokv[512];
- int64_t LastCommCheck;
- int i,j;
- double avgcellv;
- int CommChkOk;
- mg_mgr_init(&mgr_mqtt2);
- syslog(LOG_INFO,"%s ENTER idx:2",__func__);
- if(m->s_conn == NULL)
- m->s_conn = mg_mqtt_connect(&mgr_mqtt2,m->szs_url,&opts,fn_mqtt2,NULL);
- while(1)
- {
- mg_mgr_poll(&mgr_mqtt2,20);
- // Process Cmd
- if(m->Cmd == CMD_MQTT_REGISTER)
- {
- m->Cmd = CMD_MQTT_DONE;
- // // Register STA
- // sprintf(msg,
- // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":0,\"idx\":1}]}",
- // set->szCloudUserName, (long long)time(NULL)*1000, set->szSN);
- // pub_opts.message = mg_str(msg);
- // pub_opts.qos = m->s_qos, pub_opts.retain = false;
- // pub_opts.topic = mg_str("register");
- // mg_mqtt_pub(m->s_conn, &pub_opts);
- // m->TotalSendCnt++;
- // Register CTN
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s\",\"type\":1,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // Register PCS
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-PCS\",\"pid\":\"%s\",\"type\":2,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // Register BMS
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-BMS\",\"pid\":\"%s\",\"type\":3,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // Register AC
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-AC\",\"pid\":\"%s\",\"type\":4,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // Register FA, FireAlarm
- for(i = 1; i <= 5; i++)
- {
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-FA%d\",\"pid\":\"%s\",\"type\":14,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- i,set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- // Register AM, Aux Meter
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-AM\",\"pid\":\"%s\",\"type\":10,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // Register CO, Co Sensor
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-CO\",\"pid\":\"%s\",\"type\":8,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // Register DH, Dehumi
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-DH\",\"pid\":\"%s\",\"type\":6,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // Register DIDO
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-DIDO\",\"pid\":\"%s\",\"type\":9,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = mg_str("register");
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- avgcellv = bms->AvgCellV;
- // ******************************************
- // Upload Fast Data
- // ******************************************
- if(mg_millis() - m->LastFastUpload > set->UploadHighSpeed)
- {
- m->LastFastUpload = mg_millis();
- if(m->bConnected)
- {
- // CTN
- ctnkv[0] = 0;
- sprintf(buf,
- "\"device_id\":\"%s\",\"type\":1,\"state\":%d,\"err\":\"%s\",",
- set->szSN,ctl->State,ctl->szErr);
- strcat(ctnkv,buf);
- if(pcs->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"ap\":%d,",ctl->Ap);
- strcat(ctnkv,buf);
- }
- if(bms->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"soc\":%.3f,",bms->Soc);
- strcat(ctnkv,buf);
- }
- if(bms->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"soh\":%.3f,",bms->Soh);
- strcat(ctnkv,buf);
- }
- sprintf(buf,"\"end\":0");
- strcat(ctnkv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,ctnkv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // PCS
- pcskv[0] = 0;
- if(pcs->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-PCS\",\"type\":2,",set->szSN);
- strcat(pcskv,buf);
- sprintf(buf,
- "\"ap\":%.1f,\"aps\":%.1f,\"rap\":%.1f,\"dcv\":%.1f,\"dcc\":%"
- ".1f,\"errstat\":%d,\"runstat\":%d",
- pcs->Ap,pcs->Aps,pcs->Rap,pcs->BatV,pcs->BatC,
- pcs->ErrState,pcs->WorkState);
- strcat(pcskv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,pcskv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- // BMS
- bmskv[0] = 0;
- if(bms->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-BMS\",\"type\":3,",set->szSN);
- strcat(bmskv,buf);
- sprintf(buf,
- "\"hv\":%d,\"v\":%.1f,\"c\":%.1f,\"cell_max_v\":%.3f,\"cell_"
- "ave_v\":%.3f,\"cell_min_v\":%.3f,",
- bms->HvState,bms->BatV,bms->BatI,bms->MaxCellV,
- bms->AvgCellV,bms->MinCellV);
- strcat(bmskv,buf);
- if(bms->MinCellV < 3.08 || bms->MaxCellV > 3.37)
- {
- for(i = 1; i <= PACK_NBR; i++)
- {
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- sprintf(buf,"\"p%d_v%d\":%.3f,",i,j,bms->CellVolt[i][j]);
- strcat(bmskv,buf);
- }
- }
- }
- sprintf(buf,"\"end\":0");
- strcat(bmskv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,bmskv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- }
- }
- // ******************************************
- // Upload Medium Data
- // ******************************************
- if(mg_millis() - m->LastMediumUpload > set->UploadMediumSpeed)
- {
- m->LastMediumUpload = mg_millis();
- if(m->bConnected)
- {
- // PCS
- pcskv[0] = 0;
- if(pcs->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-PCS\",\"type\":2,",set->szSN);
- strcat(pcskv,buf);
- sprintf(buf,
- "\"t_igbt\":%.1f,\"t_env\":%.1f,\"uab\":%.1f,\"ubc\":%.1f,"
- "\"uca\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f",
- pcs->Tigbt,pcs->Tenv,pcs->Uab,pcs->Ubc,pcs->Uca,pcs->Ia,
- pcs->Ib,pcs->Ic);
- strcat(pcskv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,pcskv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- // BMS
- bmskv[0] = 0;
- if(bms->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-BMS\",\"type\":3,",set->szSN);
- strcat(bmskv,buf);
- sprintf(
- buf,
- "\"cell_max_t\":%.1f,\"cell_ave_t\":%.1f,\"cell_min_t\":%.1f,\"soc\":%.3f,\"soh\":%.3f,\
- \"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,\
- \"pos_ins\":%.1f,\"neg_ins\":%.1f,",
- bms->MaxCellT,bms->AvgCellT,bms->MinCellT,bms->Soc,bms->Soh,
- bms->CellVDiff,bms->CellTDiff,bms->MaxCellVIdx,
- bms->MinCellVIdx,bms->MaxCellTIdx,bms->MinCellTIdx,bms->PosRes,
- bms->NegRes);
- strcat(bmskv,buf);
- if(bms->MinCellV >= 3.08 && bms->MaxCellV <= 3.37)
- {
- for(i = 1; i <= PACK_NBR; i++)
- {
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- sprintf(buf,"\"p%d_v%d\":%.3f,",i,j,bms->CellVolt[i][j]);
- strcat(bmskv,buf);
- }
- }
- }
- for(i = 1; i <= PACK_NBR; i++)
- {
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- sprintf(buf,"\"p%d_t%d\":%.1f,",i,j,bms->CellTemp[i][j]);
- strcat(bmskv,buf);
- }
- }
- sprintf(buf,"\"end\":0");
- strcat(bmskv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,bmskv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- // AC
- ackv[0] = 0;
- if(ac->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-AC\",\"type\":4,",set->szSN);
- strcat(ackv,buf);
- sprintf(buf,
- "\"work_mode\":%d,\"outwater_t\":%d,\"rtnwater_t\":%d,"
- "\"outwater_pre\":%.1f,\"rtnwater_pre\":%.1f,\"err_code\":%d,"
- "\"err_level\":%d",
- ac->WorkMode,ac->OutWaterTemp,ac->InWaterTemp,
- ac->OutWaterPre,ac->InWaterPre,ac->ErrCode,ac->ErrLevel);
- strcat(ackv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,ackv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- }
- }
- // ******************************************
- // Upload SLow Data
- // ******************************************
- if(mg_millis() - m->LastSlowUpload > set->UploadSlowSpeed)
- {
- m->LastSlowUpload = mg_millis();
- if(m->bConnected)
- {
- // FA
- for(i = 1; i <= 5; i++)
- {
- fakv[i][0] = 0;
- }
- for(i = 1; i <= 5; i++)
- {
- fa = &APPL.Fa[i];
- if(fa->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-FA%d\",\"type\":14,",set->szSN,
- i);
- strcat(fakv[i],buf);
- sprintf(buf,
- "\"T1\":%d,\"T2\":%d,\"Co\":%d,\"Voc\":%d,\"SmokeFlag\":%d,"
- "\"Level\":%d,\"ErrCode\":%d",
- fa->T1,fa->T2,fa->Co,fa->Voc,fa->SmokeFlagVal,
- fa->LevelVal,fa->ErrCodeVal);
- strcat(fakv[i],buf);
- // Sending
- sprintf(
- msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,fakv[i]);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- }
- // AM
- amkv[0] = 0;
- if(auxm->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-AM\",\"type\":10,",set->szSN);
- strcat(amkv,buf);
- sprintf(buf,"\"pos_ae\":%.1f,\"neg_ae\":%.1f,\"ap\":%.1f",
- auxm->PosAe,auxm->NegAe,auxm->Ap);
- strcat(amkv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,amkv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- // CO
- cokv[0] = 0;
- if(co->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-CO\",\"type\":8,",set->szSN);
- strcat(cokv,buf);
- sprintf(buf,"\"Density\":%u",co->Density);
- strcat(cokv,buf);
- // Sending
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,cokv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- // DH
- dhkv[0] = 0;
- if(dh->CommState)
- {
- sprintf(buf,"\"device_id\":\"%s-DH\",\"type\":7,",set->szSN);
- strcat(dhkv,buf);
- sprintf(buf,"\"temp\":%.1f,\"humi\":%.1f",dh->Temp,dh->Humi);
- strcat(dhkv,buf);
- // Sending
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,dhkv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- }
- // DIDO
- didokv[0] = 0;
- sprintf(buf,"\"device_id\":\"%s-DIDO\",\"type\":9,",set->szSN);
- strcat(didokv,buf);
- sprintf(buf,
- "\"WaterDec1\":%d,\"WaterDec2\":%d,\"FrontDoor\":%d,"
- "\"BackDoor\":%d,\"EmgStop\":%d,\"FeEruptFb\":%d",
- dido->WaterDec1,dido->WaterDec2,dido->FrontDoor,
- dido->BackDoor,dido->EmgStop,dido->FeEruptFb);
- strcat(didokv,buf);
- // Sending
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,didokv);
- pub_opts.message = mg_str(msg);
- pub_opts.qos = m->s_qos,pub_opts.retain = false;
- pub_opts.topic = pubt;
- mg_mqtt_pub(m->s_conn,&pub_opts);
- m->TotalSendCnt++;
- // sprintf(msg,
- // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s},{%s},{%s},{%s},{%s},{%s},{%s},{%s},{%s}]}",
- // set->szCloudUserName, (long long)time(NULL)*1000,
- // fakv[1],fakv[2],fakv[3],fakv[4],fakv[5],amkv,cokv,dhkv,didokv);
- // // sprintf(msg,
- // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s},{%s},{%s},{%s},{%s},{%s}]}",
- // // set->szCloudUserName, (long long)time(NULL)*1000, fekv,
- // fakv[1],fakv[2],fakv[3],fakv[4],fakv[5]); pub_opts.message =
- // mg_str(msg); pub_opts.qos = m->s_qos, pub_opts.retain = false;
- // pub_opts.topic = pubt;
- // mg_mqtt_pub(m->s_conn, &pub_opts);
- // m->TotalSendCnt++;
- }
- }
- // **************************************
- // Meters Comm Check
- // **************************************
- if(mg_millis() - LastCommCheck > 1000)
- {
- LastCommCheck = mg_millis();
- if(mg_millis() - gm->LastUpdate > 10000)
- {
- gm->CommState = ST_COMM_ERR;
- strcpy(gm->szCommState,"故障");
- }
- else
- {
- gm->CommState = ST_COMM_NORM;
- strcpy(gm->szCommState,"正常");
- }
- if(mg_millis() - tm->LastUpdate > 10000)
- {
- tm->CommState = ST_COMM_ERR;
- strcpy(tm->szCommState,"故障");
- }
- else
- {
- tm->CommState = ST_COMM_NORM;
- strcpy(tm->szCommState,"正常");
- }
- CommChkOk = 0;
- for(i = 0; i < set->CtnMeterNbr; i++)
- {
- cm = &APPL.CtnMeter[i + 1];
- if(mg_millis() - cm->LastUpdate > 10000)
- {
- cm->CommState = ST_COMM_ERR;
- strcpy(cm->szCommState,"故障");
- CommChkOk = -1;
- }
- else
- {
- cm->CommState = ST_COMM_NORM;
- strcpy(cm->szCommState,"正常");
- }
- }
- if(CommChkOk < 0)
- {
- APPL.CtnMeterCommState = ST_COMM_ERR;
- strcpy(APPL.szCtnMeterCommState,"故障");
- }
- else
- {
- APPL.CtnMeterCommState = ST_COMM_NORM;
- strcpy(APPL.szCtnMeterCommState,"正常");
- }
- }
- if(m->s_conn == NULL)
- {
- m->s_conn =
- mg_mqtt_connect(&mgr_mqtt2,m->szs_url,&opts,fn_mqtt2,NULL);
- m->TotalReconnCnt++;
- }
- }
- syslog(LOG_INFO,"%s EXIT, idx:2",__func__);
- }
- // Get data from mosquitto server
- static void* thrd_mqtt_3(void* param)
- {
- // struct chanmqtt_t* m = &APPL.chanmqtt[3];
- // struct Dtsd1352_t* gm = &APPL.GateMeter;
- // struct Dtsd1352_t* tm = &APPL.TransMeter;
- // struct mg_mqtt_opts opts = {.user = mg_str(m->szusrname),
- // .clean = true,
- // .qos = m->s_qos,
- // .topic = mg_str(m->szs_pub_topic),
- // .version = 4,
- // .keepalive = 3,
- // .message = mg_str("bye")};
- // struct mg_mqtt_opts pub_opts;
- // struct mg_str pubt = mg_str(m->szs_pub_topic);
- // char msg[2048];
- // int64_t LastReconn = 0;
- // int64_t LastCommCheck = 0;
- // mg_mgr_init(&mgr_mqtt3);
- // syslog(LOG_INFO,"%s ENTER, idx:3", __func__);
- // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt3, m->szs_url,
- // &opts, fn_mqtt3, NULL); while(1){
- // mg_mgr_poll(&mgr_mqtt3, 50);
- // if(mg_millis() - LastReconn > 5000){ // 5s
- // LastReconn = mg_millis();
- // if (m->s_conn == NULL) m->s_conn = mg_mqtt_connect(&mgr_mqtt1,
- // m->szs_url, &opts, fn_mqtt3, NULL);
- // }
- // if(mg_millis() - LastCommCheck > 1000){ // 1s
- // LastCommCheck = mg_millis();
- // if( mg_millis() - gm->LastUpdate > 10000){
- // gm->CommState = ST_COMM_ERR;
- // strcpy(gm->szCommState,"故障");
- // }else{
- // gm->CommState = ST_COMM_NORM;
- // strcpy(gm->szCommState,"正常");
- // }
- // if( mg_millis() - tm->LastUpdate > 10000){
- // tm->CommState = ST_COMM_ERR;
- // strcpy(tm->szCommState,"故障");
- // }else{
- // tm->CommState = ST_COMM_NORM;
- // strcpy(tm->szCommState,"正常");
- // }
- // }
- // }
- // syslog(LOG_INFO,"%s EXIT, idx:1", __func__);
- }
- static void fn_mqtt4_connlost(void* context,char* cause)
- {
- syslog(LOG_INFO,"%s, mqtt connection lost, cause: %s\n",__func__,cause);
- struct chanmqtt_t* m = &APPL.chanmqtt[4];
- m->bConnected = 0;
- strcpy(m->szState,"故障");
- }
- static int fn_mqtt4_msgarrvd(void* context,char* topicName,int topicLen,
- MQTTClient_message* message)
- {
- struct Dtsd1352_t* gm = &APPL.GateMeter;
- struct Dtsd1352_t* tm = &APPL.TransMeter;
- // struct Dtsd1352_t* pm = &APPL.PvMeter;
- struct Dtsd1352_t* cm = &APPL.CtnMeter;
- struct chanmqtt_t* m = &APPL.chanmqtt[4];
- int64_t CurrIntv;
- // syslog(LOG_INFO, "%s, Message arrived, topic:%s topic len:%d payload
- // len:%d",
- // __func__, topicName, topicLen, message->payloadlen);
- struct mg_str json = mg_str(message->payload);
- double dval;
- bool ok;
- char* str = NULL;
- struct mg_str json_device_id;
- char buf[512];
- char devid[128] = { 0 };
- int i;
- int length;
- int offset = mg_json_get(json,"$.data[0]",&length);
- double val;
- struct Settings_t* set = &APPL.Set.s;
- if(offset > 0)
- {
- memset(buf,0,sizeof(buf));
- strncpy(buf,json.ptr + offset,length);
- // syslog(LOG_INFO,"%s, Get data[0]:%s", __func__, buf);
- json_device_id = mg_str(buf);
- str = mg_json_get_str(json_device_id,"$.device_id");
- if(str != NULL)
- {
- for(i = 0; i < set->CtnMeterNbr; i++)
- {
- sprintf(devid,"CtnMeter%d",i + 1);
- cm = &APPL.CtnMeter[i + 1];
- if(strcmp(str,devid) == 0)
- {
- if(mg_json_get_num(json_device_id,"$.com_ap",&val))
- {
- cm->com_active_p = val;
- cm->LastUpdate = mg_millis();
- }
- }
- }
- sprintf(devid,"TransMeter%d",set->TransId);
- if(strcmp(str,devid) == 0)
- {
- if(mg_json_get_num(json_device_id,"$.com_ap",&val))
- {
- tm->com_active_p = val;
- tm->LastUpdate = mg_millis();
- }
- }
- if(strcmp(str,"GateMeter") == 0)
- {
- if(mg_json_get_num(json_device_id,"$.com_ap",&val))
- {
- gm->com_active_p = val;
- gm->LastUpdate = mg_millis();
- if(m->LastRecv == 0)
- { // First Recv
- m->TotalRecvCnt = 0;
- m->LastRecv = mg_millis();
- m->TotalRecvIntv = 0;
- }
- else
- {
- m->TotalRecvCnt++;
- int64_t CurrIntv = mg_millis() - m->LastRecv;
- m->LastRecv = mg_millis();
- if(CurrIntv > m->MaxRecvIntv)
- {
- m->MaxRecvIntv = CurrIntv;
- }
- m->TotalRecvIntv += CurrIntv;
- m->AvgRecvIntv = m->TotalRecvIntv / m->TotalRecvCnt;
- }
- }
- }
- free(str);
- }
- }
- else
- {
- syslog(LOG_INFO,"%s, Fail to Get data[0]:%d",__func__,offset);
- }
- }
- static void mqtt4_connect(void)
- {
- struct Settings_t* set = &APPL.Set.s;
- int rc;
- struct chanmqtt_t* m = &APPL.chanmqtt[4];
- MQTTClient_deliveryToken token;
- MQTTClient_connectOptions conn_opts;
- MQTTClient_connectOptions tmpconn_opts =
- MQTTClient_connectOptions_initializer5;
- conn_opts = tmpconn_opts;
- MQTTClient_createOptions createOpts = MQTTClient_createOptions_initializer;
- createOpts.MQTTVersion = MQTTVERSION_5;
- if((rc = MQTTClient_createWithOptions(&m->s_paho_client,m->szs_url,set->szSN,
- MQTTCLIENT_PERSISTENCE_NONE,NULL,
- &createOpts)) != MQTTCLIENT_SUCCESS)
- {
- syslog(LOG_INFO,
- "%s, MQTTClient_createWithOptions fail, rc:%d msg:%s %s %s",
- __func__,rc,MQTTClient_strerror(rc));
- }
- conn_opts.keepAliveInterval = 8;
- conn_opts.cleansession = 0;
- conn_opts.username = m->szusrname;
- conn_opts.password = m->szpasswd;
- MQTTProperties props = MQTTProperties_initializer;
- MQTTProperties willProps = MQTTProperties_initializer;
- MQTTResponse response = MQTTResponse_initializer;
- MQTTClient_setCallbacks(m->s_paho_client,NULL,fn_mqtt4_connlost,fn_mqtt4_msgarrvd,
- NULL);
- response = MQTTClient_connect5(m->s_paho_client,&conn_opts,&props,&willProps);
- if(response.reasonCode != MQTTCLIENT_SUCCESS)
- {
- syslog(LOG_INFO,"%s, MQTTClient_connect fail, rc:%d msg:%s",__func__,
- response.reasonCode,MQTTClient_strerror(response.reasonCode));
- m->bConnected = 0;
- strcpy(m->szState,"故障");
- }
- else
- {
- syslog(LOG_INFO,"%s, Connect Ok",__func__);
- m->bConnected = 1;
- strcpy(m->szState,"正常");
- // control
- response =
- MQTTClient_subscribe5(m->s_paho_client,m->szs_sub_topic[0],m->s_qos,NULL,NULL);
- if(response.reasonCode != MQTTCLIENT_SUCCESS &&
- response.reasonCode != m->s_qos)
- {
- syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s",
- __func__,response.reasonCode,
- MQTTClient_strerror(response.reasonCode));
- }
- else
- {
- syslog(LOG_INFO,"SUBSCRIBED to %s",m->szs_sub_topic[0]);
- }
- // GateMeter
- response =
- MQTTClient_subscribe5(m->s_paho_client,m->szs_sub_topic[1],m->s_qos,NULL,NULL);
- if(response.reasonCode != MQTTCLIENT_SUCCESS &&
- response.reasonCode != m->s_qos)
- {
- syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s",
- __func__,response.reasonCode,
- MQTTClient_strerror(response.reasonCode));
- }
- else
- {
- syslog(LOG_INFO,"SUBSCRIBED to %s",m->szs_sub_topic[1]);
- }
- // TransMeter
- response =
- MQTTClient_subscribe5(m->s_paho_client,m->szs_sub_topic[2],m->s_qos,NULL,NULL);
- if(response.reasonCode != MQTTCLIENT_SUCCESS &&
- response.reasonCode != m->s_qos)
- {
- syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s",
- __func__,response.reasonCode,
- MQTTClient_strerror(response.reasonCode));
- }
- else
- {
- syslog(LOG_INFO,"SUBSCRIBED to %s",m->szs_sub_topic[2]);
- }
- // CtnMeter1
- for(int i = 0; i < set->CtnMeterNbr; i++)
- {
- response = MQTTClient_subscribe5(m->s_paho_client,m->szs_sub_topic[3 + i],m->s_qos,
- NULL,NULL);
- if(response.reasonCode != MQTTCLIENT_SUCCESS &&
- response.reasonCode != m->s_qos)
- {
- syslog(LOG_INFO,"%s, MQTTClient_subscribe fail, rc: %d msg: %s",
- __func__,response.reasonCode,
- MQTTClient_strerror(response.reasonCode));
- }
- else
- {
- syslog(LOG_INFO,"SUBSCRIBED to %s",m->szs_sub_topic[3 + i]);
- }
- }
- }
- }
- static void mqtt4_pub(const char* szTopic,const char* szPayload)
- {
- double pub_time;
- int ret = 0;
- int rc;
- struct chanmqtt_t* m = &APPL.chanmqtt[4];
- MQTTResponse response = MQTTResponse_initializer;
- if(m->bConnected == false)
- {
- goto leave;
- }
- MQTTClient_deliveryToken token;
- MQTTClient_message msg = MQTTClient_message_initializer;
- msg.retained = 0;
- msg.qos = m->s_qos;
- msg.payload = (void*)szPayload;
- msg.payloadlen = (int)strlen(szPayload);
- response =
- MQTTClient_publishMessage5(m->s_paho_client,szTopic,&msg,&token);
- if(response.reasonCode != MQTTCLIENT_SUCCESS)
- {
- syslog(LOG_INFO,"%s, Failed to publish message: error msg : %s\n",
- __func__,MQTTClient_strerror(response.reasonCode));
- goto leave;
- }
- rc = MQTTClient_waitForCompletion(m->s_paho_client,token,100000L);
- if(rc != MQTTCLIENT_SUCCESS)
- {
- syslog(LOG_INFO,
- "%s, MQTTClient_waitForCompletion Failed, error msg : %s\n",
- __func__,MQTTClient_strerror(rc));
- goto leave;
- }
- else
- {
- // syslog(LOG_INFO, "%s, Published message: topic %s, payload %s\n",
- // __func__,
- // szTopic, szPayload);
- }
- leave:
- MQTTResponse_free(response);
- }
- static void* thrd_mqtt4(void* param)
- {
- int i,j;
- struct Dtsd1352_t* gm = &APPL.GateMeter;
- struct Dtsd1352_t* tm = &APPL.TransMeter;
- // struct Dtsd1352_t* pm = &APPL.PvMeter;
- struct Dtsd1352_t* cm = &APPL.CtnMeter;
- struct Settings_t* set = &APPL.Set.s;
- struct Ctl_t* ctl = &APPL.Ctl;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- struct FireAlarm_t* fa = NULL;
- struct Adl200_t* auxm = &APPL.Adl200;
- struct Co_t* co = &APPL.Co;
- struct Dehumi_t* dh = &APPL.Dehumi;
- struct Dido_t* dido = &APPL.Dido;
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- int ReconnChk = 0;
- char buf[8196];
- char msg[8196];
- char kv[8196];
- struct chanmqtt_t* m = &APPL.chanmqtt[4];
- double avgcellv;
- mqtt4_connect();
- while(1)
- {
- if(++ReconnChk > 10)
- {
- ReconnChk = 0;
- if(m->bConnected == 0)
- {
- mqtt4_connect();
- }
- }
- if(m->Cmd == CMD_MQTT_REGISTER)
- {
- m->Cmd = CMD_MQTT_DONE;
- // // Register STA
- // sprintf(msg,
- // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_id\":\"%s\",\"type\":0,\"idx\":1}]}",
- // set->szCloudUserName, (long long)time(NULL)*1000, set->szSN);
- // pub_opts.message = mg_str(msg);
- // pub_opts.qos = m->s_qos, pub_opts.retain = false;
- // pub_opts.topic = mg_str("register");
- // mg_mqtt_pub(m->s_conn, &pub_opts);
- // m->TotalSendCnt++;
- // Register CTN
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s\",\"type\":1,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- // Register PCS
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-PCS\",\"pid\":\"%s\",\"type\":2,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- // Register BMS
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-BMS\",\"pid\":\"%s\",\"type\":3,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- // Register AC
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-AC\",\"pid\":\"%s\",\"type\":4,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- // Register FA, FireAlarm
- for(i = 1; i <= 5; i++)
- {
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-FA%d\",\"pid\":\"%s\",\"type\":14,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- i,set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- }
- // Register AM, Aux Meter
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-AM\",\"pid\":\"%s\",\"type\":10,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- // Register CO, Co Sensor
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-CO\",\"pid\":\"%s\",\"type\":8,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- // Register DH, Dehumi
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-DH\",\"pid\":\"%s\",\"type\":7,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- // Register DIDO
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{\"device_"
- "id\":\"%s-DIDO\",\"pid\":\"%s\",\"type\":9,\"idx\":1}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,set->szSN,
- set->szSN);
- mqtt4_pub("register",msg);
- m->TotalSendCnt++;
- }
- avgcellv = bms->AvgCellV;
- // ******************************************
- // Upload Fast Data
- // ******************************************
- if(mg_millis() - m->LastFastUpload > set->UploadHighSpeed)
- {
- m->LastFastUpload = mg_millis();
- if(m->bConnected)
- {
- // CTN
- kv[0] = 0;
- sprintf(buf,
- "\"device_id\":\"%s\",\"type\":1,\"state\":%d,\"err\":\"%s\",",
- set->szSN,ctl->State,ctl->szErr);
- strcat(kv,buf);
- if(pcs->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"ap\":%d,",ctl->Ap);
- strcat(kv,buf);
- }
- if(bms->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"soc\":%.4f,",bms->Soc);
- strcat(kv,buf);
- }
- if(bms->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"soh\":%.4f,",bms->Soh);
- strcat(kv,buf);
- }
- strcat(kv,"\"end\":0");
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- // PCS
- kv[0] = 0;
- sprintf(buf,"\"device_id\":\"%s-PCS\",\"type\":2,",set->szSN);
- strcat(kv,buf);
- if(pcs->CommState == ST_COMM_NORM)
- {
- sprintf(buf,
- "\"ap\":%.1f,\"aps\":%.1f,\"rap\":%.1f,\"dcv\":%.1f,\"dcc\":%"
- ".1f,\"errstat\":%d,\"runstat\":%d,",
- pcs->Ap,pcs->Aps,pcs->Rap,pcs->BatV,pcs->BatC,
- pcs->ErrState,pcs->WorkState);
- strcat(kv,buf);
- }
- strcat(kv,"\"end\":0");
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- // BMS
- kv[0] = 0;
- if(bms->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-BMS\",\"type\":3,",set->szSN);
- strcat(kv,buf);
- sprintf(buf,
- "\"hv\":%d,\"v\":%.1f,\"c\":%.1f,\"cell_max_v\":%.3f,\"cell_"
- "ave_v\":%.3f,\"cell_min_v\":%.3f,",
- bms->HvState,bms->BatV,bms->BatI,bms->MaxCellV,
- bms->AvgCellV,bms->MinCellV);
- strcat(kv,buf);
- if(avgcellv < 3.0 || avgcellv > 3.45)
- {
- for(i = 1; i <= PACK_NBR; i++)
- {
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- sprintf(buf,"\"p%d_v%d\":%.3f,",i,j,bms->CellVolt[i][j]);
- strcat(kv,buf);
- }
- }
- }
- }
- strcat(kv,"\"end\":0");
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- }
- }
- // ******************************************
- // Upload Medium Data
- // ******************************************
- if(mg_millis() - m->LastMediumUpload > set->UploadMediumSpeed)
- {
- m->LastMediumUpload = mg_millis();
- if(m->bConnected)
- {
- // PCS
- kv[0] = 0;
- if(pcs->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-PCS\",\"type\":2,",set->szSN);
- strcat(kv,buf);
- sprintf(buf,
- "\"t_igbt\":%.1f,\"t_env\":%.1f,\"uab\":%.1f,\"ubc\":%.1f,"
- "\"uca\":%.1f,\"ia\":%.1f,\"ib\":%.1f,\"ic\":%.1f",
- pcs->Tigbt,pcs->Tenv,pcs->Uab,pcs->Ubc,pcs->Uca,pcs->Ia,
- pcs->Ib,pcs->Ic);
- strcat(kv,buf);
- }
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- // BMS
- kv[0] = 0;
- if(bms->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-BMS\",\"type\":3,",set->szSN);
- strcat(kv,buf);
- sprintf(
- buf,
- "\"cell_max_t\":%.1f,\"cell_ave_t\":%.1f,\"cell_min_t\":%.1f,\"soc\":%.3f,\"soh\":%.3f,\
- \"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,\
- \"pos_ins\":%.0f,\"neg_ins\":%.0f,",
- bms->MaxCellT,bms->AvgCellT,bms->MinCellT,bms->Soc,bms->Soh,
- bms->CellVDiff,bms->CellTDiff,bms->MaxCellVIdx,
- bms->MinCellVIdx,bms->MaxCellTIdx,bms->MinCellTIdx,bms->PosRes,
- bms->NegRes);
- strcat(kv,buf);
- if(avgcellv >= 3.0 && avgcellv <= 3.45)
- {
- for(i = 1; i <= PACK_NBR; i++)
- {
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- sprintf(buf,"\"p%d_v%d\":%.3f,",i,j,bms->CellVolt[i][j]);
- strcat(kv,buf);
- }
- }
- }
- for(i = 1; i <= PACK_NBR; i++)
- {
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- sprintf(buf,"\"p%d_t%d\":%.1f,",i,j,bms->CellTemp[i][j]);
- strcat(kv,buf);
- }
- }
- strcat(kv,"\"end\":0");
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- }
- // AC
- kv[0] = 0;
- if(ac->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-AC\",\"type\":4,",set->szSN);
- strcat(kv,buf);
- sprintf(buf,
- "\"work_mode\":%d,\"outwater_t\":%d,\"rtnwater_t\":%d,"
- "\"outwater_pre\":%.1f,\"rtnwater_pre\":%.1f,\"err_code\":%d,"
- "\"err_level\":%d",
- ac->WorkMode,ac->OutWaterTemp,ac->InWaterTemp,
- ac->OutWaterPre,ac->InWaterPre,ac->ErrCode,ac->ErrLevel);
- strcat(kv,buf);
- }
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- }
- }
- // ******************************************
- // Upload SLow Data
- // ******************************************
- if(mg_millis() - m->LastSlowUpload > set->UploadSlowSpeed)
- {
- m->LastSlowUpload = mg_millis();
- if(m->bConnected)
- {
- // FA
- for(i = 1; i <= 5; i++)
- {
- fa = &APPL.Fa[i];
- kv[0] = 0;
- if(fa->CommState == ST_COMM_NORM)
- {
- sprintf(buf,"\"device_id\":\"%s-FA%d\",\"type\":14,",set->szSN,
- i);
- strcat(kv,buf);
- sprintf(buf,
- "\"T1\":%d,\"T2\":%d,\"Co\":%d,\"Voc\":%d,\"SmokeFlag\":%d,"
- "\"Level\":%d,\"ErrCode\":%d",
- fa->T1,fa->T2,fa->Co,fa->Voc,fa->SmokeFlagVal,
- fa->LevelVal,fa->ErrCodeVal);
- strcat(kv,buf);
- sprintf(
- msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- }
- }
- // AM
- if(auxm->CommState == ST_COMM_NORM)
- {
- kv[0] = 0;
- sprintf(buf,"\"device_id\":\"%s-AM\",\"type\":10,",set->szSN);
- strcat(kv,buf);
- sprintf(buf,"\"pos_ae\":%.1f,\"neg_ae\":%.1f,\"ap\":%.1f",
- auxm->PosAe,auxm->NegAe,auxm->Ap);
- strcat(kv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- }
- // // CO
- // if(co->CommState == ST_COMM_NORM){
- // kv[0] = 0;
- // sprintf(buf,"\"device_id\":\"%s-CO\",\"type\":8,", set->szSN);
- // strcat(kv,buf);
- // sprintf(buf,"\"Density\":%u,", co->Density);
- // strcat(kv,buf);
- // sprintf(msg,
- // "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- // set->szCloudUserName, (long long)time(NULL)*1000, kv);
- // pub_opts.message = mg_str(msg);
- // pub_opts.qos = m->s_qos, pub_opts.retain = false;
- // pub_opts.topic = pubt;
- // mg_mqtt_pub(m->s_conn, &pub_opts);
- // m->TotalSendCnt++;
- // }
- // DH
- if(dh->CommState)
- {
- kv[0] = 0;
- sprintf(buf,"\"device_id\":\"%s-DH\",\"type\":7,",set->szSN);
- strcat(kv,buf);
- sprintf(buf,"\"temp\":%.1f,\"humi\":%.1f,\"heat_state\":%d, \"work_state\":%d,",dh->Temp,dh->Humi,dh->HeatState,dh->WorkState);
- strcat(kv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- }
- // DIDO
- kv[0] = 0;
- sprintf(buf,"\"device_id\":\"%s-DIDO\",\"type\":9,",set->szSN);
- strcat(kv,buf);
- sprintf(buf,
- "\"WaterDec1\":%d,\"WaterDec2\":%d,\"FrontDoor\":%d,"
- "\"BackDoor\":%d,\"EmgStop\":%d,\"FeEruptFb\":%d",
- dido->WaterDec1,dido->WaterDec2,dido->FrontDoor,
- dido->BackDoor,dido->EmgStop,dido->FeEruptFb);
- strcat(kv,buf);
- sprintf(msg,
- "{\"project_id\":\"%s\",\"timestamp\":%lld,\"data\":[{%s}]}",
- set->szCloudUserName,(long long)time(NULL) * 1000,kv);
- mqtt4_pub(m->szs_pub_topic,msg);
- m->TotalSendCnt++;
- }
- }
- if(mg_millis() - gm->LastUpdate > 15000)
- {
- gm->CommState = ST_COMM_ERR;
- strcpy(gm->szCommState,"故障");
- }
- else
- {
- gm->CommState = ST_COMM_NORM;
- strcpy(gm->szCommState,"正常");
- }
- if(mg_millis() - tm->LastUpdate > 15000)
- {
- tm->CommState = ST_COMM_ERR;
- strcpy(tm->szCommState,"故障");
- }
- else
- {
- tm->CommState = ST_COMM_NORM;
- strcpy(tm->szCommState,"正常");
- }
- if(mg_millis() - cm->LastUpdate > 15000)
- {
- cm->CommState = ST_COMM_ERR;
- strcpy(cm->szCommState,"故障");
- }
- else
- {
- cm->CommState = ST_COMM_NORM;
- strcpy(cm->szCommState,"正常");
- }
- // if( mg_millis() - pm->LastUpdate > 15000){
- // pm->CommState = ST_COMM_ERR;
- // strcpy(pm->szCommState,"故障");
- // }else{
- // pm->CommState = ST_COMM_NORM;
- // strcpy(pm->szCommState,"正常");
- // }
- // sleep(1);
- //}
- }
- }
- void appl_snap_set_err(void)
- {
- APPL.Snap.bErr = 1;
- strcpy(APPL.Snap.szState,"故障");
- }
- void appl_snap_reset_err(void)
- {
- APPL.Snap.bErr = 0;
- strcpy(APPL.Snap.szState,"正常");
- }
- static int appl_snap_day_diff(int year_start,int month_start,int day_start,
- int year_end,int month_end,int day_end)
- {
- int y2,m2,d2;
- int y1,m1,d1;
- m1 = (month_start + 9) % 12;
- y1 = year_start - m1 / 10;
- d1 = 365 * y1 + y1 / 4 - y1 / 100 + y1 / 400 + (m1 * 306 + 5) / 10 +
- (day_start - 1);
- m2 = (month_end + 9) % 12;
- y2 = year_end - m2 / 10;
- d2 = 365 * y2 + y2 / 4 - y2 / 100 + y2 / 400 + (m2 * 306 + 5) / 10 +
- (day_end - 1);
- return (d2 - d1);
- }
- int appl_snap_rmdir(const char* path)
- {
- DIR* d = opendir(path);
- size_t path_len = strlen(path);
- int r = -1;
- if(d)
- {
- struct dirent* p;
- r = 0;
- while(!r && (p = readdir(d)))
- {
- int r2 = -1;
- char* buf;
- size_t len;
- /* Skip the names "." and ".." as we don't want to recurse on them. */
- if(!strcmp(p->d_name,".") || !strcmp(p->d_name,"..")) continue;
- len = path_len + strlen(p->d_name) + 2;
- buf = malloc(len);
- if(buf)
- {
- struct stat statbuf;
- snprintf(buf,len,"%s/%s",path,p->d_name);
- if(!stat(buf,&statbuf))
- {
- if(S_ISDIR(statbuf.st_mode))
- r2 = appl_snap_rmdir(buf);
- else
- r2 = unlink(buf);
- }
- free(buf);
- }
- r = r2;
- }
- closedir(d);
- }
- if(!r) r = rmdir(path);
- return r;
- }
- static void* thrd_snap(void* param)
- {
- struct Settings_t* set = &APPL.Set.s;
- struct Snap_t* s = &APPL.Snap;
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- struct Ctl_t* ctl = &APPL.Ctl;
- struct Dtsd1352_t* cm = &APPL.CtnMeter[set->CtnMeterId];
- struct Dtsd1352_t* tm = &APPL.TransMeter;
- struct Dtsd1352_t* gm = &APPL.GateMeter;
- struct Adl200_t* aum = &APPL.Adl200;
- struct FireAlarm_t* fa = NULL;
- struct Dido_t* dido = &APPL.Dido;
- char buf[128];
- char szfn[128];
- int y,m,d,h,min,ss; // current
- int yy,mm,dd; // dir
- int diff_day;
- int rc;
- DIR* dir;
- struct dirent* ptr;
- char szyy[8];
- char szmm[8];
- char szdd[8];
- int i,j;
- sleep(5);
- syslog(LOG_INFO,"%s, ++",__func__);
- while(1)
- {
- usleep(300000);
- if(s->bErr || set->bErr)
- {
- continue;
- }
- if(s->bStart == 0)
- {
- appl_get_datetime_num(&y,&m,&d,&h,&min,&ss);
- // 建立与序列号对应的文件夹
- sprintf(buf,"./snap_%s",set->szSN);
- if(access(buf,NULL) != 0)
- { // directory does not exists
- if(mkdir(buf,0755) < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- // 建立与日期对应的文件夹
- sprintf(s->szcurrDatePath,"./snap_%s/%04d-%02d-%02d",set->szSN,y,m,
- d);
- if(access(s->szcurrDatePath,NULL) != 0)
- { // directory does not exists
- if(mkdir(s->szcurrDatePath,0755) < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- // PCS Snap Start
- sprintf(szfn,"%s/PCS_%04d-%02d-%02d %02d-%02d-%02d.csv",
- s->szcurrDatePath,y,m,d,h,min,ss);
- s->fpcs = fopen(szfn,"w+");
- if(s->fpcs == NULL)
- {
- s->bErr = 1;
- continue;
- }
- else
- {
- rc = fprintf(
- s->fpcs,
- "ts,Uab,Ubc,Uca,Ia,Ib,Ic,Ap,Rap,BatV,BatC,Tigbt,Tenv,Tind,WorkState,ErrState,Aps,TotalBusVolt,CommState,\
- HwFault1,HwFault2,GridFault,BusFault,AcCapFault,SysFault,OnOffFault,OtherFault\n");
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- // BMS Snap Start
- sprintf(szfn,"%s/BMS_%04d-%02d-%02d %02d-%02d-%02d.csv",
- s->szcurrDatePath,y,m,d,h,min,ss);
- s->fbms = fopen(szfn,"w+");
- if(s->fbms == NULL)
- {
- s->bErr = 1;
- continue;
- }
- else
- {
- rc = fprintf(s->fbms,
- "ts,CommState,BatV,BatI,Soc,Soh,BatState,PosRes,NegRes,\
- MaxCellV,AvgCellV,MinCellV,MaxCellT,AvgCellT,MinCellT,\
- CellVDiff,CellTDiff,\
- HvState,MaxCellVIdx,MinCellVIdx,MaxCellTIdx,MinCellTIdx,\
- MaxChgCurr,MaxDhgCurr\n");
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- // PACK Snap Start
- for(i = 1; i <= PACK_NBR; i++)
- {
- sprintf(szfn,"%s/PACK%d_%04d-%02d-%02d %02d-%02d-%02d.csv",
- s->szcurrDatePath,i,y,m,d,h,min,ss);
- s->fpack[i] = fopen(szfn,"w+");
- if(s->fpack[i] == NULL)
- {
- s->bErr = 1;
- continue;
- }
- else
- {
- rc = fprintf(s->fpack[i],"ts,");
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- rc = fprintf(s->fpack[i],"v%d,",j);
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- rc = fprintf(s->fpack[i],"t%d,",j);
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- rc = fprintf(s->fpack[i],"CommState\n");
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- }
- // FireAlarm Snap Start
- sprintf(szfn,"%s/FA_%04d-%02d-%02d %02d-%02d-%02d.csv",
- s->szcurrDatePath,y,m,d,h,min,ss);
- s->ffa = fopen(szfn,"w+");
- if(s->ffa == NULL)
- {
- s->bErr = 1;
- continue;
- }
- else
- {
- rc = fprintf(s->ffa,"ts,");
- for(i = 1; i <= PACK_NBR; i++)
- {
- fprintf(s->ffa,
- "Fa%d_CommState,Fa%d_t1,Fa%d_t2,Fa%d_co,Fa%d_voc,Fa%d_"
- "ErrCode,Fa%d_SmokeFlag,Fa%d_Level,",
- i,i,i,i,i,i,i,i);
- }
- fprintf(s->ffa,"dummy\n");
- }
- // AC Snap Start
- sprintf(szfn,"%s/AC_%04d-%02d-%02d %02d-%02d-%02d.csv",
- s->szcurrDatePath,y,m,d,h,min,ss);
- s->fac = fopen(szfn,"w+");
- if(s->fac == NULL)
- {
- s->bErr = 1;
- continue;
- }
- else
- {
- rc = fprintf(s->fac,
- "ts,SetTemp,SetMode,CoolTemp,CoolGap,HeatTemp,HeatGap,\
- WorkMode,OutWaterTemp,InWaterTemp,OutWaterPre,InWaterPre,\
- EnvTemp,ErrCode,ErrLevel,\
- CompState,CompHeatStripState,ElecHeatState,PumpState,\
- Fan1State,Fan2State,Fan3State,CompRpm,PumpRpm,\
- CommState,CtlMode\n");
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- // **************************
- // CTL Snap Start
- // **************************
- sprintf(szfn,"%s/CTL_%04d-%02d-%02d %02d-%02d-%02d.csv",
- s->szcurrDatePath,y,m,d,h,min,ss);
- s->fctl = fopen(szfn,"w+");
- if(s->fctl == NULL)
- {
- s->bErr = 1;
- continue;
- }
- else
- {
- rc = fprintf(s->fctl,
- "ts,State,Step,WorkMode,Err,Cmd,bChgAble,bDhgAble,\
- Ap,GmAp,TransAp,CtnMeterAp,ChgGateLim,ChgTransLim,DhgGateLim,DhgTransLim\n");
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- // MISC Snap Start
- sprintf(szfn,"%s/MISC_%04d-%02d-%02d %02d-%02d-%02d.csv",
- s->szcurrDatePath,y,m,d,h,min,ss);
- s->fmisc = fopen(szfn,"w+");
- if(s->fmisc == NULL)
- {
- s->bErr = 1;
- continue;
- }
- else
- {
- rc = fprintf(s->fmisc,
- "ts,GmAp,TmAp,\
- AuxmAp,AuxmPosAe,AuxmNegAe,AuxmCommState,\
- DhTemp,DhHumi,DhCommState,\
- CoDensity,CoFlag,CoCommState,\
- DidoWaterDec1,DidoWaterDec2,DidoEmgStop,DidoFrontDoor,DidoBackDoor,FeEruptFb,DidoLedMode\n");
- if(rc < 0)
- {
- s->bErr = 1;
- continue;
- }
- }
- s->LastSnap = 0;
- s->bStart = 1;
- }
- else
- {
- if(mg_millis() - s->LastSnap > 5000)
- { /* snap every 5 seconds */
- s->LastSnap = mg_millis();
- appl_get_datetime_num(&y,&m,&d,&h,&min,&ss);
- sprintf(buf,"./snap_%s/%04d-%02d-%02d",set->szSN,y,m,d);
- if(strcmp(buf,s->szcurrDatePath) != 0)
- { /* New Date or New SN*/
- // syslog(LOG_INFO,"%s, New Date Or New SN, Detected", __func__);
- if(s->fpcs != NULL)
- {
- fclose(s->fpcs);
- s->fpcs = NULL;
- }
- // syslog(LOG_INFO,"%s, pcs Closed", __func__);
- if(s->fbms != NULL)
- {
- fclose(s->fbms);
- s->fbms = NULL;
- }
- // syslog(LOG_INFO,"%s, bms Closed", __func__);
- for(i = 1; i <= PACK_NBR; i++)
- {
- if(s->fpack[i] != NULL)
- {
- fclose(s->fpack[i]);
- s->fpack[i] = NULL;
- }
- }
- // syslog(LOG_INFO,"%s, pack Closed", __func__);
- if(s->ffa != NULL)
- {
- fclose(s->ffa);
- s->ffa = NULL;
- }
- // syslog(LOG_INFO,"%s, ffa Closed", __func__);
- if(s->fac != NULL)
- {
- fclose(s->fac);
- s->fac = NULL;
- }
- // syslog(LOG_INFO,"%s, ac Closed", __func__);
- if(s->fctl != NULL)
- {
- fclose(s->fctl);
- s->fctl = NULL;
- }
- // syslog(LOG_INFO,"%s, ctl Closed", __func__);
- if(s->fmisc != NULL)
- {
- fclose(s->fmisc);
- s->fmisc = NULL;
- }
- // syslog(LOG_INFO,"%s, misc Done", __func__);
- // del outofdate dir
- sprintf(buf,"./snap_%s",set->szSN);
- if((dir = opendir(buf)) == NULL)
- {
- // s->bErr = 1;
- // syslog(LOG_INFO,"%s, opendir : %s to del Fail, Maybe New SN",
- // __func__, buf); continue; // Maybe New SN
- }
- else
- {
- // syslog(LOG_INFO,"%s, Begin To Del Outofdate File", __func__);
- while((ptr = readdir(dir)) != NULL)
- {
- if(strcmp(ptr->d_name,".") == 0 ||
- strcmp(ptr->d_name,"..") ==
- 0)
- { /// current dir OR parrent dir
- continue;
- }
- else if(ptr->d_type == 8)
- { /// file
- }
- else if(ptr->d_type == 10)
- { /// link file
- // printf("d_name:%s/%s\n",basePath,ptr->d_name);
- }
- else if(ptr->d_type == 4)
- { /// dir
- if(strlen(ptr->d_name) == 10 && ptr->d_name[4] == '-' &&
- ptr->d_name[7] == '-')
- { // target dir
- // syslog(LOG_INFO,"%s, Target Dir:%s Detedted", __func__,
- // ptr->d_name);
- strncpy(szyy,ptr->d_name,4);
- strncpy(szmm,ptr->d_name + 5,2);
- strncpy(szdd,ptr->d_name + 8,2);
- yy = atoi(szyy);
- mm = atoi(szmm);
- dd = atoi(szdd);
- diff_day = appl_snap_day_diff(yy,mm,dd,y,m,d);
- if(diff_day > set->DataKeepDay)
- {
- sprintf(buf,"./snap_%s/%s",set->szSN,ptr->d_name);
- rc = appl_snap_rmdir(buf);
- if(rc < 0)
- {
- syslog(LOG_INFO,"%s, Target Dir:%s Del Fail",__func__,
- ptr->d_name);
- s->bErr = 1;
- continue;
- }
- else
- {
- syslog(LOG_INFO,"%s, Target Dir:%s Del Ok",__func__,
- ptr->d_name);
- }
- }
- }
- }
- }
- closedir(dir);
- }
- s->bStart = 0; /* start again at next loop */
- continue;
- }
- else
- {
- s->LastSnap = mg_millis();
- strcpy(buf,appl_get_datetime_short());
- // PCS Snap
- // HwFault1,HwFault2,GridFault,BusFault,AcCapFault,SysFault,OnOffFault,OtherFault
- if(s->fpcs != NULL && pcs->CommState == ST_COMM_NORM)
- {
- fprintf(s->fpcs,
- "%s,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,\
- %.1f,%.1f,%.1f,%.1f,\
- %.1f,%.1f,%.1f,\
- %d,%d,%.1f,%.1f,%d,\
- %u,%u,%u,%u,%u,%u,%u,%u\n",
- buf,pcs->Uab,pcs->Ubc,pcs->Uca,pcs->Ia,pcs->Ib,
- pcs->Ic,pcs->Ap,pcs->Rap,pcs->BatV,pcs->BatC,
- pcs->Tigbt,pcs->Tenv,pcs->Tind,pcs->WorkState,
- pcs->ErrState,pcs->Aps,pcs->TotalBusVolt,pcs->CommState,
- pcs->HwFault1,pcs->HwFault2,pcs->GridFault,pcs->BusFault,
- pcs->AcCapFault,pcs->SysFault,pcs->OnOffFault,
- pcs->OtherFault);
- fflush(s->fpcs);
- }
- // BMS Snap
- if(s->fbms != NULL && bms->CommState == ST_COMM_NORM)
- {
- fprintf(s->fbms,
- "%s,%d,%.1f,%.1f,%.1f,%.1f,%d,%.1f,%.1f,\
- %.3f,%.3f,%.3f,%.1f,%.1f,%.1f,\
- %.1f,%.1f,\
- %d,%d,%d,%d,%d,\
- %.1f,%.1f\n",
- buf,bms->CommState,bms->BatV,bms->BatI,bms->Soc,
- bms->Soh,bms->BatState,bms->PosRes,bms->NegRes,
- bms->MaxCellV,bms->AvgCellV,bms->MinCellV,bms->MaxCellT,
- bms->AvgCellT,bms->MinCellT,bms->CellVDiff,
- bms->CellTDiff,bms->HvState,bms->MaxCellVIdx,
- bms->MinCellVIdx,bms->MaxCellTIdx,bms->MinCellTIdx,
- bms->MaxChgCurr,bms->MaxDhgCurr);
- fflush(s->fbms);
- }
- // PACK Snap
- for(i = 1; i <= PACK_NBR; i++)
- {
- if(s->fpack[i] != NULL && bms->CommState == ST_COMM_NORM)
- {
- fprintf(s->fpack[i],"%s,",buf);
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- fprintf(s->fpack[i],"%f,",bms->CellVolt[i][j]);
- }
- for(j = 1; j <= PACK_CELL_NBR; j++)
- {
- fprintf(s->fpack[i],"%f,",bms->CellTemp[i][j]);
- }
- fprintf(s->fpack[i],"%d\n",bms->CommState);
- }
- }
- // FireAlarm Snap
- if(s->ffa != NULL)
- {
- fprintf(s->ffa,"%s,",buf);
- for(i = 1; i <= PACK_NBR; i++)
- {
- fa = &APPL.Fa[i];
- fprintf(s->ffa,"%d,%d,%d,%d,%d,%d,%d,%d,",fa->CommState,fa->T1,
- fa->T2,fa->Co,fa->Voc,fa->ErrCodeVal,fa->SmokeFlagVal,
- fa->LevelVal);
- }
- fprintf(s->ffa,"%d\n",0);
- fflush(s->ffa);
- }
- // AC Snap
- if(s->fac != NULL && ac->CommState == ST_COMM_NORM)
- {
- fprintf(s->fac,
- "%s,%d,%d,%d,%d,%d,%d,\
- %d,%d,%d,%.1f,%.1f,\
- %d,%d,%d,\
- %d,%d,%d,%d,\
- %d,%d,%d,%d,%d,\
- %d,%d\n",
- buf,ac->SetTemp,ac->SetMode,set->CoolTemp,set->CoolGap,
- set->HeatTemp,set->HeatGap,ac->WorkMode,ac->OutWaterTemp,
- ac->InWaterTemp,ac->OutWaterPre,ac->InWaterPre,
- ac->EnvTemp,ac->ErrCode,ac->ErrLevel,ac->CompState,
- ac->CompHeatStripState,ac->ElecHeatState,ac->PumpState,
- ac->Fan1State,ac->Fan2State,ac->Fan3State,ac->CompRpm,
- ac->PumpRpm,ac->CommState,ac->CtlMode);
- fflush(s->fac);
- }
- // Ap,GmAp,TransAp,CtnMeterAp,ChgGateLim,ChgTransLim,DhgGateLim,DhgTransLim
- // CTL Snap
- if(s->fctl != NULL)
- {
- fprintf(s->fctl,
- "%s,%d,%d,%d,%d,%d,%d,%d,\
- %d,%d,%d,%d,%d,%d,%d,%d\n",
- buf,ctl->State,ctl->Step,ctl->WorkMode,ctl->Err,
- ctl->Cmd,ctl->bChgAble,ctl->bDhgAble,ctl->Ap,
- (int)gm->com_active_p,(int)tm->com_active_p,
- (int)APPL.CtnMeter[set->CtnMeterId].com_active_p,
- set->ChgGateLim,set->ChgTransLim,set->DhgGateLim,
- set->DhgTransLim);
- fflush(s->fctl);
- }
- // MISC Snap
- if(s->fmisc != NULL)
- {
- fprintf(s->fmisc,
- "%s,%.1f,%.1f,\
- %.1f,%.1f,%.1f,%d,\
- %.1f,%.1f,%d,\
- %d,%d,%d,\
- %d,%d,%d,%d,%d,%d,%d\n",
- /*1*/ buf,gm->com_active_p,tm->com_active_p,
- /*2*/ aum->Ap,aum->PosAe,aum->NegAe,aum->CommState,
- /*3*/ APPL.Dehumi.Temp,APPL.Dehumi.Humi,
- APPL.Dehumi.CommState,
- /*4*/ APPL.Co.Density,APPL.Co.Flag,APPL.Co.CommState,
- /*5*/ dido->WaterDec1,dido->WaterDec2,dido->EmgStop,
- dido->FrontDoor,dido->BackDoor,dido->FeEruptFb,
- dido->LedMode);
- fflush(s->fmisc);
- }
- }
- }
- }
- }
- syslog(LOG_INFO,"%s, --",__func__);
- }
- void appl_start(void)
- {
- pthread_t hthrd_485_1;
- pthread_t hthrd_485_2;
- pthread_t hthrd_485_3;
- pthread_t hthrd_485_4;
- pthread_t hthrd_can_1;
- pthread_t hthrd_can_2;
- pthread_t hthrd_dido;
- pthread_t hthrd_ctl;
- pthread_t hthrd_mqtt1;
- pthread_t hthrd_mqtt2;
- pthread_t hthrd_mqtt3;
- pthread_t hthrd_mqtt4;
- pthread_t hthrd_snap;
- struct Settings_t* set = &APPL.Set.s;
- struct Ctl_t* ctl = &APPL.Ctl;
- struct chan485_t* c1 = &APPL.chan485[1];
- struct Enjoy100kW_t* pcs = &APPL.Enjoy100kW;
- struct GaoteBms_t* bms = &APPL.GaoteBms;
- struct Envicool5kW_t* ac = &APPL.Envicool5kW;
- struct chanmqtt_t* m = NULL;
- struct Snap_t* snap = &APPL.Snap;
- char buf[128];
- char buf2[128];
- int len;
- int i;
- syslog(LOG_INFO,"%s, ++",__func__);
- // Set
- if(appl_cfg_read() != 0)
- {
- appl_cfg_set_err();
- syslog(LOG_INFO,"%s, appl_cfg_read fail",__func__);
- // Set Default Settings
- strcpy(set->szSN,"DefaultSN");
- set->ChgCellV = 3.45;
- set->DhgCellV = 3.00;
- set->ChgGateLim = 10000;
- set->DhgGateLim = 200;
- set->ChgTransLim = 2000;
- set->DhgTransLim = -2000;
- set->CtnMeterNbr = 2;
- strcpy(set->szCloudUserName,"6adc9339ae5944ca900e53501e7f1535");
- strcpy(set->szCloudPasswd,"JSXJd!Q#c@");
- strcpy(set->szCloudUrl,"119.45.116.112:18883");
- set->UploadHighSpeed = 5000;
- set->UploadMediumSpeed = 60000;
- set->UploadSlowSpeed = 180000;
- // init AC Cfg
- set->HeatTemp = 15;
- set->HeatGap = 3;
- set->CoolTemp = 23;
- set->CoolGap = 3;
- set->CoolTempSet = 18;
- set->HeatTempSet = 25;
- // init Snap Cfg
- set->DataKeepDay = 7;
- for(i = 0; i <= 31; i++)
- {
- set->pcurv[i] = 35;
- }
- for(i = 32; i <= 43; i++)
- {
- set->pcurv[i] = -70;
- }
- for(i = 44; i <= 67; i++)
- {
- set->pcurv[i] = 45;
- }
- for(i = 68; i <= 87; i++)
- {
- set->pcurv[i] = -70;
- }
- for(i = 88; i <= 95; i++)
- {
- set->pcurv[i] = 0;
- }
- }
- else
- {
- syslog(LOG_INFO,"%s, appl_cfg_read Ok",__func__);
- appl_cfg_reset_err();
- // //1# MQTT thingsboard
- // m = &APPL.chanmqtt[1];
- // m->s_conn = NULL;
- // strcpy(m->szs_url,"124.222.45.156:1883");
- // strcpy(m->szs_pub_topic,"v1/devices/me/telemetry");
- // strcpy(m->szs_sub_topic,"v1/devices/me/ctl");
- // m->s_qos = 1;
- // //测试设备
- // //strcpy(m->szusrname,"gFCNk8oSxC6VlYXkhs3a");
- // strcpy(m->szusrname,"DZHbY2HAGeATfRCfhlW7");
- // m->bConnected = 0;
- // 2# MQTT Cloud
- m = &APPL.chanmqtt[4];
- m->s_conn = NULL;
- strncpy(m->szusrname,set->szCloudUserName,sizeof(m->szusrname) - 1);
- strncpy(m->szpasswd,set->szCloudPasswd,sizeof(m->szpasswd) - 1);
- strncpy(m->szs_url,set->szCloudUrl,sizeof(m->szs_url) - 1);
- strncpy(m->szclientid,set->szClientId,sizeof(m->szclientid) - 1);
- sprintf(m->szs_pub_topic,"sequential/%s",m->szusrname);
- sprintf(m->szs_sub_topic[0],"control");
- sprintf(m->szs_sub_topic[1],"sequential/%s/%s",m->szusrname,"GateMeter");
- sprintf(m->szs_sub_topic[2],"sequential/%s/TransMeter%d",m->szusrname,
- set->TransId);
- for(i = 0; i < set->CtnMeterNbr; i++)
- {
- sprintf(m->szs_sub_topic[3 + i],"sequential/%s/CtnMeter%d",m->szusrname,
- i + 1);
- }
- m->s_qos = 1;
- m->bConnected = 0;
- m->LastRecv = 0;
- m->TotalReconnCnt = 0;
- // // 3# MQTT mosquitto server
- // m = &APPL.chanmqtt[3];
- // m->s_conn = NULL;
- // strcpy(m->szs_url,"119.45.101.222:1883");
- // strcpy(m->szs_pub_topic,"qcd215");
- // strcpy(m->szs_sub_topic[0],"zh_gate_m");
- // //strcpy(m->szs_sub_topic[1],"zh_testarea_m");
- // m->s_qos = 1;
- // m->bConnected = 0;
- // // 4# MQTT EMQ server by paho
- // // 获取关口表等电表的数据
- // m = &APPL.chanmqtt[4];
- // m->s_conn = NULL;
- // strcpy(m->szs_url,"119.45.116.112:18883");
- // strcpy(m->szusrname,"bms");
- // strcpy(m->szpasswd,"KkK1iA71");
- // //strcpy(m->szclientid,APPL.Set.s.szSN);
- // strcpy(m->szclientid,"ZHES233230008");
- // strcpy(m->szs_pub_topic,"duolengduo_ctn");
- // strcpy(m->szs_sub_topic[0],"duolengduo_meter");
- // m->s_qos = 1;
- // m->bConnected = 0;
- // m->MaxIntv = 0;
- // m->AvgIntv = 0;
- // m->LastRecv = 0;
- // pthread_create(&hthrd_mqtt2, NULL, thrd_mqtt_2, NULL);
- // pthread_create(&hthrd_mqtt3, NULL, thrd_mqtt_3, NULL);
- pthread_create(&hthrd_mqtt4,NULL,thrd_mqtt4,NULL);
- }
- appl_485_set_485mode();
- // CHAN 485 1
- strcpy(APPL.chan485[1].szdev,"/dev/ttymxc1");
- APPL.chan485[1].baud = 9600;
- APPL.chan485[1].parity = 'N';
- strcpy(APPL.chan485[1].szinfo,"PCS 辅助电表");
- // CHAN 485 2
- strcpy(APPL.chan485[2].szdev,"/dev/ttymxc2");
- APPL.chan485[2].baud = 9600;
- APPL.chan485[2].parity = 'N';
- strcpy(APPL.chan485[2].szinfo,"BMS");
- // CHAN 485 3
- strcpy(APPL.chan485[3].szdev,"/dev/ttymxc3");
- APPL.chan485[3].baud = 9600;
- APPL.chan485[3].parity = 'N';
- strcpy(APPL.chan485[3].szinfo,"未使用");
- // CHAN 485 4
- strcpy(APPL.chan485[4].szdev,"/dev/ttymxc5");
- APPL.chan485[4].baud = 9600;
- APPL.chan485[4].parity = 'N';
- strcpy(APPL.chan485[4].szinfo,"一氧化碳 除湿机 消防主机");
- // CHAN CAN 1
- strcpy(APPL.chancan[1].szdev,"can0");
- strcpy(APPL.chancan[1].szinfo,"电池包火灾探测器");
- // CHAN CAN 2
- strcpy(APPL.chancan[2].szdev,"can1");
- strcpy(APPL.chancan[2].szinfo,"液冷空调");
- // init PCS
- pcs->Adr = 1;
- pcs->LastUpdate = 0;
- pcs->CommFailTotalCnt = 0;
- // init BMS
- bms->Adr = 1;
- bms->LastUpdate = 0;
- bms->CommFailTotalCnt = 0;
- // init Envicool5kW
- ac->LastUpdate1 = 0;
- ac->LastUpdate2 = 0;
- appl_ac_set_ctlmod(AC_CTLMOD_EMS);
- // init AUXM
- APPL.Adl200.Adr = 7;
- APPL.Adl200.LastUpdate = 0;
- APPL.Adl200.CommFailTotalCnt = 0;
- // Dehumi
- APPL.Dehumi.Adr = 1;
- // Co
- APPL.Co.Adr = 5;
- // Dido
- appl_dido_set_led(LEDMODE_WHITE);
- // CTL
- ctl->bChgAble = 1;
- ctl->bDhgAble = 1;
- ctl->Cmd = CTL_CMD_DONE;
- appl_ctl_set_workmode(CTL_WORKMODE_SLAVE);
- // Snap
- appl_snap_reset_err();
- snap->bStart = 0;
- pthread_create(&hthrd_485_1,NULL,thrd_485_1,NULL);
- pthread_create(&hthrd_485_2,NULL,thrd_485_2,NULL);
- pthread_create(&hthrd_485_3,NULL,thrd_485_3,NULL);
- pthread_create(&hthrd_485_3,NULL,thrd_485_4,NULL);
- pthread_create(&hthrd_can_1,NULL,thrd_can1,NULL);
- pthread_create(&hthrd_can_2,NULL,thrd_can2,NULL);
- pthread_create(&hthrd_dido,NULL,thrd_dido,NULL);
- pthread_create(&hthrd_ctl,NULL,thrd_ctl,NULL);
- pthread_create(&hthrd_snap,NULL,thrd_snap,NULL);
- }
|