MmiData.c 190 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925
  1. /********************************************************************
  2. 版权所有:
  3. 文件版本: V1.00
  4. 文件名称: Mmidata.c
  5. 生成日期: 2008年09月9日
  6. 作 者:
  7. 使用范围:
  8. 功 能:菜单调用的各种处理函数
  9. 更新信息:
  10. 更新日志1:
  11. 修改者:
  12. 修改日期:
  13. 修改内容:
  14. 修改原因:
  15. *********************************************************************/
  16. #include "head.h"
  17. #if defined LINUX_KERNEL_APP
  18. #include <linux/delay.h>
  19. #endif
  20. #include "uart_user.h"
  21. #define LCD_SIZE 160
  22. UINT m_ScreenNum;
  23. UINT m_CurrentScreen;
  24. UINT m_SwNo;
  25. DATA_MENU_DEF g_tDataMenu1; //数据菜单定义
  26. DATA_MENU_DEF g_tDataMenu2; //数据菜单定义
  27. DATA_MENU_DEF g_tExtraMenu;
  28. char m_WarningStr[PARA_NAME_LEN]; //提示信息字符
  29. char m_errInf[24]; // 错误信息保存
  30. UINT m_Password; //密码
  31. UINT m_NewPassword; //密码修改时新密码
  32. char m_strPassword[10];
  33. char m_strPassword2[10];
  34. char m_YdYcHalfOfRateValue[16]="";
  35. UINT m_AllSection; //全部定值区选择时选择的定值区
  36. UINT m_ValidSection; //有效定值区选择时选择的定值区
  37. UINT m_CtrlWord; // 当前显示控制子
  38. char m_set_name[24]; // 定值名称
  39. char m_set_name_ext[24]; // 定值名称
  40. char m_set_inf[24]; // 定值信息1 ,显示提示信息
  41. //#ifdef DISP_LIST_NUM
  42. char LIST_tmp[MAX_SET_NUMBER][MOD_NAME_LEN]; //存放定值选项字符串及对应数字的数组(如:"0:退出"、"1:投入")
  43. //#endif
  44. #ifdef CPU_FUXI
  45. char menu_tmp[MAX_SET_NUMBER][MOD_NAME_LEN];
  46. #endif
  47. SET_VALUE m_SetBuf[MAX_SET_NUMBER];// 定义定值查看及整定时的buf
  48. INDEX_DEF g_tIndex[INDEX_NUM]; // 名称 值索引结构定义
  49. const char *TestDo_Hz="合";
  50. WORD g_sw_index;
  51. char m_equipstr[22];
  52. u8 m_setgroup[GROUP_NUM];
  53. u8 bPubSetMenuShow[SET_PUB_NUM];
  54. u8 bSwSetMenuShow[SET_NUM];
  55. u8 bParaSetMenuShow[PARA_NUM];
  56. u8 bCstSetMenuShow[CSTSET_NUM];
  57. char m_Ledgoose[12];
  58. char m_Ledbh[12];
  59. char m_Ledfa[12];
  60. char m_Fa_sl[12];
  61. char m_Bh_chr[12];
  62. char m_Fa_chr[12];
  63. char m_Goose_chr[12];
  64. char m_Ledjzs[12];
  65. char m_TzCount[12];
  66. char m_HzCount[12];
  67. WORD m_selsection;
  68. WORD m_sectionnum;
  69. char m_selsec_char[10];
  70. char m_Mode_chr[20];
  71. char m_Tqhz_chr[20];
  72. char m_Zdjl_chr[20];
  73. char m_StopFun_chr[20];
  74. char m_Yftr_chr[20];
  75. bool mmd_CheckPassword2(void)
  76. {
  77. u8 passstr[10];
  78. #ifdef PASSWORD_4_STR
  79. strcpy(passstr,INTER_PASSWORD_STR_4);
  80. #else
  81. strcpy(passstr,INTER_PASSWORD_STR);
  82. #endif
  83. if((strcmp(m_strPassword,tRunPara.wPasswordstr2)!=0)&&(strcmp(m_strPassword,passstr)!=0))
  84. {
  85. m_Password=0;
  86. mmi_zero_passwordstr();
  87. strcpy(m_WarningStr,"输入密码错误!");
  88. return false;
  89. }
  90. m_Password=0;
  91. mmi_zero_passwordstr();
  92. return true;
  93. }
  94. /**************************************************************************
  95. 函数名称:mmd_RenewDataMenu
  96. 函数版本:1.00
  97. 作者:
  98. 创建日期:2008.9.1
  99. 函数功能说明:刷新动态菜单
  100. 输入参数:
  101. 输出参数:
  102. 返回值:
  103. 更新信息:
  104. 更新日志1:
  105. 日期:
  106. 修改者:
  107. 修改内容:
  108. 修改原因:
  109. ***************************************************************************/
  110. static int mmd_RenewDataMenu(DATA_MENU_DEF *pt)
  111. {
  112. int i;
  113. int index=(pt->sFocusIndex/pt->sScreenNum)*pt->sScreenNum; //当前显示的动态数据的索引
  114. for(i=0;i<pt->sScreenNum;i++) //更新显示项
  115. {
  116. (*pt->GetValueFuncAddr)(index,&pt->tDataFields[i]);
  117. if(++index>pt->sTotalNum-1) break; //最后一个CPU
  118. }
  119. m_CurrentScreen=(pt->sFocusIndex/pt->sScreenNum)+1; //当前屏数
  120. return M_OK;
  121. }
  122. /**************************************************************************
  123. 函数名称:mmd_initDataMenu
  124. 函数版本:1.00
  125. 作者:
  126. 创建日期:2008.9.1
  127. 函数功能说明:初始化动态菜单
  128. 输入参数:pt 动态显示数据结构,num最大显示数目
  129. fun_next,转下一屏处理函数,
  130. fun_value 取值函数
  131. menuno,fieldno 要显示的屏号和域号
  132. type,轮询召唤的类型
  133. 输出参数:
  134. 返回值:
  135. 更新信息:
  136. 更新日志1:
  137. 日期:
  138. 修改者:
  139. 修改内容:
  140. 修改原因:
  141. ***************************************************************************/
  142. static void mmd_initDataMenu(DATA_MENU_DEF *pt,int num,void *fun_next,void *fun_value,unsigned char menuno,unsigned char fieldno)
  143. {
  144. int i;
  145. int (*pfun)(int i,DATA_FIELD_DEF *pd);
  146. int screennum;
  147. pfun=(int(*)(int i,DATA_FIELD_DEF *pF))fun_value; //更新显示数据的函数
  148. screennum=mmi_GetScreenNum(menuno,fieldno); // 取当前屏幕最大显示树木
  149. if(fun_value!=NULL)
  150. {
  151. for(i=0;i<screennum;i++) // 更新显示数据
  152. {
  153. (*pfun)(i,&pt->tDataFields[i]);
  154. if(i>=num-1)break;
  155. }
  156. }
  157. if(screennum<=0)screennum=1;
  158. m_ScreenNum=num/screennum;
  159. if(num%screennum>0)m_ScreenNum+=1;
  160. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  161. pt->sTotalNum=num; //总的动态菜单数
  162. pt->sScreenNum=screennum;
  163. pt->GetPrevFuncAddr=fun_next; //44
  164. pt->GetNextFuncAddr=fun_next; //44
  165. pt->GetValueFuncAddr=fun_value;
  166. m_CurrentScreen=1;
  167. }
  168. /**************************************************************************
  169. 函数名称:mmd_IndexMenuKey
  170. 函数版本:1.00
  171. 作者:
  172. 创建日期:2008.9.1
  173. 函数功能说明:列表选择时,按键的处理函数
  174. 输入参数:
  175. 输出参数:
  176. 返回值:
  177. 更新信息:
  178. 更新日志1:
  179. 日期:
  180. 修改者:
  181. 修改内容:
  182. 修改原因:
  183. ***************************************************************************/
  184. int mmd_IndexMenuKey(int key)
  185. {
  186. int t;
  187. INDEX_DEF *pt;
  188. t=mmi_GetActiveFieldPara(); // 取得当前列表结构的下标
  189. if(t>=INDEX_NUM)return M_ERROR;
  190. pt=&g_tIndex[t];
  191. if(pt->num<=0)return M_ERROR;
  192. if(key==HA_KEY_ENTER) //确认键处理
  193. {
  194. int ret;
  195. *pt->pValue=pt->value[pt->bCurrent]; //赋值
  196. if(pt->EnterFunc!=NULL)
  197. {
  198. ret=(*pt->EnterFunc)(); // 执行函数
  199. return ret;
  200. }
  201. return M_OK;
  202. }
  203. if(key!=HA_KEY_ADD&&key!=HA_KEY_SUB)return M_ERROR;
  204. if(key==HA_KEY_ADD) // +键处理
  205. {
  206. pt->bCurrent++;
  207. }
  208. else if(key==HA_KEY_SUB) // +键处理
  209. {
  210. if(pt->bCurrent==0)
  211. {
  212. pt->bCurrent=pt->num-1;
  213. }
  214. else
  215. {
  216. pt->bCurrent--;
  217. }
  218. }
  219. if(pt->bCurrent>=pt->num)
  220. {
  221. pt->bCurrent=0;
  222. }
  223. strcpy(pt->str,pt->name[pt->bCurrent]); //更新列表显示
  224. *pt->pValue=pt->value[pt->bCurrent];
  225. return M_OK;
  226. }
  227. /***********************定值修改**********************************/
  228. /**************************************************************************
  229. 函数名称:mmd_IsIntegType
  230. 函数版本:1.00
  231. 作者:
  232. 创建日期:2008.9.23
  233. 函数功能说明: 判断参数类型是否为整型类型的
  234. 输入参数:
  235. 输出参数:
  236. 返回值:
  237. 更新信息:
  238. 更新日志1:
  239. 日期:
  240. 修改者:
  241. 修改内容:
  242. 修改原因:
  243. ***************************************************************************/
  244. static bool mmd_IsIntegType(WORD type)
  245. {
  246. if(type==SETTYPE_KG||type==SETTYPE_LIST||type==SETTYPE_UINT||type==SETTYPE_LINT||type==SETTYPE_5INT||type==SETTYPE_4INT)
  247. {
  248. return true;
  249. }
  250. return false;
  251. }
  252. static bool mmd_IsHexType(WORD type)
  253. {
  254. if(type==SETTYPE_YMD||type==SETTYPE_HMS||type==SETTYPE_IP)
  255. {
  256. return true;
  257. }
  258. return false;
  259. }
  260. /**************************************************************************
  261. 函数名称:mmd_ChangeList
  262. 函数版本:1.00
  263. 作者:
  264. 创建日期:2008.9.1
  265. 函数功能说明:改变下拉列表的值
  266. 输入参数:
  267. 输出参数:
  268. 返回值:若是列表,返回真值
  269. 更新信息:
  270. 更新日志1:
  271. 日期:
  272. 修改者:
  273. 修改内容:
  274. 修改原因:
  275. ***************************************************************************/
  276. static bool mmd_ChangeList(const TSETTABLE *pSetTable,int key,SET_VALUE *setbuf)
  277. {
  278. int setno;
  279. const TSETTABLE *pTable;
  280. long listvalue;
  281. //判断是否是列表
  282. setno=g_set_disp.no[mmi_GetActiveFieldIndex()];//取得当前定值的索引,判断是否是列表项
  283. pTable=&pSetTable[setno];
  284. if(pTable->wType==SETTYPE_LIST) // 列表项
  285. {
  286. listvalue=setbuf[setno].tt; //取得控制字的值
  287. if(key==HA_KEY_ADD)
  288. {
  289. listvalue++;
  290. if(listvalue>=pTable->listnum)
  291. {
  292. listvalue=pTable->fMin;
  293. }
  294. }
  295. else if(key==HA_KEY_SUB)
  296. {
  297. if(listvalue>pTable->fMin)
  298. {
  299. listvalue--;
  300. }
  301. else
  302. {
  303. listvalue=pTable->listnum-1;
  304. }
  305. }
  306. setbuf[setno].tt=listvalue;//pTable->list[listvalue].dat;操作列表定值出问题
  307. return true;
  308. }
  309. return false;
  310. }
  311. /**************************************************************************
  312. 函数名称:mmd_ChangeSet
  313. 函数版本:1.00
  314. 作者:
  315. 创建日期:2008.9.11
  316. 函数功能说明:转换定值,将EEPROM中的值转换为菜单整定时使用的值,主要是控制字
  317. 由浮点数转为定点数
  318. 输入参数:
  319. 输出参数:
  320. 返回值:
  321. 更新信息:
  322. 更新日志1:
  323. 日期:
  324. 修改者:
  325. 修改内容:
  326. 修改原因:
  327. ***************************************************************************/
  328. bool mmd_checkset_yb(u8 index) //判断定值分类对应的压板是否有效
  329. {
  330. u8 yb,group_sub;
  331. int sw=0;
  332. //if(index==0)return true;
  333. //index-=1;
  334. u8 yb_fa_g = g_tRelay[sw].run_stu.fa_g_tt;
  335. yb=SetGroups[index].set_yb;
  336. #ifdef YB_AUTO_SELECT
  337. yb_fa_g = goose_yb_enable(sw)&&(yb==SET_HYB_GOOSE);
  338. #else
  339. #ifndef GD_AREA_ZHONGSHAN //非中山的地区,开关定值显示直接关联硬件压板。中山要求智能分布式模式下显示所有开关定值
  340. #ifndef GD_AREA_ZHONGSHAN_2020
  341. yb_fa_g = g_tRelay[sw].run_stu.fa_g_tt&&(yb==SET_HYB_GOOSE);
  342. #endif
  343. #endif
  344. #endif
  345. group_sub = SetGroups[index].group_sub;
  346. if(yb==0)return true;
  347. #ifdef GD_AREA_ECZD_2020
  348. if(yb==SET_HYB_TQ)
  349. {
  350. if(group_sub == GROUP_SET_TQHZ)
  351. {
  352. return (g_tRelay[sw].run_stu.bhtt)||yb_fa_g;
  353. }
  354. else
  355. {
  356. return g_tRelay[sw].run_stu.bhtt||yb_fa_g;
  357. }
  358. }
  359. if(yb==SET_HYB_JL)
  360. {
  361. if(group_sub == GROUP_SET_DYJL)
  362. {
  363. return (g_tRelay[sw].run_stu.bhtt)||yb_fa_g;
  364. }
  365. else
  366. {
  367. return g_tRelay[sw].run_stu.bhtt||yb_fa_g;
  368. }
  369. }
  370. #endif
  371. if(yb==SET_HYB_BH)
  372. {
  373. if((group_sub == GROUP_SET_DYJL)
  374. ||(group_sub == GROUP_SET_PLJL))
  375. {
  376. return g_tRelay[sw].run_stu.bhtt||yb_fa_g;
  377. }
  378. else if(group_sub == GROUP_SET_TQHZ)
  379. {
  380. return (g_tRelay[sw].run_stu.bhtt)||yb_fa_g;
  381. }
  382. else
  383. {
  384. #ifdef YB_AUTO_SELECT
  385. return bh_yb_enable(sw)||yb_fa_g;
  386. #else
  387. return g_tRelay[sw].run_stu.bhtt||yb_fa_g;
  388. #endif
  389. }
  390. }
  391. if(yb==SET_HYB_FA)
  392. {
  393. #ifdef YB_AUTO_SELECT
  394. return fa_yb_enable(sw)||yb_fa_g;
  395. #else
  396. return g_tRelay[sw].run_stu.fatt||yb_fa_g;
  397. #endif
  398. }
  399. if(yb==SET_HYB_GOOSE)
  400. {
  401. #ifdef YB_AUTO_SELECT
  402. return goose_yb_enable(sw);
  403. #else
  404. return g_tRelay[sw].run_stu.fa_g_tt;
  405. #endif
  406. }
  407. return true;
  408. }
  409. int mmd_ChangeSet(const TSETTABLE *pSet,int num,SET_VALUE *setbuf) //ext为不需显示的定值组
  410. {
  411. int i;
  412. for(i=0;i<num;i++)
  413. {
  414. if(mmd_IsIntegType(pSet[i].wType))
  415. {
  416. float ff=setbuf[i].ff;
  417. setbuf[i].tt=(uint32_t)ff;
  418. }
  419. }
  420. return 0;
  421. }
  422. bool mmd_checkset_menucfg(const TSETTABLE *pSet,int i,u8 group) //判断定值分类对应的压板是否有效
  423. {
  424. if(pSet==&tPubSetTable[0])
  425. {
  426. return bPubSetMenuShow[i]&&(tPubSetTable[i].group==group);
  427. }
  428. else if(pSet==&tSwSetTable[0])
  429. {
  430. return bSwSetMenuShow[i]&&(tSwSetTable[i].group==group);
  431. }
  432. else if(pSet==&tEquipParaTable[0])
  433. {
  434. return bParaSetMenuShow[i]&&(tEquipParaTable[i].group==group);
  435. }
  436. else if(pSet==&tCstSetTable[0])
  437. {
  438. return bCstSetMenuShow[i]&&(tCstSetTable[i].group==group);
  439. }
  440. return (pSet[i].group==group);
  441. }
  442. int mmd_GetshowSetNum(const TSETTABLE *pSet,int num,u8 group)
  443. {
  444. int i;
  445. for(i=0;i<num;i++)
  446. {
  447. if (pSet[i].wType != SETTYPE_LABEL)
  448. {
  449. bool bYB_set;
  450. bool bmenu_set;
  451. bmenu_set=mmd_checkset_menucfg(pSet,i,group);
  452. bYB_set=mmd_checkset_yb(pSet[i].group);
  453. if((m_setgroup[pSet[i].group])&&bYB_set&&bmenu_set) // 定值分类组为0 或显示定制为1
  454. {
  455. g_set_disp.no[g_set_disp.num] = i;
  456. g_set_disp.num++;
  457. }
  458. }
  459. }
  460. return g_set_disp.num;
  461. }
  462. /**************************************************************************
  463. 函数名称:mmd_CheckSet
  464. 函数版本:1.00
  465. 作者:
  466. 创建日期:2008.9.1
  467. 函数功能说明:检查参数
  468. 输入参数:
  469. 输出参数:
  470. 返回值:
  471. 更新信息:
  472. 更新日志1:
  473. 日期:
  474. 修改者:
  475. 修改内容:
  476. 修改原因:
  477. ***************************************************************************/
  478. static bool mmd_CheckSet(const TSETTABLE *pSet,int num,SET_VALUE *setbuf)
  479. {
  480. int i;
  481. char tmpstr[32];
  482. for(i=0;i<num;i++)
  483. {
  484. if(mmd_IsIntegType(pSet[i].wType))
  485. {
  486. float ff=setbuf[i].ff;
  487. if(CheckFloatSet((void *)&ff,pSet[i].fMax,pSet[i].fMin)>0)break;
  488. }
  489. else if(mmd_IsHexType(pSet[i].wType))
  490. {
  491. //float ff=setbuf[i].ff;
  492. //if(CheckFloatSet((void *)&ff,pSet[i].fMax,pSet[i].fMin)>0)break;
  493. }
  494. else
  495. {
  496. if(CheckFloatSet((void *)&setbuf[i].ff,pSet[i].fMax,pSet[i].fMin)>0)break;
  497. }
  498. }
  499. if(i<num)
  500. {
  501. strcpy(m_WarningStr,pSet[i].szName);
  502. if(mmd_IsIntegType(pSet[i].wType))
  503. {
  504. sprintf(m_errInf,"RA:%.0f~%.0f",pSet[i].fMin,pSet[i].fMax);
  505. }
  506. else
  507. {
  508. strcpy(m_errInf,"RA:");
  509. switch(mmi_GetFloatFactor((void *)&pSet[i].fMin))
  510. {
  511. case 0: //浮点数
  512. sprintf(tmpstr,"%.0f",pSet[i].fMin);
  513. break;
  514. case 1: //浮点数
  515. sprintf(tmpstr,"%.1f",pSet[i].fMin);
  516. break;
  517. case 2: //浮点数
  518. sprintf(tmpstr,"%.2f",pSet[i].fMin);
  519. break;
  520. case 3: //浮点数
  521. sprintf(tmpstr,"%.3f",pSet[i].fMin);
  522. break;
  523. default:
  524. sprintf(tmpstr,"%.2f",pSet[i].fMin);
  525. break;
  526. }
  527. strcat(m_errInf,tmpstr);
  528. strcat(m_errInf,"~");
  529. switch(mmi_GetFloatFactor((void *)&pSet[i].fMax))
  530. {
  531. case 0: //浮点数
  532. sprintf(tmpstr,"%.0f",pSet[i].fMax);
  533. break;
  534. case 1: //浮点数
  535. sprintf(tmpstr,"%.1f",pSet[i].fMax);
  536. break;
  537. case 2: //浮点数
  538. sprintf(tmpstr,"%.2f",pSet[i].fMax);
  539. break;
  540. case 3: //浮点数
  541. sprintf(tmpstr,"%.3f",pSet[i].fMax);
  542. break;
  543. default:
  544. sprintf(tmpstr,"%.2f",pSet[i].fMax);
  545. break;
  546. }
  547. strcat(m_errInf,tmpstr);
  548. }
  549. return false;
  550. }
  551. return true; //弹出定值固化菜单,需选择输入区号
  552. }
  553. int m_SetSwNo=0;
  554. /**************************************************************************
  555. 函数名称:mmd_ReChangeSet
  556. 函数版本:1.00
  557. 作者:
  558. 创建日期:2008.9.1
  559. 函数功能说明:将整定值转换为要保存的值
  560. 输入参数:
  561. 输出参数:
  562. 返回值:
  563. 更新信息:
  564. 更新日志1:
  565. 日期:
  566. 修改者:
  567. 修改内容:
  568. 修改原因:
  569. ***************************************************************************/
  570. void mmd_ReChangeSet(const TSETTABLE *pSet,int num,SET_VALUE *setbuf)
  571. {
  572. int i;
  573. for(i=0;i<num;i++)
  574. {
  575. if(mmd_IsIntegType(pSet[i].wType))
  576. {
  577. uint32_t tt=setbuf[i].tt;
  578. setbuf[i].ff=tt;
  579. }
  580. }
  581. }
  582. bool bSetChange=false;
  583. u8 SetGroupIndex;
  584. u8 set_show_group[GROUP_NUM];
  585. void GetDefSetGroup(u8 *dat)
  586. {
  587. int i;
  588. for(i=0;i<GROUP_NUM;i++)
  589. {
  590. dat[i]=(u8)SetGroups[i].defval;
  591. }
  592. }
  593. int mmd_GetDefaultPubSet(int value)
  594. {
  595. GetDefPara((void*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
  596. mmd_ChangeSet(&tPubSetTable[0],PUB_SET_NUMBER,m_SetBuf);
  597. return M_OK;
  598. }
  599. int mmd_GetDefaultBhSet(int value)
  600. {
  601. GetDefPara((void*)m_SetBuf,SW_SET_NUMBER,&tSwSetTable[0]);
  602. mmd_ChangeSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf);
  603. return M_OK;
  604. }
  605. int mmd_GetDefaultParaSet(int value)
  606. {
  607. GetDefPara((void*)m_SetBuf,EQUIP_PARA_NUMBER,&tEquipParaTable[0]);
  608. mmd_ChangeSet(&tEquipParaTable[0],EQUIP_PARA_NUMBER,m_SetBuf);
  609. return M_OK;
  610. }
  611. int mmd_GetDefaultCstSet(int value)
  612. {
  613. GetDefPara((void*)m_SetBuf,CSTSET_NUMBER,&tCstSetTable[0]);
  614. mmd_ChangeSet(&tCstSetTable[0],CSTSET_NUMBER,m_SetBuf);
  615. return M_OK;
  616. }
  617. void mmd_split_setname(unsigned char *str,int len,DATA_FIELD_DEF *pt,int index)
  618. {
  619. int lineoff;
  620. unsigned char tmpstr[24];
  621. lineoff=mmd_splitstr(str,len);
  622. if(lineoff==0)
  623. {
  624. sprintf(pt[index].FmtStr,"%-20.20s",str);
  625. }
  626. else
  627. {
  628. lineoff=mmd_splitstr(str,len);
  629. sprintf(pt[index+1].FmtStr," %-16.16s",&str[lineoff]);
  630. strcpy(tmpstr,str);
  631. tmpstr[lineoff]='\0';
  632. sprintf(pt[index].FmtStr,"%-20.20s",tmpstr);
  633. }
  634. }
  635. void mmd_analyse(const TSETTABLE *pTable,int screennum)
  636. {
  637. int i;
  638. int offset=0;
  639. int addlines=2;
  640. int screencnt=0;
  641. int bgn=0;
  642. unsigned char tmpstr[PARA_NAME_LEN];
  643. for(i=0;i<g_set_disp.num;i++)
  644. {
  645. g_set_disp.Y_offset[i]=offset;
  646. g_set_disp.screennum[i]=0;
  647. if(offset==0)bgn=i;
  648. g_set_disp.bgn[i]=bgn;
  649. sprintf(tmpstr,"%02d.%s",i,pTable[g_set_disp.no[i]].szName);
  650. if((mmd_splitstr(tmpstr,20))==0) //定值名称一行可现实
  651. {
  652. addlines=2;
  653. }
  654. else
  655. {
  656. addlines=3;
  657. }
  658. screencnt++;
  659. offset+=addlines;
  660. if(offset==screennum)
  661. {
  662. int j;
  663. for(j=0;j<screencnt;j++)
  664. {
  665. g_set_disp.screennum[bgn+j]=screencnt;
  666. }
  667. offset=0;
  668. screencnt=0;
  669. }
  670. else if(offset>screennum)
  671. {
  672. int j;
  673. for(j=0;j<screencnt-1;j++)
  674. {
  675. g_set_disp.screennum[bgn+j]=screencnt-1;
  676. }
  677. g_set_disp.Y_offset[i]=0;
  678. g_set_disp.bgn[i]=i;
  679. bgn=i;
  680. offset=addlines;
  681. screencnt =1;
  682. }
  683. }
  684. if(screencnt>0)
  685. {
  686. int j;
  687. for(j=0;j<screencnt;j++)
  688. {
  689. g_set_disp.screennum[bgn+j]=screencnt;
  690. }
  691. }
  692. }
  693. void mmd_GetSet(int index,DATA_FIELD_DEF *pt,const TSETTABLE *pTable,SET_VALUE *setbuf)
  694. {
  695. float ff;
  696. DATA_FIELD_DEF *pex=&g_tExtraMenu.tDataFields[0];
  697. int setno;
  698. int lineoff;
  699. //#ifdef DISP_LIST_NUM
  700. int i=0;
  701. //#endif
  702. #ifdef DISP_LIST_NUM
  703. DWORD dat;
  704. #endif
  705. u8 tmp_len;
  706. const char fill_content[] = " ";
  707. //定值汉字描述
  708. m_set_name[0]=0;
  709. m_set_name_ext[0]=0;
  710. m_set_inf[0]=0;
  711. pt->bEdit=false;
  712. setno=g_set_disp.no[index];
  713. pTable+=setno;
  714. //定值名称处理
  715. {
  716. unsigned char tmpstr[PARA_NAME_LEN];
  717. sprintf(tmpstr,"%02d.%s",index+1,pTable->szName);
  718. lineoff=mmd_splitstr(tmpstr,20);
  719. pex[g_tExtraMenu.sTotalNum].offset=g_set_disp.Y_offset[index];
  720. if(lineoff==0)
  721. {
  722. sprintf(pex[g_tExtraMenu.sTotalNum].FmtStr,"%-20.20s",tmpstr);
  723. g_tExtraMenu.sTotalNum++;
  724. }
  725. else
  726. {
  727. sprintf(pex[g_tExtraMenu.sTotalNum+1].FmtStr," %-18.18s",&tmpstr[lineoff]);
  728. tmpstr[lineoff]='\0';
  729. sprintf(pex[g_tExtraMenu.sTotalNum].FmtStr,"%-20.20s",tmpstr);
  730. pex[g_tExtraMenu.sTotalNum+1].offset=pex[g_tExtraMenu.sTotalNum].offset+1;
  731. g_tExtraMenu.sTotalNum+=2;
  732. }
  733. }
  734. switch(pTable->wType)
  735. {
  736. case SETTYPE_YMD: // 年月日
  737. strcpy(pt->FmtStr,"20%y"); //对齐符号位
  738. pt->pData=(void*)&setbuf[setno].tt;
  739. break;
  740. case SETTYPE_IP: // 年月日
  741. strcpy(pt->FmtStr,"%p"); //对齐符号位
  742. pt->pData=(void*)&setbuf[setno].tt;
  743. break;
  744. case SETTYPE_KG: //16进制显示 控制字
  745. strcpy(pt->FmtStr,"%*4XH"); //对齐符号位
  746. if(bSetChange)
  747. {
  748. strcpy(m_set_inf,"长按->键选择整定");
  749. }
  750. else
  751. {
  752. sprintf(m_set_inf,"RA:%04XH~%04XH",(long)pTable->fMin,(long)pTable->fMax);
  753. }
  754. pt->pData=(void*)&setbuf[setno].tt;
  755. break;
  756. case SETTYPE_UINT: //16进制显示 控制字
  757. strcpy(pt->FmtStr,"%*3u"); //对齐符号位
  758. sprintf(m_set_inf,"RA:%03u~%03u",(long)pTable->fMin,(long)pTable->fMax);
  759. pt->pData=(void*)&setbuf[setno].tt;
  760. break;
  761. case SETTYPE_5INT: //10进制显示 5位
  762. strcpy(pt->FmtStr,"%*5u"); //对齐符号位
  763. sprintf(m_set_inf,"RA:%05u~%05u",(long)pTable->fMin,(long)pTable->fMax);
  764. pt->pData=(void*)&setbuf[setno].tt;
  765. break;
  766. case SETTYPE_LINT: //16进制显示 控制字
  767. strcpy(pt->FmtStr,"%*6u"); //对齐符号位
  768. sprintf(m_set_inf,"RA:%06u~%06u",(long)pTable->fMin,(long)pTable->fMax);
  769. pt->pData=(void*)&setbuf[setno].tt;
  770. break;
  771. case SETTYPE_LIST: //列表选择
  772. {
  773. int j;
  774. int len=0;
  775. for(i=0;i<pTable->listnum;i++) //查找最长的字符串
  776. {
  777. j=strlen(pTable->list[i].str);
  778. if(len<j)
  779. {
  780. len=j;
  781. }
  782. }
  783. if(len<10)
  784. {
  785. strcpy(pt->FmtStr,"%s");
  786. }
  787. else if(len<12)
  788. {
  789. strcpy(pt->FmtStr,"%s");
  790. }
  791. else if(len<14)
  792. {
  793. strcpy(pt->FmtStr,"%s");
  794. }
  795. else
  796. {
  797. strcpy(pt->FmtStr,"%s");
  798. }
  799. pt->bEdit=true;
  800. i = 0;
  801. #ifdef DISP_LIST_NUM
  802. //串口波特率在液晶会显示(600:600)(1200:1200)...,改成(0:600)(1:1200)...序号从0开始
  803. if(pTable->list == BaudList)
  804. {
  805. dat = setbuf[setno].tt;
  806. }
  807. else
  808. {
  809. dat = pTable->list[setbuf[setno].tt].dat;
  810. }
  811. i = sprintf(LIST_tmp[setno],"%d:",dat);
  812. #endif
  813. #ifdef CPU_FUXI
  814. strcpy(menu_tmp[setno], pTable->list[setbuf[setno].tt].str);
  815. pt->pData = (void*)menu_tmp[setno];
  816. #else
  817. tmp_len = strlen(pTable->list[setbuf[setno].tt].str);
  818. i = sprintf((LIST_tmp[setno]+i),"%s",pTable->list[setbuf[setno].tt].str);
  819. strncat((LIST_tmp[setno]+i),fill_content,len-tmp_len); // 用空白填充剩余区域,防止显示上一个列表项的部分内容
  820. pt->pData = (void*)LIST_tmp[setno];
  821. #endif
  822. }
  823. break;
  824. default:
  825. ff=setbuf[setno].ff;
  826. switch(mmi_GetFloatFactor((void *)&ff))
  827. {
  828. case 0: //浮点数
  829. strcpy(pt->FmtStr,"%+-6.1f");
  830. break;
  831. case 1: //浮点数
  832. strcpy(pt->FmtStr,"%+-6.1f");
  833. break;
  834. case 2: //浮点数
  835. strcpy(pt->FmtStr,"%+-6.2f");
  836. break;
  837. case 3: //浮点数
  838. strcpy(pt->FmtStr,"%+-6.3f");
  839. break;
  840. default:
  841. strcpy(pt->FmtStr,"%+-6.1f");
  842. break;
  843. }
  844. ff=pTable->fMin;
  845. switch(mmi_GetFloatFactor((void *)&ff))
  846. {
  847. case 0: //浮点数
  848. sprintf(m_set_inf,"RA:%-5.1f",ff);
  849. break;
  850. case 1: //浮点数
  851. sprintf(m_set_inf,"RA:%-5.1f",ff);
  852. break;
  853. case 2: //浮点数
  854. sprintf(m_set_inf,"RA:%-5.2f",ff);
  855. break;
  856. case 3: //浮点数
  857. sprintf(m_set_inf,"RA:%-5.3f",ff);
  858. break;
  859. default:
  860. sprintf(m_set_inf,"RA:%-5.1f",ff);
  861. break;
  862. }
  863. ff=pTable->fMax;
  864. switch(mmi_GetFloatFactor((void *)&ff))
  865. {
  866. case 0: //浮点数
  867. sprintf(m_set_name,"%-5.1f",ff);
  868. break;
  869. case 1: //浮点数
  870. sprintf(m_set_name,"%-5.1f",ff);
  871. break;
  872. case 2: //浮点数
  873. sprintf(m_set_name,"%-5.2f",ff);
  874. break;
  875. case 3: //浮点数
  876. sprintf(m_set_name,"%-5.3f",ff);
  877. break;
  878. default:
  879. sprintf(m_set_name,"%-5.1f",ff);
  880. break;
  881. }
  882. strcat(m_set_inf,"~");
  883. strcat(m_set_inf,m_set_name);
  884. pt->pData=(void*)&setbuf[setno].ff;
  885. break;
  886. }
  887. strcat(pt->FmtStr," "); //单位
  888. strcat(pt->FmtStr,SetUints[pTable->wUnit]); //单位
  889. pt->offset=(lineoff==0)?g_set_disp.Y_offset[index]+1:g_set_disp.Y_offset[index]+2; // 偏移地址
  890. sprintf(m_equipstr,"%s",SetGroups[pTable->group].item_name);
  891. }
  892. /**************************************************************************
  893. 函数名称:mmd_RenewPubSet
  894. 函数版本:1.00
  895. 作者:
  896. 创建日期:2008.9.11
  897. 函数功能说明:刷新定值显示
  898. 输入参数:
  899. 输出参数:
  900. 返回值:
  901. 更新信息:
  902. 更新日志1:
  903. 日期:
  904. 修改者:
  905. 修改内容:
  906. 修改原因:
  907. ***************************************************************************/
  908. int mmd_RenewPubSet(void)
  909. {
  910. DATA_MENU_DEF *pt=&g_tDataMenu1;
  911. DATA_MENU_DEF *pext=&g_tExtraMenu;
  912. int i;
  913. int bgn;
  914. bgn=g_set_disp.bgn[pt->sFocusIndex];
  915. pext->sTotalNum=0; //总的动态菜单数
  916. for(i=0;i<g_set_disp.screennum[pt->sFocusIndex];i++)
  917. {
  918. mmd_GetSet(bgn+i,&g_tDataMenu1.tDataFields[i],&tPubSetTable[0],m_SetBuf);
  919. }
  920. pt->sScreenNum=g_set_disp.screennum[pt->sFocusIndex];
  921. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  922. pext->sScreenNum=pext->sTotalNum;
  923. return M_OK;
  924. }
  925. int mmd_RenewPubSetGroup(void)
  926. {
  927. mmd_RenewDataMenu(&g_tDataMenu2);
  928. return M_OK;
  929. }
  930. static void mmd_GetSetGroupName(int i,DATA_FIELD_DEF *pF)
  931. {
  932. //strcpy(pF->FmtStr,SetGroups[set_show_group[i]].item_name);
  933. sprintf(pF->FmtStr,"%d.%s",i+1,SetGroups[set_show_group[i]].item_name);
  934. }
  935. int mmd_backPubSet(int value)
  936. {
  937. mmd_InitPubSetGroup(-1);
  938. g_tDataMenu2.sFocusIndex=SetGroupIndex;
  939. mmi_FormsInit(42,1); // 更新最后修改的数据
  940. mmd_RenewPubSetGroup();
  941. return M_OK;
  942. }
  943. int mmd_ValueJump(void)
  944. {
  945. #ifdef SEC_SETVALUE_7
  946. return M_JUMP1;
  947. #else
  948. return M_JUMP0;
  949. #endif
  950. }
  951. int mmd_InitPubSetGroup(int value)
  952. {
  953. int i,num=0;
  954. for(i=0;i<GROUP_NUM;i++)
  955. {
  956. if(SetGroups[i].group == SETGROUP_TYPE_PUB&&(m_setgroup[i]>0))
  957. {
  958. int j;
  959. for(j=0;j<PUB_SET_NUMBER;j++)
  960. {
  961. if((bPubSetMenuShow[j]>0)&&(tPubSetTable[j].group==i)&&(tPubSetTable[j].wType!= SETTYPE_LABEL))
  962. {
  963. set_show_group[num++]=i;
  964. break;
  965. }
  966. }
  967. }
  968. }
  969. if(num==0)
  970. {
  971. strcpy(m_WarningStr,"公共定值未配置");
  972. return M_JUMP2;
  973. }
  974. mmd_initDataMenu(&g_tDataMenu2,num,mmd_RenewPubSetGroup,mmd_GetSetGroupName,42,1);
  975. /*读取公共定值*/
  976. if(!ReadPara((void*)m_SetBuf,EEP_PUB_ADDR+(PUB_SETSIZE*m_selsection),PUB_SET_NUMBER,&tPubSetTable[0]))
  977. {
  978. if(value==-1)
  979. {
  980. GetDefPara((void*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
  981. }
  982. else
  983. {
  984. strcpy(m_WarningStr,"定值读取错误,请整定");
  985. return M_JUMP3;
  986. }
  987. }
  988. mmd_ChangeSet(&tPubSetTable[0],PUB_SET_NUMBER,m_SetBuf);
  989. return M_JUMP0;
  990. }
  991. /**************************************************************************
  992. 函数名称:mmd_InitSetSolid
  993. 函数版本:1.00
  994. 作者:
  995. 创建日期:2008.9.1
  996. 函数功能说明:初始化定值整定的显示
  997. 输入参数:
  998. 输出参数:
  999. 返回值:
  1000. 更新信息:
  1001. 更新日志1:
  1002. 日期:
  1003. 修改者:
  1004. 修改内容:
  1005. 修改原因:
  1006. ***************************************************************************/
  1007. int mmd_InitPubSet(int value)
  1008. {
  1009. int num=PUB_SET_NUMBER;
  1010. int screennum;
  1011. int i;
  1012. m_AllSection=0;
  1013. g_set_disp.num=0;
  1014. num=mmd_GetshowSetNum(&tPubSetTable[0],PUB_SET_NUMBER,set_show_group[value]);
  1015. SetGroupIndex=value;
  1016. screennum=mmi_GetScreenNum(43,1); // 取当前屏幕最大显示数目
  1017. bSetChange=true;
  1018. mmd_analyse(&tPubSetTable[0],screennum);
  1019. {
  1020. DATA_MENU_DEF *pt=&g_tDataMenu1;
  1021. DATA_MENU_DEF *pext=&g_tExtraMenu;
  1022. pext->sTotalNum=0;
  1023. for(i=0;i<g_set_disp.screennum[0];i++)
  1024. {
  1025. mmd_GetSet(i,&g_tDataMenu1.tDataFields[i],&tPubSetTable[0],m_SetBuf);
  1026. }
  1027. m_ScreenNum=num;
  1028. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  1029. pt->sTotalNum=num; //总的动态菜单数
  1030. pt->sScreenNum=g_set_disp.screennum[0];
  1031. pt->GetPrevFuncAddr=mmd_RenewPubSet; //44
  1032. pt->GetNextFuncAddr=mmd_RenewPubSet; //44
  1033. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  1034. pext->sScreenNum=pext->sTotalNum;
  1035. pext->GetPrevFuncAddr=NULL; //44
  1036. pext->GetNextFuncAddr=NULL; //44
  1037. m_CurrentScreen=1;
  1038. }
  1039. return M_JUMP0;
  1040. }
  1041. /**************************************************************************
  1042. 函数名称:mmd_SetKey
  1043. 函数版本:1.00
  1044. 作者:
  1045. 创建日期:2008.9.1
  1046. 函数功能说明:列表项选择
  1047. 输入参数:
  1048. 输出参数:
  1049. 返回值:
  1050. 更新信息:
  1051. 更新日志1:
  1052. 日期:
  1053. 修改者:
  1054. 修改内容:
  1055. 修改原因:
  1056. ***************************************************************************/
  1057. int mmd_SetPubKey(int key)
  1058. {
  1059. if(key==HA_KEY_UP&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_ADD;
  1060. if(key==HA_KEY_DOWN&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_SUB;
  1061. if(key==HA_KEY_ADD||key==HA_KEY_SUB) // +键增加列表
  1062. {
  1063. if(!g_bModify) return M_ERROR; // 只在修改状态下执行此函数
  1064. if(mmd_ChangeList(&tPubSetTable[0],key,m_SetBuf))
  1065. {
  1066. mmd_RenewPubSet(); //刷新修改后的值
  1067. return M_OK;
  1068. }
  1069. }
  1070. return M_ERROR;
  1071. }
  1072. int mmd_SavePubSet(int value)
  1073. {
  1074. #ifdef PUB_SET_SECTION
  1075. WORD save_section;
  1076. int i;
  1077. bool b_section_change = false; //局部变量初始化,避免下面if中判断为随机态
  1078. #endif
  1079. if(mmd_CheckPassword2()==false)
  1080. {
  1081. return M_JUMP2;
  1082. }
  1083. mmd_ReChangeSet(&tPubSetTable[0],PUB_SET_NUMBER,m_SetBuf);
  1084. if(!mmd_CheckSet(&tPubSetTable[0],PUB_SET_NUMBER,m_SetBuf))
  1085. {
  1086. mmd_ChangeSet(&tPubSetTable[0],PUB_SET_NUMBER,m_SetBuf);
  1087. return M_JUMP3;
  1088. }
  1089. #ifdef PUB_SET_SECTION
  1090. save_section = m_SetBuf[1].ff;
  1091. if(save_section!=m_runsection)
  1092. {
  1093. b_section_change = true;
  1094. }
  1095. if(SavePara((void *)m_SetBuf,EEP_PUB_ADDR+(PUB_SETSIZE*save_section),PUB_SET_NUMBER,&tPubSetTable[0]))
  1096. {
  1097. strcpy(m_WarningStr,"公共定值保存成功");
  1098. soe_record_opt(EV_PUBSET_OK,0);
  1099. MakeRunSet(false);
  1100. rt_err_clr(ERR_CODE_SET_PUB,0);
  1101. m_runsection = save_section;
  1102. }
  1103. else
  1104. {
  1105. strcpy(m_WarningStr,"公共定值保存失败");
  1106. soe_record_opt(EV_PUBSET_FAIL,0);
  1107. b_section_change = false;
  1108. }
  1109. //将其他公共定值区的定值区定值也做修改
  1110. if(b_section_change)
  1111. {
  1112. for(i=0;i<SEC_NUMBER;i++)
  1113. {
  1114. if(i == save_section)
  1115. continue;
  1116. /*读取公共定值*/
  1117. if(!ReadPara((void*)m_SetBuf,EEP_PUB_ADDR+PUB_SETSIZE*i,PUB_SET_NUMBER,&tPubSetTable[0]))
  1118. {
  1119. rt_err_set(ERR_CODE_SET_PUB,0);
  1120. GetDefPara((void*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
  1121. }
  1122. else
  1123. {
  1124. rt_err_clr(ERR_CODE_SET_PUB,0);
  1125. }
  1126. m_SetBuf[SET_SECTION].ff=m_runsection;
  1127. if(SavePara((void *)m_SetBuf,EEP_PUB_ADDR+(PUB_SETSIZE*i),PUB_SET_NUMBER,&tPubSetTable[0]))
  1128. {
  1129. strcpy(m_WarningStr,"公共定值保存成功");
  1130. soe_record_opt(EV_PUBSET_OK,0);
  1131. MakeRunSet(false);
  1132. rt_err_clr(ERR_CODE_SET_PUB,0);
  1133. m_runsection = save_section;
  1134. }
  1135. else
  1136. {
  1137. strcpy(m_WarningStr,"公共定值保存失败");
  1138. soe_record_opt(EV_PUBSET_FAIL,0);
  1139. }
  1140. }
  1141. }
  1142. #else
  1143. if(SavePara((void *)m_SetBuf,EEP_PUB_ADDR,PUB_SET_NUMBER,&tPubSetTable[0]))
  1144. {
  1145. strcpy(m_WarningStr,"公共定值保存成功");
  1146. soe_record_opt(EV_PUBSET_OK,0);
  1147. MakeRunSet(false);
  1148. rt_err_clr(ERR_CODE_SET_PUB,0);
  1149. }
  1150. else
  1151. {
  1152. strcpy(m_WarningStr,"公共定值保存失败");
  1153. soe_record_opt(EV_PUBSET_FAIL,0);
  1154. }
  1155. #endif
  1156. return M_JUMP0;
  1157. }
  1158. int mmd_SavePubPassword2(int value)
  1159. {
  1160. #ifndef PASSWORD_2_INVALID
  1161. return M_JUMP1;
  1162. #endif
  1163. return mmd_SavePubSet(0);
  1164. }
  1165. int mmd_SaveBhPassword2(int value)
  1166. {
  1167. #ifndef PASSWORD_2_INVALID
  1168. return M_JUMP1;
  1169. #endif
  1170. return mmd_SaveBhSet(0);
  1171. }
  1172. int mmd_SaveParaPassword2(int value)
  1173. {
  1174. #ifndef PASSWORD_2_INVALID
  1175. return M_JUMP1;
  1176. #endif
  1177. return mmd_SaveParaSet(0);
  1178. }
  1179. int mmd_SaveAzPassword2(int value)
  1180. {
  1181. #ifndef PASSWORD_2_INVALID
  1182. return M_JUMP1;
  1183. #endif
  1184. return mmd_SaveAzSet(0);
  1185. }
  1186. int mmd_RenewBhSet(void)
  1187. {
  1188. DATA_MENU_DEF *pt=&g_tDataMenu1;
  1189. DATA_MENU_DEF *pext=&g_tExtraMenu;
  1190. int i;
  1191. int bgn;
  1192. bgn=g_set_disp.bgn[pt->sFocusIndex];
  1193. pext->sTotalNum=0; //总的动态菜单数
  1194. for(i=0;i<g_set_disp.screennum[pt->sFocusIndex];i++)
  1195. {
  1196. mmd_GetSet(bgn+i,&g_tDataMenu1.tDataFields[i],&tSwSetTable[0],m_SetBuf);
  1197. }
  1198. pt->sScreenNum=g_set_disp.screennum[pt->sFocusIndex];
  1199. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  1200. pext->sScreenNum=pext->sTotalNum;
  1201. return M_OK;
  1202. }
  1203. int mmd_RenewBhSetGroup(void)
  1204. {
  1205. mmd_RenewDataMenu(&g_tDataMenu2);
  1206. return M_OK;
  1207. }
  1208. int mmd_backBhSet(int value)
  1209. {
  1210. mmd_InitBhSetGroup(-1);
  1211. g_tDataMenu2.sFocusIndex=SetGroupIndex;
  1212. mmi_FormsInit(44,1); // 更新最后修改的数据
  1213. mmd_RenewBhSetGroup();
  1214. return M_OK;
  1215. }
  1216. int mmd_InitBhSetGroup(int value)
  1217. {
  1218. int i,num=0;
  1219. for(i=0;i<GROUP_NUM;i++)
  1220. {
  1221. if(SetGroups[i].group == SETGROUP_TYPE_BH&&(m_setgroup[i]>0))
  1222. {
  1223. int j;
  1224. bool bYB;
  1225. bYB=mmd_checkset_yb(i);
  1226. for(j=0;j<SW_SET_NUMBER;j++)
  1227. {
  1228. if((bSwSetMenuShow[j]>0)&&(tSwSetTable[j].group==i)&&(tSwSetTable[j].wType!= SETTYPE_LABEL)&&bYB)
  1229. {
  1230. set_show_group[num++]=i;
  1231. break;
  1232. }
  1233. }
  1234. }
  1235. }
  1236. if(num==0)
  1237. {
  1238. strcpy(m_WarningStr,"保护定值未配置");
  1239. return M_JUMP2;
  1240. }
  1241. mmd_initDataMenu(&g_tDataMenu2,num,mmd_RenewBhSetGroup,mmd_GetSetGroupName,44,1);
  1242. /*读定值*/
  1243. if(!ReadPara((void*)m_SetBuf,EEP_SET_ADDR+SETSIZE*(m_runsection),SW_SET_NUMBER,&tSwSetTable[0]))
  1244. {
  1245. if(value==-1)
  1246. {
  1247. GetDefPara((void*)m_SetBuf,SW_SET_NUMBER,&tSwSetTable[0]);
  1248. }
  1249. else
  1250. {
  1251. strcpy(m_WarningStr,"定值读取错误,请整定");
  1252. return M_JUMP3;
  1253. }
  1254. }
  1255. mmd_ChangeSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf);
  1256. return M_JUMP0;
  1257. }
  1258. /**************************************************************************
  1259. 函数名称:mmd_InitSetSolid
  1260. 函数版本:1.00
  1261. 作者:
  1262. 创建日期:2008.9.1
  1263. 函数功能说明:初始化定值整定的显示
  1264. 更新日志1:
  1265. 日期:
  1266. 修改者:
  1267. 修改内容:
  1268. 修改原因:
  1269. ***************************************************************************/
  1270. int mmd_InitBhSet(int value)
  1271. {
  1272. int num=SW_SET_NUMBER;
  1273. int screennum;
  1274. int i;
  1275. m_AllSection=0;
  1276. g_set_disp.num=0;
  1277. num=mmd_GetshowSetNum(&tSwSetTable[0],SW_SET_NUMBER,set_show_group[value]);
  1278. SetGroupIndex=value;
  1279. screennum=mmi_GetScreenNum(45,1); // 取当前屏幕最大显示数目
  1280. bSetChange=true;
  1281. mmd_analyse(&tSwSetTable[0],screennum);
  1282. {
  1283. DATA_MENU_DEF *pt=&g_tDataMenu1;
  1284. DATA_MENU_DEF *pext=&g_tExtraMenu;
  1285. pext->sTotalNum=0;
  1286. for(i=0;i<g_set_disp.screennum[0];i++)
  1287. {
  1288. mmd_GetSet(i,&g_tDataMenu1.tDataFields[i],&tSwSetTable[0],m_SetBuf);
  1289. }
  1290. m_ScreenNum=num;
  1291. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  1292. pt->sTotalNum=num; //总的动态菜单数
  1293. pt->sScreenNum=g_set_disp.screennum[0];
  1294. pt->GetPrevFuncAddr=mmd_RenewBhSet; //44
  1295. pt->GetNextFuncAddr=mmd_RenewBhSet; //44
  1296. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  1297. pext->sScreenNum=pext->sTotalNum;
  1298. pext->GetPrevFuncAddr=NULL; //44
  1299. pext->GetNextFuncAddr=NULL; //44
  1300. m_CurrentScreen=1;
  1301. }
  1302. return M_JUMP0;
  1303. }
  1304. /**************************************************************************
  1305. 日期:
  1306. 修改者:
  1307. 修改内容:
  1308. 修改原因:
  1309. ***************************************************************************/
  1310. int mmd_SetBhKey(int key)
  1311. {
  1312. if(key==HA_KEY_UP&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_ADD;
  1313. if(key==HA_KEY_DOWN&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_SUB;
  1314. if(key==HA_KEY_ADD||key==HA_KEY_SUB) // +键增加列表
  1315. {
  1316. if(!g_bModify) return M_ERROR; // 只在修改状态下执行此函数
  1317. if(mmd_ChangeList(&tSwSetTable[0],key,m_SetBuf))
  1318. {
  1319. mmd_RenewBhSet(); //刷新修改后的值
  1320. return M_OK;
  1321. }
  1322. }
  1323. return M_ERROR;
  1324. }
  1325. int mmd_SaveBhSet(int value)
  1326. {
  1327. if(mmd_CheckPassword2()==false)
  1328. {
  1329. return M_JUMP2;
  1330. }
  1331. mmd_ReChangeSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf);
  1332. if(!mmd_CheckSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf))
  1333. {
  1334. mmd_ChangeSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf);
  1335. return M_JUMP3;
  1336. }
  1337. //if(SavePara((void *)m_SetBuf,EEP_SET_ADDR+(m_runsection)*SETSIZE,SW_SET_NUMBER,&tSwSetTable[0]))
  1338. if(SavePara((void *)m_SetBuf,EEP_SET_ADDR+(m_selsection)*SETSIZE,SW_SET_NUMBER,&tSwSetTable[0]))
  1339. {
  1340. strcpy(m_WarningStr,"定值保存成功");
  1341. soe_record_opt(EV_SET_OK,0);
  1342. MakeRunSet(false);
  1343. rt_err_clr(ERR_CODE_SET,0);
  1344. }
  1345. else
  1346. {
  1347. strcpy(m_WarningStr,"定值保存失败");
  1348. soe_record_opt(EV_SET_FAIL,0);
  1349. }
  1350. return M_JUMP0;
  1351. }
  1352. int mmd_RenewAzSet(void)
  1353. {
  1354. DATA_MENU_DEF *pt=&g_tDataMenu1;
  1355. DATA_MENU_DEF *pext=&g_tExtraMenu;
  1356. int i;
  1357. int bgn;
  1358. bgn=g_set_disp.bgn[pt->sFocusIndex];
  1359. pext->sTotalNum=0; //总的动态菜单数
  1360. for(i=0;i<g_set_disp.screennum[pt->sFocusIndex];i++)
  1361. {
  1362. mmd_GetSet(bgn+i,&g_tDataMenu1.tDataFields[i],&tSwSetTable[0],m_SetBuf);
  1363. }
  1364. pt->sScreenNum=g_set_disp.screennum[pt->sFocusIndex];
  1365. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  1366. pext->sScreenNum=pext->sTotalNum;
  1367. return M_OK;
  1368. }
  1369. int mmd_RenewAzSetGroup(void)
  1370. {
  1371. mmd_RenewDataMenu(&g_tDataMenu2);
  1372. return M_OK;
  1373. }
  1374. int mmd_InitAzSetGroup(int value)
  1375. {
  1376. int i,num=0;
  1377. unsigned char menuno = 0;//**
  1378. int bYB1=1;
  1379. menuno=g_tScreen.cActiveMenuNo;
  1380. switch(menuno)
  1381. {
  1382. case 150:
  1383. case 64:
  1384. case 66:
  1385. bYB1 = 1;
  1386. break;
  1387. case 96:
  1388. case 90:
  1389. bYB1 = 0;
  1390. break;
  1391. }
  1392. for(i=0;i<GROUP_NUM;i++)
  1393. {
  1394. #ifdef GD_AREA_ECZD_2020
  1395. if((SetGroups[i].group == SETGROUP_TYPE_AZ
  1396. ||SetGroups[i].group == SETGROUP_TYPE_JL)&&(m_setgroup[i]>0))
  1397. #else
  1398. if(SetGroups[i].group == SETGROUP_TYPE_AZ&&(m_setgroup[i]>0))
  1399. #endif
  1400. {
  1401. int j;
  1402. bool bYB;
  1403. if(bYB1)
  1404. {
  1405. bYB=mmd_checkset_yb(i);
  1406. }
  1407. else
  1408. {
  1409. bYB=true; //查看定值时全部定值要显示出来
  1410. }
  1411. for(j=0;j<SW_SET_NUMBER;j++)
  1412. {
  1413. if((bSwSetMenuShow[j]>0)&&(tSwSetTable[j].group==i)&&(tSwSetTable[j].wType!= SETTYPE_LABEL)&&bYB)
  1414. {
  1415. set_show_group[num++]=i;
  1416. break;
  1417. }
  1418. }
  1419. }
  1420. }
  1421. if(num==0)
  1422. {
  1423. strcpy(m_WarningStr,"安自定值未配置");
  1424. return M_JUMP2;
  1425. }
  1426. if(bYB1)
  1427. {
  1428. mmd_initDataMenu(&g_tDataMenu2,num,mmd_RenewAzSetGroup,mmd_GetSetGroupName,62,1);
  1429. }
  1430. else
  1431. {
  1432. mmd_initDataMenu(&g_tDataMenu2,num,mmd_RenewAzSetGroup,mmd_GetSetGroupName,95,1);
  1433. }
  1434. /*读定值*/
  1435. //if(!ReadPara((void*)m_SetBuf,EEP_SET_ADDR+SETSIZE*(m_runsection),SW_SET_NUMBER,&tSwSetTable[0]))
  1436. if(!ReadPara((void*)m_SetBuf,EEP_SET_ADDR+SETSIZE*(m_selsection),SW_SET_NUMBER,&tSwSetTable[0]))
  1437. {
  1438. if(value==-1)
  1439. {
  1440. GetDefPara((void*)m_SetBuf,SW_SET_NUMBER,&tSwSetTable[0]);
  1441. }
  1442. else
  1443. {
  1444. strcpy(m_WarningStr,"定值读取错误,请整定");
  1445. return M_JUMP3;
  1446. }
  1447. }
  1448. mmd_ChangeSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf);
  1449. return M_JUMP0;
  1450. }
  1451. int mmd_backAzSet(int value)
  1452. {
  1453. mmd_InitAzSetGroup(-1);
  1454. g_tDataMenu2.sFocusIndex=SetGroupIndex;
  1455. mmi_FormsInit(62,1); // 更新最后修改的数据
  1456. mmd_RenewAzSetGroup();
  1457. return M_OK;
  1458. }
  1459. int mmd_backPubSetPoll(int key)
  1460. {
  1461. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  1462. {
  1463. mmd_InitPubSetGroup(-1);
  1464. g_tDataMenu2.sFocusIndex=SetGroupIndex;
  1465. mmi_FormsInit(91,1); // 更新最后修改的数据
  1466. mmd_RenewPubSetGroup();
  1467. }
  1468. return M_OK;
  1469. }
  1470. int mmd_backBhSetPoll(int key)
  1471. {
  1472. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  1473. {
  1474. mmd_InitBhSetGroup(-1);
  1475. g_tDataMenu2.sFocusIndex=SetGroupIndex;
  1476. mmi_FormsInit(93,1); // 更新最后修改的数据
  1477. mmd_RenewBhSetGroup();
  1478. }
  1479. return M_OK;
  1480. }
  1481. int mmd_backAzSetPoll(int key)
  1482. {
  1483. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  1484. {
  1485. mmd_InitAzSetGroup(-1);
  1486. g_tDataMenu2.sFocusIndex=SetGroupIndex;
  1487. mmi_FormsInit(95,1); // 更新最后修改的数据
  1488. mmd_RenewAzSetGroup();
  1489. }
  1490. return M_OK;
  1491. }
  1492. int mmd_SetGroupInit(int value)
  1493. {
  1494. bool bret;
  1495. bret=ReadEppData(EEP_SETGROUP_ADDR,m_setgroup,GROUP_NUM);
  1496. if(!bret)
  1497. {
  1498. GetDefSetGroup(m_setgroup);
  1499. }
  1500. return M_OK;
  1501. }
  1502. int mmd_CheckSecValue(void)
  1503. {
  1504. int selsec;
  1505. selsec=atoi(m_selsec_char);
  1506. if(selsec>m_sectionnum || selsec<0)
  1507. {
  1508. m_selsection=0;
  1509. strcpy(m_selsec_char,"00");
  1510. strcpy(m_WarningStr,"输入区号错误!");
  1511. return M_JUMP3;
  1512. }
  1513. m_selsection=selsec;
  1514. rt_printf("%s:Current Section = %d\r\n",__func__,m_selsection);
  1515. mmd_SetGroupInit(0);
  1516. return M_JUMP0;
  1517. }
  1518. int mmd_CheckCopyPassword(int value)
  1519. {
  1520. u8 passstr[10];
  1521. #ifdef PASSWORD_4_STR
  1522. strcpy(passstr,PASS_WORD_STR_4);
  1523. #else
  1524. strcpy(passstr,PASS_WORD_STR);
  1525. #endif
  1526. if((strcmp(m_strPassword,tRunPara.wPasswordstr)!=0)&&(strcmp(m_strPassword,passstr)!=0))
  1527. {
  1528. m_Password=0;
  1529. mmi_zero_passwordstr();
  1530. strcpy(m_WarningStr,"输入密码错误!");
  1531. return M_JUMP3;
  1532. }
  1533. return M_JUMP0;
  1534. }
  1535. int mmd_GetshowAzSetNum(const TSETTABLE *pSet,int bgn,int end,u8 group)
  1536. {
  1537. int i;
  1538. //152 86
  1539. unsigned char menuno = 0;//**
  1540. int bYB1=1;
  1541. rt_printf("g_tScreen.cActiveMenuNo =%d,g_tScreen.cActiveFieldNo =%d\r\n",g_tScreen.cActiveMenuNo,g_tScreen.cActiveFieldNo);
  1542. menuno=g_tScreen.cActiveMenuNo;
  1543. switch(menuno)
  1544. {
  1545. case 152:
  1546. case 192:
  1547. case 62:
  1548. case 202:
  1549. case 172:
  1550. case 162:
  1551. bYB1 = 1;
  1552. break;
  1553. case 86:
  1554. case 79:
  1555. case 88:
  1556. case 95:
  1557. case 97:
  1558. case 93:
  1559. bYB1 = 0;
  1560. break;
  1561. }
  1562. for(i=bgn;i<=end;i++)
  1563. {
  1564. if (pSet[i].wType != SETTYPE_LABEL)
  1565. {
  1566. bool bYB_set;
  1567. bool bmenu_set;
  1568. bmenu_set=mmd_checkset_menucfg(pSet,i,group);
  1569. if(bYB1)
  1570. {
  1571. bYB_set=mmd_checkset_yb(pSet[i].group);
  1572. }
  1573. else
  1574. {
  1575. bYB_set=true;
  1576. }
  1577. if((m_setgroup[pSet[i].group])&&bYB_set&&bmenu_set) // 定值分类组为0 或显示定制为1
  1578. {
  1579. g_set_disp.no[g_set_disp.num] = i;
  1580. g_set_disp.num++;
  1581. }
  1582. }
  1583. }
  1584. return g_set_disp.num;
  1585. }
  1586. /**************************************************************************
  1587. 函数名称:mmd_InitSetSolid
  1588. 函数版本:1.00
  1589. 作者:
  1590. 创建日期:2008.9.1
  1591. 函数功能说明:初始化定值整定的显示
  1592. 更新日志1:
  1593. 日期:
  1594. 修改者:
  1595. 修改内容:
  1596. 修改原因:
  1597. ***************************************************************************/
  1598. int mmd_InitAzSet(int value)
  1599. {
  1600. int num=SW_SET_NUMBER;
  1601. int screennum;
  1602. int i;
  1603. m_AllSection=0;
  1604. g_set_disp.num=0;
  1605. num=mmd_GetshowAzSetNum(&tSwSetTable[0],SET_LABLE_TQ,SET_LABLE_FATT-1,set_show_group[value]);
  1606. SetGroupIndex=value;
  1607. screennum=mmi_GetScreenNum(63,1); // 取当前屏幕最大显示数目
  1608. bSetChange=true;
  1609. mmd_analyse(&tSwSetTable[0],screennum);
  1610. {
  1611. DATA_MENU_DEF *pt=&g_tDataMenu1;
  1612. DATA_MENU_DEF *pext=&g_tExtraMenu;
  1613. pext->sTotalNum=0;
  1614. for(i=0;i<g_set_disp.screennum[0];i++)
  1615. {
  1616. mmd_GetSet(i,&g_tDataMenu1.tDataFields[i],&tSwSetTable[0],m_SetBuf);
  1617. }
  1618. m_ScreenNum=num;
  1619. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  1620. pt->sTotalNum=num; //总的动态菜单数
  1621. pt->sScreenNum=g_set_disp.screennum[0];
  1622. pt->GetPrevFuncAddr=mmd_RenewAzSet; //44
  1623. pt->GetNextFuncAddr=mmd_RenewAzSet; //44
  1624. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  1625. pext->sScreenNum=pext->sTotalNum;
  1626. pext->GetPrevFuncAddr=NULL; //44
  1627. pext->GetNextFuncAddr=NULL; //44
  1628. m_CurrentScreen=1;
  1629. }
  1630. return M_JUMP0;
  1631. }
  1632. /**************************************************************************
  1633. 日期:
  1634. 修改者:
  1635. 修改内容:
  1636. 修改原因:
  1637. ***************************************************************************/
  1638. int mmd_SetAzKey(int key)
  1639. {
  1640. if(key==HA_KEY_UP&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_ADD;
  1641. if(key==HA_KEY_DOWN&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_SUB;
  1642. if(key==HA_KEY_ADD||key==HA_KEY_SUB) // +键增加列表
  1643. {
  1644. if(!g_bModify) return M_ERROR; // 只在修改状态下执行此函数
  1645. if(mmd_ChangeList(&tSwSetTable[0],key,m_SetBuf))
  1646. {
  1647. mmd_RenewAzSet(); //刷新修改后的值
  1648. return M_OK;
  1649. }
  1650. }
  1651. return M_ERROR;
  1652. }
  1653. int mmd_SaveAzSet(int value)
  1654. {
  1655. if(mmd_CheckPassword2()==false)
  1656. {
  1657. return M_JUMP2;
  1658. }
  1659. mmd_ReChangeSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf);
  1660. if(!mmd_CheckSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf))
  1661. {
  1662. mmd_ChangeSet(&tSwSetTable[0],SW_SET_NUMBER,m_SetBuf);
  1663. return M_JUMP3;
  1664. }
  1665. //if(SavePara((void *)m_SetBuf,EEP_SET_ADDR+(m_runsection)*SETSIZE,SW_SET_NUMBER,&tSwSetTable[0]))
  1666. if(SavePara((void *)m_SetBuf,EEP_SET_ADDR+(m_selsection)*SETSIZE,SW_SET_NUMBER,&tSwSetTable[0]))
  1667. {
  1668. strcpy(m_WarningStr,"定值保存成功");
  1669. soe_record_opt(EV_SET_OK,0);
  1670. MakeRunSet(false);
  1671. rt_err_clr(ERR_CODE_SET,0);
  1672. }
  1673. else
  1674. {
  1675. strcpy(m_WarningStr,"定值保存失败");
  1676. soe_record_opt(EV_SET_FAIL,0);
  1677. }
  1678. return M_JUMP0;
  1679. }
  1680. int mmd_ChangeYBSet(const TSETTABLE *pSet,int num,SET_VALUE *setbuf) //ext为不需显示的定值组
  1681. {
  1682. int i;
  1683. int sw=0;
  1684. for(i=0;i<num;i++)
  1685. {
  1686. if(mmd_IsIntegType(pSet[i].wType))
  1687. {
  1688. float ff=setbuf[i].ff;
  1689. setbuf[i].tt=(uint32_t)ff;
  1690. }
  1691. if (pSet[i].wType != SETTYPE_LABEL)
  1692. {
  1693. //xj 2019.10.21
  1694. if(pSet[i].group==GROUP_SET_YB&&(g_tRelay[sw].run_stu.bhtt==1 ||g_tRelay[sw].run_stu.fatt ||g_tRelay[sw].run_stu.fa_g_tt)&&(bPubSetMenuShow[i]>0)) // 定值分类组为0 或显示定制为1
  1695. {
  1696. g_set_disp.no[g_set_disp.num] = i;
  1697. g_set_disp.num++;
  1698. }
  1699. }
  1700. }
  1701. return g_set_disp.num;
  1702. }
  1703. /**************************************************************************
  1704. 函数名称:mmd_RenewYBSet
  1705. 函数版本:1.00
  1706. 作者:
  1707. 创建日期:2008.9.11
  1708. 函数功能说明:刷新定值显示
  1709. 输入参数:
  1710. 输出参数:
  1711. 返回值:
  1712. 更新信息:
  1713. 更新日志1:
  1714. 日期:
  1715. 修改者:
  1716. 修改内容:
  1717. 修改原因:
  1718. ***************************************************************************/
  1719. int mmd_RenewYBSet(void)
  1720. {
  1721. DATA_MENU_DEF *pt=&g_tDataMenu1;
  1722. int i;
  1723. int index=(pt->sFocusIndex/pt->sScreenNum)*pt->sScreenNum;
  1724. for(i=0;i<pt->sScreenNum;i++)
  1725. {
  1726. mmd_GetSet(index,&g_tDataMenu1.tDataFields[i], &tPubSetTable[0],m_SetBuf);
  1727. if(++index>pt->sTotalNum-1) break; //最后一个CPU
  1728. }
  1729. m_CurrentScreen=(pt->sFocusIndex/pt->sScreenNum)+1;
  1730. return M_OK;
  1731. }
  1732. /**************************************************************************
  1733. 函数名称:mmd_InitSetSolid
  1734. 函数版本:1.00
  1735. 作者:
  1736. 创建日期:2008.9.1
  1737. 函数功能说明:初始化定值整定的显示
  1738. 输入参数:
  1739. 输出参数:
  1740. 返回值:
  1741. 更新信息:
  1742. 更新日志1:
  1743. 日期:
  1744. 修改者:
  1745. 修改内容:
  1746. 修改原因:
  1747. ***************************************************************************/
  1748. int mmd_InitYBSet(int value)
  1749. {
  1750. int num=PUB_SET_NUMBER;
  1751. m_AllSection=0;
  1752. g_set_disp.num=0;
  1753. if(value>=0)
  1754. {
  1755. /*读取压板定值*/
  1756. if(!ReadPara((void*)m_SetBuf,EEP_PUB_ADDR+(PUB_SETSIZE*m_runsection),PUB_SET_NUMBER,&tPubSetTable[0]))
  1757. {
  1758. return M_JUMP3;
  1759. }
  1760. }
  1761. num=mmd_ChangeYBSet(&tPubSetTable[0],PUB_SET_NUMBER,&m_SetBuf[0]);
  1762. if(num==0)
  1763. {
  1764. strcpy(m_WarningStr,"无可整定定值!");
  1765. return M_JUMP2;
  1766. }
  1767. bSetChange=true;
  1768. {
  1769. DATA_MENU_DEF *pt=&g_tDataMenu1;
  1770. mmd_GetSet(0,&g_tDataMenu1.tDataFields[0],&tPubSetTable[0],m_SetBuf);
  1771. m_ScreenNum=num;
  1772. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  1773. pt->sTotalNum=num; //总的动态菜单数
  1774. pt->GetPrevFuncAddr=mmd_RenewYBSet; //44
  1775. pt->GetNextFuncAddr=mmd_RenewYBSet; //44
  1776. m_CurrentScreen=1;
  1777. }
  1778. return M_JUMP0;
  1779. }
  1780. /**************************************************************************
  1781. 函数名称:mmd_SetKey
  1782. 函数版本:1.00
  1783. 作者:
  1784. 创建日期:2008.9.1
  1785. 函数功能说明:列表项选择
  1786. 输入参数:
  1787. 输出参数:
  1788. 返回值:
  1789. 更新信息:
  1790. 更新日志1:
  1791. 日期:
  1792. 修改者:
  1793. 修改内容:
  1794. 修改原因:
  1795. ***************************************************************************/
  1796. int mmd_SetYBKey(int key)
  1797. {
  1798. if(key==HA_KEY_UP&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_ADD;
  1799. if(key==HA_KEY_DOWN&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_SUB;
  1800. if(key==HA_KEY_ADD||key==HA_KEY_SUB) // +键增加列表
  1801. {
  1802. if(!g_bModify) return M_ERROR; // 只在修改状态下执行此函数
  1803. if(mmd_ChangeList(&tPubSetTable[0],key,m_SetBuf))
  1804. {
  1805. mmd_RenewYBSet(); //刷新修改后的值
  1806. return M_OK;
  1807. }
  1808. }
  1809. return M_ERROR;
  1810. }
  1811. int mmd_SaveYBSet(int value)
  1812. {
  1813. mmd_ReChangeSet(&tPubSetTable[0],PUB_SET_NUMBER,m_SetBuf);
  1814. if(!mmd_CheckSet(&tPubSetTable[0],PUB_SET_NUMBER,m_SetBuf))
  1815. {
  1816. mmd_ChangeSet(&tPubSetTable[0],PUB_SET_NUMBER,m_SetBuf);
  1817. return M_JUMP3;
  1818. }
  1819. if(SavePara((void *)m_SetBuf,EEP_PUB_ADDR+(PUB_SETSIZE*m_runsection),PUB_SET_NUMBER,&tPubSetTable[0]))
  1820. {
  1821. strcpy(m_WarningStr,"压板保存成功");
  1822. soe_record_opt(EV_PUBSET_OK,0);
  1823. MakeRunSet(false);
  1824. rt_err_clr(ERR_CODE_SET_PUB,0);
  1825. }
  1826. else
  1827. {
  1828. strcpy(m_WarningStr,"压板保存失败");
  1829. soe_record_opt(EV_PUBSET_FAIL,0);
  1830. }
  1831. return M_JUMP0; //弹出定值固化菜单,需选择输入区号
  1832. }
  1833. int mmd_GetDefaultYBSet(int value)
  1834. {
  1835. GetDefPara((void*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
  1836. mmd_InitYBSet(-1);
  1837. return M_OK;
  1838. }
  1839. /**************************************************************************
  1840. 函数名称:mmd_CheckDzPassword
  1841. 函数版本:1.00
  1842. 作者:
  1843. 创建日期:2008.9.1
  1844. 函数功能说明:检查定值密码,
  1845. 输入参数:
  1846. 输出参数:
  1847. 返回值:
  1848. 更新信息:
  1849. 更新日志1:
  1850. 日期:
  1851. 修改者:
  1852. 修改内容:
  1853. 修改原因:
  1854. ***************************************************************************/
  1855. int mmd_CheckDzPassword(int value)
  1856. {
  1857. bool bret;
  1858. //if(m_Password!=tRunPara.wPassword&&m_Password!=PASS_WORD)
  1859. u8 passstr[10];
  1860. #ifdef PASSWORD_4_STR
  1861. strcpy(passstr,PASS_WORD_STR_4);
  1862. #else
  1863. strcpy(passstr,PASS_WORD_STR);
  1864. #endif
  1865. if((strcmp(m_strPassword,tRunPara.wPasswordstr)!=0)&&(strcmp(m_strPassword,passstr)!=0))
  1866. {
  1867. m_Password=0;
  1868. mmi_zero_passwordstr();
  1869. strcpy(m_WarningStr,"输入密码错误!");
  1870. return M_JUMP3;
  1871. }
  1872. m_Password=0;
  1873. mmi_zero_passwordstr();
  1874. bret=ReadEppData(EEP_SETGROUP_ADDR,m_setgroup,GROUP_NUM);
  1875. if(!bret)
  1876. {
  1877. GetDefSetGroup(m_setgroup);
  1878. }
  1879. return M_JUMP0;
  1880. }
  1881. /**************************************************************************
  1882. 函数名称:mmd_CheckXTPassword
  1883. 函数版本:1.00
  1884. 作者:
  1885. 创建日期:2008.9.1
  1886. 函数功能说明:检查系统维护密码
  1887. 输入参数:
  1888. 输出参数:
  1889. 返回值:
  1890. 更新信息:
  1891. 更新日志1:
  1892. 日期:
  1893. 修改者:
  1894. 修改内容:
  1895. 修改原因:
  1896. ***************************************************************************/
  1897. int mmd_CheckXTPassword(int value) // 系统维护密码
  1898. {
  1899. //if(m_Password==INTER_PASSWORD) // 特殊密码,进特内部设置菜单
  1900. u8 passstr[10];
  1901. #ifdef PASSWORD_4_STR
  1902. strcpy(passstr,INTER_PASSWORD_STR_4);
  1903. #else
  1904. strcpy(passstr,INTER_PASSWORD_STR);
  1905. #endif
  1906. if(strcmp(m_strPassword,passstr)==0)
  1907. {
  1908. m_Password=0;
  1909. mmi_zero_passwordstr();
  1910. return M_JUMP1;
  1911. }
  1912. #ifdef PASSWORD_4_STR
  1913. strcpy(passstr,PASS_WORD_STR_4);
  1914. #else
  1915. strcpy(passstr,PASS_WORD_STR);
  1916. #endif
  1917. //if(m_Password!=tRunPara.wPassword&&m_Password!=PASS_WORD)
  1918. if((strcmp(m_strPassword,tRunPara.wPasswordstr)!=0)&&(strcmp(m_strPassword,passstr)!=0))
  1919. {
  1920. m_Password=0;
  1921. mmi_zero_passwordstr();
  1922. strcpy(m_WarningStr,"输入密码错误!");
  1923. return M_JUMP3;
  1924. }
  1925. m_Password=0;
  1926. mmi_zero_passwordstr();
  1927. return M_JUMP0;
  1928. }
  1929. /**************************************************************************
  1930. 函数名称:mmd_CheckCopyPassword
  1931. 函数版本:1.00
  1932. 作者:
  1933. 创建日期:2008.9.1
  1934. 函数功能说明:检查定值复制密码,并取有效定值区及全部定值区到相应的buf中
  1935. 输入参数:
  1936. 输出参数:
  1937. 返回值:
  1938. 更新信息:
  1939. 更新日志1:
  1940. 日期:
  1941. 修改者:
  1942. 修改内容:
  1943. 修改原因:
  1944. ***************************************************************************/
  1945. int mmd_CheckParaPassword(int value)
  1946. {
  1947. bool bret;
  1948. u8 passstr[10];
  1949. //if(m_Password!=tRunPara.wPassword&&m_Password!=PASS_WORD)
  1950. #ifdef PASSWORD_4_STR
  1951. strcpy(passstr,INTER_PASSWORD_STR_4);
  1952. #else
  1953. strcpy(passstr,INTER_PASSWORD_STR);
  1954. #endif
  1955. if((strcmp(m_strPassword,tRunPara.wPasswordstr)!=0)&&(strcmp(m_strPassword,passstr)!=0))
  1956. {
  1957. m_Password=0;
  1958. mmi_zero_passwordstr();
  1959. strcpy(m_WarningStr,"输入密码错误!");
  1960. return M_JUMP3;
  1961. }
  1962. m_Password=0;
  1963. mmi_zero_passwordstr();
  1964. bret=ReadEppData(EEP_SETGROUP_ADDR,m_setgroup,GROUP_NUM);
  1965. if(!bret)
  1966. {
  1967. GetDefSetGroup(m_setgroup);
  1968. }
  1969. return mmd_InitParaSetGroup(0);
  1970. }
  1971. /**************************************************************************
  1972. 函数名称:mmd_RenewEquipPara
  1973. 函数版本:1.00
  1974. 作者:
  1975. 创建日期:2008.9.23
  1976. 函数功能说明: 刷新装置参数的显示
  1977. 输入参数:
  1978. 输出参数:
  1979. 返回值:
  1980. 更新信息:
  1981. 更新日志1
  1982. 日期:
  1983. 修改者:
  1984. 修改内容:
  1985. 修改原因:
  1986. ***************************************************************************/
  1987. //下面是参数修改
  1988. int mmd_RenewParaSet(void)
  1989. {
  1990. DATA_MENU_DEF *pt=&g_tDataMenu1;
  1991. DATA_MENU_DEF *pext=&g_tExtraMenu;
  1992. int i;
  1993. int bgn;
  1994. bgn=g_set_disp.bgn[pt->sFocusIndex];
  1995. pext->sTotalNum=0; //总的动态菜单数
  1996. for(i=0;i<g_set_disp.screennum[pt->sFocusIndex];i++)
  1997. {
  1998. mmd_GetSet(bgn+i,&g_tDataMenu1.tDataFields[i],&tEquipParaTable[0],m_SetBuf);
  1999. }
  2000. pt->sScreenNum=g_set_disp.screennum[pt->sFocusIndex];
  2001. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  2002. pext->sScreenNum=pext->sTotalNum;
  2003. return M_OK;
  2004. }
  2005. int mmd_RenewParaSetGroup(void)
  2006. {
  2007. mmd_RenewDataMenu(&g_tDataMenu2);
  2008. return M_OK;
  2009. }
  2010. int mmd_backParaSet(int value)
  2011. {
  2012. mmd_InitParaSetGroup(-1);
  2013. g_tDataMenu2.sFocusIndex=SetGroupIndex;
  2014. mmi_FormsInit(70,1); // 更新最后修改的数据
  2015. mmd_RenewParaSetGroup();
  2016. return M_OK;
  2017. }
  2018. int mmd_InitParaSetGroup(int value)
  2019. {
  2020. int i,num=0;
  2021. for(i=0;i<GROUP_NUM;i++)
  2022. {
  2023. if(SetGroups[i].group == SETGROUP_TYPE_PARA&&(m_setgroup[i]>0))
  2024. {
  2025. int j;
  2026. for(j=0;j<EQUIP_PARA_NUMBER;j++)
  2027. {
  2028. if((bParaSetMenuShow[j]>0)&&(tEquipParaTable[j].group==i)&&(tEquipParaTable[j].wType!= SETTYPE_LABEL))
  2029. if(tEquipParaTable[j].group==i)
  2030. {
  2031. set_show_group[num++]=i;
  2032. break;
  2033. }
  2034. }
  2035. }
  2036. }
  2037. if(num==0)
  2038. {
  2039. strcpy(m_WarningStr,"装置参数未配置");
  2040. return M_JUMP3;
  2041. }
  2042. mmd_initDataMenu(&g_tDataMenu2,num,mmd_RenewParaSetGroup,mmd_GetSetGroupName,70,1);
  2043. if(!ReadPara((void*)m_SetBuf,EEP_EQUIP_PARA_ADDR,EQUIP_PARA_NUMBER,&tEquipParaTable[0]))
  2044. {
  2045. if(value==-1)
  2046. {
  2047. GetDefPara((float*)m_SetBuf,EQUIP_PARA_NUMBER,&tEquipParaTable[0]);
  2048. }
  2049. else
  2050. {
  2051. return M_JUMP2;
  2052. }
  2053. }
  2054. mmd_ChangeSet(&tEquipParaTable[0],EQUIP_PARA_NUMBER,m_SetBuf);
  2055. return M_JUMP0;
  2056. }
  2057. int mmd_SaveParaSet(int value)
  2058. {
  2059. if(mmd_CheckPassword2()==false)
  2060. {
  2061. return M_JUMP2;
  2062. }
  2063. mmd_ReChangeSet(&tEquipParaTable[0],EQUIP_PARA_NUMBER,m_SetBuf);
  2064. if(!mmd_CheckSet(&tEquipParaTable[0],EQUIP_PARA_NUMBER,m_SetBuf))
  2065. {
  2066. mmd_ChangeSet(&tEquipParaTable[0],EQUIP_PARA_NUMBER,m_SetBuf);
  2067. return M_JUMP3;
  2068. }
  2069. if(SavePara((void *)m_SetBuf,EEP_EQUIP_PARA_ADDR,EQUIP_PARA_NUMBER,&tEquipParaTable[0]))
  2070. {
  2071. strcpy(m_WarningStr,"参数保存成功");
  2072. soe_record_opt(EV_EQUPARA_OK,0);
  2073. MakeRunPara(false,false);
  2074. rt_err_clr(ERR_CODE_EQU_PARA,0);
  2075. }
  2076. else
  2077. {
  2078. strcpy(m_WarningStr,"参数保存失败");
  2079. soe_record_opt(EV_EQUPARA_FAIL,0);
  2080. }
  2081. return M_JUMP0;
  2082. }
  2083. /**************************************************************************
  2084. 函数名称:mmd_InitSetSolid
  2085. 函数版本:1.00
  2086. 作者:
  2087. 创建日期:2008.9.1
  2088. 函数功能说明:初始化定值整定的显示
  2089. 输入参数:
  2090. 输出参数:
  2091. 返回值:
  2092. 更新信息:
  2093. 更新日志1:
  2094. 日期:
  2095. 修改者:
  2096. 修改内容:
  2097. 修改原因:
  2098. ***************************************************************************/
  2099. int mmd_InitParaSet(int value)
  2100. {
  2101. int num=EQUIP_PARA_NUMBER;
  2102. int screennum;
  2103. int i;
  2104. m_AllSection=0;
  2105. g_set_disp.num=0;
  2106. num=mmd_GetshowSetNum(&tEquipParaTable[0],EQUIP_PARA_NUMBER,set_show_group[value]);
  2107. SetGroupIndex=value;
  2108. screennum=mmi_GetScreenNum(71,1); // 取当前屏幕最大显示数目
  2109. bSetChange=true;
  2110. mmd_analyse(&tEquipParaTable[0],screennum);
  2111. {
  2112. DATA_MENU_DEF *pt=&g_tDataMenu1;
  2113. DATA_MENU_DEF *pext=&g_tExtraMenu;
  2114. pext->sTotalNum=0;
  2115. for(i=0;i<g_set_disp.screennum[0];i++)
  2116. {
  2117. mmd_GetSet(i,&g_tDataMenu1.tDataFields[i],&tEquipParaTable[0],m_SetBuf);
  2118. }
  2119. m_ScreenNum=num;
  2120. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  2121. pt->sTotalNum=num; //总的动态菜单数
  2122. pt->sScreenNum=g_set_disp.screennum[0];
  2123. pt->GetPrevFuncAddr=mmd_RenewParaSet; //44
  2124. pt->GetNextFuncAddr=mmd_RenewParaSet; //44
  2125. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  2126. pext->sScreenNum=pext->sTotalNum;
  2127. pext->GetPrevFuncAddr=NULL; //44
  2128. pext->GetNextFuncAddr=NULL; //44
  2129. m_CurrentScreen=1;
  2130. }
  2131. return M_JUMP0;
  2132. }
  2133. /**************************************************************************
  2134. 函数名称:mmd_SetKey
  2135. 函数版本:1.00
  2136. 作者:
  2137. 创建日期:2008.9.1
  2138. 函数功能说明:列表项选择
  2139. 输入参数:
  2140. 输出参数:
  2141. 返回值:
  2142. 更新信息:
  2143. 更新日志1:
  2144. 日期:
  2145. 修改者:
  2146. 修改内容:
  2147. 修改原因:
  2148. ***************************************************************************/
  2149. int mmd_SetParaKey(int key)
  2150. {
  2151. if(key==HA_KEY_UP&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_ADD;
  2152. if(key==HA_KEY_DOWN&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_SUB;
  2153. if(key==HA_KEY_ADD||key==HA_KEY_SUB) // +键增加列表
  2154. {
  2155. if(!g_bModify) return M_ERROR; // 只在修改状态下执行此函数
  2156. if(mmd_ChangeList(&tEquipParaTable[0],key,m_SetBuf))
  2157. {
  2158. mmd_RenewParaSet(); //刷新修改后的值
  2159. return M_OK;
  2160. }
  2161. }
  2162. return M_ERROR;
  2163. }
  2164. /**************************************************************************
  2165. 函数名称:mmd_GetEventShow
  2166. 函数版本:1.00
  2167. 作者:
  2168. 创建日期:2008.9.1
  2169. 函数功能说明:事件及记录显示
  2170. 输入参数:
  2171. 输出参数:
  2172. 返回值:
  2173. 更新信息:
  2174. 更新日志1:
  2175. 日期:
  2176. 修改者:
  2177. 修改内容:
  2178. 修改原因:
  2179. ***************************************************************************/
  2180. EVENT_SHOW m_tEvent; // 查询事件的结构
  2181. EVENT_SHOW m_tAutoEv; // 自动弹出事件的结构
  2182. int mmd_splitstr(unsigned char *str,int lcdsize) // 根据lcd宽度,分析一行可显示的字符串
  2183. {
  2184. int i;
  2185. int len=strlen(str);
  2186. if(len<=lcdsize)return 0; // 一行可以显示
  2187. for(i=0;i<len;)
  2188. {
  2189. if(str[i]>0x80) //是汉字
  2190. {
  2191. i+=2;
  2192. }
  2193. else
  2194. {
  2195. i++;
  2196. }
  2197. if(((i>=lcdsize-1)&&str[i]>=0x80)||i>=lcdsize)
  2198. {
  2199. return i;
  2200. }
  2201. }
  2202. return 0;
  2203. }
  2204. void mmd_GetEventShow(EVENT_SHOW *pe,bool bPDA)
  2205. {
  2206. EVENT_STRUCT *er=&pe->tEv;
  2207. char tmpstr[64], tmpstr1[64];
  2208. char namestr[64];
  2209. char valstr[3][20];
  2210. BYTE paranum=0;
  2211. int lineoff;
  2212. int i;
  2213. struct rtc_time_t tTime;
  2214. u8 ev_type;
  2215. timespec_to_rtc(er->ts,&tTime,1);
  2216. pe->year=tTime.year;
  2217. pe->month=tTime.month;
  2218. pe->day=tTime.day;
  2219. pe->hour=tTime.hour;
  2220. pe->min=tTime.min;
  2221. pe->sec=(tTime.ms/1000);
  2222. pe->ms=(tTime.ms%1000);
  2223. pe->sParaCur=0;
  2224. pe->sParaNum=0;
  2225. ev_type=er->ev_type&SOE_TYPE_MASK;
  2226. if(ev_type==SOE_TYPE_EV||ev_type==SOE_TYPE_OPT) // 不是遥信变位
  2227. {
  2228. int i;
  2229. const SOE_DEF * psoe;
  2230. int ev_sw=0;
  2231. u16 code;
  2232. if(er->ev_code>=EV_NUMBER)
  2233. {
  2234. sprintf(namestr,"错误代码:%d",er->ev_code);
  2235. return;
  2236. }
  2237. else
  2238. {
  2239. strcpy(namestr,"");
  2240. if (er->ev_code < EV_PUB_START)
  2241. {
  2242. code = er->ev_code % EV_SW_NUM;
  2243. ev_sw = (er->ev_code / EV_SW_NUM) + 1;
  2244. }
  2245. else
  2246. {
  2247. code = er->ev_code - EV_SW_NUM*(SWITCH_NUM_MAX-1);
  2248. ev_sw=0;
  2249. }
  2250. #if SWITCH_NUM_MAX != 1
  2251. {
  2252. if ((ev_sw > 0) && (ev_sw < SWITCH_NUM_MAX))
  2253. {
  2254. sprintf(namestr,"开关%d",ev_sw);
  2255. }
  2256. }
  2257. #endif
  2258. psoe=&tAllSOE[code];
  2259. strcat(namestr,psoe->strName); // soe 名称
  2260. #ifdef FUN_SET_CHANGE_SOE
  2261. if(er->ev_code==EV_SET_CHANGE_PARA) //定值修改soe,特殊处理
  2262. {
  2263. u16 type=(u16)(er->ev_arg[0]>>16);
  2264. u16 soeno=(u16)er->ev_arg[0];
  2265. const TSETTABLE *pTable;
  2266. SET_VALUE ft;
  2267. if(type==1) //公共参数
  2268. {
  2269. pTable=&tPubSetTable[soeno];
  2270. }
  2271. else if(type==2) //开关参数
  2272. {
  2273. pTable=&tSwSetTable[soeno];
  2274. }
  2275. else if(type==3) //装置参数
  2276. {
  2277. pTable=&tEquipParaTable[soeno];
  2278. }
  2279. else
  2280. {
  2281. pTable=&tCstSetTable[soeno];
  2282. }
  2283. sprintf(namestr,"%s(%s)",pTable->szName,SetGroups[pTable->group].item_name);
  2284. switch(pTable->wType)
  2285. {
  2286. case SETTYPE_F:
  2287. ft.tt=er->ev_arg[1];
  2288. sprintf(tmpstr,"由:%.3f",ft.ff);
  2289. strcpy(valstr[paranum++],tmpstr);
  2290. ft.tt=er->ev_arg[2];
  2291. sprintf(tmpstr,"改:%.3f",ft.ff);
  2292. strcpy(valstr[paranum++],tmpstr);
  2293. break;
  2294. case SETTYPE_UINT: //16进制显示 控制字
  2295. case SETTYPE_4INT: //10进制显示 4位
  2296. case SETTYPE_5INT: //10进制显示 5位
  2297. case SETTYPE_LINT: //16进制显示 控制字
  2298. ft.tt=er->ev_arg[1];
  2299. sprintf(tmpstr,"由:%d",(u16)ft.tt);
  2300. strcpy(valstr[paranum++],tmpstr);
  2301. ft.tt=er->ev_arg[2];
  2302. sprintf(tmpstr,"改:%d",(u16)ft.tt);
  2303. strcpy(valstr[paranum++],tmpstr);
  2304. break;
  2305. case SETTYPE_LIST: //列表选择
  2306. {
  2307. ft.tt=er->ev_arg[1];
  2308. sprintf(tmpstr,"由:%s", pTable->list[(u16)ft.tt].str);
  2309. strcpy(valstr[paranum++],tmpstr);
  2310. ft.tt=er->ev_arg[2];
  2311. sprintf(tmpstr,"改:%s", pTable->list[(u16)ft.tt].str);
  2312. strcpy(valstr[paranum++],tmpstr);
  2313. }
  2314. break;
  2315. case SETTYPE_IP:
  2316. {
  2317. u32 dat;
  2318. ft.tt=er->ev_arg[1];
  2319. dat=(u32)ft.tt;
  2320. sprintf(tmpstr,"由:%d.%d.%d.%d", (dat>>24)&0xFF, (dat>>16)&0xFF, (dat>>8)&0xFF, (dat>>0)&0xFF);
  2321. strcpy(valstr[paranum++],tmpstr);
  2322. ft.tt=er->ev_arg[2];
  2323. dat=(u32)ft.tt;
  2324. sprintf(tmpstr,"改:%d.%d.%d.%d", (dat>>24)&0xFF, (dat>>16)&0xFF, (dat>>8)&0xFF, (dat>>0)&0xFF);
  2325. strcpy(valstr[paranum++],tmpstr);
  2326. }
  2327. break;
  2328. case SETTYPE_YMD:
  2329. {
  2330. struct timespec ts;
  2331. struct rtc_time_t tTime;
  2332. memset(&ts, 0, sizeof(ts));
  2333. memset(&tTime, 0, sizeof(tTime));
  2334. ft.tt=er->ev_arg[1];
  2335. ts.tv_sec = (long)ft.tt;
  2336. timespec_to_rtc(ts,&tTime,1);
  2337. sprintf(tmpstr,"由:%04d-%02d-%02d", 2000+tTime.year, tTime.month, tTime.day);
  2338. strcpy(valstr[paranum++],tmpstr);
  2339. ft.tt=er->ev_arg[2];
  2340. ts.tv_sec = (long)ft.tt;
  2341. timespec_to_rtc(ts,&tTime,1);
  2342. sprintf(tmpstr,"改:%04d-%02d-%02d", 2000+tTime.year, tTime.month, tTime.day);
  2343. strcpy(valstr[paranum++],tmpstr);
  2344. }
  2345. break;
  2346. case SETTYPE_HMS:
  2347. {
  2348. struct timespec ts;
  2349. struct rtc_time_t tTime;
  2350. extern int timespec_to_rtchms(struct timespec ts, struct rtc_time_t * p_rtc,int is_round);
  2351. memset(&ts, 0, sizeof(ts));
  2352. memset(&tTime, 0, sizeof(tTime));
  2353. ft.tt=er->ev_arg[1];
  2354. ts.tv_sec = (long)ft.tt;
  2355. timespec_to_rtchms(ts,&tTime,1);
  2356. sprintf(tmpstr,"由:%02d:%02d:%02d", tTime.hour, tTime.min, tTime.ms%1000);
  2357. strcpy(valstr[paranum++],tmpstr);
  2358. memset(&ts, 0, sizeof(ts));
  2359. memset(&tTime, 0, sizeof(tTime));
  2360. ft.tt=er->ev_arg[2];
  2361. ts.tv_sec = (long)ft.tt;
  2362. timespec_to_rtchms(ts,&tTime,1);
  2363. sprintf(tmpstr,"改:%02d:%02d:%02d", tTime.hour, tTime.min, tTime.ms%1000);
  2364. strcpy(valstr[paranum++],tmpstr);
  2365. }
  2366. default:
  2367. break;
  2368. }
  2369. }
  2370. else
  2371. {
  2372. #endif
  2373. if(er->ev_value) // 置1 ,产生,显示参数
  2374. {
  2375. for(i=0; i<3; i++)
  2376. {
  2377. BYTE index=(psoe->Attrib[i]&0x1f);
  2378. if(index)
  2379. {
  2380. switch((psoe->Attrib[i]>>5)&0x07)
  2381. {
  2382. case 0: // 浮点数
  2383. FUC_Get_LongValue_String(er->ev_arg[i],tmpstr1);
  2384. sprintf((char*)tmpstr,"%s=%s%s",ev_para[index].strName,tmpstr1,g_unit[ev_para[index].byNo].name);
  2385. break;
  2386. case 1: // 整型值
  2387. sprintf(tmpstr,"%s=%d%s",ev_para[index].strName,er->ev_arg[i],g_unit[ev_para[index].byNo].name);
  2388. break;
  2389. case 2: // 遥控操作
  2390. {
  2391. BYTE sw=(er->ev_arg[0]>>8)&0xff; //开关号
  2392. BYTE no=(er->ev_arg[0]>>0)&0xff; //序号
  2393. char *ykowner;
  2394. ykowner=get_yk_owner((er->ev_arg[0]>>16)&0xff);
  2395. if (i==0)
  2396. {
  2397. sprintf(tmpstr,"通道:%s",ykowner);
  2398. }
  2399. else if (i==1)
  2400. {
  2401. //tmpstr[0]=0;
  2402. /*if(sw==0)
  2403. {
  2404. sprintf(tmpstr,"公共开出%d",no);
  2405. }
  2406. else
  2407. {
  2408. #if SWITCH_NUM_MAX != 1
  2409. sprintf(tmpstr,"开关%d开出%d",sw,no);
  2410. #else
  2411. sprintf(tmpstr,"%s",g_equ_config_do[no].name);
  2412. #endif
  2413. }*/
  2414. //if(no==0)
  2415. //{
  2416. // tmpstr[0]=0;
  2417. //}
  2418. //else
  2419. {
  2420. if(sw==0)
  2421. {
  2422. sprintf(tmpstr,"%s", g_pub_do_name[no-1]);
  2423. }
  2424. else
  2425. {
  2426. #if SWITCH_NUM_MAX!=1
  2427. sprintf(tmpstr,"开关%d%s",sw, g_sw_do_name[no-1]);
  2428. #else
  2429. sprintf(tmpstr,"%s", g_sw_do_name[no-1]);
  2430. #endif
  2431. }
  2432. }
  2433. }
  2434. }
  2435. break;
  2436. case 3: // 压板操作
  2437. {
  2438. strcat(namestr," 投入");
  2439. strcpy(tmpstr,"");
  2440. }
  2441. break;
  2442. default:
  2443. strcpy(tmpstr,"参数错误");
  2444. break;
  2445. }
  2446. strcpy(valstr[paranum++],tmpstr);
  2447. }
  2448. }
  2449. }
  2450. else // 置 0,显示返回值
  2451. {
  2452. strcat(namestr,ev_back[(psoe->soe_def&0x03)]);
  2453. }
  2454. #ifdef FUN_SET_CHANGE_SOE
  2455. }
  2456. #endif
  2457. }
  2458. }
  2459. // 遥信变位记录
  2460. else if(ev_type==SOE_TYPE_YX)
  2461. {
  2462. u8 solt=(u8)(er->ev_code>>8); //板卡号
  2463. u8 dino=(u8)(er->ev_code); //遥信号
  2464. // 第三行
  2465. // 填写事件名称
  2466. #if SWITCH_NUM_MAX==1
  2467. sprintf(namestr,"%s:",equ_di_name(solt,dino)); // 板卡xx开入xx变位
  2468. #else
  2469. sprintf(namestr,"板卡%d开入%d(%s):",solt,dino+1,equ_di_name(solt,dino)); // 板卡xx开入xx变位
  2470. #endif
  2471. if(soe_ev_is_on(er)) // 置1 ,产生,显示参数
  2472. {
  2473. strcpy(tmpstr,SOE_YX_H);
  2474. }
  2475. else
  2476. {
  2477. strcpy(tmpstr,SOE_YX_F);
  2478. }
  2479. strcat(namestr,tmpstr);
  2480. }
  2481. else if(ev_type==SOE_TYPE_LNK )
  2482. {
  2483. u32 cp_s=er->ev_arg[2]; // 通道号+地址
  2484. sprintf(namestr,"通道%d地址%d(点号%04x:%04x)变位",(u8)((cp_s>>21)&0x0f),(u8)((cp_s>>16)&0x1f),er->ev_code,(cp_s)&0xffff);
  2485. if(soe_ev_is_on(er)) // 置1 ,产生,显示参数
  2486. {
  2487. strcpy(tmpstr,SOE_YX_H);
  2488. }
  2489. else
  2490. {
  2491. strcpy(tmpstr,SOE_YX_F);
  2492. }
  2493. strcat(namestr,tmpstr);
  2494. }
  2495. // 双点变位记录
  2496. else if(ev_type==SOE_TYPE_DPI)
  2497. {
  2498. if(er->ev_value==SW_DI_TYPE_ON)
  2499. {
  2500. strcpy(tmpstr,"值=2");
  2501. }
  2502. else if(er->ev_value==SW_DI_TYPE_OFF)
  2503. {
  2504. strcpy(tmpstr,"值=1");
  2505. }
  2506. else
  2507. {
  2508. sprintf(tmpstr,"异常(值=%d)",er->ev_value);
  2509. }
  2510. sprintf(namestr,"双点%02d(点号=0x%04x): %s",er->ev_code,g_di_db_table[er->ev_code].cp,tmpstr);
  2511. }
  2512. // PLC变位记录
  2513. else if(ev_type==SOE_TYPE_PLC)
  2514. {
  2515. sprintf(namestr,"PLC(点号=%04x): %d",g_plc[er->ev_code].cp,er->ev_value);
  2516. }
  2517. else
  2518. {
  2519. sprintf(namestr,"未知类型:%d",er->ev_code);
  2520. }
  2521. for(i=0;i<5;i++)
  2522. {
  2523. sprintf(pe->str[i],"%-20.20s","");
  2524. }
  2525. sprintf(pe->namestr,"%-20.20s","");
  2526. sprintf(pe->valuestr,"%-20.20s","");
  2527. #if LCD_SIZE==128 // 128*64液晶
  2528. lineoff=mmd_splitstr(namestr,16);
  2529. if(lineoff==0)
  2530. {
  2531. sprintf(pe->namestr,"%-16.16s",namestr);
  2532. for(i=0;i<paranum;i++)
  2533. {
  2534. sprintf(pe->str[i],"%-15.15s",valstr[i]);
  2535. if(paranum>1)
  2536. {
  2537. strcat(pe->str[i],"+");
  2538. }
  2539. }
  2540. if(paranum>0)
  2541. {
  2542. strcpy(pe->valuestr,pe->str[0]);
  2543. }
  2544. }
  2545. else
  2546. {
  2547. sprintf(pe->valuestr,"%-15.15s",&namestr[lineoff]);
  2548. namestr[lineoff]='\0';
  2549. sprintf(pe->namestr,"%-16.16s",namestr);
  2550. if(paranum>0)
  2551. {
  2552. strcat(pe->valuestr,"+");
  2553. }
  2554. for(i=0;i<paranum;i++)
  2555. {
  2556. sprintf(pe->str[i],"%-15.15s+",valstr[i]);
  2557. }
  2558. }
  2559. #else
  2560. lineoff=mmd_splitstr(namestr,20);
  2561. if(lineoff==0)
  2562. {
  2563. sprintf(pe->str[0],"%-20.20s",namestr);
  2564. for(i=0;i<paranum;i++)
  2565. {
  2566. sprintf(pe->str[i+1],"%-20.20s",valstr[i]);
  2567. }
  2568. }
  2569. else
  2570. {
  2571. sprintf(pe->str[1],"%-20.20s",&namestr[lineoff]);
  2572. namestr[lineoff]='\0';
  2573. sprintf(pe->str[0],"%-20.20s",namestr);
  2574. for(i=0;i<paranum;i++)
  2575. {
  2576. sprintf(pe->str[i+2],"%-20.20s",valstr[i]);
  2577. }
  2578. }
  2579. #endif
  2580. pe->sParaNum=paranum;
  2581. }
  2582. /**************************************************************************
  2583. 函数名称:mmd_GetEvent
  2584. 函数版本:1.00
  2585. 作者:
  2586. 创建日期:2008.9.1
  2587. 函数功能说明:取事件记录信息
  2588. 输入参数:
  2589. 输出参数:
  2590. 返回值:
  2591. 更新信息:
  2592. 更新日志1:
  2593. 日期:
  2594. 修改者:
  2595. 修改内容:
  2596. 修改原因:
  2597. ***************************************************************************/
  2598. int mmd_GetEvent(int value)
  2599. {
  2600. DWORD addr;
  2601. if(g_soe_info.wEvNumber==0)
  2602. {
  2603. strcpy(m_WarningStr,"无事件记录信息");
  2604. return M_JUMP3;
  2605. }
  2606. addr=EEP_SOE_ADDR+g_soe_info.wEvIndex*(sizeof(EVENT_SAVE))+4;
  2607. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2608. mmd_GetEventShow(&m_tEvent,false);
  2609. m_tEvent.wCurrent=g_soe_info.wEvNumber;
  2610. m_tEvent.wNumber=g_soe_info.wEvNumber;
  2611. m_tEvent.wIndex=g_soe_info.wEvIndex;
  2612. return M_JUMP0;
  2613. }
  2614. int mmd_GetVipEvent(int value)
  2615. {
  2616. DWORD addr;
  2617. if(g_soe_info.wVipNumber==0)
  2618. {
  2619. strcpy(m_WarningStr,"无关键记录信息");
  2620. return M_JUMP3;
  2621. }
  2622. addr=EEP_VIP_ADDR+g_soe_info.wVipIndex*(sizeof(EVENT_SAVE))+4;
  2623. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2624. mmd_GetEventShow(&m_tEvent,false);
  2625. m_tEvent.wCurrent=g_soe_info.wVipNumber;
  2626. m_tEvent.wNumber=g_soe_info.wVipNumber;
  2627. m_tEvent.wIndex=g_soe_info.wVipIndex;
  2628. return M_JUMP0;
  2629. }
  2630. int mmd_GetDebugEvent(int value)
  2631. {
  2632. DWORD addr;
  2633. #ifndef ADD_DEBUG_RECORD_FUN //未配置调试记录的功能则每次进入菜单则需把关键记录的参数传入调试记录参数中
  2634. g_soe_info.wDebugNumber=g_soe_info.wVipNumber;
  2635. g_soe_info.wDebugIndex=g_soe_info.wVipIndex;
  2636. #endif
  2637. if(g_soe_info.wDebugNumber==0)
  2638. {
  2639. strcpy(m_WarningStr,"无调试记录信息");
  2640. return M_JUMP3;
  2641. }
  2642. addr=EEP_DEBUG_RECORD_ADDR+g_soe_info.wDebugIndex*(sizeof(EVENT_SAVE))+4;
  2643. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2644. mmd_GetEventShow(&m_tEvent,false);
  2645. m_tEvent.wCurrent=g_soe_info.wDebugNumber;
  2646. m_tEvent.wNumber=g_soe_info.wDebugNumber;
  2647. m_tEvent.wIndex=g_soe_info.wDebugIndex;
  2648. return M_JUMP0;
  2649. }
  2650. /**************************************************************************
  2651. 函数名称:mmd_GetOpe
  2652. 函数版本:1.00
  2653. 作者:
  2654. 创建日期:2008.9.1
  2655. 函数功能说明:取操作记录信息
  2656. 输入参数:
  2657. 输出参数:
  2658. 返回值:
  2659. 更新信息:
  2660. 更新日志1:
  2661. 日期:
  2662. 修改者:
  2663. 修改内容:
  2664. 修改原因:
  2665. ***************************************************************************/
  2666. int mmd_GetOpe(int value)
  2667. {
  2668. DWORD addr;
  2669. if(g_soe_info.wOpNumber==0)
  2670. {
  2671. strcpy(m_WarningStr,"无操作记录信息");
  2672. return M_JUMP3;
  2673. }
  2674. addr=EEP_OPERATE_ADDR+g_soe_info.wOpIndex*(sizeof(EVENT_SAVE))+4;
  2675. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2676. mmd_GetEventShow(&m_tEvent,false);
  2677. m_tEvent.wCurrent=g_soe_info.wOpNumber;
  2678. m_tEvent.wNumber=g_soe_info.wOpNumber;
  2679. m_tEvent.wIndex=g_soe_info.wOpIndex;
  2680. return M_JUMP0;
  2681. }
  2682. /**************************************************************************
  2683. 函数名称:mmd_GetSoePara
  2684. 函数版本:1.00
  2685. 作者:
  2686. 创建日期:2008.9.1
  2687. 函数功能说明:取记录显示的参数
  2688. 输入参数:
  2689. 输出参数:
  2690. 返回值:
  2691. 更新信息:
  2692. 更新日志1:
  2693. 日期:
  2694. 修改者:
  2695. 修改内容:
  2696. 修改原因:
  2697. ***************************************************************************/
  2698. static int mmd_GetSoePara(EVENT_SHOW *es)
  2699. {
  2700. if(g_tScreen.lcd_type!=LCD_TYPE_12232) // 是160*160液晶,参数一屏可以显示
  2701. {
  2702. return M_OK;
  2703. }
  2704. if(es->sParaNum<1)
  2705. {
  2706. return M_OK;
  2707. }
  2708. es->sParaCur++;
  2709. if(es->sParaCur>=es->sParaNum)
  2710. {
  2711. es->sParaCur=0;
  2712. }
  2713. sprintf(es->valuestr,"%-16.16s",es->str[es->sParaCur]);
  2714. return M_OK;
  2715. }
  2716. #ifdef SOE_PARA_ALL_SAVE
  2717. static int mmd_GetAllSoePara(EVENT_SHOW *pe)
  2718. {
  2719. EVENT_STRUCT *er=&pe->tEv;
  2720. u8 ev_type;
  2721. ev_type=er->ev_type&SOE_TYPE_MASK;
  2722. if(ev_type==SOE_TYPE_EV) // 事件
  2723. {
  2724. u16 code=0;
  2725. if(er->ev_code<EV_NUMBER&&er->ev_value)
  2726. {
  2727. if (er->ev_code < EV_PUB_START)
  2728. {
  2729. code = er->ev_code % EV_SW_NUM;
  2730. }
  2731. else
  2732. {
  2733. code = er->ev_code - EV_SW_NUM*(SWITCH_NUM_MAX-1);
  2734. }
  2735. if(tAllSOE[code].soe_def&0x10)
  2736. {
  2737. DATA_MENU_DEF *pt=&g_tDataMenu2;
  2738. u8 tmpstr[16];
  2739. FUC_Get_LongValue_String(er->allarg[0],tmpstr);
  2740. sprintf((char*)pt->tDataFields[0].FmtStr,"Uab=%s V",tmpstr);
  2741. FUC_Get_LongValue_String(er->allarg[1],tmpstr);
  2742. sprintf((char*)pt->tDataFields[1].FmtStr,"Ubc=%s V",tmpstr);
  2743. FUC_Get_LongValue_String(er->allarg[2],tmpstr);
  2744. sprintf((char*)pt->tDataFields[2].FmtStr,"Uca=%s V",tmpstr);
  2745. FUC_Get_LongValue_String(er->allarg[3],tmpstr);
  2746. sprintf((char*)pt->tDataFields[3].FmtStr,"U0=%s V",tmpstr);
  2747. FUC_Get_LongValue_String(er->allarg[4],tmpstr);
  2748. sprintf((char*)pt->tDataFields[4].FmtStr,"Ia= %s A",tmpstr);
  2749. FUC_Get_LongValue_String(er->allarg[5],tmpstr);
  2750. sprintf((char*)pt->tDataFields[5].FmtStr,"Ib= %s A",tmpstr);
  2751. FUC_Get_LongValue_String(er->allarg[6],tmpstr);
  2752. sprintf((char*)pt->tDataFields[6].FmtStr,"Ic= %s A",tmpstr);
  2753. FUC_Get_LongValue_String(er->allarg[7],tmpstr);
  2754. sprintf((char*)pt->tDataFields[7].FmtStr,"I0= %s A",tmpstr);
  2755. pt->sFocusIndex=0;
  2756. pt->sTotalNum=8;
  2757. pt->GetNextFuncAddr=NULL;
  2758. pt->GetPrevFuncAddr=NULL;
  2759. pt->GetValueFuncAddr=NULL;
  2760. return M_JUMP1;
  2761. }
  2762. }
  2763. }
  2764. return M_OK;
  2765. }
  2766. #endif
  2767. /**************************************************************************
  2768. 函数名称:mmd_GetNextEv
  2769. 函数版本:1.00
  2770. 作者:
  2771. 创建日期:2008.9.1
  2772. 函数功能说明:根据按键,切换到上一记录或下一记录显示
  2773. 输入参数:
  2774. 输出参数:
  2775. 返回值:
  2776. 更新信息:
  2777. 更新日志1:
  2778. 日期:
  2779. 修改者:
  2780. 修改内容:
  2781. 修改原因:
  2782. ***************************************************************************/
  2783. int mmd_GetNextEv(int key)
  2784. {
  2785. #ifdef SOE_PARA_ALL_SAVE
  2786. if(key==HA_KEY_ENTER) // 全参数显示
  2787. {
  2788. return mmd_GetAllSoePara(&m_tEvent);
  2789. }
  2790. #endif
  2791. if(key==HA_KEY_ADD) // 参数显示
  2792. {
  2793. return mmd_GetSoePara(&m_tEvent);
  2794. }
  2795. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  2796. {
  2797. return M_ERROR;
  2798. }
  2799. #ifndef GD_AREA_HEYUAN
  2800. if(key==HA_KEY_LEFT||key==HA_KEY_UP) // 上一条SOE
  2801. {
  2802. DWORD addr;
  2803. if(g_soe_info.wEvNumber<=1)
  2804. {
  2805. return M_ERROR;
  2806. }
  2807. if(m_tEvent.wCurrent<=1)
  2808. {
  2809. m_tEvent.wCurrent=g_soe_info.wEvNumber;
  2810. }
  2811. else
  2812. {
  2813. m_tEvent.wCurrent--;
  2814. }
  2815. if(m_tEvent.wIndex>0)
  2816. {
  2817. m_tEvent.wIndex--;
  2818. }
  2819. else
  2820. {
  2821. if(g_soe_info.wEvNumber==MAX_EVENT_NUMBER)
  2822. {
  2823. m_tEvent.wIndex=MAX_EVENT_NUMBER-1;
  2824. }
  2825. else
  2826. {
  2827. m_tEvent.wIndex=g_soe_info.wEvIndex;
  2828. }
  2829. }
  2830. addr=EEP_SOE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  2831. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2832. mmd_GetEventShow(&m_tEvent,false);
  2833. m_tEvent.wNumber=g_soe_info.wEvNumber;
  2834. return M_JUMP0;
  2835. }
  2836. if(key==HA_KEY_RIGHT||key==HA_KEY_DOWN) // 下一条SOE
  2837. {
  2838. DWORD addr;
  2839. if(g_soe_info.wEvNumber<=1)
  2840. {
  2841. return M_ERROR;
  2842. }
  2843. m_tEvent.wCurrent++; // 标头个数调整
  2844. if(m_tEvent.wCurrent>g_soe_info.wEvNumber)
  2845. {
  2846. m_tEvent.wCurrent=1;
  2847. }
  2848. m_tEvent.wIndex++;
  2849. if(g_soe_info.wEvNumber>=MAX_EVENT_NUMBER)
  2850. {
  2851. if(m_tEvent.wIndex>=MAX_EVENT_NUMBER)
  2852. {
  2853. m_tEvent.wIndex=0;
  2854. }
  2855. }
  2856. else
  2857. {
  2858. if(m_tEvent.wIndex>g_soe_info.wEvIndex)
  2859. {
  2860. m_tEvent.wIndex=0;
  2861. }
  2862. }
  2863. addr=EEP_SOE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  2864. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2865. mmd_GetEventShow(&m_tEvent,false);
  2866. m_tEvent.wNumber=g_soe_info.wEvNumber;
  2867. return M_JUMP0;
  2868. }
  2869. #else
  2870. if(key==HA_KEY_UP) // 上一条SOE
  2871. {
  2872. DWORD addr;
  2873. if(g_soe_info.wEvNumber<=1)
  2874. {
  2875. return M_ERROR;
  2876. }
  2877. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wCurrent,g_soe_info.wEvNumber);
  2878. if(m_tEvent.wCurrent<=1)
  2879. {
  2880. m_tEvent.wCurrent=g_soe_info.wEvNumber;
  2881. }
  2882. else
  2883. {
  2884. m_tEvent.wCurrent--;
  2885. }
  2886. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wCurrent,g_soe_info.wEvNumber);
  2887. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wIndex,g_soe_info.wEvIndex);
  2888. if(m_tEvent.wIndex>0)
  2889. {
  2890. m_tEvent.wIndex--;
  2891. }
  2892. else
  2893. {
  2894. if(g_soe_info.wEvNumber==MAX_EVENT_NUMBER)
  2895. {
  2896. m_tEvent.wIndex=MAX_EVENT_NUMBER-1;
  2897. }
  2898. else
  2899. {
  2900. m_tEvent.wIndex=g_soe_info.wEvIndex;
  2901. }
  2902. }
  2903. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wIndex,g_soe_info.wEvIndex);
  2904. addr=EEP_SOE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  2905. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2906. mmd_GetEventShow(&m_tEvent,false);
  2907. m_tEvent.wNumber=g_soe_info.wEvNumber;
  2908. return M_JUMP0;
  2909. }
  2910. if(key==HA_KEY_DOWN) // 下一条SOE
  2911. {
  2912. DWORD addr;
  2913. if(g_soe_info.wEvNumber<=1)
  2914. {
  2915. return M_ERROR;
  2916. }
  2917. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wCurrent,g_soe_info.wEvNumber);
  2918. m_tEvent.wCurrent++; // 标头个数调整
  2919. if(m_tEvent.wCurrent>g_soe_info.wEvNumber)
  2920. {
  2921. m_tEvent.wCurrent=1;
  2922. }
  2923. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wCurrent,g_soe_info.wEvNumber);
  2924. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wIndex,g_soe_info.wEvIndex);
  2925. m_tEvent.wIndex++;
  2926. if(g_soe_info.wEvNumber>=MAX_EVENT_NUMBER)
  2927. {
  2928. if(m_tEvent.wIndex>=MAX_EVENT_NUMBER)
  2929. {
  2930. m_tEvent.wIndex=0;
  2931. }
  2932. }
  2933. else
  2934. {
  2935. if(m_tEvent.wIndex>g_soe_info.wEvIndex)
  2936. {
  2937. m_tEvent.wIndex=0;
  2938. }
  2939. }
  2940. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wIndex,g_soe_info.wEvIndex);
  2941. addr=EEP_SOE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  2942. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2943. mmd_GetEventShow(&m_tEvent,false);
  2944. m_tEvent.wNumber=g_soe_info.wEvNumber;
  2945. return M_JUMP0;
  2946. }
  2947. if(key==HA_KEY_LEFT) // 上20条SOE
  2948. {
  2949. DWORD addr;
  2950. if(g_soe_info.wEvNumber<=20)
  2951. {
  2952. return M_ERROR;
  2953. }
  2954. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wCurrent,g_soe_info.wEvNumber);
  2955. if(m_tEvent.wCurrent<=20)//标头个数调整
  2956. {
  2957. m_tEvent.wCurrent +=(g_soe_info.wEvNumber-20);
  2958. }
  2959. else
  2960. {
  2961. m_tEvent.wCurrent -=20;
  2962. }
  2963. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wCurrent,g_soe_info.wEvNumber);
  2964. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wIndex,g_soe_info.wEvIndex);
  2965. if(m_tEvent.wIndex>=20)
  2966. {
  2967. m_tEvent.wIndex -=20;
  2968. }
  2969. else
  2970. {
  2971. if(g_soe_info.wEvNumber==MAX_EVENT_NUMBER)//full
  2972. {
  2973. m_tEvent.wIndex +=(MAX_EVENT_NUMBER-20);
  2974. }
  2975. else
  2976. {
  2977. m_tEvent.wIndex +=(g_soe_info.wEvIndex-19);
  2978. }
  2979. }
  2980. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wIndex,g_soe_info.wEvIndex);
  2981. addr=EEP_SOE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  2982. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  2983. mmd_GetEventShow(&m_tEvent,false);
  2984. m_tEvent.wNumber=g_soe_info.wEvNumber;
  2985. return M_JUMP0;
  2986. }
  2987. if(key==HA_KEY_RIGHT) // 下20条SOE
  2988. {
  2989. DWORD addr;
  2990. if(g_soe_info.wEvNumber<=20)
  2991. {
  2992. return M_ERROR;
  2993. }
  2994. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wCurrent,g_soe_info.wEvNumber);
  2995. m_tEvent.wCurrent +=20; // 标头个数调整
  2996. if(m_tEvent.wCurrent>g_soe_info.wEvNumber)
  2997. {
  2998. m_tEvent.wCurrent -= g_soe_info.wEvNumber;
  2999. }
  3000. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wCurrent,g_soe_info.wEvNumber);
  3001. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wIndex,g_soe_info.wEvIndex);
  3002. m_tEvent.wIndex +=20;
  3003. if(g_soe_info.wEvNumber>=MAX_EVENT_NUMBER)//full
  3004. {
  3005. if(m_tEvent.wIndex>=MAX_EVENT_NUMBER)
  3006. {
  3007. m_tEvent.wIndex -=MAX_EVENT_NUMBER;
  3008. }
  3009. }
  3010. else //not full
  3011. {
  3012. if(m_tEvent.wIndex>g_soe_info.wEvIndex)
  3013. {
  3014. m_tEvent.wIndex -=(g_soe_info.wEvIndex+1);//从0开始
  3015. }
  3016. }
  3017. //rt_printf("D-SOE: %d,%d,\r\n",m_tEvent.wIndex,g_soe_info.wEvIndex);
  3018. addr=EEP_SOE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3019. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3020. mmd_GetEventShow(&m_tEvent,false);
  3021. m_tEvent.wNumber=g_soe_info.wEvNumber;
  3022. return M_JUMP0;
  3023. }
  3024. #endif
  3025. return M_ERROR;
  3026. }
  3027. int mmd_GetNextVip(int key)
  3028. {
  3029. #ifdef SOE_PARA_ALL_SAVE
  3030. if(key==HA_KEY_ENTER) // 全参数显示
  3031. {
  3032. return mmd_GetAllSoePara(&m_tEvent);
  3033. }
  3034. #endif
  3035. if(key==HA_KEY_ADD) // 参数显示
  3036. {
  3037. return mmd_GetSoePara(&m_tEvent);
  3038. }
  3039. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  3040. {
  3041. return M_ERROR;
  3042. }
  3043. #ifndef GD_AREA_HEYUAN
  3044. if(key==HA_KEY_LEFT||key==HA_KEY_UP) // 上一条SOE
  3045. {
  3046. DWORD addr;
  3047. if(g_soe_info.wVipNumber<=1)
  3048. {
  3049. return M_ERROR;
  3050. }
  3051. if(m_tEvent.wCurrent<=1)
  3052. {
  3053. m_tEvent.wCurrent=g_soe_info.wVipNumber;
  3054. }
  3055. else
  3056. {
  3057. m_tEvent.wCurrent--;
  3058. }
  3059. if(m_tEvent.wIndex>0)
  3060. {
  3061. m_tEvent.wIndex--;
  3062. }
  3063. else
  3064. {
  3065. if(g_soe_info.wVipNumber==MAX_VIP_NUMBER)
  3066. {
  3067. m_tEvent.wIndex=MAX_VIP_NUMBER-1;
  3068. }
  3069. else
  3070. {
  3071. m_tEvent.wIndex=g_soe_info.wVipIndex;
  3072. }
  3073. }
  3074. addr=EEP_VIP_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3075. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3076. mmd_GetEventShow(&m_tEvent,false);
  3077. m_tEvent.wNumber=g_soe_info.wVipNumber;
  3078. return M_JUMP0;
  3079. }
  3080. if(key==HA_KEY_RIGHT||key==HA_KEY_DOWN) // 下一条SOE
  3081. {
  3082. DWORD addr;
  3083. if(g_soe_info.wVipNumber<=1)
  3084. {
  3085. return M_ERROR;
  3086. }
  3087. m_tEvent.wCurrent++; // 标头个数调整
  3088. if(m_tEvent.wCurrent>g_soe_info.wVipNumber)
  3089. {
  3090. m_tEvent.wCurrent=1;
  3091. }
  3092. m_tEvent.wIndex++;
  3093. if(g_soe_info.wVipNumber>=MAX_VIP_NUMBER)
  3094. {
  3095. if(m_tEvent.wIndex>=MAX_VIP_NUMBER)
  3096. {
  3097. m_tEvent.wIndex=0;
  3098. }
  3099. }
  3100. else
  3101. {
  3102. if(m_tEvent.wIndex>g_soe_info.wVipIndex)
  3103. {
  3104. m_tEvent.wIndex=0;
  3105. }
  3106. }
  3107. addr=EEP_VIP_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3108. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3109. mmd_GetEventShow(&m_tEvent,false);
  3110. m_tEvent.wNumber=g_soe_info.wVipNumber;
  3111. return M_JUMP0;
  3112. }
  3113. #else
  3114. if(key==HA_KEY_UP) // 上一条SOE
  3115. {
  3116. DWORD addr;
  3117. if(g_soe_info.wVipNumber<=1)
  3118. {
  3119. return M_ERROR;
  3120. }
  3121. if(m_tEvent.wCurrent<=1)
  3122. {
  3123. m_tEvent.wCurrent=g_soe_info.wVipNumber;
  3124. }
  3125. else
  3126. {
  3127. m_tEvent.wCurrent--;
  3128. }
  3129. if(m_tEvent.wIndex>0)
  3130. {
  3131. m_tEvent.wIndex--;
  3132. }
  3133. else
  3134. {
  3135. if(g_soe_info.wVipNumber==MAX_VIP_NUMBER)
  3136. {
  3137. m_tEvent.wIndex=MAX_VIP_NUMBER-1;
  3138. }
  3139. else
  3140. {
  3141. m_tEvent.wIndex=g_soe_info.wVipIndex;
  3142. }
  3143. }
  3144. addr=EEP_VIP_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3145. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3146. mmd_GetEventShow(&m_tEvent,false);
  3147. m_tEvent.wNumber=g_soe_info.wVipNumber;
  3148. return M_JUMP0;
  3149. }
  3150. if(key==HA_KEY_DOWN) // 下一条SOE
  3151. {
  3152. DWORD addr;
  3153. if(g_soe_info.wVipNumber<=1)
  3154. {
  3155. return M_ERROR;
  3156. }
  3157. m_tEvent.wCurrent++; // 标头个数调整
  3158. if(m_tEvent.wCurrent>g_soe_info.wVipNumber)
  3159. {
  3160. m_tEvent.wCurrent=1;
  3161. }
  3162. m_tEvent.wIndex++;
  3163. if(g_soe_info.wVipNumber>=MAX_VIP_NUMBER)
  3164. {
  3165. if(m_tEvent.wIndex>=MAX_VIP_NUMBER)
  3166. {
  3167. m_tEvent.wIndex=0;
  3168. }
  3169. }
  3170. else
  3171. {
  3172. if(m_tEvent.wIndex>g_soe_info.wVipIndex)
  3173. {
  3174. m_tEvent.wIndex=0;
  3175. }
  3176. }
  3177. addr=EEP_VIP_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3178. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3179. mmd_GetEventShow(&m_tEvent,false);
  3180. m_tEvent.wNumber=g_soe_info.wVipNumber;
  3181. return M_JUMP0;
  3182. }
  3183. if(key==HA_KEY_LEFT) // 上20条SOE
  3184. {
  3185. DWORD addr;
  3186. if(g_soe_info.wVipNumber<=20)
  3187. {
  3188. return M_ERROR;
  3189. }
  3190. if(m_tEvent.wCurrent<=20)
  3191. {
  3192. m_tEvent.wCurrent +=(g_soe_info.wVipNumber-20);
  3193. }
  3194. else
  3195. {
  3196. m_tEvent.wCurrent -=20;
  3197. }
  3198. if(m_tEvent.wIndex>=20)
  3199. {
  3200. m_tEvent.wIndex -=20;
  3201. }
  3202. else
  3203. {
  3204. if(g_soe_info.wVipNumber==MAX_VIP_NUMBER)//full
  3205. {
  3206. m_tEvent.wIndex += (MAX_VIP_NUMBER-20);
  3207. }
  3208. else
  3209. {
  3210. m_tEvent.wIndex += (g_soe_info.wVipIndex-19);
  3211. }
  3212. }
  3213. addr=EEP_VIP_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3214. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3215. mmd_GetEventShow(&m_tEvent,false);
  3216. m_tEvent.wNumber=g_soe_info.wVipNumber;
  3217. return M_JUMP0;
  3218. }
  3219. if(key==HA_KEY_RIGHT) // 下20条SOE
  3220. {
  3221. DWORD addr;
  3222. if(g_soe_info.wVipNumber<=20)
  3223. {
  3224. return M_ERROR;
  3225. }
  3226. m_tEvent.wCurrent +=20; // 标头个数调整
  3227. if(m_tEvent.wCurrent>g_soe_info.wVipNumber)
  3228. {
  3229. m_tEvent.wCurrent -=g_soe_info.wVipNumber;
  3230. }
  3231. m_tEvent.wIndex +=20;
  3232. if(g_soe_info.wVipNumber>=MAX_VIP_NUMBER)//full
  3233. {
  3234. if(m_tEvent.wIndex>=MAX_VIP_NUMBER)
  3235. {
  3236. m_tEvent.wIndex -= MAX_VIP_NUMBER;
  3237. }
  3238. }
  3239. else//not full
  3240. {
  3241. if(m_tEvent.wIndex>g_soe_info.wVipIndex)
  3242. {
  3243. m_tEvent.wIndex -=(g_soe_info.wVipIndex+1);//从0开始
  3244. }
  3245. }
  3246. addr=EEP_VIP_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3247. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3248. mmd_GetEventShow(&m_tEvent,false);
  3249. m_tEvent.wNumber=g_soe_info.wVipNumber;
  3250. return M_JUMP0;
  3251. }
  3252. #endif
  3253. return M_ERROR;
  3254. }
  3255. /**************************************************************************
  3256. 函数名称:mmd_GetNextDebug
  3257. 函数版本:1.00
  3258. 作者: jack.liu
  3259. 创建日期:2020.12.21
  3260. 函数功能说明:根据按键,切换到上一操作或下一操作记录显示
  3261. 输入参数:
  3262. 输出参数:
  3263. 返回值:
  3264. ***************************************************************************/
  3265. int mmd_GetNextDebug(int key)
  3266. {
  3267. #ifdef SOE_PARA_ALL_SAVE
  3268. if(key==HA_KEY_ENTER) // 全参数显示
  3269. {
  3270. return mmd_GetAllSoePara(&m_tEvent);
  3271. }
  3272. #endif
  3273. if(key==HA_KEY_ADD) // 参数显示
  3274. {
  3275. return mmd_GetSoePara(&m_tEvent);
  3276. }
  3277. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  3278. {
  3279. return M_ERROR;
  3280. }
  3281. #ifndef GD_AREA_HEYUAN
  3282. if(key==HA_KEY_LEFT||key==HA_KEY_UP) // 上一条SOE
  3283. {
  3284. DWORD addr;
  3285. if(g_soe_info.wDebugNumber<=1)
  3286. {
  3287. return M_ERROR;
  3288. }
  3289. if(m_tEvent.wCurrent<=1)
  3290. {
  3291. m_tEvent.wCurrent=g_soe_info.wDebugNumber;
  3292. }
  3293. else
  3294. {
  3295. m_tEvent.wCurrent--;
  3296. }
  3297. if(m_tEvent.wIndex>0)
  3298. {
  3299. m_tEvent.wIndex--;
  3300. }
  3301. else
  3302. {
  3303. if(g_soe_info.wDebugNumber==MAX_DEBUG_RECORD_NUMBER)
  3304. {
  3305. m_tEvent.wIndex=MAX_DEBUG_RECORD_NUMBER-1;
  3306. }
  3307. else
  3308. {
  3309. m_tEvent.wIndex=g_soe_info.wDebugIndex;
  3310. }
  3311. }
  3312. addr=EEP_DEBUG_RECORD_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3313. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3314. mmd_GetEventShow(&m_tEvent,false);
  3315. m_tEvent.wNumber=g_soe_info.wDebugNumber;
  3316. return M_JUMP0;
  3317. }
  3318. if(key==HA_KEY_RIGHT||key==HA_KEY_DOWN) // 下一条SOE
  3319. {
  3320. DWORD addr;
  3321. if(g_soe_info.wDebugNumber<=1)
  3322. {
  3323. return M_ERROR;
  3324. }
  3325. m_tEvent.wCurrent++; // 标头个数调整
  3326. if(m_tEvent.wCurrent>g_soe_info.wDebugNumber)
  3327. {
  3328. m_tEvent.wCurrent=1;
  3329. }
  3330. m_tEvent.wIndex++;
  3331. if(g_soe_info.wDebugNumber>=MAX_DEBUG_RECORD_NUMBER)
  3332. {
  3333. if(m_tEvent.wIndex>=MAX_DEBUG_RECORD_NUMBER)
  3334. {
  3335. m_tEvent.wIndex=0;
  3336. }
  3337. }
  3338. else
  3339. {
  3340. if(m_tEvent.wIndex>g_soe_info.wDebugIndex)
  3341. {
  3342. m_tEvent.wIndex=0;
  3343. }
  3344. }
  3345. addr=EEP_DEBUG_RECORD_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3346. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3347. mmd_GetEventShow(&m_tEvent,false);
  3348. m_tEvent.wNumber=g_soe_info.wDebugNumber;
  3349. return M_JUMP0;
  3350. }
  3351. #else
  3352. if(key==HA_KEY_UP) // 上一条SOE
  3353. {
  3354. DWORD addr;
  3355. if(g_soe_info.wDebugNumber<=1)
  3356. {
  3357. return M_ERROR;
  3358. }
  3359. if(m_tEvent.wCurrent<=1)
  3360. {
  3361. m_tEvent.wCurrent=g_soe_info.wDebugNumber;
  3362. }
  3363. else
  3364. {
  3365. m_tEvent.wCurrent--;
  3366. }
  3367. if(m_tEvent.wIndex>0)
  3368. {
  3369. m_tEvent.wIndex--;
  3370. }
  3371. else
  3372. {
  3373. if(g_soe_info.wDebugNumber==MAX_DEBUG_RECORD_NUMBER)
  3374. {
  3375. m_tEvent.wIndex=MAX_DEBUG_RECORD_NUMBER-1;
  3376. }
  3377. else
  3378. {
  3379. m_tEvent.wIndex=g_soe_info.wDebugIndex;
  3380. }
  3381. }
  3382. addr=EEP_DEBUG_RECORD_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3383. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3384. mmd_GetEventShow(&m_tEvent,false);
  3385. m_tEvent.wNumber=g_soe_info.wDebugNumber;
  3386. return M_JUMP0;
  3387. }
  3388. if(key==HA_KEY_DOWN) // 下一条SOE
  3389. {
  3390. DWORD addr;
  3391. if(g_soe_info.wDebugNumber<=1)
  3392. {
  3393. return M_ERROR;
  3394. }
  3395. m_tEvent.wCurrent++; // 标头个数调整
  3396. if(m_tEvent.wCurrent>g_soe_info.wDebugNumber)
  3397. {
  3398. m_tEvent.wCurrent=1;
  3399. }
  3400. m_tEvent.wIndex++;
  3401. if(g_soe_info.wDebugNumber>=MAX_DEBUG_RECORD_NUMBER)
  3402. {
  3403. if(m_tEvent.wIndex>=MAX_DEBUG_RECORD_NUMBER)
  3404. {
  3405. m_tEvent.wIndex=0;
  3406. }
  3407. }
  3408. else
  3409. {
  3410. if(m_tEvent.wIndex>g_soe_info.wDebugIndex)
  3411. {
  3412. m_tEvent.wIndex=0;
  3413. }
  3414. }
  3415. addr=EEP_DEBUG_RECORD_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3416. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3417. mmd_GetEventShow(&m_tEvent,false);
  3418. m_tEvent.wNumber=g_soe_info.wDebugNumber;
  3419. return M_JUMP0;
  3420. }
  3421. if(key==HA_KEY_LEFT) // 上20条SOE
  3422. {
  3423. DWORD addr;
  3424. if(g_soe_info.wDebugNumber<=20)
  3425. {
  3426. return M_ERROR;
  3427. }
  3428. if(m_tEvent.wCurrent<=20)
  3429. {
  3430. m_tEvent.wCurrent +=(g_soe_info.wDebugNumber-20);
  3431. }
  3432. else
  3433. {
  3434. m_tEvent.wCurrent -=20;
  3435. }
  3436. if(m_tEvent.wIndex>=20)
  3437. {
  3438. m_tEvent.wIndex -=20;
  3439. }
  3440. else
  3441. {
  3442. if(g_soe_info.wDebugNumber==MAX_DEBUG_RECORD_NUMBER)//full
  3443. {
  3444. m_tEvent.wIndex += (MAX_DEBUG_RECORD_NUMBER-20);
  3445. }
  3446. else
  3447. {
  3448. m_tEvent.wIndex += (g_soe_info.wDebugIndex-19);
  3449. }
  3450. }
  3451. addr=EEP_DEBUG_RECORD_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3452. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3453. mmd_GetEventShow(&m_tEvent,false);
  3454. m_tEvent.wNumber=g_soe_info.wDebugNumber;
  3455. return M_JUMP0;
  3456. }
  3457. if(key==HA_KEY_RIGHT) // 下20条SOE
  3458. {
  3459. DWORD addr;
  3460. if(g_soe_info.wDebugNumber<=20)
  3461. {
  3462. return M_ERROR;
  3463. }
  3464. m_tEvent.wCurrent +=20; // 标头个数调整
  3465. if(m_tEvent.wCurrent>g_soe_info.wDebugNumber)
  3466. {
  3467. m_tEvent.wCurrent -=g_soe_info.wDebugNumber;
  3468. }
  3469. m_tEvent.wIndex +=20;
  3470. if(g_soe_info.wDebugNumber>=MAX_DEBUG_RECORD_NUMBER)//full
  3471. {
  3472. if(m_tEvent.wIndex>=MAX_DEBUG_RECORD_NUMBER)
  3473. {
  3474. m_tEvent.wIndex -= MAX_DEBUG_RECORD_NUMBER;
  3475. }
  3476. }
  3477. else//not full
  3478. {
  3479. if(m_tEvent.wIndex>g_soe_info.wDebugIndex)
  3480. {
  3481. m_tEvent.wIndex -=(g_soe_info.wDebugIndex+1);//从0开始
  3482. }
  3483. }
  3484. addr=EEP_DEBUG_RECORD_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3485. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3486. mmd_GetEventShow(&m_tEvent,false);
  3487. m_tEvent.wNumber=g_soe_info.wDebugNumber;
  3488. return M_JUMP0;
  3489. }
  3490. #endif
  3491. return M_ERROR;
  3492. }
  3493. /**************************************************************************
  3494. 函数名称:mmd_GetNextOpe
  3495. 函数版本:1.00
  3496. 作者:
  3497. 创建日期:2008.9.1
  3498. 函数功能说明:根据按键,切换到上一操作或下一操作记录显示
  3499. 输入参数:
  3500. 输出参数:
  3501. 返回值:
  3502. 更新信息:
  3503. 更新日志1:
  3504. 日期:
  3505. 修改者:
  3506. 修改内容:
  3507. 修改原因:
  3508. ***************************************************************************/
  3509. int mmd_GetNextOpe(int key)
  3510. {
  3511. if(key==HA_KEY_ADD) // 参数显示
  3512. {
  3513. return mmd_GetSoePara(&m_tEvent);
  3514. }
  3515. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  3516. {
  3517. return M_ERROR;
  3518. }
  3519. #ifndef GD_AREA_HEYUAN
  3520. if(key==HA_KEY_LEFT||key==HA_KEY_UP) // 上一条SOE
  3521. {
  3522. DWORD addr;
  3523. if(g_soe_info.wOpNumber<=1)
  3524. {
  3525. return M_ERROR;
  3526. }
  3527. if(m_tEvent.wCurrent<=1)
  3528. {
  3529. m_tEvent.wCurrent=g_soe_info.wOpNumber;
  3530. }
  3531. else
  3532. {
  3533. m_tEvent.wCurrent--;
  3534. }
  3535. if(m_tEvent.wIndex>0)
  3536. {
  3537. m_tEvent.wIndex--;
  3538. }
  3539. else
  3540. {
  3541. if(g_soe_info.wOpNumber==MAX_OPERATE_NUMBER)
  3542. {
  3543. m_tEvent.wIndex=MAX_OPERATE_NUMBER-1;
  3544. }
  3545. else
  3546. {
  3547. m_tEvent.wIndex=g_soe_info.wOpIndex;
  3548. }
  3549. }
  3550. addr=EEP_OPERATE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3551. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3552. mmd_GetEventShow(&m_tEvent,false);
  3553. m_tEvent.wNumber=g_soe_info.wOpNumber;
  3554. return M_JUMP0;
  3555. }
  3556. if(key==HA_KEY_RIGHT||key==HA_KEY_DOWN) // 下一条SOE
  3557. {
  3558. DWORD addr;
  3559. if(g_soe_info.wOpNumber<=1)
  3560. {
  3561. return M_ERROR;
  3562. }
  3563. m_tEvent.wCurrent++; // 标头个数调整
  3564. if(m_tEvent.wCurrent>g_soe_info.wOpNumber)
  3565. {
  3566. m_tEvent.wCurrent=1;
  3567. }
  3568. m_tEvent.wIndex++;
  3569. if(g_soe_info.wOpNumber>=MAX_OPERATE_NUMBER)
  3570. {
  3571. if(m_tEvent.wIndex>=MAX_OPERATE_NUMBER)
  3572. {
  3573. m_tEvent.wIndex=0;
  3574. }
  3575. }
  3576. else
  3577. {
  3578. if(m_tEvent.wIndex>g_soe_info.wOpIndex)
  3579. {
  3580. m_tEvent.wIndex=0;
  3581. }
  3582. }
  3583. addr=EEP_OPERATE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3584. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3585. mmd_GetEventShow(&m_tEvent,false);
  3586. m_tEvent.wNumber=g_soe_info.wOpNumber;
  3587. return M_JUMP0;
  3588. }
  3589. #else
  3590. if(key==HA_KEY_UP) // 上一条SOE
  3591. {
  3592. DWORD addr;
  3593. if(g_soe_info.wOpNumber<=1)
  3594. {
  3595. return M_ERROR;
  3596. }
  3597. if(m_tEvent.wCurrent<=1)
  3598. {
  3599. m_tEvent.wCurrent=g_soe_info.wOpNumber;
  3600. }
  3601. else
  3602. {
  3603. m_tEvent.wCurrent--;
  3604. }
  3605. if(m_tEvent.wIndex>0)
  3606. {
  3607. m_tEvent.wIndex--;
  3608. }
  3609. else
  3610. {
  3611. if(g_soe_info.wOpNumber==MAX_OPERATE_NUMBER)
  3612. {
  3613. m_tEvent.wIndex=MAX_OPERATE_NUMBER-1;
  3614. }
  3615. else
  3616. {
  3617. m_tEvent.wIndex=g_soe_info.wOpIndex;
  3618. }
  3619. }
  3620. addr=EEP_OPERATE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3621. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3622. mmd_GetEventShow(&m_tEvent,false);
  3623. m_tEvent.wNumber=g_soe_info.wOpNumber;
  3624. return M_JUMP0;
  3625. }
  3626. if(key==HA_KEY_DOWN) // 下一条SOE
  3627. {
  3628. DWORD addr;
  3629. if(g_soe_info.wOpNumber<=1)
  3630. {
  3631. return M_ERROR;
  3632. }
  3633. m_tEvent.wCurrent++; // 标头个数调整
  3634. if(m_tEvent.wCurrent>g_soe_info.wOpNumber)
  3635. {
  3636. m_tEvent.wCurrent=1;
  3637. }
  3638. m_tEvent.wIndex++;
  3639. if(g_soe_info.wOpNumber>=MAX_OPERATE_NUMBER)
  3640. {
  3641. if(m_tEvent.wIndex>=MAX_OPERATE_NUMBER)
  3642. {
  3643. m_tEvent.wIndex=0;
  3644. }
  3645. }
  3646. else
  3647. {
  3648. if(m_tEvent.wIndex>g_soe_info.wOpIndex)
  3649. {
  3650. m_tEvent.wIndex=0;
  3651. }
  3652. }
  3653. addr=EEP_OPERATE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3654. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3655. mmd_GetEventShow(&m_tEvent,false);
  3656. m_tEvent.wNumber=g_soe_info.wOpNumber;
  3657. return M_JUMP0;
  3658. }
  3659. if(key==HA_KEY_LEFT) // 上20条SOE
  3660. {
  3661. DWORD addr;
  3662. if(g_soe_info.wOpNumber<=20)
  3663. {
  3664. return M_ERROR;
  3665. }
  3666. if(m_tEvent.wCurrent<=20)
  3667. {
  3668. m_tEvent.wCurrent +=(g_soe_info.wOpNumber-20);
  3669. }
  3670. else
  3671. {
  3672. m_tEvent.wCurrent -=20;
  3673. }
  3674. if(m_tEvent.wIndex>=20)
  3675. {
  3676. m_tEvent.wIndex -=20;
  3677. }
  3678. else
  3679. {
  3680. if(g_soe_info.wOpNumber==MAX_OPERATE_NUMBER)//full
  3681. {
  3682. m_tEvent.wIndex +=(MAX_OPERATE_NUMBER-20);
  3683. }
  3684. else
  3685. {
  3686. m_tEvent.wIndex +=(g_soe_info.wOpIndex-19);
  3687. }
  3688. }
  3689. addr=EEP_OPERATE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3690. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3691. mmd_GetEventShow(&m_tEvent,false);
  3692. m_tEvent.wNumber=g_soe_info.wOpNumber;
  3693. return M_JUMP0;
  3694. }
  3695. if(key==HA_KEY_RIGHT) // 下20条SOE
  3696. {
  3697. DWORD addr;
  3698. if(g_soe_info.wOpNumber<=20)
  3699. {
  3700. return M_ERROR;
  3701. }
  3702. m_tEvent.wCurrent +=20; // 标头个数调整
  3703. if(m_tEvent.wCurrent>g_soe_info.wOpNumber)
  3704. {
  3705. m_tEvent.wCurrent -=g_soe_info.wOpNumber;
  3706. }
  3707. m_tEvent.wIndex +=20;
  3708. if(g_soe_info.wOpNumber>=MAX_OPERATE_NUMBER)//full
  3709. {
  3710. if(m_tEvent.wIndex>=MAX_OPERATE_NUMBER)
  3711. {
  3712. m_tEvent.wIndex -= MAX_OPERATE_NUMBER;
  3713. }
  3714. }
  3715. else//not full
  3716. {
  3717. if(m_tEvent.wIndex>g_soe_info.wOpIndex)
  3718. {
  3719. m_tEvent.wIndex -=(g_soe_info.wOpIndex+1);//从0开始
  3720. }
  3721. }
  3722. addr=EEP_OPERATE_ADDR+m_tEvent.wIndex*(sizeof(EVENT_SAVE))+4;
  3723. e2prom_read(addr,(BYTE *)&m_tEvent.tEv,sizeof(EVENT_STRUCT));
  3724. mmd_GetEventShow(&m_tEvent,false);
  3725. m_tEvent.wNumber=g_soe_info.wOpNumber;
  3726. return M_JUMP0;
  3727. }
  3728. #endif
  3729. return M_ERROR;
  3730. }
  3731. /**************************************************************************
  3732. 函数名称:CheckAutoSOE
  3733. 函数版本:1.00
  3734. 作者:
  3735. 创建日期:2008.9.1
  3736. 函数功能说明:检查是否有自动弹出的事件要显示
  3737. 输入参数:
  3738. 输出参数:
  3739. 返回值:
  3740. 更新信息:
  3741. 更新日志1:
  3742. 日期:
  3743. 修改者:
  3744. 修改内容:
  3745. 修改原因:
  3746. ***************************************************************************/
  3747. bool CheckAutoSOE(void)
  3748. {
  3749. if(g_run_stu.bHmiRmtTest&&(g_tScreen.cActiveMenuNo<124||g_tScreen.cActiveMenuNo>129)) // 退出测试模式
  3750. {
  3751. g_run_stu.bHmiRmtTest=false;
  3752. }
  3753. if(g_tScreen.cActiveMenuNo>0)
  3754. {
  3755. g_soe_info.bDpNew=false; //进入其他页面也不弹窗
  3756. return false;
  3757. }
  3758. if(g_tLcdComm.bLock)
  3759. {
  3760. g_soe_info.bDpNew=false;
  3761. return false;
  3762. }
  3763. if(!g_soe_info.bDpNew) //没有事件产生
  3764. {
  3765. return false;
  3766. }
  3767. if(g_tScreen.cActiveMenuNo==23)return false;
  3768. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  3769. if((g_tScreen.cActiveMenuNo==124)||(g_tScreen.cActiveMenuNo==126))
  3770. {
  3771. g_soe_info.bDpNew=false; //进入其他页面也不弹窗
  3772. return false;
  3773. }
  3774. #endif
  3775. g_soe_info.bDpNew=false;
  3776. if(g_bVipSoe_show)
  3777. {
  3778. #ifdef GD_AREA_FOS_2020
  3779. if(g_soe_info.bDpType)
  3780. {
  3781. mmd_GetOpe(0);
  3782. }
  3783. else
  3784. #endif
  3785. {
  3786. #ifdef ADD_DEBUG_RECORD_FUN
  3787. mmd_GetDebugEvent(0);
  3788. #else
  3789. mmd_GetVipEvent(0);
  3790. #endif
  3791. }
  3792. }
  3793. else
  3794. {
  3795. mmd_GetEvent(0);
  3796. }
  3797. return true;
  3798. }
  3799. /*下面是测量值显示*/
  3800. /**************************************************************************
  3801. 函数名称:mmd_GetMeaPubValue
  3802. 函数版本:1.00
  3803. 作者:
  3804. 创建日期:2008.9.1
  3805. 函数功能说明:处理测量值的显示
  3806. 输入参数:
  3807. i 显示的测量值的索引,
  3808. pF显示数据结构
  3809. 输出参数:
  3810. 返回值:
  3811. 更新信息:
  3812. 更新日志1:
  3813. 日期:
  3814. 修改者:
  3815. 修改内容:
  3816. 修改原因:
  3817. ***************************************************************************/
  3818. void mmd_angle_to_str(char *str,qs16 angle)
  3819. {
  3820. if(str == NULL)
  3821. {
  3822. return ;
  3823. }
  3824. if(angle > 0)
  3825. {
  3826. angle += Q16_BASE>>1;
  3827. }
  3828. else
  3829. {
  3830. angle -= Q16_BASE>>1;
  3831. }
  3832. #ifdef DISP_MEA_CN
  3833. sprintf(str,"%3d°",angle/Q16_BASE);
  3834. #else
  3835. sprintf(str," %3d°",angle/Q16_BASE);
  3836. #endif
  3837. }
  3838. static void mmd_GetMeaPubValue(int i,DATA_FIELD_DEF *pF)
  3839. {
  3840. char *pd=pF->FmtStr;
  3841. char tmpstr[24];
  3842. char meastr[24];
  3843. char meaCal[4];
  3844. //幅值
  3845. FUC_Get_LongValue_String(lMeaVal[i],tmpstr);
  3846. strcpy(meaCal," ");
  3847. if(lMeaCal[i])
  3848. {
  3849. strcpy(meaCal,"*");
  3850. }
  3851. if(g_pub_ac_desc[i].unit_angle == UNIT_ANG) //需要显示角度
  3852. {
  3853. sprintf(meastr,"%s%-4.4s=%-6.6s%s",meaCal,g_pub_ac_desc[i].name,tmpstr,g_unit[g_pub_ac_desc[i].unit].name); //幅值
  3854. }
  3855. else
  3856. {
  3857. sprintf(meastr,"%s%-s=%-6.6s%s",meaCal,g_pub_ac_desc[i].name,tmpstr,g_unit[g_pub_ac_desc[i].unit].name); //幅值
  3858. }
  3859. if(g_pub_ac_desc[i].unit_angle == UNIT_ANG) //需要显示角度
  3860. {
  3861. if(lMeaAng[i]!=ANGEL_INVALID)
  3862. {
  3863. mmd_angle_to_str(tmpstr,lMeaAng[i]);
  3864. }
  3865. else
  3866. {
  3867. strcpy(tmpstr," --- ");
  3868. }
  3869. strcat(meastr,tmpstr);
  3870. }
  3871. sprintf(pd,"%-20s",meastr);
  3872. }
  3873. /**************************************************************************
  3874. 函数名称:mmd_RenewMeaPub
  3875. 函数版本:1.00
  3876. 作者:
  3877. 创建日期:2008.9.1
  3878. 函数功能说明:刷新测量值显示
  3879. 输入参数:
  3880. 输出参数:
  3881. 返回值:
  3882. 更新信息:
  3883. 更新日志1:
  3884. 日期:
  3885. 修改者:
  3886. 修改内容:
  3887. 修改原因:
  3888. ***************************************************************************/
  3889. int mmd_RenewMeaPub(void)
  3890. {
  3891. FreshMeaPub(lMeaVal,lMeaAng,lMeaCal);
  3892. mmd_RenewDataMenu(&g_tDataMenu1);
  3893. return M_OK;
  3894. }
  3895. /**************************************************************************
  3896. 函数名称:mmd_GetMeaPub
  3897. 函数版本:1.00
  3898. 作者:
  3899. 创建日期:2008.9.1
  3900. 函数功能说明:取得测量值的显示
  3901. 输入参数:
  3902. 输出参数:
  3903. 返回值:
  3904. 更新信息:
  3905. 更新日志1:
  3906. 日期:
  3907. 修改者:
  3908. 修改内容:
  3909. 修改原因:
  3910. ***************************************************************************/
  3911. int mmd_GetMeaPub(int value)
  3912. {
  3913. FreshMeaPub(lMeaVal,lMeaAng,lMeaCal);
  3914. mmd_initDataMenu(&g_tDataMenu1,PUB_AC_NUM_ALL,mmd_RenewMeaPub,mmd_GetMeaPubValue,15,1);
  3915. return M_OK;
  3916. }
  3917. static void mmd_GetMeaSwValue(int i,DATA_FIELD_DEF *pF)
  3918. {
  3919. char *pd=pF->FmtStr;
  3920. char tmpstr[24];
  3921. char meastr[24];
  3922. char meaCal[4];
  3923. //幅值
  3924. FUC_Get_LongValue_String(lMeaVal[i],tmpstr);
  3925. strcpy(meaCal," ");
  3926. if(lMeaCal[i])
  3927. {
  3928. strcpy(meaCal,"*");
  3929. }
  3930. if(g_sw_ac_desc[i].unit_angle == UNIT_ANG) //需要显示角度
  3931. {
  3932. sprintf(meastr,"%s%-4.4s=%-6.6s%s",meaCal,g_sw_ac_desc[i].name,tmpstr,g_unit[g_sw_ac_desc[i].unit].name); //幅值//sprintf(meastr,"%s%-6.6s=%-6.6s%s",meaCal,g_sw_ac_desc[i].name,tmpstr,g_unit[g_sw_ac_desc[i].unit].name); //幅值
  3933. }
  3934. else if(g_sw_ac_desc[i].unit == UNIT_GE) //整型值
  3935. {
  3936. sprintf(meastr,"%s%-s=%d %s",meaCal,g_sw_ac_desc[i].name,lMeaVal[i],g_unit[g_sw_ac_desc[i].unit].name); //幅值
  3937. }
  3938. else
  3939. {
  3940. sprintf(meastr,"%s%-s=%-6.6s%s",meaCal,g_sw_ac_desc[i].name,tmpstr,g_unit[g_sw_ac_desc[i].unit].name); //幅值
  3941. }
  3942. if(g_sw_ac_desc[i].unit_angle == UNIT_ANG) //需要显示角度
  3943. {
  3944. if(lMeaAng[i]!=ANGEL_INVALID)
  3945. {
  3946. // sprintf(tmpstr," %3d°",lMeaAng[i]/65536L);
  3947. mmd_angle_to_str(tmpstr,lMeaAng[i]);
  3948. }
  3949. else
  3950. {
  3951. strcpy(tmpstr," --- ");
  3952. }
  3953. strcat(meastr,tmpstr);
  3954. }
  3955. sprintf(pd,"%-20s",meastr);
  3956. }
  3957. int mmd_RenewMeaSw(void)
  3958. {
  3959. FreshMeaSw(lMeaVal,lMeaAng,lMeaCal,g_sw_index);
  3960. mmd_RenewDataMenu(&g_tDataMenu1);
  3961. return M_OK;
  3962. }
  3963. int mmd_GetMeaSw(int value)
  3964. {
  3965. g_sw_index=1;
  3966. FreshMeaSw(lMeaVal,lMeaAng,lMeaCal,g_sw_index);
  3967. mmd_initDataMenu(&g_tDataMenu1,SW_AC_NUM_ALL,mmd_RenewMeaSw,mmd_GetMeaSwValue,16,1);
  3968. return M_OK;
  3969. }
  3970. int mmd_ChangeSwMea(int key)
  3971. {
  3972. if(key==HA_KEY_ADD||key==HA_KEY_SUB) // 显示下一个开关
  3973. {
  3974. if(key==HA_KEY_ADD)
  3975. {
  3976. g_sw_index++;
  3977. if(g_sw_index>SWITCH_NUM_MAX)
  3978. {
  3979. g_sw_index=1;
  3980. }
  3981. }
  3982. else
  3983. {
  3984. if(g_sw_index>1)
  3985. {
  3986. g_sw_index--;
  3987. }
  3988. else
  3989. {
  3990. g_sw_index=SWITCH_NUM_MAX;
  3991. }
  3992. }
  3993. FreshMeaSw(lMeaVal,lMeaAng,lMeaCal,g_sw_index);
  3994. mmd_initDataMenu(&g_tDataMenu1,SW_AC_NUM_ALL,mmd_RenewMeaSw,mmd_GetMeaSwValue,16,1);
  3995. }
  3996. return M_OK;
  3997. }
  3998. /*下面是遥信值显示*/
  3999. struct M_List
  4000. {
  4001. WORD list[64];
  4002. WORD num;
  4003. WORD ftuswnum;
  4004. WORD m_current;
  4005. }m_list;
  4006. struct M_board
  4007. {
  4008. BYTE list[16];
  4009. int list_num[16];
  4010. BYTE num;
  4011. BYTE m_current;
  4012. }m_board;
  4013. extern struct di g_di[];
  4014. static void mmd_GetPubYxValue(int i,DATA_FIELD_DEF *pF)
  4015. {
  4016. char *pd=pF->FmtStr;
  4017. char tmpstr[4];
  4018. struct equ_config_di *ecd=&g_equ_config_di[g_sw_pub.di_cfg_index[m_list.list[i]]];
  4019. //if(g_di[ecd->slot].value&(1<<ecd->index))
  4020. if(dido_di_is_on(ecd->slot,ecd->index))
  4021. {
  4022. strcpy(tmpstr,YX_H);
  4023. }
  4024. else
  4025. {
  4026. strcpy(tmpstr,YX_F);
  4027. }
  4028. sprintf(pd,"%-16.16s %s",ecd->name,tmpstr);
  4029. }
  4030. int mmd_RenewPubYX(void)
  4031. {
  4032. mmd_RenewDataMenu(&g_tDataMenu1);
  4033. return M_OK;
  4034. }
  4035. /**************************************************************************
  4036. 函数名称:mmd_GetMeaPub
  4037. 函数版本:1.00
  4038. 作者:
  4039. 创建日期:2008.9.1
  4040. 函数功能说明:取得测量值的显示
  4041. 输入参数:
  4042. 输出参数:
  4043. 返回值:
  4044. 更新信息:
  4045. 更新日志1:
  4046. 日期:
  4047. 修改者:
  4048. 修改内容:
  4049. 修改原因:
  4050. ***************************************************************************/
  4051. int mmd_GetPubYX(int value)
  4052. {
  4053. int i;
  4054. memset(&m_list,0,sizeof(m_list));
  4055. for(i=0;i<PUB_DI_NUM;i++)
  4056. {
  4057. if((short)g_sw_pub.di_cfg_index[i]!=INDEX_INVALLID) //此遥信有配置
  4058. {
  4059. m_list.list[m_list.num]=i;
  4060. m_list.num++;
  4061. }
  4062. }
  4063. if(m_list.num==0)
  4064. {
  4065. strcpy(m_WarningStr,"无公用遥信配置");
  4066. return M_JUMP3;
  4067. }
  4068. m_list.m_current=0;
  4069. mmd_initDataMenu(&g_tDataMenu1,m_list.num,mmd_RenewPubYX,mmd_GetPubYxValue,17,1);
  4070. return M_JUMP0;
  4071. }
  4072. static void mmd_GetSwYxValue(int i,DATA_FIELD_DEF *pF)
  4073. {
  4074. char *pd=pF->FmtStr;
  4075. char tmpstr[4];
  4076. struct equ_config_di *ecd=&g_equ_config_di[g_sw[m_board.list[m_board.m_current]].di_cfg_index[m_list.list[i]]];
  4077. //if(g_di[ecd->slot].value&(1<<ecd->index))
  4078. if(dido_di_is_on(ecd->slot,ecd->index))
  4079. {
  4080. strcpy(tmpstr,YX_H);
  4081. }
  4082. else
  4083. {
  4084. strcpy(tmpstr,YX_F);
  4085. }
  4086. sprintf(pd,"%-16.16s %s",ecd->name,tmpstr);
  4087. }
  4088. int mmd_RenewSwYX(void)
  4089. {
  4090. mmd_RenewDataMenu(&g_tDataMenu1);
  4091. return M_OK;
  4092. }
  4093. int mmd_GetSwYX(int value)
  4094. {
  4095. int i,sw;
  4096. memset(&m_board,0,sizeof(m_board));
  4097. for(sw=0; sw<SWITCH_NUM_MAX; sw++)
  4098. {
  4099. int sum=0;
  4100. for(i=0;i<SW_DI_NUM;i++)
  4101. {
  4102. if((short)g_sw[sw].di_cfg_index[i]!=INDEX_INVALLID) //此遥信有配置
  4103. {
  4104. sum++;
  4105. }
  4106. }
  4107. if(sum)// 此开关配置有遥信
  4108. {
  4109. m_board.list[m_board.num]=sw;
  4110. m_board.list_num[m_board.num]=sum;
  4111. m_board.num++;
  4112. }
  4113. }
  4114. if(m_board.num==0)
  4115. {
  4116. strcpy(m_WarningStr,"线路无遥信配置");
  4117. return M_JUMP3;
  4118. }
  4119. m_board.m_current=0;
  4120. memset(&m_list,0,sizeof(m_list));
  4121. sw=m_board.list[m_board.m_current];
  4122. for(i=0;i<SW_DI_NUM;i++)
  4123. {
  4124. if((short)g_sw[sw].di_cfg_index[i]!=INDEX_INVALLID) //此遥信有配置
  4125. {
  4126. m_list.list[m_list.num]=i;
  4127. m_list.num++;
  4128. }
  4129. }
  4130. g_sw_index=sw+1;
  4131. mmd_initDataMenu(&g_tDataMenu1,m_list.num,mmd_RenewSwYX,mmd_GetSwYxValue,18,1);
  4132. return M_JUMP0;
  4133. }
  4134. int mmd_ChangeYxSw(int key)
  4135. {
  4136. int i,sw;
  4137. if(m_board.num==0)return M_OK;
  4138. if(key==HA_KEY_ADD||key==HA_KEY_SUB)
  4139. {
  4140. if(key==HA_KEY_ADD) // 显示下一个开关
  4141. {
  4142. m_board.m_current++;
  4143. if(m_board.m_current>=m_board.num)
  4144. {
  4145. m_board.m_current=0;
  4146. }
  4147. }
  4148. if(key==HA_KEY_SUB) // 显示上一个开关
  4149. {
  4150. if(m_board.m_current>0)
  4151. {
  4152. m_board.m_current--;
  4153. }
  4154. else
  4155. {
  4156. m_board.m_current=m_board.num-1;
  4157. }
  4158. }
  4159. memset(&m_list,0,sizeof(m_list));
  4160. sw=m_board.list[m_board.m_current];
  4161. for(i=0;i<SW_DI_NUM;i++)
  4162. {
  4163. if((short)g_sw[sw].di_cfg_index[i]!=INDEX_INVALLID) //此遥信有配置
  4164. {
  4165. m_list.list[m_list.num]=i;
  4166. m_list.num++;
  4167. }
  4168. }
  4169. g_sw_index=sw+1;
  4170. Add_Clear_Screen();
  4171. mmd_initDataMenu(&g_tDataMenu1,m_list.num,mmd_RenewSwYX,mmd_GetSwYxValue,18,1);
  4172. }
  4173. return M_OK;
  4174. }
  4175. static void mmd_GetBoardYXValue(int no,DATA_FIELD_DEF *pF)
  4176. {
  4177. char *pd=pF->FmtStr;
  4178. char tmpstr[8];
  4179. int i,di_no;
  4180. int num;
  4181. strcpy(pd,"");
  4182. di_no=no*10;
  4183. num=m_board.list_num[m_board.m_current];
  4184. for(i=0;i<10;i++)
  4185. {
  4186. if(di_no>=num) //超出有效遥信范围
  4187. {
  4188. strcpy(tmpstr," ");
  4189. }
  4190. else
  4191. {
  4192. // // TODO:if(g_di[g_sw_index].value&(1<<di_no))
  4193. if(dido_di_is_on(g_sw_index,di_no))
  4194. {
  4195. strcpy(tmpstr,"●");
  4196. }
  4197. else
  4198. {
  4199. strcpy(tmpstr,"○");
  4200. }
  4201. di_no++;
  4202. }
  4203. strcat(pd,tmpstr);
  4204. }
  4205. }
  4206. int mmd_RenewBoardYX(void)
  4207. {
  4208. mmd_RenewDataMenu(&g_tDataMenu1);
  4209. return M_OK;
  4210. }
  4211. int mmd_GetBoardYX(int value)
  4212. {
  4213. int i;
  4214. memset(&m_board,0,sizeof(m_board));
  4215. for(i=0; i<g_equ_config->equ_slot_num; i++)
  4216. {
  4217. int di_num = equ_get_di_num(i);
  4218. if(di_num>0)
  4219. {
  4220. m_board.list[m_board.num]=i;
  4221. m_board.list_num[m_board.num]=di_num;
  4222. m_board.num++;
  4223. }
  4224. }
  4225. if(m_board.num==0)
  4226. {
  4227. strcpy(m_WarningStr,"无遥信板卡配置");
  4228. return M_JUMP3;
  4229. }
  4230. m_board.m_current=0;
  4231. g_sw_index=m_board.list[m_board.m_current];
  4232. mmd_initDataMenu(&g_tDataMenu1,3,mmd_RenewBoardYX,mmd_GetBoardYXValue,19,1);
  4233. return M_JUMP0;
  4234. }
  4235. int mmd_ChangeYxBoard(int key)
  4236. {
  4237. if(m_board.num<=1)return M_OK;
  4238. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  4239. {
  4240. return M_ERROR;
  4241. }
  4242. if(key==HA_KEY_ADD||key==HA_KEY_DOWN||key==HA_KEY_RIGHT) // 显示下一个开关
  4243. {
  4244. m_board.m_current++;
  4245. if(m_board.m_current>=m_board.num)
  4246. {
  4247. m_board.m_current=0;
  4248. }
  4249. }
  4250. if(key==HA_KEY_SUB||key==HA_KEY_UP||key==HA_KEY_LEFT) // 显示上一个开关
  4251. {
  4252. if(m_board.m_current>0)
  4253. {
  4254. m_board.m_current--;
  4255. }
  4256. else
  4257. {
  4258. m_board.m_current=m_board.num-1;
  4259. }
  4260. }
  4261. g_sw_index=m_board.list[m_board.m_current];
  4262. mmd_initDataMenu(&g_tDataMenu1,3,mmd_RenewBoardYX,mmd_GetBoardYXValue,19,1);
  4263. return M_OK;
  4264. }
  4265. /************下面是FTU遥测,遥信显示处理************************/
  4266. typedef struct MENU_MEA
  4267. {
  4268. u8 index[MEA_MENU_MAX];
  4269. u8 num;
  4270. }MENU_MEA;
  4271. MENU_MEA tMenuMea;
  4272. static void mmd_GetFtuMeaValue(int index,DATA_FIELD_DEF *pF)
  4273. {
  4274. char *pd=pF->FmtStr;
  4275. char tmpstr[24];
  4276. char meastr[24];
  4277. char meaCal[4];
  4278. u8 unit_angle ;
  4279. long lValue=0;
  4280. int i;
  4281. float pt;
  4282. if(tMenuMea.num==0) //没有额外显示配置文件
  4283. {
  4284. i=index;
  4285. }
  4286. else
  4287. {
  4288. i=tMenuMea.index[index];
  4289. }
  4290. lValue=lMeaVal[i];
  4291. if(pRunSet->bTT_ShowOne)
  4292. {
  4293. if(i<SW_AC_MENU_NUM)
  4294. {
  4295. switch(g_sw_ac_desc[i].unit)
  4296. {
  4297. case UNIT_A5:
  4298. case UNIT_BIA:
  4299. case UNIT_I0A:
  4300. if (strstr(g_sw_ac_desc[i].name,"I0"))//I0零序电流变比不一样
  4301. {
  4302. if(pRunSet->ct0_two)
  4303. lValue = _MulFac_S(lMeaVal[i],((DWORD)(pRunSet->ct0_one/pRunSet->ct0_two))<<16);
  4304. }
  4305. else
  4306. {
  4307. if(pRunSet->ct_two)
  4308. lValue = _MulFac_S(lMeaVal[i],((DWORD)(pRunSet->ct_one/pRunSet->ct_two))<<16);//((DWORD)(pRunSet->ct_one/pRunSet->ct_two));
  4309. }
  4310. break;
  4311. case UNIT_W:
  4312. case UNIT_Var:
  4313. case UNIT_kW:
  4314. case UNIT_kVar:
  4315. if(pRunSet->pt1_two)
  4316. lValue=(long)((float)lMeaVal[i]*(pRunSet->ct_one/pRunSet->ct_two*pRunSet->pt_rate/pRunSet->pt1_two));
  4317. break;
  4318. default:
  4319. break;
  4320. }
  4321. }
  4322. else
  4323. {
  4324. switch(g_pub_ac_desc[i-SW_AC_MENU_NUM].unit)
  4325. {
  4326. case UNIT_V100:
  4327. case UNIT_V220:
  4328. case UNIT_kV:
  4329. //判断PT变比电源侧&&母线侧&&零序电压
  4330. if (strstr(g_pub_ac_desc[i].name,"U0"))
  4331. pt = pRunSet->pt_3U0;
  4332. else if(strchr(g_pub_ac_desc[i-SW_AC_MENU_NUM].name,'2'))
  4333. pt = pRunSet->pt2_two;
  4334. else
  4335. pt = pRunSet->pt1_two;
  4336. if(pt)
  4337. lValue=(long)((float)lMeaVal[i]*(pRunSet->pt_rate/pt));
  4338. break;
  4339. default:
  4340. lValue=lMeaVal[i];
  4341. break;
  4342. }
  4343. }
  4344. }
  4345. else
  4346. {
  4347. lValue=lMeaVal[i];
  4348. }
  4349. //幅值
  4350. FUC_Get_LongValue_String(lValue,tmpstr);
  4351. meaCal[0]=0;
  4352. #ifndef DISP_MEA_CN
  4353. strcpy(meaCal," ");
  4354. if(lMeaCal[i])
  4355. {
  4356. strcpy(meaCal,"*");
  4357. }
  4358. #endif
  4359. if(i<SW_AC_MENU_NUM)
  4360. {
  4361. unit_angle=g_sw_ac_desc[i].unit_angle;
  4362. if(g_sw_ac_desc[i].unit == UNIT_GE) //整型值
  4363. {
  4364. sprintf(meastr,"%s%-s=%d %s",meaCal,g_sw_ac_desc[i].name,lValue,g_unit[g_sw_ac_desc[i].unit].name); //幅值
  4365. }
  4366. else
  4367. {
  4368. if(pRunSet->bTT_ShowOne)//单位显示
  4369. {
  4370. switch(g_sw_ac_desc[i].unit)
  4371. {
  4372. case UNIT_A5:
  4373. case UNIT_BIA:
  4374. case UNIT_I0A:
  4375. if(unit_angle == UNIT_ANG) //需要显示角度
  4376. {
  4377. #ifdef DISP_MEA_CN
  4378. sprintf(meastr,"%s%-6.6s=%-6.6sA",meaCal,g_sw_ac_desc[i].name,tmpstr); //幅值
  4379. #else
  4380. sprintf(meastr,"%s%-4.4s=%-6.6s A",meaCal,g_sw_ac_desc[i].name,tmpstr); //幅值
  4381. #endif
  4382. }
  4383. else
  4384. {
  4385. sprintf(meastr,"%s%-s=%-6.6sA",meaCal,g_sw_ac_desc[i].name,tmpstr);
  4386. }
  4387. break;
  4388. case UNIT_kW:
  4389. case UNIT_W:
  4390. #ifdef DISP_MEA_CN
  4391. sprintf(meastr,"%s%-s=%-7.7sKW",meaCal,g_sw_ac_desc[i].name,tmpstr);
  4392. #else
  4393. sprintf(meastr,"%s%-s=%-7.7s KW",meaCal,g_sw_ac_desc[i].name,tmpstr);
  4394. #endif
  4395. break;
  4396. case UNIT_kVar:
  4397. case UNIT_Var:
  4398. #ifdef DISP_MEA_CN
  4399. sprintf(meastr,"%s%-s=%-7.7sKVar",meaCal,g_sw_ac_desc[i].name,tmpstr);
  4400. #else
  4401. sprintf(meastr,"%s%-s=%-7.7s KVar",meaCal,g_sw_ac_desc[i].name,tmpstr);
  4402. #endif
  4403. break;
  4404. default:
  4405. #ifdef DISP_MEA_CN
  4406. sprintf(meastr,"%s%-s=%-6.6s%s",meaCal,g_sw_ac_desc[i].name,tmpstr,g_unit[g_sw_ac_desc[i].unit].name);
  4407. #else
  4408. sprintf(meastr,"%s%-s=%-6.6s%s ",meaCal,g_sw_ac_desc[i].name,tmpstr,g_unit[g_sw_ac_desc[i].unit].name);
  4409. #endif
  4410. break;
  4411. }
  4412. }
  4413. else
  4414. {
  4415. if(unit_angle == UNIT_ANG) //需要显示角度
  4416. {
  4417. #ifdef DISP_MEA_CN
  4418. sprintf(meastr,"%s%-7.7s=%-5.5s%s",meaCal,g_sw_ac_desc[i].name,tmpstr,g_unit[g_sw_ac_desc[i].unit].name); //幅值
  4419. #else
  4420. sprintf(meastr,"%s%-4.4s=%-6.6s%s",meaCal,g_sw_ac_desc[i].name,tmpstr,g_unit[g_sw_ac_desc[i].unit].name); //幅值
  4421. #endif
  4422. }
  4423. else
  4424. {
  4425. sprintf(meastr,"%s%-s=%-6.6s%s",meaCal,g_sw_ac_desc[i].name,tmpstr,g_unit[g_sw_ac_desc[i].unit].name);
  4426. }
  4427. }
  4428. }
  4429. }
  4430. else
  4431. {
  4432. unit_angle=g_pub_ac_desc[i-SW_AC_MENU_NUM].unit_angle;
  4433. if(pRunSet->bTT_ShowOne)//单位显示
  4434. {
  4435. switch(g_pub_ac_desc[i-SW_AC_MENU_NUM].unit)
  4436. {
  4437. case UNIT_V100:
  4438. case UNIT_V220:
  4439. case UNIT_kV:
  4440. #ifdef DISP_MEA_CN
  4441. sprintf(meastr,"%s%-7.7s=%-4.4sKV",meaCal,g_pub_ac_desc[i-SW_AC_MENU_NUM].name,tmpstr); //幅值
  4442. #else
  4443. sprintf(meastr,"%s%-4.4s=%-6.6sKV",meaCal,g_pub_ac_desc[i-SW_AC_MENU_NUM].name,tmpstr); //幅值
  4444. #endif
  4445. break;
  4446. default:
  4447. #ifdef DISP_MEA_CN
  4448. sprintf(meastr,"%s%-s=%-5.5s%s",meaCal,g_pub_ac_desc[i-SW_AC_MENU_NUM].name,tmpstr,g_unit[g_pub_ac_desc[i-SW_AC_MENU_NUM].unit].name); //幅值
  4449. #else
  4450. sprintf(meastr,"%s%-s=%-6.6s%s",meaCal,g_pub_ac_desc[i-SW_AC_MENU_NUM].name,tmpstr,g_unit[g_pub_ac_desc[i-SW_AC_MENU_NUM].unit].name); //幅值
  4451. #endif
  4452. break;
  4453. }
  4454. }
  4455. else if(unit_angle == UNIT_ANG) //需要显示角度
  4456. {
  4457. #ifdef DISP_MEA_CN
  4458. sprintf(meastr,"%s%-7.7s=%-5.5s%s",meaCal,g_pub_ac_desc[i-SW_AC_MENU_NUM].name,tmpstr,g_unit[g_pub_ac_desc[i-SW_AC_MENU_NUM].unit].name); //幅值
  4459. #else
  4460. sprintf(meastr,"%s%-4.4s=%-6.6s%s",meaCal,g_pub_ac_desc[i-SW_AC_MENU_NUM].name,tmpstr,g_unit[g_pub_ac_desc[i-SW_AC_MENU_NUM].unit].name); //幅值
  4461. #endif
  4462. }
  4463. else
  4464. sprintf(meastr,"%s%-s=%-6.6s%s",meaCal,g_pub_ac_desc[i-SW_AC_MENU_NUM].name,tmpstr,g_unit[g_pub_ac_desc[i-SW_AC_MENU_NUM].unit].name); //幅值
  4465. }
  4466. if(unit_angle) //需要显示角度
  4467. {
  4468. if(lMeaAng[i]!=ANGEL_INVALID)
  4469. {
  4470. mmd_angle_to_str(tmpstr,lMeaAng[i]);
  4471. }
  4472. else
  4473. {
  4474. strcpy(tmpstr," --- ");
  4475. }
  4476. #if LCD_SIZE==160
  4477. strcat(meastr,tmpstr);
  4478. #endif
  4479. }
  4480. #if LCD_SIZE==128
  4481. sprintf(pd,"%-16.16s",meastr);
  4482. #else
  4483. sprintf(pd,"%-20.20s",meastr);
  4484. #endif
  4485. }
  4486. int mmd_RenewFtuMea(void)
  4487. {
  4488. FreshMeaSw(lMeaVal,lMeaAng,lMeaCal,1);
  4489. FreshMeaPub(&lMeaVal[SW_AC_MENU_NUM],&lMeaAng[SW_AC_MENU_NUM],&lMeaCal[SW_AC_MENU_NUM]);
  4490. mmd_RenewDataMenu(&g_tDataMenu1);
  4491. return M_OK;
  4492. }
  4493. int mmd_GetFtuMea(int value)
  4494. {
  4495. int num;
  4496. num=(tMenuMea.num>0)?tMenuMea.num:MEA_MENU_MAX;
  4497. FreshMeaSw(lMeaVal,lMeaAng,lMeaCal,1);
  4498. FreshMeaPub(&lMeaVal[SW_AC_MENU_NUM],&lMeaAng[SW_AC_MENU_NUM],&lMeaCal[SW_AC_MENU_NUM]);
  4499. mmd_initDataMenu(&g_tDataMenu1,num,mmd_RenewFtuMea,mmd_GetFtuMeaValue,21,1);
  4500. return M_OK;
  4501. }
  4502. static void mmd_GetFtuYxValue(int i,DATA_FIELD_DEF *pF)
  4503. {
  4504. char *pd=pF->FmtStr;
  4505. char tmpstr[4];
  4506. struct equ_config_di *ecd;
  4507. if(i<m_list.ftuswnum)
  4508. {
  4509. ecd=&g_equ_config_di[g_sw[0].di_cfg_index[m_list.list[i]]];
  4510. }
  4511. else
  4512. {
  4513. ecd=&g_equ_config_di[g_sw_pub.di_cfg_index[m_list.list[i]]];
  4514. }
  4515. //if(g_di[ecd->slot].value&(1<<ecd->index))
  4516. if(dido_di_is_on(ecd->slot,ecd->index))
  4517. {
  4518. strcpy(tmpstr,YX_H);
  4519. }
  4520. else
  4521. {
  4522. strcpy(tmpstr,YX_F);
  4523. }
  4524. //关联压板处理
  4525. if(SW_DI_BSCH+1==ecd->type && ecd->owner!=0 && (!CHZ_ALL_EN(0)))//闭锁重合压板
  4526. strcpy(tmpstr,YX_H);
  4527. if((SW_DI_CHZ+1==ecd->type && ecd->owner!=0 && (!CHZ_ALL_EN(0)))||//重合闸投入压板
  4528. (SW_DI_BHZTT+1==ecd->type && ecd->owner!=0 && (!FUN_ALL_EN(0)))||//保护总投入压板
  4529. (ecd->owner!=0 && (!TQ_ALL_EN(0))))//同期压板
  4530. strcpy(tmpstr,YX_F);
  4531. #if defined GD_AREA_SHAOGUAN || defined BHFAGS_YB_YK || defined GD_AREA_ZHONGSHAN || defined GD_AREA_ECZD_2020
  4532. if((SW_DI_BHTT+1==ecd->type && ecd->owner!=0 && (!BH_ALL_EN(0)))||//常规保护压板
  4533. (SW_DI_FA_TT+1==ecd->type && ecd->owner!=0 && (!FA_ALL_EN(0)))||//FA压板
  4534. (SW_DI_FA_GOOSE+1==ecd->type && ecd->owner!=0 && (!BH_GOOSE_EN(0))))//智能分布式压板
  4535. strcpy(tmpstr,YX_F);
  4536. #endif
  4537. #ifdef GD_AREA_SHANTOU
  4538. if(SW_DI_TYTQ+1==ecd->type && ecd->owner!=0 && TYTQ_ALL_EN(0))//停用同期压板
  4539. strcpy(tmpstr,YX_H);
  4540. #endif
  4541. #ifdef GD_AREA_ECZD_2020
  4542. if(ecd->owner!=0 && TYTQ_ALL_EN(0))//停用同期压板
  4543. strcpy(tmpstr,YX_H);
  4544. if(ecd->owner!=0 && !JL_ALL_EN(0))//自动解列软压板
  4545. strcpy(tmpstr,YX_H);
  4546. if(SW_DI_BHZTT+1==ecd->type && ecd->owner!=0 && !FUN_ALL_EN(0))//停用保护功能总
  4547. strcpy(tmpstr,YX_H);
  4548. #endif
  4549. #ifdef GD_AREA_MAIN_2020 //广东标准2020 停用同期合闸功能软压板
  4550. if(ecd->owner!=0 && TYTQ_ALL_EN(0))//停用同期压板
  4551. strcpy(tmpstr,YX_H);
  4552. if(ecd->owner!=0 && !JL_ALL_EN(0))//自动解列软压板
  4553. strcpy(tmpstr,YX_H);
  4554. if(SW_DI_BHZTT+1==ecd->type && ecd->owner!=0 && !FUN_ALL_EN(0))//停用保护功能总
  4555. strcpy(tmpstr,YX_H);
  4556. #endif
  4557. #if LCD_SIZE==128
  4558. sprintf(pd,"%-13.13s %s",shield_str(ecd),tmpstr);
  4559. #else
  4560. sprintf(pd,"%-16.16s %s",shield_str(ecd),tmpstr);
  4561. #endif
  4562. }
  4563. int mmd_RenewFtuYX(void)
  4564. {
  4565. mmd_RenewDataMenu(&g_tDataMenu1);
  4566. return M_OK;
  4567. }
  4568. /**************************************************************************
  4569. 函数名称:mmd_GetMeaPub
  4570. 函数版本:1.00
  4571. 作者:
  4572. 创建日期:2008.9.1
  4573. 函数功能说明:取得测量值的显示
  4574. 输入参数:
  4575. 输出参数:
  4576. 返回值:
  4577. 更新信息:
  4578. 更新日志1:
  4579. 日期:
  4580. 修改者:
  4581. 修改内容:
  4582. 修改原因:
  4583. ***************************************************************************/
  4584. int mmd_GetFtuYX(int value)
  4585. {
  4586. int i;
  4587. memset(&m_list,0,sizeof(m_list));
  4588. for(i=0;i<SW_DI_NUM;i++)
  4589. {
  4590. if((short)g_sw[0].di_cfg_index[i]!=INDEX_INVALLID) //此遥信有配置
  4591. {
  4592. m_list.list[m_list.num]=i;
  4593. m_list.num++;
  4594. }
  4595. }
  4596. m_list.ftuswnum=m_list.num;
  4597. for(i=0;i<PUB_DI_NUM;i++)
  4598. {
  4599. if((short)g_sw_pub.di_cfg_index[i]!=INDEX_INVALLID) //此遥信有配置
  4600. {
  4601. m_list.list[m_list.num]=i;
  4602. m_list.num++;
  4603. }
  4604. }
  4605. if(m_list.num==0)
  4606. {
  4607. strcpy(m_WarningStr,"无遥信配置");
  4608. return M_JUMP3;
  4609. }
  4610. m_list.m_current=0;
  4611. mmd_initDataMenu(&g_tDataMenu1,m_list.num,mmd_RenewFtuYX,mmd_GetFtuYxValue,22,1);
  4612. return M_JUMP0;
  4613. }
  4614. static void mmd_GetGooseValue(int i,DATA_FIELD_DEF *pF)
  4615. {
  4616. char *pd=pF->FmtStr;
  4617. char tmpstr[16];
  4618. sprintf(tmpstr,"%d",tFAg.inval[i]);
  4619. sprintf(pd,"%-16.16s %s",g_goose_recv_tbl[i].name,tmpstr);
  4620. }
  4621. int mmd_RenewGoose(void)
  4622. {
  4623. mmd_RenewDataMenu(&g_tDataMenu1);
  4624. return M_OK;
  4625. }
  4626. int mmd_GetGoose(int value)
  4627. {
  4628. mmd_initDataMenu(&g_tDataMenu1,GOOSE_RECV_TBL_NUMBER,mmd_RenewGoose,mmd_GetGooseValue,23,1);
  4629. return M_JUMP0;
  4630. }
  4631. static void mmd_GetFaStatusValue(int i,DATA_FIELD_DEF *pF)
  4632. {
  4633. sprintf(pF->FmtStr,"%-20.20s",strGprsInf[i]);
  4634. }
  4635. void mmd_RefreshFAStatus(void)
  4636. {
  4637. int num=0;
  4638. sprintf(strGprsInf[num++],"电流型 : %s",m_Ledbh);
  4639. sprintf(strGprsInf[num++],"集中式 : %s",m_Ledjzs);
  4640. sprintf(strGprsInf[num++],"重合闸充电: %s",m_Bh_chr);
  4641. sprintf(strGprsInf[num++],"电压电流型: %s",m_Ledfa);
  4642. sprintf(strGprsInf[num++],"联络/分段 : %s",m_Fa_sl);
  4643. sprintf(strGprsInf[num++],"联络充电 : %s",m_Fa_chr);
  4644. sprintf(strGprsInf[num++],"智能分布式: %s",m_Ledgoose);
  4645. sprintf(strGprsInf[num++],"分布式充电: %s",m_Goose_chr);
  4646. g_gprs_info_num=num;
  4647. }
  4648. int mmd_RenewFAStatus(void)
  4649. {
  4650. mmd_RefreshFAStatus();
  4651. mmd_RenewDataMenu(&g_tDataMenu1);
  4652. return M_OK;
  4653. }
  4654. int mmd_GetFaStatus(int value)
  4655. {
  4656. mmd_RefreshFAStatus();
  4657. mmd_initDataMenu(&g_tDataMenu1,g_gprs_info_num,mmd_RenewFAStatus,mmd_GetFaStatusValue,8,1);
  4658. return M_OK;
  4659. }
  4660. /////////////////////////////////////////////////////////////////////////////////////////////////////
  4661. //GD_AREA_ECZD_2020
  4662. static void mmd_GetFunmodSetValue(int i,DATA_FIELD_DEF *pF)
  4663. {
  4664. sprintf(pF->FmtStr,"%-20.20s",strGprsInf[i]);
  4665. }
  4666. void mmd_RefreshFunmodSet(void)
  4667. {
  4668. int num=0;
  4669. #if (!defined (GD_AREA_ZHONGSHAN_2020)) && (!defined (GD_AREA_ECZD_2020))
  4670. mmd_RefreshFAStatus();
  4671. return;
  4672. #endif
  4673. #ifdef GD_AREA_ZHONGSHAN_2020
  4674. sprintf(strGprsInf[num++],"控制开入");
  4675. #else
  4676. sprintf(strGprsInf[num++],"控制字");
  4677. #endif
  4678. sprintf(strGprsInf[num++]," 保护/FA: %s",m_Mode_chr);
  4679. sprintf(strGprsInf[num++]," 同期合闸: %s",m_Tqhz_chr);
  4680. sprintf(strGprsInf[num++]," 自动解列: %s",m_Zdjl_chr);
  4681. sprintf(strGprsInf[num++]," 停用: %s",m_StopFun_chr);
  4682. sprintf(strGprsInf[num++],"软压板");
  4683. #ifdef GD_AREA_ZHONGSHAN_2020
  4684. sprintf(strGprsInf[num++]," 远方修改功能: %s",m_Yftr_chr);
  4685. #else
  4686. sprintf(strGprsInf[num++]," 远方投入: %s",m_Yftr_chr);
  4687. #endif
  4688. g_gprs_info_num=num;
  4689. }
  4690. int mmd_RenewFunmodSet(void)
  4691. {
  4692. mmd_RefreshFunmodSet();
  4693. mmd_RenewDataMenu(&g_tDataMenu1);
  4694. return M_OK;
  4695. }
  4696. int mmd_GetFunmodSet(int value)
  4697. {
  4698. mmd_RefreshFunmodSet();
  4699. mmd_initDataMenu(&g_tDataMenu1,g_gprs_info_num,mmd_RenewFunmodSet,mmd_GetFunmodSetValue,28,1);
  4700. return M_OK;
  4701. }
  4702. /////////////////////////////////////////////////////////////////////////////////////////////////////
  4703. int mmd_GetFtuIfo(int value)
  4704. {
  4705. return M_OK;
  4706. }
  4707. int mmd_TestDiDo(int value)
  4708. {
  4709. return M_OK;
  4710. }
  4711. /**************************************************************************
  4712. 函数名称:mmd_GetSectionInf
  4713. 函数版本:1.00
  4714. 作者:
  4715. 创建日期:2008.10.21
  4716. 函数功能说明:获取有效定值区
  4717. 输入参数:
  4718. 输出参数:
  4719. 返回值:
  4720. 更新信息:
  4721. 更新日志1:
  4722. 日期:
  4723. 修改者: sunxi
  4724. 修改内容:
  4725. 修改原因:
  4726. ***************************************************************************/
  4727. int mmd_GetSectionInf(int value)
  4728. {
  4729. int i,j;
  4730. DATA_MENU_DEF *pt=&g_tDataMenu1;
  4731. char *pd;
  4732. char tmpstr[4];
  4733. pd=g_tDataMenu1.tDataFields[0].FmtStr;
  4734. strcpy(pd,"有效定值区: ");
  4735. for(i=0,j=0;i<SEC_NUMBER;i++)
  4736. {
  4737. if(tSecInfo.szSections[i]==0x55)
  4738. {
  4739. sprintf(tmpstr,"%02u ",i);
  4740. strcat(pd,tmpstr);
  4741. if(strlen(pd)>=15)
  4742. {
  4743. j++;
  4744. pd=g_tDataMenu1.tDataFields[j].FmtStr;
  4745. strcpy(pd," ");
  4746. }
  4747. }
  4748. }
  4749. if(strlen(pd)>0)j++;
  4750. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  4751. pt->sTotalNum=j; // 将菜单总数置于小于菜单数,保证不清屏
  4752. pt->GetPrevFuncAddr=NULL; //44
  4753. pt->GetNextFuncAddr=NULL; //44
  4754. return M_JUMP0;
  4755. }
  4756. /*系统时间显示*/
  4757. TIME_SHOW m_ShowTime;
  4758. TIME_SHOW m_SetTime;
  4759. int mmd_GetSetTime(int value)
  4760. {
  4761. struct timespec ts;
  4762. struct rtc_time_t rtc;
  4763. clk_time_get(&ts);
  4764. timespec_to_rtc(ts,&rtc,1);
  4765. m_SetTime.year=rtc.year;
  4766. m_SetTime.month=rtc.month;
  4767. m_SetTime.day=rtc.day;
  4768. m_SetTime.hour=rtc.hour;
  4769. m_SetTime.min=rtc.min;
  4770. m_SetTime.sec=rtc.ms/1000;
  4771. return M_OK;
  4772. }
  4773. /**************************************************************************
  4774. 函数名称:mmd_SetTime
  4775. 函数版本:1.00
  4776. 作者:
  4777. 创建日期:2008.10.21
  4778. 函数功能说明:校验并设置系统时间
  4779. 输入参数:
  4780. 输出参数:
  4781. 返回值:
  4782. 更新信息:
  4783. 更新日志1:
  4784. 日期:
  4785. 修改者: sunxi
  4786. 修改内容:
  4787. 修改原因:
  4788. ***************************************************************************/
  4789. int mmd_SetTime(int value)
  4790. {
  4791. TIME mt;
  4792. if(m_SetTime.year>99)
  4793. {
  4794. strcpy(m_WarningStr,"年设置错误");
  4795. return M_JUMP3;
  4796. }
  4797. if(m_SetTime.month>12||m_SetTime.month<1)
  4798. {
  4799. strcpy(m_WarningStr,"月设置错误");
  4800. return M_JUMP3;
  4801. }
  4802. if(m_SetTime.day>31||m_SetTime.day<1)
  4803. {
  4804. strcpy(m_WarningStr,"日设置错误");
  4805. return M_JUMP3;
  4806. }
  4807. if(m_SetTime.hour>23)
  4808. {
  4809. strcpy(m_WarningStr,"时设置错误");
  4810. return M_JUMP3;
  4811. }
  4812. if(m_SetTime.min>59)
  4813. {
  4814. strcpy(m_WarningStr,"分设置错误");
  4815. return M_JUMP3;
  4816. }
  4817. if(m_SetTime.sec>59)
  4818. {
  4819. strcpy(m_WarningStr,"秒设置错误");
  4820. return M_JUMP3;
  4821. }
  4822. if(m_SetTime.month==2) // 2月特殊处理
  4823. {
  4824. WORD year=m_SetTime.year+2000;
  4825. if(year%4==0) //闰年
  4826. {
  4827. if(m_SetTime.day>29)
  4828. {
  4829. strcpy(m_WarningStr,"日设置错误");
  4830. return M_JUMP3;
  4831. }
  4832. }
  4833. else
  4834. {
  4835. if(m_SetTime.day>28)
  4836. {
  4837. strcpy(m_WarningStr,"日设置错误");
  4838. return M_JUMP3;
  4839. }
  4840. }
  4841. }
  4842. mt.year=m_SetTime.year;
  4843. mt.month=m_SetTime.month;
  4844. mt.day=m_SetTime.day;
  4845. mt.hour=m_SetTime.hour;
  4846. mt.min=m_SetTime.min;
  4847. mt.ms=(WORD)m_SetTime.sec*1000;
  4848. if(sys_time_set(&mt) == 0)
  4849. {
  4850. strcpy(m_WarningStr,"时间设置成功");
  4851. }
  4852. else
  4853. {
  4854. strcpy(m_WarningStr,"读RTC失败");
  4855. }
  4856. return M_JUMP3;
  4857. }
  4858. /**************************************************************************
  4859. 函数名称:mmd_ChangeSection
  4860. 函数版本:1.00
  4861. 作者:
  4862. 创建日期:2008.9.1
  4863. 函数功能说明:切换定值区
  4864. 输入参数:
  4865. 输出参数:
  4866. 返回值:
  4867. 更新信息:
  4868. 更新日志1:
  4869. 日期:
  4870. 修改者:
  4871. 修改内容:
  4872. 修改原因:
  4873. ***************************************************************************/
  4874. #if 0
  4875. static int mmd_ChangeSection(int value)
  4876. {
  4877. bool ret=false;
  4878. UINT section=m_ValidSection;
  4879. TSECTIONINFO tSec;
  4880. if((short)section>=0&&section<SEC_NUMBER)
  4881. {
  4882. MakeRunSet(false); // 将当前运行定值区转换为运行定值区
  4883. tSec=tSecInfo;
  4884. tSec.sCurSec=section;
  4885. if(SaveSection(&tSec))
  4886. {
  4887. soe_record_opt(EV_SECQH_OK,section);
  4888. tSecInfo=tSec;
  4889. ret=true;
  4890. rt_err_clr(ERR_CODE_SET);
  4891. }
  4892. }
  4893. if(ret)
  4894. {
  4895. strcpy(m_WarningStr,"定值区切换成功");
  4896. }
  4897. else
  4898. {
  4899. strcpy(m_WarningStr,"定值区切换失败");
  4900. soe_record_opt(EV_SECQH_FAIL,section);
  4901. }
  4902. return M_JUMP3;
  4903. }
  4904. #endif
  4905. /**************************************************************************
  4906. 函数名称:mmd_ClearSOE
  4907. 函数版本:1.00
  4908. 作者:
  4909. 创建日期:2008.9.1
  4910. 函数功能说明:清除事件库
  4911. 输入参数:
  4912. 输出参数:
  4913. 返回值:
  4914. 更新信息:
  4915. 更新日志1:
  4916. 日期:
  4917. 修改者:
  4918. 修改内容:
  4919. 修改原因:
  4920. ***************************************************************************/
  4921. int mmd_ClearSOE(int value) /*清除事件库 */
  4922. {
  4923. #if defined GD_AREA_FOS || defined GD_AREA_FOS_2021 || defined FOS_2021//佛山要求不允许本地删除记录 2020-5-14《10kV柱上断路器自动化成套设备的技术交底(2020年)2020.05.11.doc》
  4924. strcpy(m_WarningStr,"本地禁止删除记录");
  4925. return M_JUMP3;
  4926. #else
  4927. soe_clear_ev(); // 清事件记录
  4928. soe_record_opt(EV_CLEAR_SOE,0);
  4929. strcpy(m_WarningStr,"事件库清除完毕");
  4930. return M_JUMP3;
  4931. #endif
  4932. }
  4933. /**************************************************************************
  4934. 函数名称:mmd_ClearOperateSOE
  4935. 函数版本:1.00
  4936. 作者:
  4937. 创建日期:2008.9.1
  4938. 函数功能说明:清除操作记录
  4939. 输入参数:
  4940. 输出参数:
  4941. 返回值:
  4942. 更新信息:
  4943. 更新日志1:
  4944. 日期:
  4945. 修改者:
  4946. 修改内容:
  4947. 修改原因:
  4948. ***************************************************************************/
  4949. int mmd_ClearOperateSOE(int value) /*清除操作记录 */
  4950. {
  4951. soe_clear_opt();
  4952. soe_record_opt(EV_CLEAR_OPE,0);
  4953. strcpy(m_WarningStr,"操作记录清除完毕");
  4954. return M_JUMP3;
  4955. }
  4956. /**************************************************************************
  4957. 函数名称:mmd_SavePassWord
  4958. 函数版本:1.00
  4959. 作者:
  4960. 创建日期:2008.9.1
  4961. 函数功能说明:保存密码
  4962. 输入参数:
  4963. 输出参数:
  4964. 返回值:
  4965. 更新信息:
  4966. 更新日志1:
  4967. 日期:
  4968. 修改者:
  4969. 修改内容:
  4970. 修改原因:
  4971. ***************************************************************************/
  4972. int mmd_SavePassWord(int value)
  4973. {
  4974. int i;
  4975. BYTE charnum=0;
  4976. for(i=0;i<PASSWORD_LEN;i++)
  4977. {
  4978. if(m_strPassword[i]>='0'&&m_strPassword[i]<='9') //数字
  4979. {
  4980. charnum|=(0<<i);
  4981. }
  4982. if(m_strPassword[i]>='A'&&m_strPassword[i]<='Z') //数字
  4983. {
  4984. charnum|=(1<<i);
  4985. }
  4986. }
  4987. #ifndef PASSWORD_4_STR
  4988. if(charnum==0||charnum==0xFF)
  4989. {
  4990. m_NewPassword=0;
  4991. m_Password=0;
  4992. mmi_zero_passwordstr();
  4993. strcpy(m_WarningStr,"输入一级密码非法");
  4994. return M_JUMP3;
  4995. }
  4996. #endif
  4997. charnum=0;
  4998. for(i=0;i<PASSWORD_LEN;i++)
  4999. {
  5000. if(m_strPassword2[i]>='0'&&m_strPassword2[i]<='9') //数字
  5001. {
  5002. charnum|=(0<<i);
  5003. }
  5004. if(m_strPassword2[i]>='A'&&m_strPassword2[i]<='Z') //数字
  5005. {
  5006. charnum|=(1<<i);
  5007. }
  5008. }
  5009. #ifndef PASSWORD_4_STR
  5010. if(charnum==0||charnum==0xFF)
  5011. {
  5012. m_NewPassword=0;
  5013. m_Password=0;
  5014. mmi_zero_passwordstr();
  5015. strcpy(m_WarningStr,"输入二级密码非法");
  5016. return M_JUMP3;
  5017. }
  5018. #endif
  5019. SavePassword(m_strPassword);
  5020. SavePassword2(m_strPassword2);
  5021. tRunPara.wPassword= ReadPassword();
  5022. strcpy(m_WarningStr,"密码修改成功");
  5023. m_Password=0;
  5024. m_NewPassword=0;
  5025. mmi_zero_passwordstr();
  5026. return M_JUMP3;
  5027. }
  5028. /*************开出测试************************/
  5029. static void mmd_GetBoardDoValue(int no,DATA_FIELD_DEF *pF)
  5030. {
  5031. //sprintf(pF->FmtStr,"%-15.15s",g_equ_config_do[no].name);
  5032. sprintf(pF->FmtStr,"%-20.20s",g_equ_config_do[no].name);
  5033. }
  5034. int mmd_RenewBoardDo(void)
  5035. {
  5036. mmd_RenewDataMenu(&g_tDataMenu1);
  5037. return M_OK;
  5038. }
  5039. int mmd_GetBoardDO(int value)
  5040. {
  5041. int i;
  5042. memset(&m_board,0,sizeof(m_board));
  5043. for(i=0; i<g_equ_config->equ_slot_num; i++)
  5044. {
  5045. int do_num = equ_get_do_num(i);
  5046. if(do_num>0)
  5047. {
  5048. m_board.list[m_board.num]=i;
  5049. m_board.list_num[m_board.num]=do_num;
  5050. m_board.num++;
  5051. }
  5052. }
  5053. if(m_board.num==0)
  5054. {
  5055. strcpy(m_WarningStr,"无开出板卡配置");
  5056. return M_JUMP3;
  5057. }
  5058. m_board.m_current=0;
  5059. g_sw_index=m_board.list[m_board.m_current];
  5060. mmd_initDataMenu(&g_tDataMenu1,m_board.list_num[m_board.m_current],mmd_RenewBoardDo,mmd_GetBoardDoValue,112,1);
  5061. return M_JUMP0;
  5062. }
  5063. int mmd_ChangeDoBoard(int key)
  5064. {
  5065. if(m_board.num==0)return M_OK;
  5066. if(key==HA_KEY_ADD) // 显示下一个开关
  5067. {
  5068. m_board.m_current++;
  5069. if(m_board.m_current>=m_board.num)
  5070. {
  5071. m_board.m_current=0;
  5072. }
  5073. g_sw_index=m_board.list[m_board.m_current];
  5074. mmd_initDataMenu(&g_tDataMenu1,m_board.list_num[m_board.m_current],mmd_RenewBoardDo,mmd_GetBoardDoValue,112,1);
  5075. return M_JUMP0;
  5076. }
  5077. if(key==HA_KEY_SUB) // 显示上一个开关
  5078. {
  5079. if(m_board.m_current>0)
  5080. {
  5081. m_board.m_current--;
  5082. }
  5083. else
  5084. {
  5085. m_board.m_current=m_board.num-1;
  5086. }
  5087. g_sw_index=m_board.list[m_board.m_current];
  5088. mmd_initDataMenu(&g_tDataMenu1,m_board.list_num[m_board.m_current],mmd_RenewBoardDo,mmd_GetBoardDoValue,112,1);
  5089. return M_JUMP0;
  5090. }
  5091. return M_OK;
  5092. }
  5093. /**************************************************************************
  5094. 函数名称:mmd_TestHz
  5095. 函数版本:1.00
  5096. 作者:
  5097. 创建日期:2008.9.23
  5098. 函数功能说明: 进行测试开出
  5099. 输入参数:
  5100. 输出参数:
  5101. 返回值:
  5102. 更新信息:
  5103. 更新日志1:
  5104. 日期:
  5105. 修改者:
  5106. 修改内容:
  5107. 修改原因:
  5108. ***************************************************************************/
  5109. int mmd_TestHz(int value)
  5110. {
  5111. sprintf(m_WarningStr,"开出测试完毕");
  5112. dido_do(m_board.list[m_board.m_current],(1<<value),1);
  5113. return M_JUMP3;
  5114. }
  5115. WORD g_RmtIndex;
  5116. static void mmd_GooseKcValue(int no,DATA_FIELD_DEF *pF)
  5117. {
  5118. sprintf(pF->FmtStr,"%s",g_goose_send_tbl[no].name);
  5119. }
  5120. int mmd_RenewGooseKc(void)
  5121. {
  5122. mmd_RenewDataMenu(&g_tDataMenu1);
  5123. return M_OK;
  5124. }
  5125. int mmd_GetGooseKc(int value)
  5126. {
  5127. mmd_initDataMenu(&g_tDataMenu1,GOOSE_SEND_TBL_NUMBER,mmd_RenewGooseKc,mmd_GooseKcValue,114,1);
  5128. return M_OK;
  5129. }
  5130. int mmd_GooseKcTest(int value)
  5131. {
  5132. if(g_RmtIndex==0)
  5133. {
  5134. tFAg.ug.bFlag.bTstgz=value;
  5135. }
  5136. else if(g_RmtIndex==1)
  5137. {
  5138. tFAg.ug.bFlag.bTstglok=value;
  5139. }
  5140. else if(g_RmtIndex==2)
  5141. {
  5142. tFAg.ug.bFlag.bTstjt=value;
  5143. }
  5144. else if(g_RmtIndex==3)
  5145. {
  5146. tFAg.ug.bFlag.bTstglbs=value;
  5147. }
  5148. else if(g_RmtIndex==4)
  5149. {
  5150. tFAg.ug.bFlag.bTstcomerr=value;
  5151. }
  5152. return M_OK;
  5153. }
  5154. /******主循环界面******/
  5155. /**************************************************************************
  5156. 函数名称:mmd_RenewMain
  5157. 函数版本:1.00
  5158. 作者:
  5159. 创建日期:2008.10.8
  5160. 函数功能说明:刷新主循环界面
  5161. 输入参数:
  5162. 输出参数:
  5163. 返回值:
  5164. 更新信息:
  5165. 更新日志1:
  5166. 日期:
  5167. 修改者:
  5168. 修改内容:
  5169. 修改原因:
  5170. ***************************************************************************/
  5171. DWORD m_MainNoTime; // 主循环界面时间
  5172. int mmd_RenewMain(void)
  5173. {
  5174. if((dTCounter-m_MainNoTime)>8*SAM_FREQUENCY) // 8秒钟界面翻一屏
  5175. {
  5176. DATA_MENU_DEF *pt=&g_tDataMenu1;
  5177. if(pt->sTotalNum<=pt->sScreenNum)return M_OK;
  5178. if((pt->sFocusIndex/pt->sScreenNum)*pt->sScreenNum+pt->sScreenNum>=pt->sTotalNum)
  5179. {
  5180. pt->sFocusIndex=0;
  5181. }
  5182. else
  5183. {
  5184. pt->sFocusIndex=(pt->sFocusIndex/pt->sScreenNum)*pt->sScreenNum+pt->sScreenNum;
  5185. }
  5186. Add_Clear_Screen();
  5187. m_MainNoTime=dTCounter;
  5188. }
  5189. mmd_RenewDataMenu(&g_tDataMenu1);
  5190. return M_OK;
  5191. }
  5192. /**************************************************************************
  5193. 函数名称:mmd_KeyMain
  5194. 函数版本:1.00
  5195. 作者:
  5196. 创建日期:2008.10.8
  5197. 函数功能说明:判断是否有按键,有按键,将主循环界面时间清为当前值
  5198. 输入参数:
  5199. 输出参数:
  5200. 返回值:
  5201. 更新信息:
  5202. 更新日志1:
  5203. 日期:
  5204. 修改者:
  5205. 修改内容:
  5206. 修改原因:
  5207. ***************************************************************************/
  5208. int mmd_KeyMain(int key)
  5209. {
  5210. m_MainNoTime=dTCounter;
  5211. return M_OK;
  5212. }
  5213. /**************************************************************************
  5214. 函数名称:mmd_EnterMainMenu
  5215. 函数版本:1.00
  5216. 作者:
  5217. 创建日期:2008.10.8
  5218. 函数功能说明:进入主循环界面,并初始化测量值的显示
  5219. 输入参数:
  5220. 输出参数:
  5221. 返回值:
  5222. 更新信息:
  5223. 更新日志1:
  5224. 日期:
  5225. 修改者:
  5226. 修改内容:
  5227. 修改原因:
  5228. ***************************************************************************/
  5229. int mmd_EnterMainMenu(int key)
  5230. {
  5231. if(key==HA_KEY_ENTER)
  5232. {
  5233. #if 0
  5234. #if SWITCH_NUM_MAX==1
  5235. #ifdef GD_AREA_ECZD_2020
  5236. return M_JUMP3;
  5237. #else
  5238. return M_JUMP2;
  5239. #endif
  5240. #else
  5241. return M_JUMP2;
  5242. #endif
  5243. #else
  5244. return M_JUMP3; //全部显示功能模块配置 jack.liu 20201105
  5245. #endif
  5246. }
  5247. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  5248. {
  5249. #if SWITCH_NUM_MAX==1
  5250. mmd_GetFtuMea(0);
  5251. #endif
  5252. if(g_tLcdComm.tImage.pBuf==NULL)
  5253. {
  5254. return M_JUMP0;
  5255. }
  5256. else
  5257. {
  5258. return M_JUMP1;
  5259. }
  5260. }
  5261. return M_ERROR;
  5262. }
  5263. int mmd_BoardLedTest(int value)
  5264. {
  5265. if(value==1) // 辅助板
  5266. {
  5267. g_led_aux_test_st=(g_led_aux_test_st>0)?0:1;
  5268. g_led_kz_test_st=0;
  5269. }
  5270. else if(value==2) //状态板
  5271. {
  5272. g_led_kz_test_st=(g_led_kz_test_st>0)?0:1;
  5273. g_led_aux_test_st=0;
  5274. }
  5275. else if(value==0) //液晶板
  5276. {
  5277. add_led_test(TEST_LCD);
  5278. g_led_aux_test_st=0;
  5279. g_led_kz_test_st=0;
  5280. }
  5281. return M_OK;
  5282. }
  5283. /*内部定值处理*/
  5284. /**************************************************************************
  5285. 函数名称:mmd_RenewCstSet
  5286. 函数版本:1.00
  5287. 作者:
  5288. 创建日期:2008.9.1
  5289. 函数功能说明:更新内部定值显示
  5290. 输入参数:
  5291. 输出参数:
  5292. 返回值:
  5293. 更新信息:
  5294. 更新日志1:
  5295. 日期:
  5296. 修改者:
  5297. 修改内容:
  5298. 修改原因:
  5299. ***************************************************************************/
  5300. int mmd_RenewCstSet(void)
  5301. {
  5302. DATA_MENU_DEF *pt=&g_tDataMenu1;
  5303. DATA_MENU_DEF *pext=&g_tExtraMenu;
  5304. int i;
  5305. int bgn;
  5306. bgn=g_set_disp.bgn[pt->sFocusIndex];
  5307. pext->sTotalNum=0; //总的动态菜单数
  5308. for(i=0;i<g_set_disp.screennum[pt->sFocusIndex];i++)
  5309. {
  5310. mmd_GetSet(bgn+i,&g_tDataMenu1.tDataFields[i],&tCstSetTable[0],m_SetBuf);
  5311. }
  5312. pt->sScreenNum=g_set_disp.screennum[pt->sFocusIndex];
  5313. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  5314. pext->sScreenNum=pext->sTotalNum;
  5315. return M_OK;
  5316. }
  5317. int mmd_RenewCstSetGroup(void)
  5318. {
  5319. mmd_RenewDataMenu(&g_tDataMenu2);
  5320. return M_OK;
  5321. }
  5322. int mmd_backCstSet(int value)
  5323. {
  5324. mmd_InitCstSetGroup(-1);
  5325. g_tDataMenu2.sFocusIndex=SetGroupIndex;
  5326. mmi_FormsInit(182,1); // 更新最后修改的数据
  5327. mmd_RenewCstSetGroup();
  5328. return M_OK;
  5329. }
  5330. int mmd_InitCstSetGroup(int value)
  5331. {
  5332. int i,num=0;
  5333. bool bret;
  5334. bret=ReadEppData(EEP_SETGROUP_ADDR,m_setgroup,GROUP_NUM);
  5335. if(!bret)
  5336. {
  5337. GetDefSetGroup(m_setgroup);
  5338. }
  5339. for(i=0;i<GROUP_NUM;i++)
  5340. {
  5341. if(SetGroups[i].group == SETGROUP_TYPE_CSTSET&&(m_setgroup[i]>0))
  5342. {
  5343. int j;
  5344. for(j=0;j<CSTSET_NUMBER;j++)
  5345. {
  5346. if(tCstSetTable[j].group==i)
  5347. {
  5348. set_show_group[num++]=i;
  5349. break;
  5350. }
  5351. }
  5352. }
  5353. }
  5354. if(num==0)
  5355. {
  5356. strcpy(m_WarningStr,"内部定值未配置");
  5357. return M_JUMP2;
  5358. }
  5359. mmd_initDataMenu(&g_tDataMenu2,num,mmd_RenewCstSetGroup,mmd_GetSetGroupName,182,1);
  5360. if(!ReadPara((void*)m_SetBuf,EEP_CSTSET_ADDR,CSTSET_NUMBER,&tCstSetTable[0]))
  5361. {
  5362. if(value==-1)
  5363. {
  5364. GetDefPara((float*)m_SetBuf,CSTSET_NUMBER,&tCstSetTable[0]);
  5365. }
  5366. else
  5367. {
  5368. return M_JUMP3;
  5369. }
  5370. }
  5371. mmd_ChangeSet(&tCstSetTable[0],CSTSET_NUMBER,m_SetBuf);
  5372. return M_JUMP0;
  5373. }
  5374. int mmd_SaveCstSet(int value)
  5375. {
  5376. mmd_ReChangeSet(&tCstSetTable[0],CSTSET_NUMBER,m_SetBuf);
  5377. if(!mmd_CheckSet(&tCstSetTable[0],CSTSET_NUMBER,m_SetBuf))
  5378. {
  5379. mmd_ChangeSet(&tCstSetTable[0],CSTSET_NUMBER,m_SetBuf);
  5380. return M_JUMP3;
  5381. }
  5382. if(SavePara((void *)m_SetBuf,EEP_CSTSET_ADDR,CSTSET_NUMBER,&tCstSetTable[0]))
  5383. {
  5384. strcpy(m_WarningStr,"定值保存成功");
  5385. soe_record_opt(EV_CSTSET_OK,0); // 内部定值整定成功
  5386. MakeRunSet(false); // 将当前运行定值区转换为运行定值区
  5387. rt_err_clr(ERR_CODE_SET_IN,0);
  5388. }
  5389. else
  5390. {
  5391. strcpy(m_WarningStr,"定值保存失败");
  5392. soe_record_opt(EV_CSTSET_FAIL,0); // 内部定值整定成功
  5393. }
  5394. return M_JUMP0;
  5395. }
  5396. /**************************************************************************
  5397. 函数名称:mmd_InitSetSolid
  5398. 函数版本:1.00
  5399. 作者:
  5400. 创建日期:2008.9.1
  5401. 函数功能说明:初始化定值整定的显示
  5402. 输入参数:
  5403. 输出参数:
  5404. 返回值:
  5405. 更新信息:
  5406. 更新日志1:
  5407. 日期:
  5408. 修改者:
  5409. 修改内容:
  5410. 修改原因:
  5411. ***************************************************************************/
  5412. int mmd_InitCstSet(int value)
  5413. {
  5414. int num=CSTSET_NUMBER;
  5415. int screennum;
  5416. int i;
  5417. m_AllSection=0;
  5418. g_set_disp.num=0;
  5419. num=mmd_GetshowSetNum(&tCstSetTable[0],CSTSET_NUMBER,set_show_group[value]);
  5420. SetGroupIndex=value;
  5421. screennum=mmi_GetScreenNum(183,1); // 取当前屏幕最大显示数目
  5422. bSetChange=true;
  5423. mmd_analyse(&tCstSetTable[0],screennum);
  5424. {
  5425. DATA_MENU_DEF *pt=&g_tDataMenu1;
  5426. DATA_MENU_DEF *pext=&g_tExtraMenu;
  5427. pext->sTotalNum=0;
  5428. for(i=0;i<g_set_disp.screennum[0];i++)
  5429. {
  5430. mmd_GetSet(i,&g_tDataMenu1.tDataFields[i],&tCstSetTable[0],m_SetBuf);
  5431. }
  5432. m_ScreenNum=num;
  5433. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  5434. pt->sTotalNum=num; //总的动态菜单数
  5435. pt->sScreenNum=g_set_disp.screennum[0];
  5436. pt->GetPrevFuncAddr=mmd_RenewCstSet; //44
  5437. pt->GetNextFuncAddr=mmd_RenewCstSet; //44
  5438. pext->sFocusIndex=0; //第一个显示的动态菜单的索引
  5439. pext->sScreenNum=pext->sTotalNum;
  5440. pext->GetPrevFuncAddr=NULL; //44
  5441. pext->GetNextFuncAddr=NULL; //44
  5442. m_CurrentScreen=1;
  5443. }
  5444. return M_JUMP0;
  5445. }
  5446. /**************************************************************************
  5447. 函数名称:mmd_SetKey
  5448. 函数版本:1.00
  5449. 作者:
  5450. 创建日期:2008.9.1
  5451. 函数功能说明:列表项选择
  5452. 输入参数:
  5453. 输出参数:
  5454. 返回值:
  5455. 更新信息:
  5456. 更新日志1:
  5457. 日期:
  5458. 修改者:
  5459. 修改内容:
  5460. 修改原因:
  5461. ***************************************************************************/
  5462. int mmd_SetCstKey(int key)
  5463. {
  5464. if(key==HA_KEY_UP&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_ADD;
  5465. if(key==HA_KEY_DOWN&&g_tScreen.lcd_type!=LCD_TYPE_160_KEY9)key=HA_KEY_SUB;
  5466. if(key==HA_KEY_ADD||key==HA_KEY_SUB) // +键增加列表
  5467. {
  5468. if(!g_bModify) return M_ERROR; // 只在修改状态下执行此函数
  5469. if(mmd_ChangeList(&tCstSetTable[0],key,m_SetBuf))
  5470. {
  5471. mmd_RenewCstSet(); //刷新修改后的值
  5472. return M_OK;
  5473. }
  5474. }
  5475. return M_ERROR;
  5476. }
  5477. /*下面是精度自校及手校处理*/
  5478. /**************************************************************************
  5479. 函数名称:mmd_SaveAdjustValue
  5480. 函数版本:1.00
  5481. 作者:
  5482. 创建日期:2008.9.1
  5483. 函数功能说明:保存精度手校系数
  5484. 输入参数:
  5485. 输出参数:
  5486. 返回值:
  5487. 更新信息:
  5488. 更新日志1:
  5489. 日期:
  5490. 修改者:
  5491. 修改内容:
  5492. 修改原因:
  5493. ***************************************************************************/
  5494. int mmd_SaveAdjustValue(int value)
  5495. {
  5496. // TODO:增加恢复默认系数操作
  5497. factor_restore_default();
  5498. strcpy(m_WarningStr,"通道系数恢复为默认值");
  5499. log_str_time(LOG_OPERATE,"面板恢复默认校准系数",0,0);
  5500. return M_JUMP0;
  5501. }
  5502. /**************************************************************************
  5503. 函数名称:mmd_StartAutojust
  5504. 函数版本:1.00
  5505. 作者:
  5506. 创建日期:2008.9.1
  5507. 函数功能说明:启动精度自校
  5508. 输入参数:
  5509. 输出参数:
  5510. 返回值:
  5511. 更新信息:
  5512. 更新日志1:
  5513. 日期:
  5514. 修改者:
  5515. 修改内容:
  5516. 修改原因:
  5517. ***************************************************************************/
  5518. int mmd_StartAutojust(int value)
  5519. {
  5520. int ret;
  5521. ret = sw_auto_adjust(-1);
  5522. switch(ret)
  5523. {
  5524. case 0:
  5525. strcpy(m_WarningStr,"通道校正成功!");
  5526. break;
  5527. case -1:
  5528. strcpy(m_WarningStr,"输入校正值太大");
  5529. break;
  5530. case -2:
  5531. strcpy(m_WarningStr,"通道系数超范围");
  5532. break;
  5533. case -3:
  5534. strcpy(m_WarningStr,"输入角度值太小");
  5535. break;
  5536. case -4:
  5537. strcpy(m_WarningStr,"输入角度值太大");
  5538. break;
  5539. case -5:
  5540. strcpy(m_WarningStr,"角度系数超范围");
  5541. break;
  5542. case -6:
  5543. strcpy(m_WarningStr,"系数保存错误");
  5544. break;
  5545. default:
  5546. strcpy(m_WarningStr,"未知错误");
  5547. break;
  5548. }
  5549. return M_JUMP3;
  5550. }
  5551. int mmd_StartZljust1(int value)
  5552. {
  5553. int ret;
  5554. // equ_power_adjust();
  5555. ret = sw_adjust_dc_0();
  5556. switch(ret)
  5557. {
  5558. case 0:
  5559. sprintf(m_WarningStr,"直流%fV校正成功!",dc_adjust[0]);
  5560. break;
  5561. case -1:
  5562. sprintf(m_WarningStr,"输入直流%0.1fV值太小",dc_adjust[0]);
  5563. break;
  5564. case -2:
  5565. sprintf(m_WarningStr,"输入直流%0.1fV值太大",dc_adjust[0]);
  5566. break;
  5567. default:
  5568. break;
  5569. }
  5570. if(ret==0)
  5571. {
  5572. return M_JUMP0;
  5573. }
  5574. else
  5575. {
  5576. return M_JUMP3;
  5577. }
  5578. }
  5579. int mmd_StartZljust2(int value)
  5580. {
  5581. int ret;
  5582. ret = sw_adjust_dc_1();
  5583. switch(ret)
  5584. {
  5585. case 0:
  5586. sprintf(m_WarningStr,"直流校正成功!");
  5587. break;
  5588. case -1:
  5589. sprintf(m_WarningStr,"输入直流%0.1fV值太小",dc_adjust[1]);
  5590. break;
  5591. case -2:
  5592. sprintf(m_WarningStr,"输入直流%0.1f值太大",dc_adjust[1]);
  5593. break;
  5594. default:
  5595. break;
  5596. }
  5597. return M_JUMP3;
  5598. }
  5599. int mmd_StartPowerAjust(int value)
  5600. {
  5601. int ret=0;
  5602. //ret = equ_power_adjust();
  5603. switch(ret)
  5604. {
  5605. case 0:
  5606. sprintf(m_WarningStr,"电源电压校正成功!");
  5607. break;
  5608. case -1:
  5609. sprintf(m_WarningStr,"电源电压值超范围");
  5610. break;
  5611. case -2:
  5612. sprintf(m_WarningStr,"系数保存错误");
  5613. break;
  5614. default:
  5615. break;
  5616. }
  5617. return M_JUMP3;
  5618. }
  5619. void GetBoardName(BYTE type,char *name)
  5620. {
  5621. extern struct board_res_head *g_board_res_head;
  5622. struct board_res *br;
  5623. int i;
  5624. br = g_board_res;
  5625. for(i=0; i<g_board_res_head->br_num; i++)
  5626. {
  5627. if(br[i].type==type)
  5628. {
  5629. strcpy(name,br[i].name);
  5630. return ;
  5631. }
  5632. }
  5633. strcpy(name,"未知");
  5634. }
  5635. void mmd_GetInfValue(int no,DATA_FIELD_DEF *pF)
  5636. {
  5637. struct board_res *br;
  5638. struct board_info *bi;
  5639. char bName[24];
  5640. int i=no;
  5641. br = g_board_res;
  5642. bi = g_board_info;
  5643. GetBoardName(bi[i].type,bName);
  5644. #if LCD_SIZE==128
  5645. sprintf(pF->FmtStr,"%-4.4s %04X %01X%02X%02x",bName,bi[i].crc,(BYTE)(bi[i].version>>16),(BYTE)(bi[i].version>>8),(BYTE)(bi[i].version>>0));
  5646. #else
  5647. sprintf(pF->FmtStr,"板卡%d %04X %01X.%02X.%02x",
  5648. i,bi[i].crc,(BYTE)(bi[i].version>>16),(BYTE)(bi[i].version>>8),(BYTE)(bi[i].version>>0));
  5649. #endif
  5650. }
  5651. int mmd_RenewInf(void)
  5652. {
  5653. mmd_RenewDataMenu(&g_tDataMenu1);
  5654. return M_OK;
  5655. }
  5656. /**************************************************************************
  5657. 函数名称:mmd_GetInf
  5658. 函数版本:1.00
  5659. 作者:
  5660. 创建日期:2008.9.1
  5661. 函数功能说明:取得装置信息
  5662. 输入参数:
  5663. 输出参数:
  5664. 返回值:
  5665. 更新信息:
  5666. 更新日志1:
  5667. 日期:
  5668. 修改者:
  5669. 修改内容:
  5670. 修改原因:
  5671. ***************************************************************************/
  5672. int mmd_GetInf(int value)
  5673. {
  5674. char tmpbuf[64];
  5675. if(set_get_fixed_arg(FIXED_SET_TPE,tmpbuf, 32)==0)
  5676. {
  5677. strncpy(m_equipstr,tmpbuf,20);
  5678. }
  5679. else
  5680. {
  5681. strcpy(m_equipstr,"FYD830");
  5682. }
  5683. if(set_get_fixed_arg(FIXED_SET_CRC,tmpbuf, 32)==0)
  5684. {
  5685. sprintf(m_errInf,"%sH",tmpbuf);//strncpy(m_errInf,tmpbuf,20);
  5686. }
  5687. else
  5688. {
  5689. sprintf(m_errInf,"%04XH",g_board_info[0].crc);
  5690. }
  5691. //sprintf(m_errInf,"%sH",CODE_CRC);
  5692. if(set_get_fixed_arg(FIXED_SET_SVR,tmpbuf, 32)==0)
  5693. strncpy(m_set_inf,tmpbuf,20);
  5694. else
  5695. sprintf(m_set_inf,"SV%02d.%03d",g_board_info[0].version/1000,g_board_info[0].version%1000);
  5696. //sprintf(m_set_inf,"%01X.%02X.%02x",(BYTE)(g_board_info[0].version>>16),(BYTE)(g_board_info[0].version>>8),(BYTE)(g_board_info[0].version>>0));
  5697. if(set_get_fixed_arg(FIXED_SET_CPT,tmpbuf, 32)==0)
  5698. {
  5699. strcpy(m_WarningStr,tmpbuf);
  5700. }
  5701. else
  5702. {
  5703. strcpy(m_WarningStr,VER_TIME);
  5704. }
  5705. return M_OK;
  5706. }
  5707. BYTE strGprsInf[30][24];
  5708. int g_gprs_info_num;
  5709. static void mmd_GetConfigInfValue(int no,DATA_FIELD_DEF *pF)
  5710. {
  5711. int i;
  5712. int errno=0;
  5713. for(i=0;i<ERR_CODE_NUM;i++)
  5714. {
  5715. if(rt_err_test(i)>0)
  5716. {
  5717. errno++;
  5718. if((no+1)==errno)
  5719. {
  5720. break;
  5721. }
  5722. }
  5723. }
  5724. if(i==ERR_CODE_NUM)
  5725. {
  5726. sprintf(pF->FmtStr,"无错误信息,代码:%d",no);
  5727. }
  5728. else
  5729. {
  5730. if(g_tScreen.lcd_type!=LCD_TYPE_160160)
  5731. {
  5732. sprintf(pF->FmtStr,"%-16.16s",rt_err_msg(i));
  5733. }
  5734. else
  5735. {
  5736. sprintf(pF->FmtStr,"%02d.%-17.17s",no+1,rt_err_msg(i));
  5737. }
  5738. }
  5739. }
  5740. int mmd_RenewConfigInf(void)
  5741. {
  5742. mmd_RenewDataMenu(&g_tDataMenu1);
  5743. return M_OK;
  5744. }
  5745. /**************************************************************************
  5746. 函数名称:mmd_GetInf
  5747. 函数版本:1.00
  5748. 作者:
  5749. 创建日期:2008.9.1
  5750. 函数功能说明:取得装置信息
  5751. 输入参数:
  5752. 输出参数:
  5753. 返回值:
  5754. 更新信息:
  5755. 更新日志1:
  5756. 日期:
  5757. 修改者:
  5758. 修改内容:
  5759. 修改原因:
  5760. ***************************************************************************/
  5761. int mmd_GetConfigInf(int value)
  5762. {
  5763. int i;
  5764. int err_cnt=0;
  5765. for(i=0;i<ERR_CODE_NUM;i++)
  5766. {
  5767. if(rt_err_test(i)>0)
  5768. {
  5769. err_cnt++;
  5770. }
  5771. }
  5772. if(err_cnt==0)
  5773. {
  5774. strcpy(m_WarningStr,"无故障信息!");
  5775. return M_JUMP3;
  5776. }
  5777. mmd_initDataMenu(&g_tDataMenu1,err_cnt,mmd_RenewConfigInf,mmd_GetConfigInfValue,7,1);
  5778. return M_JUMP0;
  5779. }
  5780. static void mmd_GetExtInfValue(int no,DATA_FIELD_DEF *pF)
  5781. {
  5782. #if LCD_SIZE==128
  5783. sprintf(pF->FmtStr,"%-16.16s",strGprsInf[no]);
  5784. #else
  5785. sprintf(pF->FmtStr,"%-20.20s",strGprsInf[no]);
  5786. #endif
  5787. }
  5788. int mmd_RenewExtInf(void)
  5789. {
  5790. mmd_RenewDataMenu(&g_tDataMenu1);
  5791. return M_OK;
  5792. }
  5793. int mmd_GetDebugInf(int value)
  5794. {
  5795. int num=0;
  5796. int debug_port;
  5797. char * acteth;
  5798. #ifdef FUN_JDXX
  5799. u32 version_jdxx;
  5800. version_jdxx = FUN_JDXX_VERSION;
  5801. #endif
  5802. acteth = env_get_info(ENV_ETHACT);
  5803. debug_port = 0;
  5804. #if LCD_SIZE==128
  5805. sprintf(strGprsInf[num++],"调试串口:%d",g_con_uart_index);
  5806. sprintf(strGprsInf[num++],"波特率:115200");
  5807. sprintf(strGprsInf[num++],"校验位:无校验");
  5808. sprintf(strGprsInf[num++],"调试网口:%d",debug_port+1);
  5809. sprintf(strGprsInf[num++],"IP地址:",env_get_info(ENV_IPADDR));
  5810. sprintf(strGprsInf[num++],"%s",env_get_info(ENV_IPADDR));
  5811. sprintf(strGprsInf[num++],"子网掩码:",env_get_info(ENV_NETMASK));
  5812. sprintf(strGprsInf[num++],"%s",env_get_info(ENV_NETMASK));
  5813. sprintf(strGprsInf[num++],"网关:",env_get_info(ENV_GATEWAYIP));
  5814. sprintf(strGprsInf[num++],"%s",env_get_info(ENV_GATEWAYIP));
  5815. #else
  5816. sprintf(strGprsInf[num++],"调试串口:%d",g_con_uart_index);
  5817. sprintf(strGprsInf[num++],"波特率:115200 无校验");
  5818. sprintf(strGprsInf[num++],"调试网口:%d",debug_port+1);
  5819. printf("[%s:%d] debug_port = %d\r\n", __func__, __LINE__, debug_port);
  5820. sprintf(strGprsInf[num++],"IP=%s",env_get_info(ENV_IPADDR));
  5821. sprintf(strGprsInf[num++],"MASK=%s",env_get_info(ENV_NETMASK));
  5822. sprintf(strGprsInf[num++],"GATE=%s",env_get_info(ENV_GATEWAYIP));
  5823. sprintf(strGprsInf[num++],"编译脚本:");
  5824. sprintf(strGprsInf[num++],"%s",SH_NAME);
  5825. #ifdef FUN_JDXX
  5826. sprintf(strGprsInf[num++],"JDXX_Ver:V%02d.%03d",version_jdxx/1000,version_jdxx%1000);
  5827. #else
  5828. sprintf(strGprsInf[num++],"JDXX_Ver:------");
  5829. #endif
  5830. #endif
  5831. g_gprs_info_num=num;
  5832. mmd_initDataMenu(&g_tDataMenu1,num,mmd_RenewExtInf,mmd_GetExtInfValue,8,1);
  5833. return M_OK;
  5834. }
  5835. int mmd_GetFileInf(int value)
  5836. {
  5837. int num=0;
  5838. int i;
  5839. int index=0;
  5840. extern struct board_res_head *g_board_res_head;
  5841. for(i=0; i<g_board_res_head->br_num; i++)
  5842. {
  5843. if(g_board_res[i].type==g_board_info[EQU_SLOT_KZ].type)
  5844. {
  5845. index=i;
  5846. }
  5847. }
  5848. #if LCD_SIZE==128
  5849. sprintf(strGprsInf[num],"%d.装置资源:%04XH",num+1,g_crc_rsc); //显示面板上num排序应从1(num+1)开始
  5850. num++;
  5851. sprintf(strGprsInf[num],"%d.板卡资源:%04XH",num+1,g_crc_brd_res);
  5852. num++;
  5853. sprintf(strGprsInf[num],"%d.通道配置:%04XH",num+1,g_crc_equ_cfg);
  5854. num++;
  5855. sprintf(strGprsInf[num],"%d.转发点表:%04XH",num+1,g_crc_rectable);
  5856. num++;
  5857. sprintf(strGprsInf[num],"%d.定值描述:%04XH",num+1,g_crc_set_desc);
  5858. num++;
  5859. sprintf(strGprsInf[num],"%d.定值数据:%04XH",num+1,g_crc_set_data);
  5860. num++;
  5861. sprintf(strGprsInf[num],"%d.HV:%s",num+1,g_board_res[index].name);
  5862. num++;
  5863. sprintf(strGprsInf[num],"%d.KV:%s",num+1,(env_get_info(ENV_KERNEL)+15));
  5864. strGprsInf[num][13]=0;
  5865. num++;
  5866. #else
  5867. sprintf(strGprsInf[num],"%d.装置资源文件:%04XH",num+1,g_crc_rsc); //显示面板上num排序应从1(num+1)开始
  5868. num++;
  5869. sprintf(strGprsInf[num],"%d.板卡资源文件:%04XH",num+1,g_crc_brd_res);
  5870. num++;
  5871. sprintf(strGprsInf[num],"%d.通道配置文件:%04XH",num+1,g_crc_equ_cfg);
  5872. num++;
  5873. sprintf(strGprsInf[num],"%d.转发点表文件:%04XH",num+1,g_crc_rectable);
  5874. num++;
  5875. sprintf(strGprsInf[num],"%d.定值描述文件:%04XH",num+1,g_crc_set_desc);
  5876. num++;
  5877. sprintf(strGprsInf[num],"%d.定值数据文件:%04XH",num+1,g_crc_set_data);
  5878. num++;
  5879. sprintf(strGprsInf[num],"%d.HV:%s",num+1,g_board_res[index].name);
  5880. num++;
  5881. sprintf(strGprsInf[num],"%d.KV:%s",num+1,(env_get_info(ENV_KERNEL)+15));
  5882. strGprsInf[num][13]=0;
  5883. num++;
  5884. #endif
  5885. g_gprs_info_num=num;
  5886. mmd_initDataMenu(&g_tDataMenu1,num,mmd_RenewExtInf,mmd_GetExtInfValue,9,1);
  5887. return M_OK;
  5888. }
  5889. /****GPRS维护信息显示**********************/
  5890. static void mmd_GprsInf(int i,DATA_FIELD_DEF *pF)
  5891. {
  5892. char *pd=pF->FmtStr;
  5893. #if LCD_SIZE==128
  5894. sprintf(pd,"%-16.16s",strGprsInf[i]);
  5895. #else
  5896. sprintf(pd,"%-20.20s",strGprsInf[i]);
  5897. #endif
  5898. }
  5899. int mmd_RenewGprsInf(void)
  5900. {
  5901. mmd_RenewDataMenu(&g_tDataMenu1);
  5902. return M_OK;
  5903. }
  5904. int mmd_GetGprsInf(int value)
  5905. {
  5906. int i;
  5907. for(i=0;i<20;i++)
  5908. {
  5909. strcpy(strGprsInf[i]," ");
  5910. }
  5911. mmd_initDataMenu(&g_tDataMenu1,3,mmd_RenewGprsInf,mmd_GprsInf,11,1);
  5912. IEC101_PH_GprsInfo();
  5913. return M_OK;
  5914. }
  5915. int mmd_GprsInfKey(int key)
  5916. {
  5917. if(key==HA_KEY_ENTER) // +键增加列表
  5918. {
  5919. int i;
  5920. for(i=0;i<CFG_UART_NUM_MAX-1;i++)
  5921. {
  5922. if(UART_CHANNEL[i]< 0)
  5923. {
  5924. continue;
  5925. }
  5926. //外部通信报文处理
  5927. if(tRunPara.tUartPara[i].wProtocol==PROTOCOL_101_PH) // 101规约
  5928. {
  5929. IEC101_DEF *pt=(IEC101_DEF *)g_tRsComm[i].ptBuf;
  5930. pt->bCallGprsInf=true;
  5931. }
  5932. }
  5933. }
  5934. return M_OK;
  5935. }
  5936. int mmd_get_gprs_info(void)
  5937. {
  5938. BYTE *pd=tGprsInf.data;
  5939. int num=0;
  5940. if(!tGprsInf.bInf)return 0;
  5941. tGprsInf.bInf=false;
  5942. if(pd[0]==1)
  5943. {
  5944. strcpy(strGprsInf[num++],"模块状态 :正常");
  5945. }
  5946. else
  5947. {
  5948. strcpy(strGprsInf[num++],"模块状态 :异常");
  5949. }
  5950. if(pd[1]==1)
  5951. {
  5952. strcpy(strGprsInf[num++],"SIM卡状态:正常");
  5953. }
  5954. else
  5955. {
  5956. strcpy(strGprsInf[num++],"SIM卡状态:异常");
  5957. }
  5958. if(pd[2]==1)
  5959. {
  5960. strcpy(strGprsInf[num++],"PPP拨号 :正常");
  5961. }
  5962. else
  5963. {
  5964. strcpy(strGprsInf[num++],"PPP拨号 :异常");
  5965. }
  5966. sprintf(strGprsInf[num++],"信号强度 :%2d",pd[9]);
  5967. sprintf(strGprsInf[num++],"IP:%d.%d.%d.%d",pd[19],pd[20],pd[21],pd[22]);
  5968. if(pd[10]==1)
  5969. {
  5970. strcpy(strGprsInf[num++],"频段:900MHz");
  5971. }
  5972. else
  5973. {
  5974. strcpy(strGprsInf[num++],"频段:1800MHz(其他)");
  5975. }
  5976. sprintf(strGprsInf[num++],"ICMP延时:%d ms",(pd[24]|(pd[23]<<8)));
  5977. sprintf(strGprsInf[num++],"上传字节数:%d",(pd[34]|(pd[33]<<8)|(pd[32]<<16)|(pd[31]<<24)));
  5978. sprintf(strGprsInf[num++],"下载字节数:%d",(pd[38]|(pd[37]<<8)|(pd[36]<<16)|(pd[35]<<24)));
  5979. g_gprs_info_num = num;
  5980. return num;
  5981. }
  5982. int mmd_AuotGprsInf(void)
  5983. {
  5984. int num;
  5985. num = mmd_get_gprs_info();
  5986. if(num)
  5987. {
  5988. g_tDataMenu1.sTotalNum=num; //总的动态菜单数
  5989. }
  5990. mmd_RenewGprsInf();
  5991. return M_OK;
  5992. }
  5993. u8 *goosefilebuf=NULL;
  5994. u8 *gooseinfbuf;
  5995. struct file * goosepfile=NULL;
  5996. int gooseinflenth=0;
  5997. int gooseinfbgn=0;
  5998. void mmd_printgooseinf(void)
  5999. {
  6000. int i;
  6001. DATA_MENU_DEF *pt=&g_tDataMenu1;
  6002. int num=0;
  6003. u8 *buf=gooseinfbuf;
  6004. char *ptstr;
  6005. pt->sFocusIndex=0;
  6006. for(i=0;i<9;i++)
  6007. {
  6008. sprintf(pt->tDataFields[i].FmtStr,"%20.20s"," ");
  6009. }
  6010. if(gooseinfbgn>=gooseinflenth)return;
  6011. ptstr=pt->tDataFields[pt->sFocusIndex].FmtStr;
  6012. for(i=gooseinfbgn;i<gooseinflenth;i++)
  6013. {
  6014. if(buf[i] == 0x0A)
  6015. {
  6016. ptstr[20]=0;
  6017. pt->sFocusIndex++;
  6018. if(pt->sFocusIndex>=9)
  6019. {
  6020. i++;
  6021. break;
  6022. }
  6023. num=0;
  6024. ptstr=pt->tDataFields[pt->sFocusIndex].FmtStr;
  6025. }
  6026. else if(buf[i]<0x20)
  6027. {
  6028. }
  6029. else
  6030. {
  6031. ptstr[num++]=buf[i];
  6032. if(buf[i]>0x80)
  6033. {
  6034. ptstr[num++]=buf[i+1];
  6035. i+=1;
  6036. }
  6037. if(num>=19)
  6038. {
  6039. ptstr[20]=0;
  6040. pt->sFocusIndex++;
  6041. if(pt->sFocusIndex>=9)
  6042. {
  6043. i++;
  6044. break;
  6045. }
  6046. num=0;
  6047. ptstr=pt->tDataFields[pt->sFocusIndex].FmtStr;
  6048. }
  6049. }
  6050. }
  6051. ptstr[20]=0;
  6052. gooseinfbgn=i;
  6053. pt->sFocusIndex=0; //第一个显示的动态菜单的索引
  6054. pt->sTotalNum=9; //总的动态菜单数
  6055. pt->sScreenNum=9;
  6056. pt->GetPrevFuncAddr=NULL; //44
  6057. pt->GetNextFuncAddr=NULL; //44
  6058. pt->GetValueFuncAddr=NULL;
  6059. }
  6060. int mmd_GetGooseInf(int value)
  6061. {
  6062. u32 i,file_length;
  6063. struct file * pfile;
  6064. u8 *filebuf;
  6065. u8 filestr[256],*pstr,strlenth;
  6066. loff_t pos;
  6067. // 打开文件
  6068. pfile = rt_file_open("/tmp/kmsg",O_RDONLY ,0);
  6069. if(IS_ERR(pfile))
  6070. {
  6071. sprintf(m_WarningStr,"无法打开kmsg文件");
  6072. return M_JUMP3;
  6073. }
  6074. // 得到文件长度
  6075. file_length = rt_file_getfile_size(pfile);
  6076. if(file_length <= 0)
  6077. {
  6078. rt_file_close(pfile,0);
  6079. sprintf(m_WarningStr,"kmsg文件长度=0");
  6080. return M_JUMP3;
  6081. }
  6082. // 分配内存
  6083. filebuf = rt_malloc(file_length);
  6084. if((filebuf) == NULL)
  6085. {
  6086. rt_file_close(pfile,0);
  6087. sprintf(m_WarningStr,"内存分配失败");
  6088. return M_JUMP3;
  6089. }
  6090. pos = 0;
  6091. if(rt_file_read(pfile,filebuf,file_length,&pos) != file_length)
  6092. {
  6093. rt_file_close(pfile,0);
  6094. rt_free(filebuf);
  6095. sprintf(m_WarningStr,"kmsg读取失败");
  6096. return M_JUMP3;
  6097. }
  6098. pstr = filestr;
  6099. strlenth=0; // 纠错处理
  6100. //找到\r\n位置,得到一行长度
  6101. for(i = 0; i < file_length; i++)
  6102. {
  6103. *pstr++=filebuf[i];
  6104. strlenth++;
  6105. if(filebuf[i] == 0x0a||strlenth>=256)
  6106. {
  6107. *pstr=0;
  6108. pstr=filestr;
  6109. if(strstr(filestr,"goose_init...")) //
  6110. {
  6111. goosefilebuf=filebuf;
  6112. goosepfile=pfile;
  6113. gooseinfbuf=&filebuf[i+1];
  6114. gooseinfbgn=0;
  6115. gooseinflenth=file_length-i;
  6116. mmd_printgooseinf();
  6117. return M_JUMP0;
  6118. }
  6119. }
  6120. }
  6121. rt_file_close(pfile,0); // 关闭文件
  6122. rt_free(filebuf); // 释放内存
  6123. sprintf(m_WarningStr,"未找到 goose信息");
  6124. return M_JUMP3;
  6125. }
  6126. int mmd_gooseKey(int key)
  6127. {
  6128. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  6129. {
  6130. rt_file_close(goosepfile,0); // 关闭文件
  6131. rt_free(goosefilebuf); // 释放内存
  6132. return M_JUMP1;
  6133. }
  6134. if(key==HA_KEY_ENTER)
  6135. {
  6136. mmd_printgooseinf();
  6137. }
  6138. return M_OK;
  6139. }
  6140. /**************************************************************************
  6141. 函数名称:mmd_InitDefaultEquipSet
  6142. 函数版本:1.00
  6143. 作者:
  6144. 创建日期:2008.9.1
  6145. 函数功能说明:恢复出厂设置,定值,定值区信息,压板,内部定值,参数均设为默认值,
  6146. 清事件记录、操作记录,运行定值区0 ,有效区一个 0
  6147. 输入参数:
  6148. 输出参数:
  6149. 返回值:
  6150. 更新信息:
  6151. 更新日志1:
  6152. 日期:
  6153. 修改者:
  6154. 修改内容:
  6155. 修改原因:
  6156. ***************************************************************************/
  6157. int mmd_InitDefaultEquipSet(int value)
  6158. {
  6159. if(rt_err_test(ERR_CODE_FACTOR)) // 装置配置若校验错误,置为默认值,若正确,不做处理
  6160. {
  6161. // 恢复错误的系数,正确的保留
  6162. factor_restore_default();
  6163. log_str_time(LOG_OPERATE,"装置恢复默认校准系数",0,0);
  6164. }
  6165. init_default_equip_set(0);
  6166. strcpy(m_WarningStr,"恢复为出厂设置");
  6167. return M_JUMP3;
  6168. }
  6169. int mmd_SoftReset(int value)
  6170. {
  6171. watchdog_reset_cpu(3);
  6172. return M_OK;
  6173. }
  6174. /*下面是远动测试的内容*/
  6175. double GetYdYcValue(int i)
  6176. {
  6177. double ff;
  6178. int ycvalue;
  6179. DWORD lmeaval=0;
  6180. long lzero=0;
  6181. BYTE no=g_ac_table[i].indexno;
  6182. u8 link_qds=0;
  6183. int sw=g_ac_table[i].owner;
  6184. if(no>0)
  6185. {
  6186. DWORD dwMax;
  6187. DWORD dwDeadVal;
  6188. float rate;
  6189. float f_65536=65536.0;
  6190. no-=1;
  6191. rate=(float)g_ac_table[i].rate/65536.0;
  6192. dwMax=(DWORD)g_ac_table[i].normal;
  6193. //dwMax = (tRunPara.bDeadType==true) ? (DWORD)g_ac_table[i].normal:_AbsL(pt104->yc_save[i]);
  6194. if(dwMax==0) //防止额定或者前一次保存值为0
  6195. dwMax=1;
  6196. dwDeadVal=_Mul_Div_U(g_ac_table[i].dead_value,dwMax,6553600);
  6197. if(dwDeadVal==0)dwDeadVal=1;
  6198. if(dwMax==0)f_65536=1.0;
  6199. #if 0 //远动测试情况下遥测数据测试值锁定功能 此处暂不开启
  6200. lmeaval=GetRmtMeaVal(g_ac_table[i].owner,no,&link_qds);
  6201. #else
  6202. if(sw==0) // 公共测量值
  6203. {
  6204. if(no < PUB_AC_NUM_ALL)
  6205. {
  6206. lmeaval=g_sw_pub.ac_in[no];
  6207. }
  6208. lzero=g_unit[g_pub_ac_desc[no].unit].zero;
  6209. }
  6210. else if(sw<=SWITCH_NUM_EXT)
  6211. {
  6212. sw-=1;
  6213. if(no < SW_AC_NUM_ALL)
  6214. {
  6215. lmeaval=g_sw[sw].ac_in[no];
  6216. if(link_qds)
  6217. {
  6218. link_qds=g_sw[sw].link_qds[no];
  6219. }
  6220. }
  6221. lzero=g_unit[g_sw_ac_desc[no].unit].zero;
  6222. }
  6223. if(lzero>0&&_AbsL(lmeaval)<lzero && pRunSet->bTT_RET_ZERO)
  6224. {
  6225. lmeaval=0;
  6226. }
  6227. #endif
  6228. //rt_printf("%d--",lmeaval);
  6229. ff=((double)lmeaval)/f_65536*rate; //转为浮点数
  6230. #ifdef VOLT_ADAPTIVE_FACTOR
  6231. if(pRunSet->bTT_AdaptiveFactor)
  6232. {
  6233. if(0 == g_ac_table[i].owner)
  6234. {
  6235. if((no <= PUB_AC_UCA1) && (no >= PUB_AC_UA1))
  6236. {
  6237. ff=((double)lmeaval)/f_65536*10/pRunSet->pt1_two;
  6238. }
  6239. else if((no <= PUB_AC_UCA2) && (no >= PUB_AC_UA2))
  6240. {
  6241. ff=((double)lmeaval)/f_65536*10/pRunSet->pt2_two;
  6242. }
  6243. }
  6244. }
  6245. #endif
  6246. ycvalue=(int)rt_round(ff);
  6247. if(tRunPara.bYcFloat)
  6248. {
  6249. if(_AbsL(lmeaval) > (dwMax*10)) // 大于额定值的10倍*65536
  6250. {
  6251. //if(dwMax>0)QDS|=0x01; //遥测溢出
  6252. }
  6253. }
  6254. else
  6255. {
  6256. if (ycvalue >= 0)
  6257. {
  6258. if (ycvalue > 32767)
  6259. {
  6260. ycvalue = 32767;
  6261. //QDS|=0x01; //遥测溢出
  6262. }
  6263. }
  6264. else
  6265. {
  6266. if (ycvalue < (-32768))
  6267. {
  6268. ycvalue = -32768;
  6269. //QDS|=0x01; //遥测溢出
  6270. }
  6271. }
  6272. }
  6273. }
  6274. else //备用点号,数值上送0
  6275. {
  6276. ycvalue=0;
  6277. ff=0;
  6278. }
  6279. return ff;
  6280. }
  6281. static void mmd_GetRmtYCValue(int i,DATA_FIELD_DEF *pF)
  6282. {
  6283. char *pd=pF->FmtStr;
  6284. char tmpstr[16];
  6285. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  6286. char flag=0; //溢出标志
  6287. double v;
  6288. #endif
  6289. strcpy(pd,"");
  6290. if(g_ac_table[i].indexno!=0)
  6291. {
  6292. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  6293. tbl_getname(RES_TYPE_YC,i,pd);
  6294. #else
  6295. tbl_getacname(g_ac_table[i].owner,g_ac_table[i].indexno,pd);
  6296. #endif
  6297. }
  6298. else
  6299. {
  6300. sprintf(pd,"备用遥测%d",i+1);
  6301. }
  6302. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  6303. strcpy(tmpstr,"");
  6304. v=GetYdYcValue(i);
  6305. if((v<-99999)||(v>999999))
  6306. flag=1;
  6307. sprintf(tmpstr,"%.4lf",v);
  6308. #if LCD_SIZE==128
  6309. sprintf(pd,"%-13.13s %s",pd,tmpstr);
  6310. #else
  6311. if((g_ac_table[i].owner)&&(g_ac_table[i].indexno>=21)&&(g_ac_table[i].indexno<=32))
  6312. {
  6313. if(flag)
  6314. sprintf(pd,"%-12.12s : over",pd);
  6315. else
  6316. sprintf(pd,"%-12.12s :%-6.6s",pd,tmpstr);
  6317. }
  6318. else
  6319. sprintf(pd,"%-8.8s :%-10.10s",pd,tmpstr);
  6320. #endif
  6321. #else
  6322. sprintf(tmpstr," :%.2f",(float)g_ac_table[i].normal/(65536*2)); // 额定值的一半
  6323. strcat(pd,tmpstr);
  6324. #endif
  6325. }
  6326. /**************************************************************************
  6327. 函数名称:mmd_RenewMea
  6328. 函数版本:1.00
  6329. 作者:
  6330. 创建日期:2008.9.1
  6331. 函数功能说明:刷新测量值显示
  6332. 输入参数:
  6333. 输出参数:
  6334. 返回值:
  6335. 更新信息:
  6336. 更新日志1:
  6337. 日期:
  6338. 修改者:
  6339. 修改内容:
  6340. 修改原因:
  6341. ***************************************************************************/
  6342. int mmd_RenewRmtYC(void)
  6343. {
  6344. mmd_RenewDataMenu(&g_tDataMenu1);
  6345. return M_OK;
  6346. }
  6347. /**************************************************************************
  6348. 函数名称:mmd_GetMea
  6349. 函数版本:1.00
  6350. 作者:
  6351. 创建日期:2008.9.1
  6352. 函数功能说明:取得测量值的显示
  6353. 输入参数:
  6354. 输出参数:
  6355. 返回值:
  6356. 更新信息:
  6357. 更新日志1:
  6358. 日期:
  6359. 修改者:
  6360. 修改内容:
  6361. 修改原因:
  6362. ***************************************************************************/
  6363. int mmd_GetRmtYC(int value)
  6364. {
  6365. mmd_initDataMenu(&g_tDataMenu1,g_table_head->ac_num,mmd_RenewRmtYC,mmd_GetRmtYCValue,126,1);
  6366. return M_OK;
  6367. }
  6368. /*下面是遥信测试处理*/
  6369. static void mmd_GetRmtYXValue(int i,DATA_FIELD_DEF *pF)
  6370. {
  6371. char *pd=pF->FmtStr;
  6372. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  6373. u8 data=0;
  6374. int sz_index;
  6375. char valStr[5]="";
  6376. #endif
  6377. strcpy(pd,"");
  6378. if(g_di_table[i].indexno==0)
  6379. {
  6380. bool bMix=true;
  6381. int m;
  6382. for(m=0; m<g_table_head->di_db_num; m++) // 双点
  6383. {
  6384. if(g_di_table[i].cp==g_di_db_table[m].cp)
  6385. {
  6386. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  6387. sz_index = tbl_get_sz_index_yx(i); //找到双点在sz_table的位置(双点+x+x)
  6388. //sz_index+=1; //合并点显示第一行名称
  6389. if(tbl_getname_sz(RES_TYPE_YX,sz_index,pd)<0)
  6390. #endif
  6391. tbl_getdiname(((g_di_db_table[m].no[0]>>8)&0xff),(g_di_db_table[m].no[0]&0xff),pd);
  6392. //sprintf(pd,"%s-%d-%d",pd,sz_index,i);
  6393. strcat(pd," (双点) ");
  6394. bMix=false;
  6395. break;
  6396. }
  6397. }
  6398. if(bMix) //合并点
  6399. {
  6400. for(m=0; m<g_table_head->dimerge_num; m++)
  6401. {
  6402. if(g_di_table[i].cp==g_di_merge_table[m].cp)
  6403. {
  6404. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  6405. sz_index = tbl_get_sz_index_yx(i); //找到双点在sz_table的位置(合并点+x+x)
  6406. //sz_index+=1; //合并点显示第一行名称
  6407. if(tbl_getname_sz(RES_TYPE_YX,sz_index,pd)<0)
  6408. #endif
  6409. //tbl_getdiname(((g_di_merge_table[m].no[0]>>12)&0x0f),(g_di_merge_table[m].no[0]&0xff),pd);
  6410. tbl_getdiname(((g_di_merge_table[m].no[0]>>8)&0xff),(g_di_merge_table[m].no[0]&0xff),pd); //高八位的低四位为归属 没有实点属性
  6411. strcat(pd," (合并点) ");
  6412. bMix=false;
  6413. break;
  6414. }
  6415. }
  6416. }
  6417. if(bMix) sprintf(pd,"备用遥信%d",i+1);
  6418. }
  6419. else
  6420. {
  6421. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  6422. tbl_getname(RES_TYPE_YX,i,pd);
  6423. #else
  6424. tbl_getdiname(g_di_table[i].owner,g_di_table[i].indexno,pd);
  6425. #endif
  6426. }
  6427. #ifdef YD_TEST_REALTIME_VALUE_DISPLAY
  6428. data=tbl_get_yx(i,1);
  6429. #if 1
  6430. if(data==1)
  6431. strcpy(valStr," 分");
  6432. else if(data==2)
  6433. strcpy(valStr," 合");
  6434. else
  6435. strcpy(valStr,"非法");
  6436. #endif
  6437. #if LCD_SIZE==128
  6438. sprintf(pd,"%-13.13s %d",pd,data);
  6439. #else
  6440. //sprintf(pd,"%-16.16s %d",pd,data);
  6441. sprintf(pd,"%-14.14s %-4.4s",pd,valStr);
  6442. #endif
  6443. #endif
  6444. }
  6445. /**************************************************************************
  6446. 函数名称:mmd_RenewRmtYX
  6447. 函数版本:1.00
  6448. 作者:
  6449. 创建日期:2008.9.1
  6450. 函数功能说明:刷新遥信显示
  6451. 输入参数:
  6452. 输出参数:
  6453. 返回值:
  6454. 更新信息:
  6455. 更新日志1:
  6456. 日期:
  6457. 修改者:
  6458. 修改内容:
  6459. 修改原因:
  6460. ***************************************************************************/
  6461. int mmd_RenewRmtYX(void)
  6462. {
  6463. mmd_RenewDataMenu(&g_tDataMenu1);
  6464. return M_OK;
  6465. }
  6466. /**************************************************************************
  6467. 函数名称:mmd_GetRmtYX
  6468. 函数版本:1.00
  6469. 作者:
  6470. 创建日期:2008.9.1
  6471. 函数功能说明:取得遥信值的显示
  6472. 输入参数:
  6473. 输出参数:
  6474. 返回值:
  6475. 更新信息:
  6476. 更新日志1:
  6477. 日期:
  6478. 修改者:
  6479. 修改内容:
  6480. 修改原因:
  6481. ***************************************************************************/
  6482. int mmd_GetRmtYX(int value)
  6483. {
  6484. mmd_initDataMenu(&g_tDataMenu1,g_table_head->di_num,mmd_RenewRmtYX,mmd_GetRmtYXValue,124,1);
  6485. return M_OK;
  6486. }
  6487. int mmd_CheckRmtTbl(int value)
  6488. {
  6489. if(rt_err_test(ERR_CODE_IEC_TABLE))
  6490. {
  6491. strcpy(m_WarningStr,"转发表加载错误!");
  6492. return M_JUMP3;
  6493. }
  6494. return M_JUMP0;
  6495. }
  6496. int mmd_GetRmtIndex(int value)
  6497. {
  6498. g_RmtIndex=value;
  6499. sprintf(m_YdYcHalfOfRateValue,":%.2f",(float)g_ac_table[g_RmtIndex].normal/(65536*2)); // 额定值的一半
  6500. return M_OK;
  6501. }
  6502. int mmd_SendRmtYX(int value)
  6503. {
  6504. int i=g_RmtIndex;
  6505. u8 type=0;
  6506. u8 buf[12];
  6507. if(g_di_table[i].indexno==0)
  6508. {
  6509. int m;
  6510. for(m=0; m<g_table_head->di_db_num; m++) // 双点
  6511. {
  6512. if(g_di_table[i].cp==g_di_db_table[m].cp)
  6513. {
  6514. type=3;
  6515. }
  6516. }
  6517. for(m=0; m<g_table_head->dimerge_num; m++)
  6518. {
  6519. if(g_di_table[i].cp==g_di_merge_table[m].cp)
  6520. {
  6521. type=4;
  6522. }
  6523. }
  6524. }
  6525. // 点表类型
  6526. buf[2]=type;
  6527. // 点号
  6528. buf[3]=(u8)g_di_table[i].cp;
  6529. buf[4]=(u8)(g_di_table[i].cp>>8);
  6530. // 归属
  6531. buf[5]=g_di_table[i].owner;
  6532. // 实点、虚点
  6533. buf[6]=0;
  6534. // 资源表中索引
  6535. buf[7]=g_di_table[i].indexno;
  6536. buf[8]=value;
  6537. buf[9]=0;
  6538. buf[10]=0;
  6539. buf[11]=0;
  6540. send_rmt_yx(buf);
  6541. g_run_stu.bHmiRmtTest=true;
  6542. return M_OK;
  6543. }
  6544. int mmd_SendRmtYC(int value)
  6545. {
  6546. DWORD val;
  6547. u8 buf[12];
  6548. val=g_ac_table[g_RmtIndex].normal/2; // 额定值的一半
  6549. buf[5]=g_ac_table[g_RmtIndex].owner;
  6550. buf[7]=g_ac_table[g_RmtIndex].indexno;
  6551. buf[8]=(u8)(val>>0);
  6552. buf[9]=(u8)(val>>8);
  6553. buf[10]=(u8)(val>>16);
  6554. buf[11]=(u8)(val>>24);
  6555. send_rmt_yc(buf);
  6556. g_run_stu.bHmiRmtTest=true;
  6557. return M_OK;
  6558. }
  6559. int mmd_SendRmtDD(int value)
  6560. {
  6561. DWORD val;
  6562. u8 buf[12];
  6563. val=g_dd_table[g_RmtIndex].normal/2; // 额定值的一半
  6564. buf[5]=g_ac_table[g_RmtIndex].owner;
  6565. buf[7]=g_ac_table[g_RmtIndex].indexno;
  6566. buf[8]=(u8)(val>>0);
  6567. buf[9]=(u8)(val>>8);
  6568. buf[10]=(u8)(val>>16);
  6569. buf[11]=(u8)(val>>24);
  6570. send_rmt_dd(buf);
  6571. g_run_stu.bHmiRmtTest=true;
  6572. return M_OK;
  6573. }
  6574. // 电度远动测试
  6575. static void mmd_GetRmtDDValue(int i,DATA_FIELD_DEF *pF)
  6576. {
  6577. char *pd=pF->FmtStr;
  6578. char tmpstr[16];
  6579. strcpy(pd,"");
  6580. //if(g_dd_table[i].indexno!=0)
  6581. if((g_dd_table[i].indexno>0)&&(g_dd_table[i].indexno<=SW_DD_NUM_ALL))
  6582. {
  6583. tbl_getddname(g_dd_table[i].owner,g_dd_table[i].indexno,pd);
  6584. }
  6585. else
  6586. {
  6587. sprintf(pd,"备用电度%d",i+1);
  6588. }
  6589. sprintf(tmpstr," :%.2f",(float)g_dd_table[i].normal/(65536*2)); // 额定值的一半
  6590. strcat(pd,tmpstr);
  6591. }
  6592. /**************************************************************************
  6593. 函数名称:mmd_RenewMea
  6594. 函数版本:1.00
  6595. 作者:
  6596. 创建日期:2008.9.1
  6597. 函数功能说明:刷新测量值显示
  6598. 输入参数:
  6599. 输出参数:
  6600. 返回值:
  6601. 更新信息:
  6602. 更新日志1:
  6603. 日期:
  6604. 修改者:
  6605. 修改内容:
  6606. 修改原因:
  6607. ***************************************************************************/
  6608. int mmd_RenewRmtDD(void)
  6609. {
  6610. mmd_RenewDataMenu(&g_tDataMenu1);
  6611. return M_OK;
  6612. }
  6613. /**************************************************************************
  6614. 函数名称:mmd_GetMea
  6615. 函数版本:1.00
  6616. 作者:
  6617. 创建日期:2008.9.1
  6618. 函数功能说明:取得测量值的显示
  6619. 输入参数:
  6620. 输出参数:
  6621. 返回值:
  6622. 更新信息:
  6623. 更新日志1:
  6624. 日期:
  6625. 修改者:
  6626. 修改内容:
  6627. 修改原因:
  6628. ***************************************************************************/
  6629. int mmd_GetRmtDD(int value)
  6630. {
  6631. mmd_initDataMenu(&g_tDataMenu1,g_table_head->dd_num,mmd_RenewRmtDD,mmd_GetRmtDDValue,128,1);
  6632. return M_OK;
  6633. }
  6634. int mmd_Jump0(int value)
  6635. {
  6636. return M_JUMP0;
  6637. }
  6638. int mmd_BatActive(int value)
  6639. {
  6640. if(bat_active(1)!=0)
  6641. {
  6642. strcpy(m_WarningStr,"电池活化启动失败!");
  6643. rt_printf("%s\r\n",m_WarningStr);
  6644. return M_JUMP3;
  6645. }
  6646. return M_JUMP0;
  6647. }
  6648. int mmd_BatActOff(int value)
  6649. {
  6650. #ifdef BATTERY_WITH_COMM
  6651. StopBattAct();
  6652. #else
  6653. if(sw_do_pub(PUB_DO_HHTC,SW_DO_TYPE_ON)!=0)
  6654. {
  6655. strcpy(m_WarningStr,"电池活化退出失败!");
  6656. rt_printf("%s\r\n",m_WarningStr);
  6657. return M_JUMP3;
  6658. }
  6659. soe_record_opt(EV_BAT_HANDACTOFF, 1);
  6660. #endif
  6661. return M_JUMP0;
  6662. }
  6663. /**************************************************************************
  6664. 函数名称:mmd_InitDefaultEquipSet
  6665. 函数版本:1.00
  6666. 作者:
  6667. 创建日期:2008.9.1
  6668. 函数功能说明:恢复出厂设置,定值,定值区信息,压板,内部定值,参数均设为默认值,
  6669. 清事件记录、操作记录,运行定值区0 ,有效区一个 0
  6670. 输入参数:
  6671. 输出参数:
  6672. 返回值:
  6673. 更新信息:
  6674. 更新日志1:
  6675. 日期:
  6676. 修改者:
  6677. 修改内容:
  6678. 修改原因:
  6679. ***************************************************************************/
  6680. int init_default_equip_set(int value)
  6681. {
  6682. int i;
  6683. e2prom_reinit();
  6684. GetDefPara((float*)m_SetBuf,EQUIP_PARA_NUMBER,&tEquipParaTable[0]); //装置参数默认
  6685. //调试网口参数做特殊处理。调试网口的默认参数以UBOOT中的环境变量为默认值.
  6686. GetDefDebugNetPara();
  6687. SavePara((void *)m_SetBuf,EEP_EQUIP_PARA_ADDR,EQUIP_PARA_NUMBER,&tEquipParaTable[0]);
  6688. #ifdef PUB_SET_SECTION
  6689. for(i=0;i<SEC_NUMBER;i++)
  6690. {
  6691. GetDefPara((float*)&m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);//定值默认
  6692. SavePara((void *)&m_SetBuf,EEP_PUB_ADDR+i*PUB_SETSIZE,PUB_SET_NUMBER,&tPubSetTable[0]);
  6693. }
  6694. #else
  6695. GetDefPara((float*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);//定值默认
  6696. SavePara((void *)m_SetBuf,EEP_PUB_ADDR,PUB_SET_NUMBER,&tPubSetTable[0]);
  6697. #endif
  6698. for(i=0;i<SEC_NUMBER;i++)
  6699. {
  6700. GetDefPara((float*)m_SetBuf,SW_SET_NUMBER,&tSwSetTable[0]);//定值默认
  6701. SavePara((void *)m_SetBuf,EEP_SET_ADDR+i*SETSIZE,SW_SET_NUMBER,&tSwSetTable[0]);
  6702. }
  6703. GetDefPara((float*)m_SetBuf,CSTSET_NUMBER,&tCstSetTable[0]);//定值默认
  6704. SavePara((void *)m_SetBuf,EEP_CSTSET_ADDR,CSTSET_NUMBER,&tCstSetTable[0]);
  6705. m_runsection=0; // 当前运行定值区为 0区
  6706. #ifdef PASSWORD_4_STR
  6707. SavePassword(INIT_PASSWORD_STR_4); // 密码初始化
  6708. SavePassword2(INIT_PASSWORD_STR_4); // 密码初始化
  6709. #else
  6710. SavePassword(INIT_PASSWORD_STR); // 密码初始化
  6711. SavePassword2(INIT_PASSWORD_STR); // 密码初始化
  6712. #endif
  6713. soe_clear_ev(); // 清事件记录
  6714. soe_clear_opt() ; // 清操作记录
  6715. soe_record_opt(EV_INIT_EQUIP,0); // 记录操作记录
  6716. MakeRunSet(true); // 将当前运行定值区转换为运行定值区
  6717. MakeRunPara(false, true); // 转换参数到运行参数区
  6718. SaveUqua(true);
  6719. GetDefSetGroup(m_setgroup);
  6720. SaveEppData(EEP_SETGROUP_ADDR,m_setgroup,GROUP_NUM);
  6721. {
  6722. extern int led_save_flag; // 当前灯状态保存一下
  6723. led_save_flag=1;
  6724. }
  6725. rt_printf("恢复为出厂设置\r\n");
  6726. return 0;
  6727. }
  6728. extern int gprs_net_get_gprs_info(void);
  6729. /******************************************************************************
  6730. 函数名称: gprs_get_info
  6731. 函数版本: 01.01
  6732. 创建作者: xxxxxx
  6733. 创建日期: 2014-12-30
  6734. 函数说明: 获取当前屏分配的实体数
  6735. 参数说明: 无
  6736. 返回值: 成功返回0.
  6737. 修改记录:
  6738. */
  6739. int gprs_get_info(void)
  6740. {
  6741. u8 *pd=tGprsInf.data;
  6742. int num=0;
  6743. //获取内部GPRS状态信息
  6744. num = mmd_get_gprs_info();
  6745. g_gprs_info_num = num;
  6746. if(num > 0)
  6747. {
  6748. return num;
  6749. }
  6750. if(!tGprsInf.bInf)
  6751. {
  6752. return 0;
  6753. }
  6754. tGprsInf.bInf=false;
  6755. if((pd[0]|(pd[1]<<8))==0x0001)
  6756. {
  6757. strcpy(strGprsInf[num++],"模块状态 :正常");
  6758. }
  6759. else
  6760. {
  6761. strcpy(strGprsInf[num++],"模块状态 :异常");
  6762. }
  6763. if((pd[2]|(pd[3]<<8))==0x0001)
  6764. {
  6765. strcpy(strGprsInf[num++],"SIM卡状态:正常");
  6766. }
  6767. else
  6768. {
  6769. strcpy(strGprsInf[num++],"SIM卡状态:异常");
  6770. }
  6771. if((pd[4]|(pd[5]<<8))==0x0001)
  6772. {
  6773. strcpy(strGprsInf[num++],"PPP拨号 :正常");
  6774. }
  6775. else
  6776. {
  6777. strcpy(strGprsInf[num++],"PPP拨号 :异常");
  6778. }
  6779. sprintf(strGprsInf[num++],"信号强度 :%2d",(pd[16]|(pd[17]<<8)));
  6780. // SIM卡IP
  6781. sprintf(strGprsInf[num++],"%d.%d.%d.%d",pd[36],pd[37],pd[38],pd[39]);
  6782. // CH1是否正常,端口是多少,IP1
  6783. if((pd[6]|(pd[7]<<8))==0x0001)
  6784. {
  6785. sprintf(strGprsInf[num++],"CH1:正常 %d",(pd[44]|(pd[45]<<8)));
  6786. }
  6787. else
  6788. {
  6789. sprintf(strGprsInf[num++],"CH1:异常 %d",(pd[44]|(pd[45]<<8)));
  6790. }
  6791. sprintf(strGprsInf[num++],"%d.%d.%d.%d",pd[40],pd[41],pd[42],pd[43]);
  6792. // CH2是否正常,端口是多少,IP2
  6793. if((pd[8]|(pd[9]<<8))==0x0001)
  6794. {
  6795. sprintf(strGprsInf[num++],"CH2:正常 %d",(pd[50]|(pd[51]<<8)));
  6796. }
  6797. else
  6798. {
  6799. sprintf(strGprsInf[num++],"CH2:异常 %d",(pd[50]|(pd[51]<<8)));
  6800. }
  6801. sprintf(strGprsInf[num++],"%d.%d.%d.%d",pd[46],pd[47],pd[48],pd[49]);
  6802. strcpy(strGprsInf[num++],"频段:自适应");
  6803. strcpy(strGprsInf[num++],"流量(秒):");
  6804. sprintf(strGprsInf[num++],"%d",(pd[26]|(pd[27]<<8)|(pd[28]<<16)|(pd[29]<<24)));
  6805. strcpy(strGprsInf[num++],"流量(B) :");
  6806. sprintf(strGprsInf[num++],"%d",(pd[30]|(pd[31]<<8)|(pd[32]<<16)|(pd[33]<<24)));
  6807. if((pd[14]|(pd[15]<<8))==0x0001)
  6808. {
  6809. strcpy(strGprsInf[num++],"重启状态:重启");
  6810. }
  6811. else
  6812. {
  6813. strcpy(strGprsInf[num++],"重启状态:未重启");
  6814. }
  6815. g_gprs_info_num = num;
  6816. return num;
  6817. }
  6818. int mmd_FreshTime(void)
  6819. {
  6820. struct timespec ts;
  6821. struct rtc_time_t rtc;
  6822. clk_time_get(&ts);
  6823. timespec_to_rtc(ts,&rtc,1);
  6824. m_ShowTime.year=rtc.year; //显示时间刷新
  6825. m_ShowTime.month=rtc.month;
  6826. m_ShowTime.day=rtc.day;
  6827. m_ShowTime.hour=rtc.hour;
  6828. m_ShowTime.min=rtc.min;
  6829. m_ShowTime.sec=rtc.ms/1000;
  6830. return M_OK;
  6831. }
  6832. extern unsigned int s_stat_get(int chnl,int type);
  6833. void mmd_freshmainunit(bool bfirst)
  6834. {
  6835. MAIN_IMAGE_DEF *pm=&g_tLcdComm.tImage;
  6836. int i;
  6837. u8 owner,index;
  6838. for(i=0;i<pm->sYxNum;i++) //遥信都转为双点处理
  6839. {
  6840. int val=0;
  6841. DWORD dotaddr;
  6842. bool bfresh=false;
  6843. D_UNIT_DEF *pu=&pm->tYxUnits[i];
  6844. owner=(u8)(pu->yx_di>>8);
  6845. index=(u8)(pu->yx_di>>0);
  6846. if(owner==0xFF) // 特殊遥信若充电标志等
  6847. {
  6848. if(index==1) // 0xff01 为充电标志
  6849. {
  6850. int sw;
  6851. bool bcd=false;
  6852. for(sw=0;sw<g_sw_num;sw++)
  6853. {
  6854. RUN_STU_SW *prun=&g_tRelay[sw].run_stu;
  6855. bcd|=(prun->goose_qccd||prun->goose_glcd||prun->goose_ll_cd);
  6856. }
  6857. val=((g_run_stu.cd>0)||bcd)?2:1;
  6858. }
  6859. }
  6860. else if(owner>=0x20) // 板卡遥信
  6861. {
  6862. val=dido_di_is_on(owner-0x20,index)+1;
  6863. }
  6864. else
  6865. {
  6866. val=GetRmtYxVal(owner,index);
  6867. }
  6868. if(bfirst)
  6869. {
  6870. bfresh=true;
  6871. }
  6872. else if(pu->yx_value!=val)
  6873. {
  6874. bfresh=true;
  6875. }
  6876. pu->yx_value=val;
  6877. if(bfresh)
  6878. {
  6879. dotaddr=pu->addr_open;
  6880. if(val==1)
  6881. {
  6882. dotaddr=pu->addr_open;
  6883. }
  6884. else if(val==2)
  6885. {
  6886. dotaddr=pu->addr_close;
  6887. }
  6888. else if(pu->yx_attrib!=0)
  6889. {
  6890. dotaddr=pu->addr_third;
  6891. }
  6892. lcd_DrawImage(pu->sx,pu->sy,&pm->pBuf[dotaddr],0); //主接线
  6893. }
  6894. }
  6895. for(i=0;i<pm->sYcNum;i++)
  6896. {
  6897. YC_UNIT_DEF *py=&pm->tYcUnits[i];
  6898. owner=(u8)(py->yc_di>>8);
  6899. index=(u8)(py->yc_di>>0);
  6900. if(owner==0xff) //特殊遥测,管理板使用
  6901. {
  6902. int chnl,type;
  6903. u32 ubytes=0;
  6904. float fbytes;
  6905. u8 fmtstr[20];
  6906. chnl=(index>>4)&0x0f;
  6907. type=(index)&0x0f;
  6908. if(chnl>COMM_CHANNEL_NUM)return;
  6909. ubytes=s_stat_get(chnl,type);
  6910. strcpy(fmtstr,"%*6uB");
  6911. if(ubytes>=10000)
  6912. {
  6913. fbytes=ubytes;
  6914. fbytes/=1024;
  6915. if(fbytes>=1000)
  6916. {
  6917. fbytes/=1024;
  6918. if(fbytes>=1000)
  6919. {
  6920. strcpy(fmtstr,"%*6.1fM");
  6921. }
  6922. else if(fbytes>=100)
  6923. {
  6924. strcpy(fmtstr,"%*6.2fM");
  6925. }
  6926. else if(fbytes>=10)
  6927. {
  6928. strcpy(fmtstr,"%*6.3fM");
  6929. }
  6930. else
  6931. {
  6932. strcpy(fmtstr,"%*6.4fM");
  6933. }
  6934. }
  6935. else
  6936. {
  6937. if(fbytes>=100)
  6938. {
  6939. strcpy(fmtstr,"%*6.2fK");
  6940. }
  6941. else if(fbytes>=10)
  6942. {
  6943. strcpy(fmtstr,"%*6.3fK");
  6944. }
  6945. }
  6946. fmt_Printf(py->sx/8,py->sy,MMI_FOCUS_ASC5_7,fmtstr,(void *)(&fbytes));
  6947. }
  6948. else
  6949. {
  6950. fmt_Printf(py->sx/8,py->sy,MMI_FOCUS_ASC5_7,fmtstr,(void *)(&ubytes));
  6951. }
  6952. }
  6953. else
  6954. {
  6955. float ycdata;
  6956. if(index==0)
  6957. {
  6958. ycdata=0;
  6959. }
  6960. else
  6961. {
  6962. ycdata=GetRmtMeaVal(owner,index-1,NULL)/65536.0;
  6963. }
  6964. fmt_Printf(py->sx/8,py->sy,MMI_FOCUS_ASC5_7,(char *)py->fmtstr,(void *)(&ycdata));
  6965. }
  6966. }
  6967. }
  6968. int mmd_freshmain(void)
  6969. {
  6970. mmd_freshmainunit(false);
  6971. return M_OK;
  6972. }
  6973. unsigned char m_LockIcon[2];
  6974. int mmd_mainimageKey(int key)
  6975. {
  6976. if(key==HA_KEY_ENTER) //
  6977. {
  6978. g_tLcdComm.bLock=!g_tLcdComm.bLock;
  6979. if(g_tLcdComm.bLock)m_LockIcon[0]='\1';
  6980. else m_LockIcon[0]=' ';
  6981. m_LockIcon[1]=0;
  6982. }
  6983. if(key==((g_tScreen.lcd_type==LCD_TYPE_6KEY)?HA_KEY_LEFT:HA_KEY_ESC)) // 老版本按键6键,左键为取消键
  6984. {
  6985. g_tLcdComm.bLock=false;
  6986. m_LockIcon[0]=' ';
  6987. m_LockIcon[1]=0;
  6988. }
  6989. return M_OK;
  6990. }
  6991. int mmd_ClearQUA(int value)
  6992. {
  6993. SaveUqua(true);
  6994. strcpy(m_WarningStr,"电压合格率清零");
  6995. return M_JUMP3;
  6996. }
  6997. int mmd_ClearIMP(int value)
  6998. {
  6999. int sw;
  7000. for(sw=0;sw<SWITCH_NUM_MAX;sw++)
  7001. {
  7002. g_sw[sw].ac_in[SW_AC_IN_IMP1]=0;
  7003. g_sw[sw].ac_in[SW_AC_IN_IMP2]=0;
  7004. }
  7005. strcpy(m_WarningStr,"脉冲计数值清零");
  7006. return M_JUMP3;
  7007. }
  7008. int mmd_FA_Unlock(int value)
  7009. {
  7010. g_run_stu.rmtjs= true;
  7011. #ifdef FUNC_ONLY_MMD_JS
  7012. g_run_stu.b_mmdjs= true;
  7013. #endif
  7014. strcpy(m_WarningStr,"FA闭锁解除");
  7015. return M_JUMP3;
  7016. }
  7017. int mmd_testKey(int key)
  7018. {
  7019. if(key==HA_KEY_LEFT) strcpy(m_WarningStr,"左键 ");
  7020. else if(key==HA_KEY_RIGHT) strcpy(m_WarningStr,"右键 ");
  7021. else if(key==HA_KEY_UP) strcpy(m_WarningStr,"上键 ");
  7022. else if(key==HA_KEY_DOWN) strcpy(m_WarningStr,"下键 ");
  7023. else if(key==HA_KEY_ENTER) strcpy(m_WarningStr,"确认键 ");
  7024. else if(key==HA_KEY_ESC) strcpy(m_WarningStr,"取消键 ");
  7025. else if(key==HA_KEY_RST) strcpy(m_WarningStr,"复归键 ");
  7026. else if(key==HA_KEY_ADD) strcpy(m_WarningStr,"加键 ");
  7027. else if(key==HA_KEY_SUB) strcpy(m_WarningStr,"减键 ");
  7028. else return M_JUMP0;
  7029. return M_OK;
  7030. }
  7031. int mmd_clearWarnStr(int val)
  7032. {
  7033. strcpy(m_WarningStr,"");
  7034. return M_OK;
  7035. }
  7036. int mmd_DIDOTest(int value)
  7037. {
  7038. char tmpbuf[8],tmpstr[4];
  7039. int i;
  7040. bool bs=false;
  7041. tmpbuf[0] = 1; // DO板卡
  7042. tmpbuf[1] = 1; // DI板卡
  7043. dido_auto_test(tmpbuf,1);
  7044. if(dido_buf[1]) // 开出异常
  7045. {
  7046. strcpy(m_WarningStr,"开出");
  7047. for(i=0;i<5;i++)
  7048. {
  7049. if((dido_buf[1]>>i)&0x01)
  7050. {
  7051. sprintf(tmpstr,"%d ",i+1);
  7052. strcat(m_WarningStr,tmpstr);
  7053. }
  7054. }
  7055. strcat(m_WarningStr,"异常");
  7056. return M_JUMP3;
  7057. }
  7058. strcpy(m_WarningStr,"开入");
  7059. if(dido_buf[6]) // 开如 1-8异常
  7060. {
  7061. bs=true;
  7062. for(i=0;i<8;i++)
  7063. {
  7064. if((dido_buf[6]>>i)&0x01)
  7065. {
  7066. sprintf(tmpstr,"%d ",i+1);
  7067. strcat(m_WarningStr,tmpstr);
  7068. if(strlen(m_WarningStr)>=15)
  7069. {
  7070. strcat(m_WarningStr,"异常");
  7071. return M_JUMP3;
  7072. }
  7073. }
  7074. }
  7075. }
  7076. if(dido_buf[7]) // 开如 1-8异常
  7077. {
  7078. bs=true;
  7079. for(i=0;i<8;i++)
  7080. {
  7081. if(((dido_buf[7]>>i)&0x01)&&bs)
  7082. {
  7083. sprintf(tmpstr,"%d ",i+9);
  7084. strcat(m_WarningStr,tmpstr);
  7085. if(strlen(m_WarningStr)>=15)
  7086. {
  7087. strcat(m_WarningStr,"异常");
  7088. return M_JUMP3;
  7089. }
  7090. }
  7091. }
  7092. }
  7093. if(dido_buf[8]) // 开如 1-8异常
  7094. {
  7095. bs=true;
  7096. for(i=0;i<8;i++)
  7097. {
  7098. if(((dido_buf[8]>>i)&0x01)&&bs)
  7099. {
  7100. sprintf(tmpstr,"%d ",i+17);
  7101. strcat(m_WarningStr,tmpstr);
  7102. if(strlen(m_WarningStr)>=15)
  7103. {
  7104. strcat(m_WarningStr,"异常");
  7105. return M_JUMP3;
  7106. }
  7107. }
  7108. }
  7109. }
  7110. if(bs)
  7111. {
  7112. strcat(m_WarningStr,"异常");
  7113. }
  7114. else
  7115. {
  7116. strcpy(m_WarningStr,"开入开出测试正常");
  7117. }
  7118. return M_JUMP3;
  7119. }
  7120. static void mmd_GetSetGroupValue(int i,DATA_FIELD_DEF *pF)
  7121. {
  7122. int index;
  7123. if(m_setgroup[i])
  7124. {
  7125. sprintf(pF->FmtStr,"%-16.16s 投",SetGroups[i].item_name);
  7126. }
  7127. else
  7128. {
  7129. sprintf(pF->FmtStr,"%-16.16s 退",SetGroups[i].item_name);
  7130. }
  7131. index=mmi_GetActiveFieldIndex();
  7132. sprintf(m_equipstr,"%s",SetGroups[index].group_name);
  7133. }
  7134. int mmd_RenewSetGroup(void)
  7135. {
  7136. mmd_RenewDataMenu(&g_tDataMenu1);
  7137. return M_OK;
  7138. }
  7139. int mmd_InitSetGroup(int value)
  7140. {
  7141. bool bret;
  7142. bret=ReadEppData(EEP_SETGROUP_ADDR,m_setgroup,GROUP_NUM);
  7143. if(!bret)
  7144. {
  7145. GetDefSetGroup(m_setgroup);
  7146. }
  7147. mmd_initDataMenu(&g_tDataMenu1,GROUP_NUM,mmd_RenewSetGroup,mmd_GetSetGroupValue,188,1);
  7148. return M_OK;
  7149. }
  7150. int mmd_ChangeSetGroup(int value)
  7151. {
  7152. int index=mmi_GetActiveFieldIndex();
  7153. if(m_setgroup[index])
  7154. {
  7155. m_setgroup[index]=0;
  7156. }
  7157. else
  7158. {
  7159. m_setgroup[index]=1;
  7160. }
  7161. mmd_RenewDataMenu(&g_tDataMenu1);
  7162. return M_OK;
  7163. }
  7164. int mmd_SaveSetGroup(int value)
  7165. {
  7166. SaveEppData(EEP_SETGROUP_ADDR,m_setgroup,GROUP_NUM);
  7167. return M_JUMP0;
  7168. }
  7169. WORD m_srcsection;
  7170. WORD m_dstsection;
  7171. WORD m_maxsection;
  7172. int mmd_changesection(int value)
  7173. {
  7174. #ifdef PUB_SET_SECTION
  7175. int i;
  7176. #endif
  7177. if(m_dstsection>=SEC_NUMBER||m_runsection==m_dstsection)
  7178. {
  7179. strcpy(m_WarningStr,"切换区号异常");
  7180. return M_JUMP3;
  7181. }
  7182. //切换定值区,重新初始化运行定值区
  7183. m_runsection=m_dstsection;
  7184. #ifdef PUB_SET_SECTION
  7185. for(i=0;i<SEC_NUMBER;i++)
  7186. {
  7187. /*读取公共定值*/
  7188. if(!ReadPara((void*)m_SetBuf,EEP_PUB_ADDR+PUB_SETSIZE*i,PUB_SET_NUMBER,&tPubSetTable[0]))
  7189. {
  7190. rt_err_set(ERR_CODE_SET_PUB,0);
  7191. GetDefPara((void*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
  7192. }
  7193. else
  7194. {
  7195. rt_err_clr(ERR_CODE_SET_PUB,0);
  7196. }
  7197. m_SetBuf[SET_SECTION].ff=m_dstsection;
  7198. SavePara((void *)m_SetBuf,EEP_PUB_ADDR+PUB_SETSIZE*i,PUB_SET_NUMBER,&tPubSetTable[0]);
  7199. if(i == m_runsection)
  7200. {
  7201. MakeRunSet(false);
  7202. }
  7203. }
  7204. #else
  7205. /*读取公共定值*/
  7206. if(!ReadPara((void*)m_SetBuf,EEP_PUB_ADDR,PUB_SET_NUMBER,&tPubSetTable[0]))
  7207. {
  7208. rt_err_set(ERR_CODE_SET_PUB,0);
  7209. GetDefPara((void*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
  7210. }
  7211. else
  7212. {
  7213. rt_err_clr(ERR_CODE_SET_PUB,0);
  7214. }
  7215. m_SetBuf[SET_SECTION].ff=m_dstsection;
  7216. SavePara((void *)m_SetBuf,EEP_PUB_ADDR,PUB_SET_NUMBER,&tPubSetTable[0]);
  7217. MakeRunSet(false);
  7218. #endif
  7219. return M_JUMP0;
  7220. }
  7221. int mmd_copysection(int value)
  7222. {
  7223. if(m_runsection==m_dstsection)
  7224. {
  7225. strcpy(m_WarningStr,"运行区不能复制");
  7226. return M_JUMP3;
  7227. }
  7228. if(m_dstsection>=SEC_NUMBER||m_srcsection>=SEC_NUMBER)
  7229. {
  7230. strcpy(m_WarningStr,"区号超出范围");
  7231. return M_JUMP3;
  7232. }
  7233. /*读取公共定值*/
  7234. if(!ReadPara((void*)m_SetBuf,EEP_SET_ADDR+(m_srcsection)*SETSIZE,SW_SET_NUMBER,&tSwSetTable[0]))
  7235. {
  7236. strcpy(m_WarningStr,"源定值区读取错误");
  7237. return M_JUMP3;
  7238. }
  7239. SavePara((void*)m_SetBuf,EEP_SET_ADDR+(m_dstsection)*SETSIZE,SW_SET_NUMBER,&tSwSetTable[0]);
  7240. strcpy(m_WarningStr,"定值区复制成功");
  7241. return M_JUMP3;
  7242. }
  7243. int mmd_initSection(int value)
  7244. {
  7245. m_maxsection=(SEC_NUMBER-1);
  7246. m_srcsection=m_runsection;
  7247. m_dstsection=m_runsection+1;
  7248. if(m_dstsection>=SEC_NUMBER)m_dstsection=0;
  7249. return M_OK;
  7250. }
  7251. int _Run61850(void)
  7252. {
  7253. int ret=0;
  7254. //char *envp[] = { NULL };
  7255. //char *cmd[] = {"/app/fs61850.ko", "&", NULL}; //调用shell脚本,关闭对应端口
  7256. //ret=call_usermodehelper("/app/fs61850.ko", cmd, envp, UMH_WAIT_PROC);
  7257. //rt_printf("\r\n run 61850 ret=%d\r\n",ret);
  7258. return ret;
  7259. }
  7260. static bool b61850run=true;
  7261. int _Stop61850(void)
  7262. {
  7263. int ret=0;
  7264. //char *envp[] = { NULL };
  7265. //char *cmd[] = {"/usr/bin/killall", "fs61850.ko", NULL}; //调用shell脚本,关闭对应端口
  7266. //ret=call_usermodehelper("/usr/bin/killall", cmd, envp, UMH_WAIT_PROC);
  7267. //rt_printf("\r\nkillall 61850 ret=%d\r\n",ret);
  7268. return ret;
  7269. }
  7270. int mmd_Stop61850(int value)
  7271. {
  7272. int ret=0;
  7273. if(b61850run)
  7274. {
  7275. ret=_Stop61850();
  7276. sprintf(m_WarningStr,"停止61850库ret=%d",ret);
  7277. }
  7278. else
  7279. {
  7280. //ret=_Run61850();
  7281. sprintf(m_WarningStr,"装置重启/",ret);
  7282. watchdog_reset_cpu(2);
  7283. }
  7284. b61850run=!b61850run;
  7285. return M_JUMP3;
  7286. }
  7287. static void mmd_getmenumea(u8 *buf)
  7288. {
  7289. u8 str[128];
  7290. u8 str1[128];
  7291. int len,i;
  7292. int index=-1;
  7293. len=iec_findchardot(buf,str);
  7294. if(len==0)return;
  7295. if(strcmp(str,"MEA")==0) //测量值
  7296. {
  7297. buf+=len+1;
  7298. len=iec_findchardot(buf,str);
  7299. if(len==0)return;
  7300. for(i=0;i<SW_AC_NUM_ALL;i++)
  7301. {
  7302. if(strcmp(str,g_sw_ac_desc[i].name)==0)
  7303. {
  7304. index=i;
  7305. break;
  7306. }
  7307. }
  7308. if(index==-1)
  7309. {
  7310. for(i=0;i<PUB_AC_NUM_ALL;i++)
  7311. {
  7312. if(strcmp(str,g_pub_ac_desc[i].name)==0)
  7313. {
  7314. index=SW_AC_MENU_NUM+i;
  7315. break;
  7316. }
  7317. }
  7318. }
  7319. if(index>=0)
  7320. {
  7321. int j;
  7322. buf+=len+1;
  7323. len=iec_findchardot(buf,str1);
  7324. if(len==0)return;
  7325. j=strtoul(str1,NULL,10);
  7326. //j=strtoul(buf,NULL,10);
  7327. if(j>0)
  7328. {
  7329. j-=1;
  7330. if(j>=MEA_MENU_MAX)return;
  7331. tMenuMea.index[j]=index;
  7332. tMenuMea.num++;
  7333. }
  7334. }
  7335. }
  7336. }
  7337. //#ifdef YPARA_LINK
  7338. void print_yparatable(void)
  7339. {
  7340. int i=0;
  7341. if(ParaIDNum >0) rt_printf("-------ParaIDNum=%d\r\n",ParaIDNum);
  7342. for(i=0;i<ParaIDNum;i++)
  7343. {
  7344. if(i%50 == 0) msleep(500);
  7345. if(tParaID[i].link_ch == 0)
  7346. {
  7347. rt_printf("local----parId = %x,group_type=%d,setno = %d\r\n ",tParaID[i].parId,tParaID[i].group_type,tParaID[i].setno);
  7348. }
  7349. else
  7350. {
  7351. rt_printf("link----link_ch = %d,parId=%x,link_cp = %x\r\n ",tParaID[i].link_ch,tParaID[i].parId,tParaID[i].link_cp);
  7352. }
  7353. }
  7354. }
  7355. /*获取通道号类型*/
  7356. int get_chnl_index(char *name)
  7357. {
  7358. int val = 0;
  7359. if(strcmp(name,"网络")==0) /*本地,不级联*/
  7360. {
  7361. val = LINK_NET;
  7362. }
  7363. else if(strstr(name,"串口")) /*本地,不级联*/
  7364. {
  7365. sscanf(name, "串口%d", &val); /*数据长度*/
  7366. if(val >= (CFG_UART_NUM_MAX+1)) return -1;
  7367. val += 1;
  7368. }
  7369. return val;
  7370. }
  7371. //#endif
  7372. static void mmd_getmenuset(u8 *buf)
  7373. {
  7374. u8 str[128],str1[128],str2[128],strpara[128];
  7375. int val_rd_only=0;
  7376. int len,i;
  7377. int val;
  7378. u32 paraid,chnl=0,index=0,link_cp=0;
  7379. //rt_printf("-----------------\r\n");
  7380. len=iec_findchardot(buf,str);
  7381. if(len==0)return;
  7382. if(strcmp(str,"SET")==0) //定值
  7383. {
  7384. buf+=len+1;
  7385. len=iec_findchardot(buf,str);
  7386. if(len==0)return;
  7387. buf+=len+1;
  7388. len=iec_findchardot(buf,str1);
  7389. if(len==0)return;
  7390. buf+=len+1;
  7391. len=iec_findchardot(buf,str2);
  7392. if(len==0)return;
  7393. buf+=len+1;
  7394. len=iec_findchardot(buf,strpara);
  7395. if(len==0)return;
  7396. val=strtoul(strpara,NULL,10);
  7397. //rt_printf("val=%d,len=%d\r\n",val,len);
  7398. buf+=len+1;
  7399. len=iec_findchardot(buf,strpara); //通信点号
  7400. if(len==0)return;
  7401. paraid=strtoul(strpara,NULL,16);
  7402. buf+=len+1;
  7403. /*兼容老lcd,没相关字段不return,默认为0*/
  7404. len=iec_findchardot(buf,strpara); //只读
  7405. if(len > 0)
  7406. {
  7407. val_rd_only = strtoul(strpara,NULL,10);
  7408. buf+=len+1;
  7409. }
  7410. len=iec_findchardot(buf,strpara); /*级联通道*/
  7411. if(len > 0)
  7412. {
  7413. chnl = get_chnl_index(strpara);
  7414. buf+=len+1;
  7415. }
  7416. len=iec_findchardot(buf,strpara); /*级联序号*/
  7417. if(len > 0)
  7418. {
  7419. index=strtoul(strpara,NULL,10);
  7420. buf+=len+1;
  7421. }
  7422. len=iec_findchardot(buf,strpara);
  7423. if(len > 0)
  7424. {
  7425. link_cp=strtoul(strpara,NULL,16); /*级联点号*/
  7426. buf+=len+1;
  7427. }
  7428. //if(paraid > 0)
  7429. //{
  7430. //rt_printf("paraid=%x,val_rd_only=%x,chnl=%x,index=%x,link_cp=%x\r\n",paraid,val_rd_only,chnl,index,link_cp);
  7431. //}
  7432. //len=iec_findchardot(buf,strpara); /*级联点号*/
  7433. //if(len==0)return;
  7434. if((chnl == 0) && (index == 0))
  7435. {
  7436. for(i=0;i<SET_PUB_NUM;i++)
  7437. {
  7438. if((strcmp(str,tPubSetTable[i].szName)==0)&&(strcmp(str1,SetGroups[tPubSetTable[i].group].group_name)==0)&&(strcmp(str2,SetGroups[tPubSetTable[i].group].item_name)==0))
  7439. {
  7440. bPubSetMenuShow[i]=val;
  7441. if((paraid>0) && (ParaIDNum <MAX_SET_NUMBER)) // 定值参数修改的点号
  7442. {
  7443. tParaID[ParaIDNum].group_type=SETGROUP_TYPE_PUB;
  7444. tParaID[ParaIDNum].parId=paraid;
  7445. if(val_rd_only) tParaID[ParaIDNum].b_rd_only = true;
  7446. tParaID[ParaIDNum].setno=i;
  7447. tParaID[ParaIDNum].link_ch = (chnl<<5) + (index&0x1F);
  7448. ParaIDNum++;
  7449. }
  7450. return;
  7451. }
  7452. }
  7453. for(i=0;i<SET_NUM;i++)
  7454. {
  7455. if((strcmp(str,tSwSetTable[i].szName)==0)&&(strcmp(str1,SetGroups[tSwSetTable[i].group].group_name)==0)&&(strcmp(str2,SetGroups[tSwSetTable[i].group].item_name)==0))
  7456. {
  7457. bSwSetMenuShow[i]=val;
  7458. if((paraid>0) && (ParaIDNum <MAX_SET_NUMBER)) // 定值参数修改的点号
  7459. {
  7460. tParaID[ParaIDNum].group_type=SETGROUP_TYPE_BH;
  7461. tParaID[ParaIDNum].parId=paraid;
  7462. if(val_rd_only) tParaID[ParaIDNum].b_rd_only = true;
  7463. tParaID[ParaIDNum].setno=i;
  7464. tParaID[ParaIDNum].link_ch = (chnl<<5) + (index&0x1F);
  7465. ParaIDNum++;
  7466. }
  7467. return;
  7468. }
  7469. }
  7470. for(i=0;i<PARA_NUM;i++)
  7471. {
  7472. if((strcmp(str,tEquipParaTable[i].szName)==0)&&(strcmp(str1,SetGroups[tEquipParaTable[i].group].group_name)==0)&&(strcmp(str2,SetGroups[tEquipParaTable[i].group].item_name)==0))
  7473. {
  7474. bParaSetMenuShow[i]=val;
  7475. if((paraid>0) && (ParaIDNum <MAX_SET_NUMBER)) // 定值参数修改的点号
  7476. {
  7477. tParaID[ParaIDNum].group_type=SETGROUP_TYPE_PARA;
  7478. tParaID[ParaIDNum].parId=paraid;
  7479. if(val_rd_only) tParaID[ParaIDNum].b_rd_only = true;
  7480. tParaID[ParaIDNum].setno=i;
  7481. tParaID[ParaIDNum].link_ch = (chnl<<5) + (index&0x1F);
  7482. ParaIDNum++;
  7483. }
  7484. return;
  7485. }
  7486. }
  7487. for(i=0;i<CSTSET_NUM;i++)
  7488. {
  7489. if((strcmp(str,tCstSetTable[i].szName)==0)&&(strcmp(str1,SetGroups[tCstSetTable[i].group].group_name)==0)&&(strcmp(str2,SetGroups[tCstSetTable[i].group].item_name)==0))
  7490. {
  7491. bCstSetMenuShow[i]=val;
  7492. if((paraid>0) && (ParaIDNum <MAX_SET_NUMBER)) // 定值参数修改的点号
  7493. {
  7494. tParaID[ParaIDNum].group_type=SETGROUP_TYPE_CSTSET;
  7495. tParaID[ParaIDNum].parId=paraid;
  7496. tParaID[ParaIDNum].setno=i;
  7497. tParaID[ParaIDNum].link_ch = (chnl<<5) + (index&0x1F);
  7498. ParaIDNum++;
  7499. }
  7500. return;
  7501. }
  7502. }
  7503. }
  7504. else
  7505. {
  7506. if((paraid>0) && (ParaIDNum <MAX_SET_NUMBER)) // 定值参数修改的点号
  7507. {
  7508. tParaID[ParaIDNum].parId=paraid;
  7509. tParaID[ParaIDNum].link_ch = (chnl<<5) + (index&0x1F);
  7510. tParaID[ParaIDNum].link_cp = link_cp;
  7511. ParaIDNum++;
  7512. }
  7513. }
  7514. }
  7515. }
  7516. bool g_bVipSoe_show;
  7517. static void mmd_getmenuSoeShow(u8 *buf)
  7518. {
  7519. u8 str[128];
  7520. u8 str1[128];
  7521. int len;
  7522. int val;
  7523. len=iec_findchardot(buf,str);
  7524. if(len==0)return;
  7525. if(strcmp(str,"EVENT_SHOW")==0) // 关键记录显示定义
  7526. {
  7527. buf+=len+1;
  7528. len=iec_findchardot(buf,str);
  7529. if(len==0)return;
  7530. buf+=len+1;
  7531. len=iec_findchardot(buf,str1);
  7532. if(len==0)return;
  7533. val=strtoul(str1,NULL,10);
  7534. //val=strtoul(buf,NULL,10);
  7535. if(val==0)
  7536. {
  7537. g_bVipSoe_show=false;
  7538. return;
  7539. }
  7540. }
  7541. }
  7542. #ifdef FUNC_YT_HARD_YB
  7543. const short sw_yt_hard_yb_index[]=
  7544. {
  7545. SW_DI_BHZTT, // 保护总功能投退压板
  7546. SW_DI_BHTT, // 常规保护投退压板
  7547. SW_DI_CHZ, // 重合闸压板
  7548. SW_DI_FA_TT, // 就地FA压板
  7549. SW_DI_FA_GOOSE, //智能FA压板
  7550. SW_DI_FA_LS, //联络/分段模式
  7551. SW_DI_SAFE_AUTO, //安全自动控制
  7552. };
  7553. const int YT_SW_HARD_YB_NUM = (sizeof(sw_yt_hard_yb_index)/sizeof(sw_yt_hard_yb_index[0]));
  7554. const short pub_yt_hard_yb_index[]=
  7555. {
  7556. PUB_DI_JX, //检修压板
  7557. PUB_DI_YF, // 远方
  7558. PUB_DI_JD, // 就地
  7559. };
  7560. const int YT_PUB_HARD_YB_NUM = (sizeof(pub_yt_hard_yb_index)/sizeof(pub_yt_hard_yb_index[0]));
  7561. #ifdef FUNC_YT_MIX
  7562. u32 tHardYBID[SW_DI_NUM+PUB_DI_NUM+MIX_YT_NUM];
  7563. #else
  7564. u32 tHardYBID[SW_DI_NUM+PUB_DI_NUM];
  7565. #endif
  7566. static void mmd_getmenuHardYB(u8 *buf)
  7567. {
  7568. u8 str[128];
  7569. u8 str1[128];
  7570. int len;
  7571. int i;
  7572. u32 paraid=0;
  7573. len=iec_findchardot(buf,str);
  7574. if(len==0)return;
  7575. if(strcmp(str,"HARD_YB")==0)
  7576. {
  7577. buf+=len+1;
  7578. len=iec_findchardot(buf,str);
  7579. if(len==0)return;
  7580. buf+=len+1;
  7581. len=iec_findchardot(buf,str1);
  7582. if(len==0)return;
  7583. paraid=strtoul(str1,NULL,16);
  7584. //paraid=strtoul(buf,NULL,16);
  7585. }
  7586. for(i=0;i<YT_SW_HARD_YB_NUM;i++)
  7587. {
  7588. if(strcmp(str,g_sw_di_name[sw_yt_hard_yb_index[i]])==0)
  7589. {
  7590. if(paraid>0)
  7591. {
  7592. tHardYBID[i] = paraid;
  7593. }
  7594. return;
  7595. }
  7596. }
  7597. for(i=0;i<YT_PUB_HARD_YB_NUM;i++)
  7598. {
  7599. if(strcmp(str,g_pub_di_name[pub_yt_hard_yb_index[i]])==0)
  7600. {
  7601. if(paraid>0)
  7602. {
  7603. tHardYBID[YT_SW_HARD_YB_NUM+i] = paraid;
  7604. }
  7605. return;
  7606. }
  7607. }
  7608. #ifdef FUNC_YT_MIX
  7609. for(i=0;i<MIX_YT_NUM;i++)
  7610. {
  7611. if(strcmp(str,mix_yt_index[i])==0)
  7612. {
  7613. if(paraid>0)
  7614. {
  7615. tHardYBID[YT_SW_HARD_YB_NUM+YT_PUB_HARD_YB_NUM+i] = paraid;
  7616. }
  7617. return;
  7618. }
  7619. }
  7620. #endif
  7621. }
  7622. #endif
  7623. int mmd_menu_cfg_init(void)
  7624. {
  7625. u32 i,file_length;
  7626. struct file * pfile;
  7627. u8 *filebuf;
  7628. u8 filestr[128],*pstr,strlenth;
  7629. loff_t pos;
  7630. tMenuMea.num=0;
  7631. memset(bPubSetMenuShow,1,SET_PUB_NUM);
  7632. memset(bSwSetMenuShow,1,SET_NUM);
  7633. memset(bParaSetMenuShow,1,PARA_NUM);
  7634. memset(bCstSetMenuShow,1,CSTSET_NUM);
  7635. memset(&tParaID[0],0,sizeof(SET_PARAID)*MAX_SET_NUMBER);
  7636. #ifdef FUNC_YT_HARD_YB
  7637. #ifdef FUNC_YT_MIX
  7638. memset(tHardYBID,0,(SW_DI_NUM+PUB_DI_NUM+MIX_YT_NUM));
  7639. #else
  7640. memset(tHardYBID,0,(SW_DI_NUM+PUB_DI_NUM));
  7641. #endif
  7642. #endif
  7643. ParaIDNum=0;
  7644. #ifdef YPARA_LINK
  7645. memset(&tPara_val[0],0,sizeof(SET_PARA_VAL)*MAX_SET_NUMBER);
  7646. #endif
  7647. g_bVipSoe_show=true;
  7648. // 打开文件
  7649. pfile = rt_file_open("/app/data/lcd_menu.csv",O_RDONLY ,0);
  7650. if(IS_ERR(pfile))
  7651. {
  7652. dp_err_n_c_rt("无法打开 lcd_menu.csv,新建...\r\n");
  7653. mmd_create_menufile();
  7654. pfile = rt_file_open("/app/data/lcd_menu.csv",O_RDONLY ,0);
  7655. if(IS_ERR(pfile))
  7656. return -1;
  7657. }
  7658. // 得到文件长度
  7659. file_length = rt_file_getfile_size(pfile);
  7660. if(file_length <= 0)
  7661. {
  7662. rt_file_close(pfile,0);
  7663. return -2;
  7664. }
  7665. // 分配内存
  7666. filebuf = rt_malloc(file_length);
  7667. if((filebuf) == NULL)
  7668. {
  7669. rt_file_close(pfile,0);
  7670. return -3;
  7671. }
  7672. pos = 0;
  7673. if(rt_file_read(pfile,filebuf,file_length,&pos) != file_length)
  7674. {
  7675. rt_file_close(pfile,0);
  7676. rt_free(filebuf);
  7677. return -4;
  7678. }
  7679. pstr = filestr;
  7680. strlenth=0; // 纠错处理
  7681. //找到\r\n位置,得到一行长度
  7682. for(i = 0; i < file_length; i++)
  7683. {
  7684. *pstr++=filebuf[i];
  7685. strlenth++;
  7686. if(filebuf[i] == 0x0a||strlenth>=128)
  7687. {
  7688. pstr-=2; // 去掉回车换行
  7689. *pstr++=','; //增加逗号
  7690. *pstr='\0';
  7691. mmd_getmenumea(filestr);
  7692. mmd_getmenuset(filestr);
  7693. mmd_getmenuSoeShow(filestr);
  7694. #ifdef FUNC_YT_HARD_YB
  7695. mmd_getmenuHardYB(filestr);
  7696. #endif
  7697. pstr=filestr;
  7698. strlenth=0;
  7699. }
  7700. }
  7701. #if 0
  7702. print_yparatable();
  7703. #endif
  7704. rt_file_close(pfile,0); // 关闭文件
  7705. rt_free(filebuf); // 释放内存
  7706. #if 0
  7707. //打印调试信息
  7708. for(i=0;i<tMenuMea.num;i++)
  7709. {
  7710. if(tMenuMea.index[i])rt_printf("\r\nMEA%d index=%d",i+1,tMenuMea.index[i]);
  7711. }
  7712. for(i=0;i<SET_PUB_NUM;i++)
  7713. {
  7714. if(bPubSetMenuShow[i]&&(tPubSetTable[i].wType!=SETTYPE_LABEL))rt_printf("\r\n%s ",tPubSetTable[i].szName);
  7715. }
  7716. for(i=0;i<SET_NUM;i++)
  7717. {
  7718. if(bSwSetMenuShow[i]&&(tSwSetTable[i].wType!=SETTYPE_LABEL)) rt_printf("\r\n%s ",tSwSetTable[i].szName);
  7719. }
  7720. for(i=0;i<ParaIDNum;i++)
  7721. {
  7722. if(tParaID[i].group_type==SETGROUP_TYPE_PUB)
  7723. {
  7724. rt_printf("\r\n%s %04x :%d",tPubSetTable[tParaID[i].setno].szName, tParaID[i].parId,tParaID[i].setno);
  7725. }
  7726. }
  7727. for(i=0;i<ParaIDNum;i++)
  7728. {
  7729. if(tParaID[i].group_type==SETGROUP_TYPE_BH)
  7730. {
  7731. rt_printf("\r\n%s %04x :%d",tSwSetTable[tParaID[i].setno].szName, tParaID[i].parId,tParaID[i].setno);
  7732. }
  7733. }
  7734. for(i=0;i<ParaIDNum;i++)
  7735. {
  7736. if(tParaID[i].group_type==SETGROUP_TYPE_PARA)
  7737. {
  7738. rt_printf("\r\n%s %04x :%d",tEquipParaTable[tParaID[i].setno].szName, tParaID[i].parId,tParaID[i].setno);
  7739. }
  7740. }
  7741. #endif
  7742. return 0;
  7743. }
  7744. void mmd_create_menufile(void)
  7745. {
  7746. char *p;
  7747. char tmpbuf[128];
  7748. struct file * pfile;
  7749. loff_t pos;
  7750. int i;
  7751. WORD addr=0;
  7752. p=tmpbuf;
  7753. // 创建描述文件
  7754. pfile = rt_file_open("/app/data/lcd_menu.csv",O_CREAT|O_RDWR|O_TRUNC,0);
  7755. if(IS_ERR(pfile))
  7756. {
  7757. return ;
  7758. }
  7759. pos = 0;
  7760. for(i=0;i<SW_AC_MENU_NUM;i++)
  7761. {
  7762. sprintf(p,"MEA,%s,0\r\n",g_sw_ac_desc[i].name);
  7763. rt_file_write(pfile,p,strlen(p),&pos);
  7764. }
  7765. for(i=0;i<PUB_AC_MENU_NUM;i++)
  7766. {
  7767. sprintf(p,"MEA,%s,0\r\n",g_pub_ac_desc[i].name);
  7768. rt_file_write(pfile,p,strlen(p),&pos);
  7769. }
  7770. sprintf(p,"my_set_desc,名称,组名,分组名,液晶显示,通信点号,只读,级联通道,级联地址,级联点号\r\n");
  7771. rt_file_write(pfile,p,strlen(p),&pos);
  7772. for(i=0;i<PUB_SET_NUMBER;i++)
  7773. {
  7774. //if(tPubSetTable[i].wType!=SETTYPE_LABEL)
  7775. {
  7776. addr = GetCstValForwardAddr(SETGROUP_TYPE_PUB,i);
  7777. sprintf(p,"SET,%s,%s,%s,1,0x%x,0,0,0,0\r\n",tPubSetTable[i].szName,SetGroups[tPubSetTable[i].group].group_name,SetGroups[tPubSetTable[i].group].item_name,addr);
  7778. rt_file_write(pfile,p,strlen(p),&pos);
  7779. }
  7780. }
  7781. for(i=0;i<SW_SET_NUMBER;i++)
  7782. {
  7783. //if(tSwSetTable[i].wType!=SETTYPE_LABEL)
  7784. {
  7785. addr = GetCstValForwardAddr(SETGROUP_TYPE_BH,i);
  7786. sprintf(p,"SET,%s,%s,%s,1,0x%x,0,0,0,0\r\n",tSwSetTable[i].szName,SetGroups[tSwSetTable[i].group].group_name,SetGroups[tSwSetTable[i].group].item_name,addr);
  7787. rt_file_write(pfile,p,strlen(p),&pos);
  7788. }
  7789. }
  7790. for(i=0;i<EQUIP_PARA_NUMBER;i++)
  7791. {
  7792. //if(tEquipParaTable[i].wType!=SETTYPE_LABEL)
  7793. {
  7794. addr = GetCstValForwardAddr(SETGROUP_TYPE_PARA,i);
  7795. sprintf(p,"SET,%s,%s,%s,1,0x%x,0,0,0,0\r\n",tEquipParaTable[i].szName,SetGroups[tEquipParaTable[i].group].group_name,SetGroups[tEquipParaTable[i].group].item_name,addr);
  7796. rt_file_write(pfile,p,strlen(p),&pos);
  7797. }
  7798. }
  7799. for(i=0;i<CSTSET_NUMBER;i++)
  7800. {
  7801. //if(tEquipParaTable[i].wType!=SETTYPE_LABEL)
  7802. {
  7803. addr = GetCstValForwardAddr(SETGROUP_TYPE_CSTSET,i);
  7804. sprintf(p,"SET,%s,%s,%s,1,0x%x,0,0,0,0\r\n",tCstSetTable[i].szName,SetGroups[tCstSetTable[i].group].group_name,SetGroups[tCstSetTable[i].group].item_name,addr);
  7805. rt_file_write(pfile,p,strlen(p),&pos);
  7806. }
  7807. }
  7808. strcpy(p,"EVENT_SHOW,SOE弹出关键记录,1\r\n");
  7809. rt_file_write(pfile,p,strlen(p),&pos);
  7810. #ifdef FUNC_YT_HARD_YB
  7811. for(i=0;i<YT_SW_HARD_YB_NUM;i++)
  7812. {
  7813. sprintf(p,"HARD_YB,%s,0x0000\r\n",g_sw_di_name[sw_yt_hard_yb_index[i]]);
  7814. rt_file_write(pfile,p,strlen(p),&pos);
  7815. }
  7816. for(i=0;i<YT_PUB_HARD_YB_NUM;i++)
  7817. {
  7818. sprintf(p,"HARD_YB,%s,0x0000\r\n",g_pub_di_name[pub_yt_hard_yb_index[i]]);
  7819. rt_file_write(pfile,p,strlen(p),&pos);
  7820. }
  7821. #ifdef FUNC_YT_MIX
  7822. for(i=0;i<MIX_YT_NUM;i++)
  7823. {
  7824. sprintf(p,"HARD_YB,%s,0x0000\r\n",mix_yt_index[i]);
  7825. rt_file_write(pfile,p,strlen(p),&pos);
  7826. }
  7827. #endif
  7828. #endif
  7829. rt_file_close(pfile,0);
  7830. return ;
  7831. }
  7832. #ifdef FUN_SET_CHANGE_SOE
  7833. void log_operate_set_change(const TSETTABLE *pTable,u16 setno,long v1,long v2)
  7834. {
  7835. char namestr[128];
  7836. char tmpstr[64];
  7837. SET_VALUE ft;
  7838. sprintf(namestr,"%s(%s)",pTable->szName,SetGroups[pTable->group].item_name);
  7839. switch(pTable->wType)
  7840. {
  7841. case SETTYPE_F:
  7842. ft.tt=v1;
  7843. sprintf(tmpstr,"由:%.3f",ft.ff);
  7844. strcat(namestr,tmpstr);
  7845. ft.tt=v2;
  7846. sprintf(tmpstr,"改:%.3f",ft.ff);
  7847. strcat(namestr,tmpstr);
  7848. break;
  7849. case SETTYPE_UINT: //16进制显示 控制字
  7850. case SETTYPE_4INT: //10进制显示 4位
  7851. case SETTYPE_5INT: //10进制显示 5位
  7852. case SETTYPE_LINT: //16进制显示 控制字
  7853. ft.tt=v1;
  7854. sprintf(tmpstr,"由:%d",(u16)ft.tt);
  7855. strcat(namestr,tmpstr);
  7856. ft.tt=v2;
  7857. sprintf(tmpstr,"改:%d",(u16)ft.tt);
  7858. strcat(namestr,tmpstr);
  7859. break;
  7860. case SETTYPE_LIST: //列表选择
  7861. {
  7862. ft.tt=v1;
  7863. sprintf(tmpstr,"由:%s", pTable->list[(u16)ft.tt].str);
  7864. strcat(namestr,tmpstr);
  7865. ft.tt=v2;
  7866. sprintf(tmpstr,"改:%s", pTable->list[(u16)ft.tt].str);
  7867. strcat(namestr,tmpstr);
  7868. }
  7869. break;
  7870. case SETTYPE_IP:
  7871. {
  7872. u32 dat;
  7873. ft.tt=v1;
  7874. dat=(u32)ft.tt;
  7875. sprintf(tmpstr,"由:%d.%d.%d.%d", (dat>>24)&0xFF, (dat>>16)&0xFF, (dat>>8)&0xFF, (dat>>0)&0xFF);
  7876. strcat(namestr,tmpstr);
  7877. ft.tt=v2;
  7878. dat=(u32)ft.tt;
  7879. sprintf(tmpstr,"改:%d.%d.%d.%d", (dat>>24)&0xFF, (dat>>16)&0xFF, (dat>>8)&0xFF, (dat>>0)&0xFF);
  7880. strcat(namestr,tmpstr);
  7881. }
  7882. break;
  7883. case SETTYPE_YMD:
  7884. {
  7885. struct timespec ts;
  7886. struct rtc_time_t tTime;
  7887. memset(&ts, 0, sizeof(ts));
  7888. memset(&tTime, 0, sizeof(tTime));
  7889. ft.tt=v1;
  7890. ts.tv_sec = (long)ft.tt;
  7891. timespec_to_rtc(ts,&tTime,1);
  7892. sprintf(tmpstr,"由:%04d-%02d-%02d", 2000+tTime.year, tTime.month, tTime.day);
  7893. strcat(namestr,tmpstr);
  7894. ft.tt=v2;
  7895. ts.tv_sec = (long)ft.tt;
  7896. timespec_to_rtc(ts,&tTime,1);
  7897. sprintf(tmpstr,"改:%04d-%02d-%02d", 2000+tTime.year, tTime.month, tTime.day);
  7898. strcat(namestr,tmpstr);
  7899. }
  7900. break;
  7901. case SETTYPE_HMS:
  7902. {
  7903. struct timespec ts;
  7904. struct rtc_time_t tTime;
  7905. extern int timespec_to_rtchms(struct timespec ts, struct rtc_time_t * p_rtc,int is_round);
  7906. memset(&ts, 0, sizeof(ts));
  7907. memset(&tTime, 0, sizeof(tTime));
  7908. ft.tt=v1;
  7909. ts.tv_sec = (long)ft.tt;
  7910. timespec_to_rtchms(ts,&tTime,1);
  7911. sprintf(tmpstr,"由:%02d:%02d:%02d", tTime.hour, tTime.min, tTime.ms%1000);
  7912. strcat(namestr,tmpstr);
  7913. memset(&ts, 0, sizeof(ts));
  7914. memset(&tTime, 0, sizeof(tTime));
  7915. ft.tt=v2;
  7916. ts.tv_sec = (long)ft.tt;
  7917. timespec_to_rtchms(ts,&tTime,1);
  7918. sprintf(tmpstr," 改为:%02d:%02d:%02d", tTime.hour, tTime.min, tTime.ms%1000);
  7919. strcat(namestr,tmpstr);
  7920. }
  7921. default:
  7922. return;
  7923. }
  7924. log_str_time(LOG_OPERATE,namestr,0,0);
  7925. }
  7926. void para_change_check_soe(float *pf,DWORD wAddr,WORD num,const TSETTABLE *pTable)
  7927. {
  7928. SET_VALUE *pbuf;
  7929. int i;
  7930. pbuf = rt_malloc(MAX_SET_NUMBER*4);
  7931. if(!pbuf)
  7932. {
  7933. rt_printf("\r\npara_change_check_soe 定值变化检查,分配缓存失败!\r\n");
  7934. return;
  7935. }
  7936. if(!ReadPara((void*)pbuf,wAddr,num,pTable))
  7937. {
  7938. GetDefPara((void*)pbuf,num,pTable);
  7939. }
  7940. for(i=0;i<num;i++)
  7941. {
  7942. SET_VALUE ft,fval;
  7943. long v0=0;
  7944. if(pTable==(&tPubSetTable[0])) //公共定值
  7945. {
  7946. v0=(1<<16)|i;
  7947. }
  7948. else if(pTable==(&tSwSetTable[0])) //开关定值
  7949. {
  7950. v0=(2<<16)|i;
  7951. }
  7952. else if(pTable==(&tEquipParaTable[0])) //参数定值
  7953. {
  7954. v0=(3<<16)|i;
  7955. }
  7956. else if(pTable==(&tCstSetTable[0])) //内部定值
  7957. {
  7958. v0=(4<<16)|i;
  7959. }
  7960. if(mmd_IsHexType(pTable[i].wType))
  7961. {
  7962. u32 *pt;
  7963. pt=(u32*)(&pf[i]);
  7964. ft.tt=(u32)*pt;
  7965. fval.tt=(u32)(pbuf[i].tt);
  7966. }
  7967. else if (mmd_IsIntegType(pTable[i].wType))
  7968. {
  7969. ft.tt=(u32)pf[i];
  7970. fval.tt=(u32)pbuf[i].ff;
  7971. }
  7972. else
  7973. {
  7974. ft.ff=pf[i];
  7975. fval.ff=pbuf[i].ff;
  7976. }
  7977. if(ft.tt!=fval.tt)
  7978. {
  7979. soe_record_opt3(EV_SET_CHANGE_PARA,v0,fval.tt,ft.tt);
  7980. log_operate_set_change(&pTable[i],i,fval.tt,ft.tt);
  7981. }
  7982. }
  7983. rt_free(pbuf);
  7984. }
  7985. #endif