ControlSystem.c 217 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843
  1. /*--------------------------------------------------------------------------------------
  2. * @file ControlSystem.c
  3. * @author ZhangJing
  4. * @version base on stm32f0x
  5. * @date 2015.09.11
  6. * @brief 整个系统的控制动作及策略
  7. ---------------------------------------------------------------------------------------*/
  8. #include <string.h>
  9. #include "stm32f10x_gpio.h"
  10. #include "stm32f10x_tim.h"
  11. #include "stm32f10x_pwr.h"
  12. #include "TypeDefine.h"
  13. #include "Driver.h"
  14. #include "DrawLCDGUI.h"
  15. #include "ControlSystem.h"
  16. #include "ParameterSet.h"
  17. #include "SystemAlarm.h"
  18. #include "History.h"
  19. #include "ZigbeeDataHandle.h"
  20. #include "RTCSetup.h"
  21. #include "FM31256.h"
  22. #include "HostSlaveHandle.h"
  23. #include "FlashSetup.h"
  24. #include <stdio.h>
  25. #include "Bubble_ADCSetup.h"
  26. #include "delay.h"
  27. SysWorkStepType emSysWorkStep; //系统工作步骤
  28. SysInfusionModeType infusionMode; //输液模式
  29. uint8_t controlTimerCounts = 0;//控制时间计时次数
  30. uint32_t InfusionStopTimer = 0;//输液时间
  31. uint32_t InfusionXmitTimer = 0;//输注发送时间
  32. uint16_t lockTimeCountDown = 0;//锁时倒计时
  33. uint16_t G_Led_Time = 0xffff;//绿色指示灯点亮时间
  34. uint16_t Y_Led_Time = HALF_SECOND_TIMER;//黄色指示灯点亮时间
  35. SysWorkStepType emLockPasswordStep;//在进入锁定密码后保存将要进入的界面
  36. SysWorkStepType emLockPasswordFailStep;//在锁定密码失败后保存将要进入的界面
  37. SysWorkStepType emAlarmRecordStep;//报警时要将现在在哪页记录下来
  38. SysWorkStepType emAlarmRememberStep;//报警时记录报警界面
  39. uint16_t inputDose_bf=0; //已输入量备份
  40. uint8_t Input_End=0; //输液结束标志
  41. uint8_t start_flag=0; //运行按键启动标志,用于压力值得判断标志
  42. uint8_t Key_Quiet_Cont=0; //静音键次数
  43. uint8_t LimitBeginsTime = 0; //极限计时开始
  44. uint8_t LcdFlicker_Flag=0 ; //背景光闪烁标志
  45. uint8_t PCADontRun_Flag=0; //pca运行期间堵塞解除堵塞,pca为运行完标志
  46. uint8_t AppendComplete=0;//堵塞自检后追加量未运行完,返回到主运行界面不暂停
  47. extern uint16_t Quiet_Timedata; //静音键延时时间
  48. extern uint8_t Quiet_Timedata_flag; //静音键延时完成标志
  49. extern uint16_t PressureF1_bf[10]; //压力备份数据数组
  50. extern uint16_t PressureF1_bf2[10]; //压力备份数据数组
  51. extern uint8_t Pressurebf_Cont; //压力备份次数
  52. extern uint16_t average_Pressure_bf; //压力平均值
  53. extern uint8_t sysPromptToneType_bf; //报警状态备份
  54. uint8_t Sound_prepore_flag=0; //预报警标志
  55. extern uint16_t self_adaption_Pressure; //自适应压力值
  56. extern uint8_t BlockageRecovery; //堵塞自检恢复标志
  57. extern uint8_t self_adaption_cont; //自适应压力值缓冲区储存次数
  58. extern uint8_t self_adaption_flag; //自适应压力参数处理完成标志,用于后面压力报警判断
  59. extern uint8_t Alarm_flag; //报警标志
  60. extern uint8_t ElectSmallCount; //计算小于电流基准值150的次数 未装药盒报警检测次数
  61. extern uint8_t ElectLargeCount; //计算大于电流基准值150的次数 堵塞报警检测次数
  62. uint8_t pca_count=0; //一小时内pca按压次数
  63. uint8_t sysPromptToneTypebf=0; //声音类型备份值
  64. uint8_t TotalDoesChange0 = 0;//工程模式输注总量变化1变0
  65. uint8_t TotalDoesChange1 = 0;//工程模式输注总量变化0变1
  66. //uint8_t TestSwitch = 0; //工程模式中测试开关打开其他数据不在发送
  67. uint8_t Start_send = 1; //开始发送标志
  68. uint8_t ran = 0; //只要运行按键开启置1,在暂停中判断上次是否为1,防止暂停按键按压后实际运行的参数并没有变化这种现象发生
  69. uint8_t SetParametersAgain = 0; //运行过程中重新设置参数标志
  70. uint8_t InpudingComplete = 0; //输注结束完成标志
  71. uint8_t FackreadIndex = 1; //假读索引
  72. uint8_t KEY_Enter_action = 0; //Enter按键动作,只有在短按松开的情况下才有用
  73. uint8_t TurnOffACKTone = 0; //修改设置完住院号进入参数设置界面蜂鸣器长鸣问题
  74. uint8_t LCDBlackFlashCount = 0;
  75. //uint8_t FlashCount1 = 0;
  76. extern int fputc(int ch, FILE *f);
  77. int fputc(int ch, FILE *f)
  78. {
  79. USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
  80. while (!(USART1->SR & USART_FLAG_TXE));
  81. return (ch);
  82. }
  83. /*************************************************************************************
  84. * Function: CntlSysInitWork
  85. * Object: 控制系统初始化工作
  86. * 输入: 无
  87. * 输出: 无
  88. * 备注: 系统初始化3s后进入稳定工作状态
  89. **************************************************************************************/
  90. void CntlSysInitWork( void )
  91. {
  92. //进入开机状态
  93. if( emSysWorkStep == EnterStartup )
  94. {
  95. if( TaskSchedulerFlag.initFinishFlag == TASK_FLAG_SET )
  96. {
  97. TaskSchedulerFlag.initFinishFlag = TASK_FLAG_CLEAR;
  98. TaskSchedulerFlag.zigbeeComReadFlag = TASK_FLAG_SET;
  99. }
  100. }
  101. }
  102. /*************************************************************************************
  103. * Function: CntlMotorWork
  104. * Object: 控制电机工作
  105. * 输入: uint16_t pwmSetValue
  106. * 输出: 无
  107. * 备注: pwmSetValue 0:停止工作 其它值:开启电机
  108. **************************************************************************************/
  109. void CntlMotorWork( uint16_t pwmSetValue )
  110. {
  111. if( pwmSetValue == 0 )
  112. {
  113. /* 关闭电机 */
  114. GPIO_SetBits(GPIOB,GPIO_Pin_13);
  115. GPIO_ResetBits(GPIOA,GPIO_Pin_8); //机械报警,关闭电机电源
  116. }
  117. else
  118. {
  119. /* 开电机 */
  120. GPIO_ResetBits(GPIOB,GPIO_Pin_13);
  121. GPIO_SetBits(GPIOA,GPIO_Pin_8); //机械报警,关闭电机电源
  122. }
  123. }
  124. /*************************************************************************************
  125. * Function: CntlSpeakerWork
  126. * Object: 控制蜂鸣器工作
  127. * 输入: 无
  128. * 输出: 无
  129. * 备注: 1、蜂鸣器的工作状态通过sysPromptToneType变量来选择
  130. * 2、通过EngineeringModeValue.silenceState来判断在工程模式中是否静音
  131. * 3、通过TaskSchedulerFlag.silenceFlag来判断是否手动静音
  132. **************************************************************************************/
  133. void CntlSpeakerWork( void )
  134. {
  135. if( EngineeringModeValue.silenceState == ENGINEERINGMODE_OFF )//工程模式静音模式关
  136. {
  137. switch( sysPromptToneType )
  138. {
  139. case SoundOff:
  140. SpeakerCtl( DRIVER_OFF );
  141. break;
  142. case StartupTone://进入开机画面,蜂鸣器要响一声
  143. {
  144. SpeakerCtl( DRIVER_ON );
  145. if( speakerWorkStep == emSpeakerNoneWork )
  146. {
  147. TaskSchedulerTimer.speakerTimer = ONE_MSEC_TIMER;//蜂鸣器计时 1000ms
  148. speakerWorkStep = emSpeakerWorkStep1;
  149. }
  150. else if( speakerWorkStep == emSpeakerWorkDone )
  151. {
  152. sysPromptToneType = SoundOff;
  153. speakerWorkStep = emSpeakerNoneWork;
  154. }
  155. }
  156. break;
  157. case KeypadShortTone://短按声
  158. case KeypadLongTone://长按声
  159. {
  160. SpeakerCtl( DRIVER_ON );
  161. if( speakerWorkStep == emSpeakerNoneWork )
  162. {
  163. TaskSchedulerTimer.speakerTimer = 50;//蜂鸣器计时 50ms
  164. speakerWorkStep = emSpeakerWorkStep1;
  165. }
  166. else if( speakerWorkStep == emSpeakerWorkDone )
  167. {
  168. // if((sysPromptToneTypebf == Sound_prepore) || (sysPromptToneTypebf == WarringTone) || (sysPromptToneTypebf == InfusionTone))//按键声音处理完,判断之前声音的状态,是报警就回复,否则,关闭
  169. // {
  170. // sysPromptToneType=sysPromptToneTypebf;
  171. // SpeakerCtl( DRIVER_OFF );
  172. // }
  173. // else
  174. {
  175. sysPromptToneType = SoundOff;
  176. }
  177. speakerWorkStep = emSpeakerNoneWork;
  178. }
  179. }
  180. break;
  181. case VerificationTone://确认声
  182. {
  183. SpeakerCtl( DRIVER_ON );
  184. if( speakerWorkStep == emSpeakerNoneWork )
  185. {
  186. TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
  187. speakerWorkStep = emSpeakerWorkStep1;
  188. }
  189. else if( speakerWorkStep == emSpeakerWorkDone )
  190. {
  191. sysPromptToneType = SoundOff;
  192. speakerWorkStep = emSpeakerNoneWork;
  193. }
  194. }
  195. break;
  196. /*case Sound_prepore://电池预报警
  197. {
  198. if( TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET )//静音标志,静音后蜂鸣器不响,
  199. {
  200. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//静音开启,关闭喇叭标志
  201. speakerWorkStep = emSpeakerNoneWork;
  202. sysPromptToneTypebf=sysPromptToneType;//备份声音状态,在静音回复的时候进行回复
  203. sysPromptToneType = SoundOff;
  204. break;
  205. }
  206. if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_SET )
  207. {
  208. switch( speakerWorkStep )
  209. {
  210. case emSpeakerNoneWork:
  211. SpeakerCtl( DRIVER_ON );
  212. TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
  213. speakerWorkStep = emSpeakerWorkStart;
  214. break;
  215. case emSpeakerWorkStep1:
  216. SpeakerCtl( DRIVER_OFF );
  217. break;
  218. case emSpeakerWorkStep2:
  219. SpeakerCtl( DRIVER_ON );
  220. break;
  221. case emSpeakerWorkStep3:
  222. SpeakerCtl( DRIVER_OFF );
  223. break;
  224. case emSpeakerWorkStep4:
  225. SpeakerCtl( DRIVER_ON );
  226. break;
  227. case emSpeakerWorkStep5:
  228. SpeakerCtl( DRIVER_OFF );
  229. speakerWorkStep = emSpeakerWorkDone;
  230. sysPromptToneType = SoundOff;
  231. break;
  232. default:break;
  233. }
  234. if( speakerWorkStep == emSpeakerWorkDone )
  235. {
  236. SpeakerCtl( DRIVER_OFF );
  237. speakerWorkStep = emSpeakerNoneWork;
  238. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  239. //TaskSchedulerTimer.speakerWaitTimer = TEN_SECOND_TIMER;//10S间隔时间 为下次进入蜂鸣器计时做准备
  240. if( sysPromptToneCounts == 255 )//在PCA错误时只发出一次响声
  241. {
  242. sysPromptToneCounts = 0;
  243. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  244. }
  245. }
  246. }
  247. else if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_CLEAR )
  248. {
  249. sysPromptToneType = SoundOff;
  250. }
  251. }
  252. break;
  253. case WarringTone://报警声
  254. if( TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET )//静音标志,静音后蜂鸣器不响,
  255. {
  256. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//静音开启,关闭喇叭标志
  257. speakerWorkStep = emSpeakerNoneWork;
  258. sysPromptToneTypebf=sysPromptToneType;//备份声音状态,在静音回复的时候进行回复
  259. sysPromptToneType = SoundOff;
  260. break;
  261. }
  262. if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_SET )
  263. {
  264. switch( speakerWorkStep )
  265. {
  266. case emSpeakerNoneWork:
  267. SpeakerCtl( DRIVER_ON );
  268. TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
  269. speakerWorkStep = emSpeakerWorkStart;
  270. break;
  271. case emSpeakerWorkStep1:
  272. SpeakerCtl( DRIVER_OFF );
  273. break;
  274. case emSpeakerWorkStep2:
  275. SpeakerCtl( DRIVER_ON );
  276. break;
  277. case emSpeakerWorkStep3:
  278. SpeakerCtl( DRIVER_OFF );
  279. break;
  280. case emSpeakerWorkStep4:
  281. SpeakerCtl( DRIVER_ON );
  282. break;
  283. case emSpeakerWorkStep5:
  284. SpeakerCtl( DRIVER_OFF );
  285. speakerWorkStep = emSpeakerWorkDone;
  286. sysPromptToneType = WarringTone;
  287. break;
  288. default:break;
  289. }
  290. if( speakerWorkStep == emSpeakerWorkDone )
  291. {
  292. SpeakerCtl( DRIVER_OFF );
  293. speakerWorkStep = emSpeakerNoneWork;
  294. TaskSchedulerFlag.speakerFlag = TASK_FLAG_WAIT;
  295. TaskSchedulerTimer.speakerWaitTimer = TEN_SECOND_TIMER;//10S间隔时间 为下次进入蜂鸣器计时做准备
  296. if( sysPromptToneCounts == 255 )//在PCA错误时只发出一次响声
  297. {
  298. sysPromptToneCounts = 0;
  299. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  300. }
  301. }
  302. }
  303. else if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_CLEAR )
  304. {
  305. sysPromptToneType = SoundOff;
  306. }
  307. break;
  308. case InfusionTone://输注完毕声
  309. if( TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET )//静音标志,静音后蜂鸣器不响,屏不闪
  310. {
  311. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//静音开启,关闭喇叭标志
  312. speakerWorkStep = emSpeakerNoneWork;
  313. sysPromptToneTypebf=sysPromptToneType;//备份声音状态,在静音回复的时候进行回复
  314. sysPromptToneType = SoundOff;
  315. break;
  316. }
  317. if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_SET )
  318. {
  319. switch( speakerWorkStep )
  320. {
  321. case emSpeakerNoneWork:
  322. SpeakerCtl( DRIVER_ON );
  323. TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 125ms
  324. speakerWorkStep = emSpeakerWorkStart;
  325. break;
  326. case emSpeakerWorkStep1:
  327. SpeakerCtl( DRIVER_OFF );
  328. break;
  329. case emSpeakerWorkStep2:
  330. SpeakerCtl( DRIVER_ON );
  331. break;
  332. case emSpeakerWorkStep3:
  333. SpeakerCtl( DRIVER_OFF );
  334. break;
  335. case emSpeakerWorkStep4:
  336. SpeakerCtl( DRIVER_ON );
  337. break;
  338. case emSpeakerWorkStep5:
  339. SpeakerCtl( DRIVER_OFF );
  340. speakerWorkStep = emSpeakerWorkDone;
  341. sysPromptToneType = InfusionTone;
  342. break;
  343. default:break;
  344. }
  345. if( speakerWorkStep == emSpeakerWorkDone )
  346. {
  347. SpeakerCtl( DRIVER_OFF );
  348. speakerWorkStep = emSpeakerNoneWork;
  349. TaskSchedulerFlag.speakerFlag = TASK_FLAG_WAIT;
  350. TaskSchedulerTimer.speakerWaitTimer = TEN_SECOND_TIMER;//10S间隔时间 为下次进入蜂鸣器计时做准备
  351. }
  352. }
  353. else if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_CLEAR )
  354. {
  355. sysPromptToneType = SoundOff;
  356. }
  357. break;
  358. case RemindeTone:
  359. if( TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET )//静音标志,静音后蜂鸣器不响,屏不闪
  360. {
  361. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//静音开启,关闭喇叭标志
  362. speakerWorkStep = emSpeakerNoneWork;
  363. sysPromptToneType = SoundOff;
  364. break;
  365. }
  366. if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_SET )
  367. {
  368. switch( speakerWorkStep )
  369. {
  370. case emSpeakerNoneWork:
  371. SpeakerCtl( DRIVER_ON );
  372. TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
  373. speakerWorkStep = emSpeakerWorkStart;
  374. break;
  375. case emSpeakerWorkStep1:
  376. SpeakerCtl( DRIVER_OFF );
  377. break;
  378. case emSpeakerWorkStep2:
  379. SpeakerCtl( DRIVER_ON );
  380. break;
  381. case emSpeakerWorkStep3:
  382. SpeakerCtl( DRIVER_OFF );
  383. speakerWorkStep = emSpeakerWorkDone;
  384. sysPromptToneType = SoundOff;
  385. break;
  386. default:break;
  387. }
  388. if( speakerWorkStep == emSpeakerWorkDone )
  389. {
  390. speakerWorkStep = emSpeakerNoneWork;
  391. }
  392. }
  393. case SoundWait:
  394. break;*/
  395. default:break;
  396. }
  397. }
  398. else
  399. {
  400. // if(sysAlarmFlag.VoltLowest == ALARM_PREPARE)
  401. // {
  402. // Sound_prepore_flag = 2;
  403. // }
  404. SpeakerCtl( DRIVER_OFF );
  405. speakerWorkStep = emSpeakerNoneWork;
  406. }
  407. }
  408. /*************************************************************************************
  409. * Function: CntlHornWork
  410. * Object: 控制喇叭工作
  411. * 输入: 无
  412. * 输出: 无
  413. * 备注: 1、
  414. **************************************************************************************/
  415. void CntlHornWork( void )
  416. {
  417. if((EngineeringModeValue.silenceState == ENGINEERINGMODE_OFF)&&(SysHornToneType != SoundWate))
  418. {
  419. CntOpenHornInit();//报警前打开功放管脚的初始化
  420. }
  421. if(( EngineeringModeValue.silenceState == ENGINEERINGMODE_OFF)&&(TaskSchedulerFlag.AlarmInitFlag == TASK_FLAG_SET))//工程模式静音模式关且喇叭初始化完成
  422. {
  423. switch( SysHornToneType )
  424. {
  425. case SoundOff:
  426. HornWorkStatus(HornOFF);
  427. SysHornToneType = SoundWate;
  428. break;
  429. case Sound_prepore://电池预报警
  430. {
  431. if( TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET )//静音标志,静音后蜂鸣器不响,
  432. {
  433. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//静音开启,关闭喇叭标志
  434. HornWorkStatus(HornOFF);
  435. break;
  436. }
  437. if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_SET )
  438. {
  439. HornWorkStatus(HornAlarmSound);
  440. // SysHornToneType = SoundOff;
  441. TaskSchedulerFlag.speakerFlag = TASK_FLAG_WAIT;
  442. TaskSchedulerTimer.speakerWaitTimer = ONE_SECOND_TIMER;
  443. }
  444. else if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_CLEAR )
  445. {
  446. HornWorkStatus(HornOFF);
  447. }
  448. }
  449. break;
  450. case WarringTone://报警声
  451. case InfusionTone://输注完毕声
  452. {
  453. if( TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET )//静音标志,静音后蜂鸣器不响,
  454. {
  455. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//静音开启,关闭喇叭标志
  456. HornWorkStatus(HornOFF);
  457. break;
  458. }
  459. if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_SET )
  460. {
  461. HornWorkStatus(HornAlarmSound);
  462. TaskSchedulerFlag.speakerFlag = TASK_FLAG_WAIT;
  463. TaskSchedulerTimer.speakerWaitTimer = TEN_SECOND_TIMER;//预报警不需要这句
  464. }
  465. else if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_CLEAR )
  466. {
  467. HornWorkStatus(HornOFF);
  468. }
  469. }
  470. break;
  471. case RemindeTone://遗忘报警提示音
  472. {
  473. if( TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET )//静音标志,静音后蜂鸣器不响,
  474. {
  475. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//静音开启,关闭喇叭标志
  476. HornWorkStatus(HornOFF);
  477. break;
  478. }
  479. if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_SET )
  480. {
  481. HornWorkStatus(HornWarningTone);
  482. // SysHornToneType = SoundOff;
  483. TaskSchedulerFlag.speakerFlag = TASK_FLAG_WAIT;
  484. TaskSchedulerTimer.speakerWaitTimer = ONE_SECOND_TIMER;
  485. }
  486. else if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_CLEAR )
  487. {
  488. HornWorkStatus(HornOFF);
  489. }
  490. }
  491. break;
  492. case LowPriWarning://低优先级两声报警
  493. {
  494. if( TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET )//静音标志,静音后蜂鸣器不响,
  495. {
  496. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//静音开启,关闭喇叭标志
  497. HornWorkStatus(HornOFF);
  498. break;
  499. }
  500. if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_SET )
  501. {
  502. HornWorkStatus(HornLowPriWarning);
  503. // SysHornToneType = SoundOff;
  504. TaskSchedulerFlag.speakerFlag = TASK_FLAG_WAIT;
  505. TaskSchedulerTimer.speakerWaitTimer = ONE_SECOND_TIMER;
  506. }
  507. else if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_CLEAR )
  508. {
  509. HornWorkStatus(HornOFF);
  510. }
  511. }
  512. break;
  513. default:break;
  514. }
  515. }
  516. else
  517. {
  518. HornWorkStatus(HornOFF);
  519. }
  520. }
  521. /*************************************************************************************
  522. * Function: HornWarningTone
  523. * Object: horn器工作状态
  524. * 输入: 无
  525. * 输出: 无
  526. * 备注: 1
  527. **************************************************************************************/
  528. void HornWorkStatus(uint8_t status)
  529. {
  530. if(status == HornOFF )
  531. {
  532. CntAlarmSpeaker(0xFE);//喇叭静音
  533. }
  534. else if(status == HornWarningTone )
  535. {
  536. CntAlarmSpeaker(0x01);//喇叭单声提示音
  537. }
  538. else if(status == HornAlarmSound)
  539. {
  540. CntAlarmSpeaker(0x08);//喇叭报警音。中优先级报警
  541. }
  542. else if(status == HornMaxSound)
  543. {
  544. CntAlarmSpeaker(0xEF);//喇叭最大音量
  545. }
  546. else if(status == HornLowPriWarning)
  547. {
  548. CntAlarmSpeaker(0x04);//低优先级报警
  549. }
  550. }
  551. /*************************************************************************************
  552. * Function: CntlSensorPWWork
  553. * Object: 控制传感器电源工作
  554. * 输入: 无
  555. * 输出: 无
  556. * 备注: 通过此函数可控制传感器的电源通断,以达到节能的目的
  557. * 重要变量 TaskSchedulerFlag.sensorPWHallFlag
  558. * TaskSchedulerFlag.sensorPWPressureFlag
  559. * TaskSchedulerFlag.sensorPWBatteryFlag
  560. **************************************************************************************/
  561. void CntlSensorPWWork( void )
  562. {
  563. // if( ( TaskSchedulerFlag.sensorPWHallFlag == TASK_FLAG_SET )
  564. // || ( TaskSchedulerFlag.sensorPWPressureFlag == TASK_FLAG_SET )
  565. // || ( TaskSchedulerFlag.sensorPWBatteryFlag == TASK_FLAG_SET ) )//主芯片低功耗配置
  566. if( ( TaskSchedulerFlag.sensorPWHallFlag == TASK_FLAG_SET )
  567. || ( TaskSchedulerFlag.sensorPWPressureFlag == TASK_FLAG_SET ))
  568. {
  569. SensorPWRCtl( DRIVER_ON );//Sensor电源
  570. }
  571. else
  572. {
  573. SensorPWRCtl( DRIVER_OFF );//Sensor电源
  574. }
  575. }
  576. /*************************************************************************************
  577. * Function: CntlLCDBlackWork
  578. * Object: 控制LCD背光工作
  579. * 输入: 无
  580. * 输出: 无
  581. * 备注: 背光有完全关闭和闪烁的情况,通过本函数控制
  582. * 1、TaskSchedulerFlag.lcdBlackFlashFlag判断背光是否闪烁
  583. * 2、在非闪烁的情况下,判断TaskSchedulerFlag.lcdBlackFlag是否关闭背光
  584. **************************************************************************************/
  585. void CntlLCDBlackWork( void )
  586. {
  587. if( TaskSchedulerFlag.lcdBlackFlashFlag == TASK_FLAG_SET )//背光闪烁
  588. {
  589. if(LcdFlicker_Flag == TASK_FLAG_SET)
  590. {
  591. Y_LED_ON;//黄色LED亮
  592. R_LED_OFF;
  593. G_LED_OFF;
  594. /*if( ( sysAlarmFlag.MechanicalFault == ALARM_ON ) || ( sysAlarmFlag.MechanicalFault == ALARM_CONTINUE ) )
  595. {
  596. R_LED_OFF;//机械故障,红色led亮
  597. Y_LED_ON;
  598. G_LED_OFF;
  599. }
  600. else
  601. {
  602. Y_LED_ON;//黄色LED亮
  603. R_LED_OFF;
  604. G_LED_OFF;
  605. }*/
  606. }
  607. else if( LcdFlicker_Flag == TASK_FLAG_CLEAR)
  608. {
  609. Y_LED_OFF;//黄色LED亮
  610. R_LED_OFF
  611. G_LED_OFF;
  612. }
  613. }
  614. if(( realTimeData.stateRun == Poweroff ) || ( realTimeData.stateRun == Pause )) //收到关机信号,所有指示灯关闭
  615. {
  616. if(sysAlarmFlag.VoltLowest != ALARM_PREPARE) //电池预报警的时候,不关闭报警灯
  617. {
  618. Y_LED_OFF;//黄色LED亮
  619. }
  620. R_LED_OFF
  621. G_LED_OFF;
  622. }
  623. //if( TaskSchedulerFlag.lcdBlackFlashFlag == TASK_FLAG_CLEAR )
  624. {
  625. if( TaskSchedulerFlag.lcdBlackFlag == TASK_FLAG_SET )
  626. {
  627. LCDBLACtl( DRIVER_ON );//LCD背光
  628. }
  629. else if( TaskSchedulerFlag.lcdBlackFlag == TASK_FLAG_CLEAR )
  630. {
  631. LCDBLACtl( DRIVER_OFF );//LCD背光
  632. }
  633. }
  634. }
  635. /****************************************************************************************
  636. * Function: ScanKeyWorkType
  637. * Object: 扫描按键的工作类型,包括长按、短按,消抖操作
  638. * 输入: 无
  639. * 输出: 无
  640. * 备注: 1、主要涉及变量KeyScanStatus,用来判断是哪个按键正在工作
  641. * 2、总共有8个按键,分别有长按短按两种操作
  642. * 3、KEY_QTY_LONGPRESS长按数值,KEY_QTY_SHORTEST短按数值
  643. ******************************************************************************************/
  644. void ScanKeyWorkType( void )
  645. {
  646. switch( KeyScanStatus.keyEnter )//enter键
  647. {
  648. case emKeyActionOff:
  649. KeyActionFlag.keyEnter = emKeyflagNonePress;
  650. break;
  651. case emKeyActionOn:
  652. if( KeyScanQty.keyEnter >= KEY_QTY_LONGPRESS )//长按
  653. {
  654. KeyActionFlag.keyEnter = emKeyflagLongPress;
  655. }
  656. else if( KeyScanQty.keyEnter >= KEY_QTY_SHORTEST )//短按
  657. {
  658. KeyActionFlag.keyEnter = emKeyflagShortPress;
  659. }
  660. else//其它情况表明无按键操作,这样能达到真正消抖的目的
  661. {
  662. KeyActionFlag.keyEnter = emKeyflagNonePress;
  663. }
  664. KeyScanQty.keyEnter = 0;//清除按键计数
  665. KeyScanStatus.keyEnter = emKeyActionOff;//按键操作结束
  666. KEY_Enter_action = 1;
  667. break;
  668. case emKyeActionScanSet:
  669. KeyScanQty.keyEnter++;
  670. if( KeyScanQty.keyEnter == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  671. {
  672. // if( sysPromptToneType == SoundOff )
  673. // {
  674. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  675. {
  676. // if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone))
  677. // {
  678. // sysPromptToneTypebf=sysPromptToneType;
  679. // }
  680. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  681. }
  682. }
  683. if( KeyScanQty.keyEnter >= KEY_QTY_LONGPRESS )
  684. {
  685. KeyActionFlag.keyEnter = emKeyflagLongPress;
  686. }
  687. else if( KeyScanQty.keyEnter >= KEY_QTY_NORMAL )
  688. {
  689. // KeyActionFlag.keyEnter = emKeyflagShortPress;
  690. // MoreKeyActionFlag.keyEnter = emKeyflagShortPress;
  691. KEY_Enter_action = 0;//Enter按键作为快速按键使用时,短按与长按之间的时间长引起的参数跳转问题
  692. }
  693. if( KeyScanQty.keyEnter == 255 )
  694. {
  695. KeyScanQty.keyEnter = KEY_QTY_LONGPRESS;
  696. }
  697. KeyScanStatus.keyEnter = emKeyActionWait;//按键操作结束
  698. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  699. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  700. // if( KeyScanQty.keyEnter >= KEY_QTY_LONGPRESS )
  701. // {
  702. // KeyScanStatus.keyEnter = emKeyActionOn;//按键为长按,操作结束
  703. // }
  704. // else
  705. // {
  706. // KeyScanStatus.keyEnter = emKeyActionWait;//按键操作结束
  707. // }
  708. // TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  709. // TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  710. break;
  711. case emKeyActionWait:
  712. break;
  713. default:break;
  714. }
  715. switch( KeyScanStatus.keyPower )//power键
  716. {
  717. case emKeyActionOff:
  718. KeyActionFlag.keyPower = emKeyflagNonePress;
  719. break;
  720. case emKeyActionOn:
  721. if( KeyScanQty.keyPower >= KEY_QTY_LONGPRESS )//长按
  722. {
  723. KeyActionFlag.keyPower = emKeyflagLongPress;
  724. }
  725. /* 方晨峰 修改于 20170711 */
  726. //else if( ( KeyScanQty.keyPower >= KEY_QTY_SHORTEST ) && ( KeyScanQty.keyPower <= KEY_QTY_SHORT ) )//短按
  727. //else if( KeyScanQty.keyPower >= KEY_QTY_SHORTEST )//短按
  728. else if( KeyScanQty.keyPower >= KEY_QTY_SHORTEST )
  729. {
  730. KeyActionFlag.keyPower = emKeyflagShortPress;
  731. }
  732. else//其它情况表明无按键操作,这样能达到真正消抖的目的
  733. {
  734. KeyActionFlag.keyPower = emKeyflagNonePress;
  735. }
  736. KeyScanQty.keyPower = 0;//清除按键计数
  737. KeyScanStatus.keyPower = emKeyActionOff;//按键操作结束
  738. break;
  739. case emKyeActionScanSet:
  740. KeyScanQty.keyPower++;
  741. if( KeyScanQty.keyPower == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  742. {
  743. // if( sysPromptToneType == SoundOff )
  744. // {
  745. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  746. {
  747. // if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone))
  748. // {
  749. // sysPromptToneTypebf=sysPromptToneType;
  750. // }
  751. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  752. }
  753. }
  754. if( KeyScanQty.keyPower >= KEY_QTY_LONGPRESS )
  755. {
  756. KeyScanStatus.keyPower = emKeyActionOn;//按键为长按,操作结束
  757. }
  758. else
  759. {
  760. KeyScanStatus.keyPower = emKeyActionWait;//按键操作结束
  761. }
  762. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  763. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  764. break;
  765. case emKeyActionWait:
  766. break;
  767. default:break;
  768. }
  769. switch( KeyScanStatus.keyRunPause )//RunPause键
  770. {
  771. case emKeyActionOff:
  772. KeyActionFlag.keyRunPause = emKeyflagNonePress;
  773. break;
  774. case emKeyActionOn:
  775. if( KeyScanQty.keyRunPause >= KEY_QTY_LONGPRESS )//长按
  776. {
  777. KeyActionFlag.keyRunPause = emKeyflagLongPress;
  778. }
  779. else if( KeyScanQty.keyRunPause >= KEY_QTY_SHORTEST )//短按
  780. {
  781. KeyActionFlag.keyRunPause = emKeyflagShortPress;
  782. }
  783. else//其它情况表明无按键操作,这样能达到真正消抖的目的
  784. {
  785. KeyActionFlag.keyRunPause = emKeyflagNonePress;
  786. }
  787. KeyScanQty.keyRunPause = 0;//清除按键计数
  788. KeyScanStatus.keyRunPause = emKeyActionOff;//按键操作结束
  789. break;
  790. case emKyeActionScanSet:
  791. KeyScanQty.keyRunPause++;
  792. if( KeyScanQty.keyRunPause == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  793. {
  794. // if( sysPromptToneType == SoundOff )
  795. // {
  796. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  797. {
  798. // if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone))
  799. // {
  800. // sysPromptToneTypebf=sysPromptToneType;
  801. // }
  802. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  803. }
  804. }
  805. if( KeyScanQty.keyRunPause >= KEY_QTY_LONGPRESS )
  806. {
  807. KeyScanStatus.keyRunPause = emKeyActionOn;//按键为长按,操作结束
  808. }
  809. else
  810. {
  811. KeyScanStatus.keyRunPause = emKeyActionWait;//按键操作结束
  812. }
  813. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  814. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  815. break;
  816. case emKeyActionWait:
  817. break;
  818. default:break;
  819. }
  820. switch( KeyScanStatus.keyPS )//PS键
  821. {
  822. case emKeyActionOff:
  823. KeyActionFlag.keyPS = emKeyflagNonePress;
  824. break;
  825. case emKeyActionOn:
  826. if(( GPIO_ReadInputDataBit( KEY_GPIO_PORT,PS_GPIO_PIN ) != 0) && ( speakerWorkStep == emSpeakerNoneWork )) //按键弹起之后,再做判断
  827. {
  828. if( KeyScanQty.keyPS >= KEY_QTY_LONGPRESS )//长按
  829. {
  830. //KeyActionFlag.keyPS = emKeyflagLongPress;
  831. KeyActionFlag.keyPS = emKeyflagShortPress;
  832. }
  833. else if( KeyScanQty.keyPS >= KEY_QTY_SHORTEST )//短按
  834. {
  835. KeyActionFlag.keyPS = emKeyflagShortPress;
  836. }
  837. else//其它情况表明无按键操作,这样能达到真正消抖的目的
  838. {
  839. KeyActionFlag.keyPS = emKeyflagNonePress;
  840. }
  841. KeyScanQty.keyPS = 0;//清除按键计数
  842. KeyScanStatus.keyPS = emKeyActionOff;//按键操作结束
  843. }
  844. break;
  845. case emKyeActionScanSet:
  846. KeyScanQty.keyPS++;
  847. if( KeyActionFlag.keyPS == emKeyflagLongRelease )//如果在程序中用过此按键长按功能,则按键需要被释放即使按键没有抬起也不会影响一下操作
  848. {
  849. KeyScanQty.keyPS = 0;//清除按键计数
  850. KeyScanStatus.keyPS = emKeyActionOff;//按键操作结束
  851. }
  852. else
  853. {
  854. if( KeyScanQty.keyPS == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  855. {
  856. // if( sysPromptToneType == SoundOff )
  857. // {
  858. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  859. {
  860. // if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone))
  861. // {
  862. // sysPromptToneTypebf=sysPromptToneType;
  863. // }
  864. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  865. }
  866. }
  867. else if( KeyScanQty.keyPS >= KEY_QTY_LONGPRESS )
  868. {
  869. KeyActionFlag.keyPS = emKeyflagLongPress;
  870. }
  871. else if( KeyScanQty.keyPS >= KEY_QTY_NORMAL )
  872. {
  873. // KeyActionFlag.keyPS = emKeyflagShortPress;
  874. }
  875. if( KeyScanQty.keyPS == 255 )
  876. {
  877. KeyScanQty.keyPS = KEY_QTY_LONGPRESS;
  878. }
  879. KeyScanStatus.keyPS = emKeyActionWait;//按键操作结束
  880. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  881. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  882. }
  883. break;
  884. /*if( KeyScanQty.keyPS == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  885. {
  886. //if( sysPromptToneType == SoundOff )
  887. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  888. {
  889. if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone))
  890. {
  891. sysPromptToneTypebf=sysPromptToneType;
  892. }
  893. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  894. }
  895. }
  896. if( KeyScanQty.keyPS >= KEY_QTY_LONGPRESS )
  897. {
  898. KeyScanStatus.keyPS = emKeyActionOn;//按键为长按,操作结束
  899. }
  900. else
  901. {
  902. KeyScanStatus.keyPS = emKeyActionWait;//按键操作结束
  903. }
  904. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  905. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  906. break;*/
  907. /*KeyScanQty.keyPS++;
  908. if( KeyScanQty.keyPS == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  909. {
  910. if( sysPromptToneType == SoundOff )
  911. {
  912. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  913. }
  914. }
  915. if( KeyScanQty.keyPS >= KEY_QTY_LONGPRESS )
  916. {
  917. KeyScanStatus.keyPS = emKeyActionOn;//按键为长按,操作结束
  918. }
  919. else
  920. {
  921. KeyScanStatus.keyPS = emKeyActionWait;//按键操作结束
  922. }
  923. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  924. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  925. break;*/
  926. case emKeyActionWait:
  927. break;
  928. default:break;
  929. }
  930. switch( KeyScanStatus.keyPCA )//PCA键
  931. {
  932. case emKeyActionOff:
  933. KeyActionFlag.keyPCA = emKeyflagNonePress;
  934. break;
  935. case emKeyActionOn:
  936. if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,PAC_GPIO_PIN ) != 0 )
  937. {
  938. if( KeyScanQty.keyPCA >= KEY_QTY_LONGPRESS )//长按
  939. {
  940. KeyActionFlag.keyPCA = emKeyflagLongPress;
  941. }
  942. else if( KeyScanQty.keyPCA >= KEY_QTY_SHORTEST )//短按
  943. {
  944. KeyActionFlag.keyPCA = emKeyflagShortPress;
  945. }
  946. else//其它情况表明无按键操作,这样能达到真正消抖的目的
  947. {
  948. KeyActionFlag.keyPCA = emKeyflagNonePress;
  949. }
  950. KeyScanQty.keyPCA = 0;//清除按键计数
  951. KeyScanStatus.keyPCA = emKeyActionOff;//按键操作结束
  952. }
  953. break;
  954. case emKyeActionScanSet:
  955. KeyScanQty.keyPCA++;
  956. if( KeyScanQty.keyPCA == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  957. {
  958. // if( sysPromptToneType == SoundOff )
  959. // {
  960. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  961. {
  962. // if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone) )
  963. // {
  964. // sysPromptToneTypebf=sysPromptToneType;
  965. // }
  966. if( TaskSchedulerFlag.pcaLockFlag != TASK_FLAG_SET )
  967. {
  968. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  969. }
  970. else if((TaskSchedulerFlag.pcaLockFlag == TASK_FLAG_SET)&&((TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET)||(realTimeData.stateRun == Pause)))
  971. {
  972. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  973. }
  974. }
  975. }
  976. if( KeyScanQty.keyPCA >= KEY_QTY_LONGPRESS )
  977. {
  978. KeyScanStatus.keyPCA = emKeyActionOn;//按键为长按,操作结束
  979. }
  980. else
  981. {
  982. KeyScanStatus.keyPCA = emKeyActionWait;//按键操作结束
  983. }
  984. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  985. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  986. break;
  987. case emKeyActionWait:
  988. break;
  989. default:break;
  990. }
  991. switch( KeyScanStatus.keyPlus )//Plus键
  992. {
  993. case emKeyActionOff:
  994. KeyActionFlag.keyPlus = emKeyflagNonePress;
  995. break;
  996. case emKeyActionOn:
  997. if( KeyScanQty.keyPlus >= KEY_QTY_LONGPRESS )//长按
  998. {
  999. KeyActionFlag.keyPlus = emKeyflagLongPress;
  1000. }
  1001. else if( KeyScanQty.keyPlus >= KEY_QTY_SHORTEST )//短按
  1002. {
  1003. KeyActionFlag.keyPlus = emKeyflagShortPress;
  1004. MoreKeyActionFlag.keyPlus = emKeyflagShortPress;
  1005. }
  1006. else//其它情况表明无按键操作,这样能达到真正消抖的目的
  1007. {
  1008. KeyActionFlag.keyPlus = emKeyflagNonePress;
  1009. }
  1010. KeyScanQty.keyPlus = 0;//清除按键计数
  1011. KeyScanStatus.keyPlus = emKeyActionOff;//按键操作结束
  1012. break;
  1013. case emKyeActionScanSet:
  1014. // KeyScanQty.keyPlus++;
  1015. if( KeyActionFlag.keyPlus == emKeyflagLongRelease )//如果在程序中用过此按键长按功能,则按键需要被释放即使按键没有抬起也不会影响一下操作
  1016. {
  1017. KeyScanQty.keyPlus = 0;//清除按键计数
  1018. KeyScanStatus.keyPlus = emKeyActionOff;//按键操作结束
  1019. }
  1020. else
  1021. {
  1022. if( KeyScanQty.keyPlus == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  1023. {
  1024. // if( sysPromptToneType == SoundOff )
  1025. // {
  1026. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  1027. {
  1028. // if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone))
  1029. // {
  1030. // sysPromptToneTypebf=sysPromptToneType;
  1031. // }
  1032. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  1033. }
  1034. }
  1035. else if( KeyScanQty.keyPlus >= KEY_QTY_LONGPRESS )
  1036. {
  1037. KeyActionFlag.keyPlus = emKeyflagLongPress;
  1038. }
  1039. else if( KeyScanQty.keyPlus >= KEY_QTY_NORMAL )
  1040. {
  1041. KeyActionFlag.keyPlus = emKeyflagShortPress;
  1042. MoreKeyActionFlag.keyPlus = emKeyflagShortPress;
  1043. }
  1044. if( KeyScanQty.keyPlus == 255 )
  1045. {
  1046. KeyScanQty.keyPlus = KEY_QTY_LONGPRESS;
  1047. }
  1048. KeyScanStatus.keyPlus = emKeyActionWait;//按键操作结束
  1049. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  1050. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  1051. }
  1052. break;
  1053. case emKeyActionWait:
  1054. break;
  1055. default:break;
  1056. }
  1057. switch( KeyScanStatus.keyMinus )//Minus键
  1058. {
  1059. case emKeyActionOff:
  1060. KeyActionFlag.keyMinus = emKeyflagNonePress;
  1061. break;
  1062. case emKeyActionOn:
  1063. if( KeyScanQty.keyMinus >= KEY_QTY_LONGPRESS )//长按
  1064. {
  1065. KeyActionFlag.keyMinus = emKeyflagLongPress;
  1066. }
  1067. else if( KeyScanQty.keyMinus >= KEY_QTY_SHORTEST )//短按
  1068. {
  1069. KeyActionFlag.keyMinus = emKeyflagShortPress;
  1070. MoreKeyActionFlag.keyMinus = emKeyflagShortPress;
  1071. }
  1072. else//其它情况表明无按键操作,这样能达到真正消抖的目的
  1073. {
  1074. KeyActionFlag.keyMinus = emKeyflagNonePress;
  1075. }
  1076. KeyScanQty.keyMinus = 0;//清除按键计数
  1077. KeyScanStatus.keyMinus = emKeyActionOff;//按键操作结束
  1078. break;
  1079. case emKyeActionScanSet:
  1080. KeyScanQty.keyMinus++;
  1081. if( KeyActionFlag.keyMinus == emKeyflagLongRelease )//如果在程序中用过此按键长按功能,则按键需要被释放即使按键没有抬起也不会影响一下操作
  1082. {
  1083. KeyScanQty.keyMinus = 0;//清除按键计数
  1084. KeyScanStatus.keyMinus = emKeyActionOff;//按键操作结束
  1085. }
  1086. else
  1087. {
  1088. if( KeyScanQty.keyMinus == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  1089. {
  1090. // if( sysPromptToneType == SoundOff )
  1091. // {
  1092. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  1093. {
  1094. // if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone))
  1095. // {
  1096. // sysPromptToneTypebf=sysPromptToneType;
  1097. // }
  1098. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  1099. }
  1100. }
  1101. else if( KeyScanQty.keyMinus >= KEY_QTY_LONGPRESS )
  1102. {
  1103. KeyActionFlag.keyMinus = emKeyflagLongPress;
  1104. }
  1105. else if( KeyScanQty.keyMinus >= KEY_QTY_NORMAL )
  1106. {
  1107. KeyActionFlag.keyMinus = emKeyflagShortPress;
  1108. MoreKeyActionFlag.keyMinus = emKeyflagShortPress;
  1109. }
  1110. if( KeyScanQty.keyMinus == 255 )
  1111. {
  1112. KeyScanQty.keyMinus = KEY_QTY_LONGPRESS;
  1113. }
  1114. KeyScanStatus.keyMinus = emKeyActionWait;//按键操作结束
  1115. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  1116. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  1117. }
  1118. break;
  1119. case emKeyActionWait:
  1120. break;
  1121. default:break;
  1122. }
  1123. switch( KeyScanStatus.keyAirout )//Airout键
  1124. {
  1125. case emKeyActionOff:
  1126. KeyActionFlag.keyAirout = emKeyflagNonePress;
  1127. break;
  1128. case emKeyActionOn:
  1129. if( KeyScanQty.keyAirout >= KEY_QTY_LONGPRESS )//长按
  1130. {
  1131. KeyActionFlag.keyAirout = emKeyflagLongPress;
  1132. }
  1133. else if( KeyScanQty.keyAirout >= KEY_QTY_SHORTEST )//短按
  1134. {
  1135. KeyActionFlag.keyAirout = emKeyflagShortPress;
  1136. }
  1137. else//其它情况表明无按键操作,这样能达到真正消抖的目的
  1138. {
  1139. KeyActionFlag.keyAirout = emKeyflagNonePress;
  1140. }
  1141. KeyScanQty.keyAirout = 0;//清除按键计数
  1142. KeyScanStatus.keyAirout = emKeyActionOff;//按键操作结束
  1143. break;
  1144. case emKyeActionScanSet:
  1145. KeyScanQty.keyAirout++;
  1146. if( KeyActionFlag.keyAirout == emKeyflagLongRelease )//如果在程序中用过此按键长按功能,则按键需要被释放即使按键没有抬起也不会影响一下操作
  1147. {
  1148. KeyScanQty.keyAirout = 0;//清除按键计数
  1149. KeyScanStatus.keyAirout = emKeyActionOff;//按键操作结束
  1150. }
  1151. else
  1152. {
  1153. if( KeyScanQty.keyAirout == 1 )//只要按键消抖成功就算有操作,要有声音或LCD背光亮等动作
  1154. {
  1155. // if( sysPromptToneType == SoundOff )
  1156. // {
  1157. if(( speakerWorkStep == emSpeakerNoneWork )||( speakerWorkStep == emSpeakerWorkDone ))
  1158. {
  1159. // if((sysPromptToneType == Sound_prepore) || (sysPromptToneType == WarringTone) || (sysPromptToneType == InfusionTone))
  1160. // {
  1161. // sysPromptToneTypebf=sysPromptToneType;
  1162. // }
  1163. sysPromptToneType = KeypadShortTone;//长按短按全都按短按音提示
  1164. }
  1165. }
  1166. else if( KeyScanQty.keyAirout >= KEY_QTY_LONGPRESS )
  1167. {
  1168. KeyActionFlag.keyAirout = emKeyflagLongPress;
  1169. }
  1170. else if( KeyScanQty.keyAirout >= KEY_QTY_NORMAL )
  1171. {
  1172. // KeyActionFlag.keyAirout = emKeyflagShortPress;
  1173. }
  1174. if( KeyScanQty.keyAirout == 255 )
  1175. {
  1176. KeyScanQty.keyAirout = KEY_QTY_LONGPRESS;
  1177. }
  1178. KeyScanStatus.keyAirout = emKeyActionWait;//按键操作结束
  1179. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;//有按键按下则清除LCD背光关闭标志
  1180. TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;
  1181. }
  1182. break;
  1183. case emKeyActionWait:
  1184. break;
  1185. default:break;
  1186. }
  1187. //增加静音按键处理
  1188. if( KeyActionFlag.keyPS == emKeyflagLongPress )//返回/静音键
  1189. // if(( KeyActionFlag.keyAirout == emKeyflagLongPress ) && (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9) != 0))//排气/静音键
  1190. {
  1191. KeyActionFlag.keyPS = emKeyflagNonePress;
  1192. {
  1193. if((emSysWorkStep !=EnterSetParam)&&(emSysWorkStep !=EnterAirout) )
  1194. {
  1195. if(TaskSchedulerFlag.silenceFlag == TASK_FLAG_CLEAR)
  1196. {
  1197. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  1198. TaskSchedulerFlag.silenceFlag = TASK_FLAG_SET;//静音标志
  1199. DrawSilenceDisplay();//静音
  1200. KeyScanStatus.keyPS = emKeyActionOff;
  1201. KeyScanQty.keyPS = 0;
  1202. }
  1203. else if(TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET)
  1204. {
  1205. TaskSchedulerFlag.silenceFlag = TASK_FLAG_CLEAR;//静音标志
  1206. DrawSilenceDisplay();//静音
  1207. // TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  1208. speakerWorkStep = emSpeakerNoneWork;
  1209. //sysPromptToneType=WarringTone;//静音回复后,之前的状态回复
  1210. if(emSysWorkStep == EnterLockPassword)
  1211. {
  1212. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  1213. }
  1214. else
  1215. {
  1216. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  1217. }
  1218. // if( realTimeData.stateRun == Alarm ) //在报警状态,回复
  1219. // {
  1220. // sysPromptToneType=sysPromptToneTypebf; //静音回复后,之前的状态回复
  1221. // }
  1222. // else if( emSysWorkStep == EnterTransfuseOver )
  1223. // {
  1224. // sysPromptToneType = InfusionTone;
  1225. // }
  1226. // else //否则不回复
  1227. // {
  1228. // sysPromptToneType=SoundOff;
  1229. // }
  1230. KeyScanStatus.keyPS = emKeyActionOff;
  1231. KeyScanQty.keyPS = 0;
  1232. }
  1233. }
  1234. }
  1235. }
  1236. if((emSysWorkStep ==EnterRunFirstDose)||(emSysWorkStep ==EnterRunMain)||(emSysWorkStep ==EnterTransfuseOver) )
  1237. {
  1238. if( KeyActionFlag.keyAirout == emKeyflagLongPress )//呼叫/排气按键
  1239. {
  1240. KeyActionFlag.keyAirout = emKeyflagNonePress;
  1241. if( TaskSchedulerFlag.callFunctionFlag == TASK_FLAG_CLEAR )
  1242. {
  1243. TaskSchedulerFlag.callFunctionFlag = TASK_FLAG_SET;
  1244. DrawPhoneDisplay();//呼叫
  1245. }
  1246. else
  1247. {
  1248. TaskSchedulerFlag.callFunctionFlag = TASK_FLAG_CLEAR;
  1249. DrawPhoneDisplay();//呼叫
  1250. }
  1251. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  1252. // DrawPhoneDisplay();//呼叫
  1253. // DrawLockDisplay();
  1254. // DrawPauseDisplay();
  1255. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//清锁屏时间
  1256. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_CLEAR;//清锁屏标志
  1257. KeyScanStatus.keyAirout = emKeyActionOff;
  1258. KeyScanQty.keyAirout = 0;
  1259. }
  1260. }
  1261. }
  1262. /*************************************************************************************
  1263. * Function: CntlPowerOFFWork
  1264. * Object: 控制关机供电
  1265. * 输入: 无
  1266. * 输出: 无
  1267. * 备注: 1、通过TaskSchedulerFlag.sysPowerOffFlag变量来判定关机步骤
  1268. * 2、关机前需要延时10S,向PC机发送关机状态
  1269. ********************************************** ****************************************/
  1270. void CntlPowerOFFWork( void )
  1271. {
  1272. MotorPWRCtl( DRIVER_OFF );
  1273. SpeakerCtl( DRIVER_OFF );//蜂鸣器
  1274. SensorPWRCtl( DRIVER_OFF );//Sensor电源
  1275. LCDBLACtl( DRIVER_OFF );//LCD背光
  1276. HornWorkStatus(HornOFF);//喇叭关闭
  1277. if(sysAlarmFlag.VoltLowest == ALARM_PREPARE)
  1278. {
  1279. sysAlarmFlag.VoltLowest = ALARM_OFF;
  1280. LcdFlicker_Flag = TASK_FLAG_CLEAR;
  1281. }
  1282. if( TaskSchedulerFlag.sysPowerOffFlag == TASK_FLAG_CLEAR ) //comment by wulianwei
  1283. {
  1284. TaskSchedulerFlag.sysPowerOffFlag = TASK_FLAG_WAIT;
  1285. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  1286. TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_SET;
  1287. }
  1288. else if( TaskSchedulerFlag.sysPowerOffFlag == TASK_FLAG_SET )
  1289. {
  1290. realTimeData.ctlSlaveRun = Poweroff;
  1291. PowerKeySave();
  1292. }
  1293. }
  1294. /*************************************************************************************
  1295. * Function: CntlPowerONWork
  1296. * Object: 控制开机供电
  1297. * 输入: 无
  1298. * 输出: 无
  1299. * 备注: 1、开机时根据不同的按键状态来判断应该执行哪个任务,包括开机、进入工程模式
  1300. * 2、TaskSchedulerFlag.autoPowerOffFlag判断是否自动关机
  1301. **************************************************************************************/
  1302. void CntlPowerONWork( void )
  1303. {
  1304. /*if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_CLEAR )//从进入此界面开始自动关机倒计时
  1305. {
  1306. TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_WAIT;
  1307. TaskSchedulerTimer.autoPowerOffTimer = FIVE_SECOND_TIMER;
  1308. }*/
  1309. // if( ( KeyActionFlag.keyPower == emKeyflagLongPress ) && ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )
  1310. // {
  1311. // KeyActionFlag.keyPlus = emKeyflagLongRelease;//长按释放按键
  1312. // emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1313. // emSysWorkStep = EnterEngineeringMode1;
  1314. // emDisplayPicture = EngineeringMode1Disp;
  1315. // realTimeData.stateRun = StartWork;//系统运行状态:工作
  1316. //
  1317. // }
  1318. // else if( KeyActionFlag.keyPower == emKeyflagShortPress || KeyActionFlag.keyPower == emKeyflagLongPress)
  1319. {
  1320. /* 方晨峰 修改于 20170711 */
  1321. sysPromptToneType = StartupTone;//蜂鸣器响:开机音
  1322. speakerWorkStep = emSpeakerNoneWork;
  1323. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  1324. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1325. emSysWorkStep = EnterStartup;
  1326. emDisplayPicture = Startup;
  1327. realTimeData.stateRun = SelfTest;//系统运行状态:自检
  1328. // TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_SET;
  1329. }
  1330. }
  1331. /*************************************************************************************
  1332. * Function: CntlAutoPowerOff
  1333. * Object: 控制自动关机
  1334. * 输入: 无
  1335. * 输出: 无
  1336. * 备注: 1、在有自动关机操作的界面会将TaskSchedulerFlag.autoPowerOffFlag变量设置为
  1337. * TASK_FLAG_SET,到规定时间没有操作则自动关机
  1338. ********************************************** ****************************************/
  1339. void CntlAutoPowerOff( void )
  1340. {
  1341. if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_SET )
  1342. {
  1343. if( emSysWorkStep == EnterPowerON )
  1344. {
  1345. realTimeData.stateRun = Poweroff;
  1346. realTimeData.ctlSlaveRun = Poweroff;
  1347. PowerKeySave();//在上电操作时关机不用发送数据直接加
  1348. }
  1349. else
  1350. {
  1351. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1352. realTimeData.stateRun = Poweroff;//关机发送
  1353. /* 切断电源,关机 */
  1354. emDisplayPicture = ClearDisp;
  1355. emSysWorkStep = EnterPowerOFF;
  1356. }
  1357. }
  1358. }
  1359. /*************************************************************************************
  1360. * Function: CntlNoActionHint()
  1361. * Object: 控制无操作提示
  1362. * 输入: 无
  1363. * 输出: 无
  1364. * 备注: 1、在有自动关机操作的界面会将TaskSchedulerFlag.NoActionHintFlag 变量设置为
  1365. * TASK_FLAG_SET,到规定30min后蜂鸣器提示
  1366. ********************************************** ****************************************/
  1367. void CntlNoActionHint(void)
  1368. {
  1369. if(TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_SET)
  1370. {
  1371. SysHornToneType = LowPriWarning; //两声提示音
  1372. Y_LED_ON;
  1373. Y_Led_Time=HALF_SECOND_TIMER;//自检LED点亮500ms
  1374. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WSET ;
  1375. }
  1376. }
  1377. /*************************************************************************************
  1378. * Function: InfusionControl
  1379. * Object: 输液控制
  1380. * 输入: SysInfusionModeType infusionMode 输液模式
  1381. * 输出: 无
  1382. * 备注: 输液控制,主要用来控制输液量及输液模式
  1383. * 1、首次量模式:根据工程模式中的自控量算 默认100ml/h
  1384. * 2、持续量模式:根据持续量设置值计算出多长时间电机转动一圈
  1385. * 3、追加量模式:根据工程模式中的自控量算 默认100ml/h
  1386. **************************************************************************************/
  1387. void InfusionControl( SysInfusionModeType infusionMode )
  1388. {
  1389. switch( infusionMode )
  1390. {
  1391. case FirstDoseMode:
  1392. InfusionStopTimer = ( 3600 * 1000 ) / ( 100 *10 );
  1393. InfusionXmitTimer = InfusionStopTimer;
  1394. // if( EngineeringModeValue.selfcontrol == 0 )//自控流速
  1395. // {
  1396. // InfusionStopTimer = 0;
  1397. // InfusionXmitTimer = 3600 * 100;
  1398. // }
  1399. // else
  1400. // {
  1401. // InfusionStopTimer = ( 3600 * 1000 ) / ( EngineeringModeValue.selfcontrol *10 );
  1402. // InfusionXmitTimer = InfusionStopTimer;
  1403. // }
  1404. break;
  1405. case ContinueMode:
  1406. //1小时(3600s) / 持续量设置值(电机每转一圈是0.05ml,持续量的单位是0.1ml) * 1000(转化为ms)
  1407. if( runParamInfo.continueDose == 0 )
  1408. {
  1409. InfusionStopTimer = 0;
  1410. InfusionXmitTimer = 3600 * 100;
  1411. }
  1412. else
  1413. {
  1414. InfusionStopTimer = ( 3600 * 1000 ) / runParamInfo.continueDose;
  1415. InfusionXmitTimer = InfusionStopTimer;
  1416. }
  1417. break;
  1418. case SuperadditionMode:
  1419. if( EngineeringModeValue.selfcontrol == 0 )
  1420. {
  1421. InfusionStopTimer = 0;
  1422. InfusionXmitTimer = 3600 * 100;
  1423. }
  1424. else
  1425. {
  1426. InfusionStopTimer = ( 3600 * 1000 ) / ( EngineeringModeValue.selfcontrol *10 );
  1427. InfusionXmitTimer = InfusionStopTimer;
  1428. }
  1429. break;
  1430. default:break;
  1431. }
  1432. /* 电机开始工作,将电机停止标志设置为等待,电机停止InfusionStopTimer时长,然后再次启动电机;电机工作状态为启动 */
  1433. if( InfusionStopTimer != 0)
  1434. {
  1435. motorWorkState = MOTOR_WORK_ON;//进入电机工作状态
  1436. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_WAIT;//开始计时,等待下次电机启动操作
  1437. }
  1438. else
  1439. {
  1440. motorWorkState = MOTOR_WORK_OFF;//进入电机工作状态
  1441. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;//开始计时,等待下次电机启动操作
  1442. }
  1443. }
  1444. /*************************************************************************************
  1445. * Function: CntlSystemStandby
  1446. * Object: 控制系统休眠
  1447. * 输入: 无
  1448. * 输出: 无
  1449. * 备注: 1、系统上运行10s即休眠
  1450. * 2、休眠前会给从机发送命令,令其也休眠
  1451. **************************************************************************************/
  1452. void CntlSystemStandby( void )
  1453. {
  1454. if( TaskSchedulerFlag.sysStandbyFlag == TASK_FLAG_SET )
  1455. {
  1456. TaskSchedulerFlag.sysStandbyFlag = TASK_FLAG_CLEAR;
  1457. if( realTimeData.ctlSlaveRun != WaitState )
  1458. {
  1459. if( speakerWorkStep != emSpeakerNoneWork)
  1460. return;
  1461. realTimeData.ctlSlaveRun = StandBy;//从机运行状态
  1462. HostToSlaveHandle(); //发送休眠命令到从单片机
  1463. }
  1464. }
  1465. }
  1466. /*************************************************************************************
  1467. * Function: CntlStartupPicture
  1468. * Object: 控制开机画面
  1469. * 输入: 无
  1470. * 输出: 无
  1471. * 备注: 1、enter键、停止/运行键长按有效,其它键无效
  1472. * 2、开机时会有自检,只有自检通过才能跳到其它界面处理事件
  1473. * 3、在开机界面可长按停止/运行键进入历史数据界面
  1474. **************************************************************************************/
  1475. void CntlStartupPicture( void )
  1476. {
  1477. if( TaskSchedulerFlag.motorSelfTestFlag != TASK_FLAG_SET )//如果没有自检开始自检
  1478. {
  1479. PECASelfTestHandle();
  1480. }
  1481. else//只有自检成功后才可以进行开机界面其它事件处理
  1482. {
  1483. if( ( KeyActionFlag.keyPower == emKeyflagLongPress ) && ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )
  1484. {
  1485. KeyActionFlag.keyPlus = emKeyflagLongRelease;//长按释放按键
  1486. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1487. emSysWorkStep = EnterEngineeringMode1;
  1488. emDisplayPicture = EngineeringMode1Disp;
  1489. realTimeData.stateRun = StartWork;//系统运行状态:工作
  1490. }
  1491. else if( EngineeringModeValue.seachState == ENGINEERINGMODE_ON )
  1492. {
  1493. if( KeyActionFlag.keyEnter == emKeyflagLongPress )//enter键
  1494. {
  1495. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1496. realTimeData.stateRun = StartWork;//系统运行状态:工作
  1497. TaskSchedulerTimer.dispAutoJumpTimer = FIVE_SECOND_TIMER;//修改于2019.02.12跳转时间3s-5s
  1498. emSysWorkStep = EnterHistory;
  1499. emDisplayPicture = HistoryFisrtDisp;
  1500. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  1501. motorWorkState = MOTOR_WORK_OFF;
  1502. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  1503. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  1504. }
  1505. }
  1506. }
  1507. }
  1508. /*************************************************************************************
  1509. * Function: CntlHistoryPicture
  1510. * Object: 控制历史数据画面
  1511. * 输入: 无
  1512. * 输出: 无
  1513. * 备注: 1、enter键短按进入设备ID界面
  1514. * 2、加减键短按翻页
  1515. * 3、电源键长按关机
  1516. * 4、其它键无效
  1517. **************************************************************************************/
  1518. void CntlHistoryPicture( void )
  1519. {
  1520. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  1521. {
  1522. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1523. emSysWorkStep = EnterDeviceID;
  1524. emDisplayPicture = DeviceID;
  1525. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;//自动跳转恢复为常用值
  1526. }
  1527. if( KeyActionFlag.keyPlus == emKeyflagShortPress )//加键
  1528. {
  1529. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按释放按键
  1530. TaskSchedulerTimer.dispAutoJumpTimer = FIVE_SECOND_TIMER;
  1531. if(FackhistoryRecordQTY == 0)
  1532. {
  1533. FackreadIndex = 0;
  1534. }
  1535. else if(FackreadIndex < FackhistoryRecordQTY )
  1536. {
  1537. FackreadIndex ++ ;//假索引
  1538. }
  1539. else
  1540. {
  1541. FackreadIndex = 1;
  1542. if(FackhistoryRecordQTY > 10)
  1543. {
  1544. if(historyRecordPointer == 0)
  1545. {
  1546. historyRecord.readIndex = (historyRecordQTY-1);
  1547. }
  1548. else
  1549. {
  1550. historyRecord.readIndex = historyRecordPointer-1;
  1551. }
  1552. ReadHistoryRecord();
  1553. emSysWorkStep = EnterHistory;
  1554. emDisplayPicture = HistoryFisrtDisp;
  1555. return;
  1556. }
  1557. }
  1558. /* if( historyRecordQTY == 0 )//表示没有历史数据
  1559. {
  1560. historyRecord.readIndex = 0;
  1561. }
  1562. else if( historyRecord.readIndex < ( historyRecordQTY - 1 ) )
  1563. {
  1564. historyRecord.readIndex++;
  1565. }
  1566. else
  1567. {
  1568. historyRecord.readIndex = 0;
  1569. }*/
  1570. if( historyRecord.readIndex > 0 )
  1571. {
  1572. historyRecord.readIndex--;
  1573. }
  1574. else
  1575. {
  1576. if( historyRecordQTY == 0 )//表示没有历史数据
  1577. {
  1578. historyRecord.readIndex = 0;
  1579. }
  1580. else
  1581. {
  1582. historyRecord.readIndex = historyRecordQTY - 1;
  1583. }
  1584. }
  1585. ReadHistoryRecord();
  1586. emSysWorkStep = EnterHistory;
  1587. emDisplayPicture = HistoryFisrtDisp;
  1588. }
  1589. if( KeyActionFlag.keyMinus == emKeyflagShortPress )//减键
  1590. {
  1591. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按释放按键
  1592. TaskSchedulerTimer.dispAutoJumpTimer = FIVE_SECOND_TIMER;
  1593. if(FackhistoryRecordQTY == 0)
  1594. {
  1595. FackreadIndex = 0;
  1596. }
  1597. else if(FackreadIndex > 1)
  1598. {
  1599. FackreadIndex -- ;
  1600. }
  1601. else
  1602. {
  1603. FackreadIndex = FackhistoryRecordQTY;
  1604. if(FackhistoryRecordQTY > 10)
  1605. {
  1606. historyRecord.readIndex = 0;
  1607. ReadHistoryRecord();
  1608. emSysWorkStep = EnterHistory;
  1609. emDisplayPicture = HistoryFisrtDisp;
  1610. return;
  1611. }
  1612. }
  1613. /*if( historyRecord.readIndex > 0 )
  1614. {
  1615. historyRecord.readIndex--;
  1616. }
  1617. else
  1618. {
  1619. if( historyRecordQTY == 0 )//表示没有历史数据
  1620. {
  1621. historyRecord.readIndex = 0;
  1622. }
  1623. else
  1624. {
  1625. historyRecord.readIndex = historyRecordQTY - 1;
  1626. }
  1627. }*/
  1628. if( historyRecordQTY == 0 )//表示没有历史数据
  1629. {
  1630. historyRecord.readIndex = 0;
  1631. }
  1632. else if( historyRecord.readIndex < ( historyRecordQTY - 1 ) )
  1633. {
  1634. historyRecord.readIndex++;
  1635. }
  1636. else
  1637. {
  1638. historyRecord.readIndex = 0;
  1639. }
  1640. ReadHistoryRecord();
  1641. emSysWorkStep = EnterHistory;
  1642. emDisplayPicture = HistoryFisrtDisp;
  1643. }
  1644. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  1645. {
  1646. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1647. realTimeData.stateRun = Poweroff;//关机发送
  1648. /* 切断电源,关机 */
  1649. emDisplayPicture = ClearDisp;
  1650. emSysWorkStep = EnterPowerOFF;
  1651. }
  1652. }
  1653. /*************************************************************************************
  1654. * Function: CntlDeviceIDPicture
  1655. * Object: 控制设备ID画面
  1656. * 输入: 无
  1657. * 输出: 无
  1658. * 备注: 1、enter键短按进入时间显示界面
  1659. * 2、power键长按关机
  1660. * 3、其它键无效
  1661. **************************************************************************************/
  1662. void CntlDeviceIDPicture( void )
  1663. {
  1664. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  1665. {
  1666. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1667. emSysWorkStep = EnterDispTime;
  1668. emDisplayPicture = TimeDisp;
  1669. // emSysWorkStep = EnterVerifyInfo;
  1670. // emDisplayPicture = VerifyInfoDisp;
  1671. // TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_SET;
  1672. }
  1673. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  1674. {
  1675. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1676. realTimeData.stateRun = Poweroff;//关机发送
  1677. /* 切断电源,关机 */
  1678. emDisplayPicture = ClearDisp;
  1679. emSysWorkStep = EnterPowerOFF;
  1680. }
  1681. }
  1682. /*************************************************************************************
  1683. * Function: CntlDispTimePicture
  1684. * Object: 控制时间显示画面
  1685. * 输入: 无
  1686. * 输出: 无
  1687. * 备注: 1、enter键短按进入信息确认界面
  1688. * 2、power键长按关机
  1689. * 3、加号键长按进入时间设置界面
  1690. * 4、其它键无效
  1691. * 5、此页面有自动关机功能
  1692. **************************************************************************************/
  1693. void CntlDispTimePicture( void )
  1694. {
  1695. /*if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_CLEAR )//从进入此界面开始自动关机倒计时
  1696. {
  1697. TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_WAIT;
  1698. TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;
  1699. }*/
  1700. if( TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_CLEAR )//从进入此界面开始未操作提示倒计时
  1701. {
  1702. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WAIT;
  1703. TaskSchedulerTimer.NoActionHintTimer = THIRTY_MINUTE_TIMER;
  1704. }
  1705. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  1706. {
  1707. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1708. emSysWorkStep = EnterVerifyInfo;
  1709. emDisplayPicture = VerifyInfoDisp;
  1710. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  1711. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  1712. }
  1713. if( KeyActionFlag.keyPlus == emKeyflagLongPress )//加键
  1714. {
  1715. KeyActionFlag.keyPlus = emKeyflagLongRelease;//长按释放按键
  1716. setTimeBuf.year = displayTimeBuf.year;
  1717. setTimeBuf.month = displayTimeBuf.month;
  1718. setTimeBuf.date = displayTimeBuf.date;
  1719. setTimeBuf.week = displayTimeBuf.week;
  1720. setTimeBuf.hour = displayTimeBuf.hour;
  1721. setTimeBuf.minute = displayTimeBuf.minute;
  1722. setTimeBuf.seconds = displayTimeBuf.seconds;
  1723. /*不设置月份直接设置天数,减按键无法使用情况*/
  1724. switch( setTimeBuf.month )
  1725. {
  1726. case 1: case 3: case 5: case 7:
  1727. case 8: case 10: case 12:
  1728. dateLimit = 31;
  1729. break;
  1730. case 2:
  1731. dateLimit = 29;
  1732. break;
  1733. case 4: case 6: case 9: case 11:
  1734. dateLimit = 30;
  1735. break;
  1736. default:
  1737. dateLimit = 30;
  1738. break;
  1739. }
  1740. /**********************************************/
  1741. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1742. emSysWorkStep = EnterSetTime;
  1743. emDisplayPicture = TimeSetDisp;
  1744. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  1745. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  1746. }
  1747. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  1748. {
  1749. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1750. realTimeData.stateRun = Poweroff;//关机发送
  1751. //切断电源,关机
  1752. emDisplayPicture = ClearDisp;
  1753. emSysWorkStep = EnterPowerOFF;
  1754. }
  1755. }
  1756. /*************************************************************************************
  1757. * Function: CntlSetTimePicture
  1758. * Object: 控制时间设置画面
  1759. * 输入: 无
  1760. * 输出: 无
  1761. * 备注: 1、enter键短按下一项选择,直到最后一项进入时间显示界面
  1762. * 2、运行停止键短按前一项选择,直到第一项进入时间显示界面
  1763. * 3、power键长按关机
  1764. * 4、加减键短按选项数字加减
  1765. * 5、其它键无效
  1766. * 6、此页面有自动关机功能
  1767. **************************************************************************************/
  1768. void CntlSetTimePicture( void )
  1769. {
  1770. /*if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_CLEAR )//从进入此界面开始自动关机倒计时
  1771. {
  1772. TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_WAIT;
  1773. TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;
  1774. }*/
  1775. if( TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_CLEAR )//从进入此界面开始未操作提示倒计时
  1776. {
  1777. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WAIT;
  1778. TaskSchedulerTimer.NoActionHintTimer = THIRTY_MINUTE_TIMER;
  1779. }
  1780. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  1781. {
  1782. switch( emSetTimeChoose )
  1783. {
  1784. case Year:
  1785. emSetTimeChoose = Month;
  1786. emDisplayPicture = TimeSetDisp;
  1787. break;
  1788. case Month:
  1789. emSetTimeChoose = Date;
  1790. emDisplayPicture = TimeSetDisp;
  1791. break;
  1792. case Date:
  1793. emSetTimeChoose = Hour;
  1794. emDisplayPicture = TimeSetDisp;
  1795. break;
  1796. case Hour:
  1797. emSetTimeChoose = Minute;
  1798. emDisplayPicture = TimeSetDisp;
  1799. break;
  1800. case Minute:
  1801. displayTimeBuf.year = setTimeBuf.year;
  1802. displayTimeBuf.month = setTimeBuf.month;
  1803. displayTimeBuf.date = setTimeBuf.date;
  1804. displayTimeBuf.week = setTimeBuf.week;
  1805. displayTimeBuf.hour = setTimeBuf.hour;
  1806. displayTimeBuf.minute = setTimeBuf.minute;
  1807. displayTimeBuf.seconds = 0;//setTimeBuf.seconds;
  1808. /* 在此应该设置一下时间 */
  1809. // RTC_Set(setTimeBuf.year,setTimeBuf.month,setTimeBuf.date,setTimeBuf.hour,setTimeBuf.minute,0);//默认时间
  1810. SetDateTimeToRTC();
  1811. emSetTimeChoose = Year;
  1812. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1813. controlTimerCounts = 0;
  1814. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;
  1815. emDisplayPicture = TimeDisp;
  1816. emSysWorkStep = EnterDispTime;
  1817. sysPromptToneCounts = 0;//蜂鸣器-计数
  1818. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  1819. break;
  1820. default:break;
  1821. }
  1822. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  1823. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  1824. }
  1825. if( (KeyActionFlag.keyRunPause == emKeyflagShortPress )||(KeyActionFlag.keyPS == emKeyflagShortPress) )//RunPause键\返回按键
  1826. {
  1827. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  1828. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  1829. switch( emSetTimeChoose)
  1830. {
  1831. case Year://如果在year项按运行/停止键则保存时间设置跳回时间显示界面
  1832. displayTimeBuf.year = setTimeBuf.year;
  1833. displayTimeBuf.month = setTimeBuf.month;
  1834. displayTimeBuf.date = setTimeBuf.date;
  1835. displayTimeBuf.week = setTimeBuf.week;
  1836. displayTimeBuf.hour = setTimeBuf.hour;
  1837. displayTimeBuf.minute = setTimeBuf.minute;
  1838. displayTimeBuf.seconds = setTimeBuf.seconds;
  1839. /* 在此应该设置一下时间 */
  1840. // RTC_Set(setTimeBuf.year,setTimeBuf.month,setTimeBuf.date,setTimeBuf.hour,setTimeBuf.minute,0);//默认时间
  1841. SetDateTimeToRTC();
  1842. emSetTimeChoose = Year;
  1843. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  1844. controlTimerCounts = 0;
  1845. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;
  1846. emDisplayPicture = TimeDisp;
  1847. emSysWorkStep = EnterDispTime;
  1848. sysPromptToneCounts = 0;//蜂鸣器-计数
  1849. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  1850. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  1851. break;
  1852. case Month:
  1853. emSetTimeChoose = Year;
  1854. emDisplayPicture = TimeSetDisp;
  1855. break;
  1856. case Date:
  1857. emSetTimeChoose = Month;
  1858. emDisplayPicture = TimeSetDisp;
  1859. break;
  1860. case Hour:
  1861. emSetTimeChoose = Date;
  1862. emDisplayPicture = TimeSetDisp;
  1863. break;
  1864. case Minute:
  1865. emSetTimeChoose = Hour;
  1866. emDisplayPicture = TimeSetDisp;
  1867. break;
  1868. default:break;
  1869. }
  1870. }
  1871. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  1872. {
  1873. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按按释放按键
  1874. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  1875. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  1876. switch( emSetTimeChoose)
  1877. {
  1878. case Year:
  1879. setTimeBuf.year++;
  1880. break;
  1881. case Month:
  1882. setTimeBuf.month++;
  1883. if( setTimeBuf.month > 12 )
  1884. {
  1885. setTimeBuf.month = 1;
  1886. }
  1887. switch( setTimeBuf.month )
  1888. {
  1889. case 1: case 3: case 5: case 7:
  1890. case 8: case 10: case 12:
  1891. dateLimit = 31;
  1892. break;
  1893. case 2:
  1894. if(setTimeBuf.year %4 !=0)
  1895. {
  1896. dateLimit = 28;
  1897. }
  1898. else
  1899. {
  1900. dateLimit = 29;
  1901. }
  1902. break;
  1903. case 4: case 6: case 9: case 11:
  1904. dateLimit = 30;
  1905. break;
  1906. default:
  1907. dateLimit = 30;
  1908. break;
  1909. }
  1910. if( setTimeBuf.date > dateLimit )
  1911. {
  1912. setTimeBuf.date = dateLimit;
  1913. }
  1914. break;
  1915. case Date:
  1916. switch( setTimeBuf.month )
  1917. {
  1918. case 1: case 3: case 5: case 7:
  1919. case 8: case 10: case 12:
  1920. dateLimit = 31;
  1921. break;
  1922. case 2:
  1923. if(setTimeBuf.year %4 !=0)
  1924. {
  1925. dateLimit = 28;
  1926. }
  1927. else
  1928. {
  1929. dateLimit = 29;
  1930. }
  1931. break;
  1932. case 4: case 6: case 9: case 11:
  1933. dateLimit = 30;
  1934. break;
  1935. default:
  1936. dateLimit = 30;
  1937. break;
  1938. }
  1939. setTimeBuf.date++;
  1940. if( setTimeBuf.date > dateLimit )
  1941. {
  1942. setTimeBuf.date = 1;
  1943. }
  1944. break;
  1945. case Hour:
  1946. setTimeBuf.hour++;
  1947. if( setTimeBuf.hour > 23 )
  1948. {
  1949. setTimeBuf.hour = 0;
  1950. }
  1951. break;
  1952. case Minute:
  1953. setTimeBuf.minute++;
  1954. if( setTimeBuf.minute > 59 )
  1955. {
  1956. setTimeBuf.minute = 0;
  1957. }
  1958. emDisplayPicture = TimeDisp;
  1959. emSysWorkStep = EnterDispTime;
  1960. break;
  1961. default:break;
  1962. }
  1963. emSysWorkStep = EnterSetTime;
  1964. emDisplayPicture = TimeSetDisp;
  1965. }
  1966. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  1967. {
  1968. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按按释放按键
  1969. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  1970. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  1971. switch( emSetTimeChoose)
  1972. {
  1973. case Year:
  1974. setTimeBuf.year--;
  1975. break;
  1976. case Month:
  1977. if( setTimeBuf.month <= 1 )
  1978. {
  1979. setTimeBuf.month = 12;
  1980. }
  1981. else
  1982. {
  1983. setTimeBuf.month--;
  1984. }
  1985. switch( setTimeBuf.month )
  1986. {
  1987. case 1: case 3: case 5: case 7:
  1988. case 8: case 10: case 12:
  1989. dateLimit = 31;
  1990. break;
  1991. case 2:
  1992. if(setTimeBuf.year %4 !=0)
  1993. {
  1994. dateLimit = 28;
  1995. }
  1996. else
  1997. {
  1998. dateLimit = 29;
  1999. }
  2000. break;
  2001. case 4: case 6: case 9: case 11:
  2002. dateLimit = 30;
  2003. break;
  2004. default:
  2005. dateLimit = 30;
  2006. break;
  2007. }
  2008. if( setTimeBuf.date > dateLimit )
  2009. {
  2010. setTimeBuf.date = dateLimit;
  2011. }
  2012. break;
  2013. case Date:
  2014. switch( setTimeBuf.month )
  2015. {
  2016. case 1: case 3: case 5: case 7:
  2017. case 8: case 10: case 12:
  2018. dateLimit = 31;
  2019. break;
  2020. case 2:
  2021. if(setTimeBuf.year %4 !=0)
  2022. {
  2023. dateLimit = 28;
  2024. }
  2025. else
  2026. {
  2027. dateLimit = 29;
  2028. }
  2029. break;
  2030. case 4: case 6: case 9: case 11:
  2031. dateLimit = 30;
  2032. break;
  2033. default:
  2034. dateLimit = 30;
  2035. break;
  2036. }
  2037. if( setTimeBuf.date <= 1 )
  2038. {
  2039. setTimeBuf.date = dateLimit;
  2040. }
  2041. else
  2042. {
  2043. setTimeBuf.date--;
  2044. }
  2045. break;
  2046. case Hour:
  2047. if( setTimeBuf.hour <= 0 )
  2048. {
  2049. setTimeBuf.hour = 23;
  2050. }
  2051. else
  2052. {
  2053. setTimeBuf.hour--;
  2054. }
  2055. break;
  2056. case Minute:
  2057. if( setTimeBuf.minute <= 0 )
  2058. {
  2059. setTimeBuf.minute = 59;
  2060. }
  2061. else
  2062. {
  2063. setTimeBuf.minute--;
  2064. }
  2065. break;
  2066. default:break;
  2067. }
  2068. emSysWorkStep = EnterSetTime;
  2069. emDisplayPicture = TimeSetDisp;
  2070. }
  2071. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  2072. {
  2073. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2074. realTimeData.stateRun = Poweroff;//关机发送
  2075. /* 切断电源,关机 */
  2076. emDisplayPicture = ClearDisp;
  2077. emSysWorkStep = EnterPowerOFF;
  2078. }
  2079. }
  2080. /*************************************************************************************
  2081. * Function: CntlSetPasswordPicture
  2082. * Object: 控制设置密码画面
  2083. * 输入: 无
  2084. * 输出: 无
  2085. * 备注: 1、每次使用都会设置新的密码,密码设置完成无须保存
  2086. * 2、enter键短按下一项选择,直到最后一项进入时间显示界面
  2087. * 3、运行停止键短按前一项选择,直到第一项进入时间显示界面
  2088. * 4、power键长按关机
  2089. * 5、加减键短按选项数字加减
  2090. * 6、其它键无效
  2091. **************************************************************************************/
  2092. void CntlSetPasswordPicture( void )
  2093. {
  2094. uint8_t i;
  2095. uint8_t tempPasswordState = 0;
  2096. uint8_t temptestValue = 0;
  2097. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  2098. {
  2099. switch( modifyStep )//选择下一个项
  2100. {
  2101. case 1: case 2: case 3: case 4:
  2102. case 5:
  2103. modifyStep++;
  2104. emSysWorkStep = EnterSetPassword;
  2105. emDisplayPicture = PasswordSetDisp;
  2106. break;
  2107. case 6:
  2108. modifyStep = 1;
  2109. for( i = 0 ; i < 3 ; i++ )//比较密码信息,有一个不正确则将状态置1
  2110. {
  2111. if( setPasswordBuf[i] != verifyPasswordBuf[i] )
  2112. {
  2113. tempPasswordState = 1;
  2114. break;
  2115. }
  2116. }
  2117. if( tempPasswordState == 0 )//如果比较后密码信息正确,则跳入下一个界面,否则继续留在本页并跳到第一步
  2118. {
  2119. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2120. emSysWorkStep = EnterSetParam;
  2121. emDisplayPicture = SetParamDisp;
  2122. sysPromptToneCounts = 0;//蜂鸣器-计数
  2123. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  2124. }
  2125. else
  2126. {
  2127. emSysWorkStep = EnterSetPassword;
  2128. emDisplayPicture = PasswordSetDisp;
  2129. // sysPromptToneCounts = 255;//蜂鸣器-计数
  2130. SysHornToneType = WarringTone;//蜂鸣器-密码比对错误报警
  2131. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  2132. }
  2133. temptestValue = setPasswordBuf[0]*10;
  2134. temptestValue += setPasswordBuf[1];
  2135. break;
  2136. default:break;
  2137. }
  2138. }
  2139. if( KeyActionFlag.keyRunPause == emKeyflagShortPress )//运行/停止键
  2140. {
  2141. switch( modifyStep )//选择下一个项
  2142. {
  2143. case 1:
  2144. modifyStep = 1;
  2145. break;
  2146. case 2: case 3: case 4:
  2147. case 5: case 6:
  2148. modifyStep--;
  2149. break;
  2150. default:break;
  2151. }
  2152. emSysWorkStep = EnterSetPassword;
  2153. emDisplayPicture = PasswordSetDisp;
  2154. }
  2155. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  2156. {
  2157. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按释放按键
  2158. switch( modifyStep )//选项加1
  2159. {
  2160. case 1: case 2: case 3:
  2161. if( setPasswordBuf[modifyStep-1] < 9 )
  2162. {
  2163. setPasswordBuf[modifyStep-1]++;
  2164. }
  2165. else
  2166. {
  2167. setPasswordBuf[modifyStep-1] = 0;
  2168. }
  2169. break;
  2170. case 4: case 5: case 6:
  2171. if( verifyPasswordBuf[modifyStep-4] < 9 )//modifyStep-1-3 数组维数从0开始
  2172. {
  2173. verifyPasswordBuf[modifyStep-4]++;
  2174. }
  2175. else
  2176. {
  2177. verifyPasswordBuf[modifyStep-4] = 0;
  2178. }
  2179. break;
  2180. default:break;
  2181. }
  2182. emSysWorkStep = EnterSetPassword;
  2183. emDisplayPicture = PasswordSetDisp;
  2184. }
  2185. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  2186. {
  2187. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按释放按键
  2188. switch( modifyStep )//选项减1
  2189. {
  2190. case 1: case 2: case 3:
  2191. if( setPasswordBuf[modifyStep-1] > 0 )
  2192. {
  2193. setPasswordBuf[modifyStep-1]--;
  2194. }
  2195. else
  2196. {
  2197. setPasswordBuf[modifyStep-1] = 9;
  2198. }
  2199. break;
  2200. case 4: case 5: case 6:
  2201. if( verifyPasswordBuf[modifyStep-4] > 0 )//modifyStep-1-3 数组维数从0开始
  2202. {
  2203. verifyPasswordBuf[modifyStep-4]--;
  2204. }
  2205. else
  2206. {
  2207. verifyPasswordBuf[modifyStep-4] = 9;
  2208. }
  2209. break;
  2210. default:break;
  2211. }
  2212. emSysWorkStep = EnterSetPassword;
  2213. emDisplayPicture = PasswordSetDisp;
  2214. }
  2215. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  2216. {
  2217. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2218. realTimeData.stateRun = Poweroff;//关机发送
  2219. /* 切断电源,关机 */
  2220. emDisplayPicture = ClearDisp;
  2221. emSysWorkStep = EnterPowerOFF;
  2222. }
  2223. }
  2224. /*************************************************************************************
  2225. * Function: CntlVerifyInfoPicture
  2226. * Object: 控制确认住院信息画面
  2227. * 输入: 无
  2228. * 输出: 无
  2229. * 备注: 1、enter键短按下一项选择,直到最后一项进入参数设置界面
  2230. * 2、运行停止键短按前一项选择
  2231. * 3、power键长按关机
  2232. * 4、加号键长按进入信息设置界面
  2233. * 5、其它键无效
  2234. * 6、此页面有自动关机功能
  2235. **************************************************************************************/
  2236. void CntlVerifyInfoPicture( void )
  2237. {
  2238. /*if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_CLEAR )//从进入此界面开始自动关机倒计时
  2239. {
  2240. TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_WAIT;
  2241. TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;
  2242. }*/
  2243. if( TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_CLEAR )//从进入此界面开始未操作提示倒计时
  2244. {
  2245. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WAIT;
  2246. TaskSchedulerTimer.NoActionHintTimer = THIRTY_MINUTE_TIMER;
  2247. }
  2248. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  2249. {
  2250. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2251. // TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;//清除自动关机计时
  2252. if( verifyInfo.modifyInfoType == HOSPITALNO_SELECTED )
  2253. {
  2254. emDisplayPicture = VerifyInfoDisp;
  2255. verifyInfo.modifyInfoType = BEDNO_SELECTED;
  2256. }
  2257. else
  2258. {
  2259. if(EngineeringModeValue.networkState ==0 )
  2260. {
  2261. if(TaskSchedulerFlag.HistoryDontSetFlag == TASK_FLAG_SET)
  2262. {
  2263. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2264. verifyInfo.modifyInfoType = HOSPITALNO_SELECTED;
  2265. realTimeData.stateRun = Poweron;
  2266. Start_send=0; //设置完住院号/病区床号,进入参数设置开始发送数据
  2267. TaskSchedulerTimer.rtdXmitTimer = ONE_SECOND_TIMER;//准备快速发送实时数据 进入设置界面1s发送开机状态长数据包
  2268. emSysWorkStep = EnterSetParam;
  2269. emDisplayPicture = SetParamDisp;
  2270. verifyInfo.modifyInfoType = HOSPITALNO_SELECTED;
  2271. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2272. }
  2273. else
  2274. {
  2275. verifyInfo.modifyInfoType = HOSPITALNO_SELECTED;
  2276. emSysWorkStep = EnterInpatien;
  2277. emDisplayPicture = Inpatien;
  2278. }
  2279. }
  2280. else
  2281. {
  2282. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2283. emSysWorkStep = EnterSetParam;
  2284. emDisplayPicture = SetParamDisp;
  2285. }
  2286. }
  2287. }
  2288. if((KeyActionFlag.keyRunPause == emKeyflagShortPress )||(KeyActionFlag.keyPS == emKeyflagShortPress))//暂停键具有返回功能
  2289. {
  2290. // TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;//清除自动关机计时
  2291. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2292. if( verifyInfo.modifyInfoType == BEDNO_SELECTED )
  2293. {
  2294. emDisplayPicture = VerifyInfoDisp;
  2295. verifyInfo.modifyInfoType = HOSPITALNO_SELECTED;
  2296. }
  2297. else
  2298. {
  2299. verifyInfo.modifyInfoType = HOSPITALNO_SELECTED;
  2300. }
  2301. }
  2302. if( KeyActionFlag.keyPlus == emKeyflagLongPress )//“+”键
  2303. {
  2304. KeyActionFlag.keyPlus = emKeyflagLongRelease;//长按释放按键
  2305. // TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;//清除自动关机计时
  2306. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2307. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2308. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2309. emSysWorkStep = EnterSetVerifyInfo;
  2310. emDisplayPicture = SetVerifyInfoDisp;
  2311. modifyStep = 1;
  2312. }
  2313. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  2314. {
  2315. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2316. realTimeData.stateRun = Poweroff;//关机发送
  2317. /* 切断电源,关机 */
  2318. emDisplayPicture = ClearDisp;
  2319. emSysWorkStep = EnterPowerOFF;
  2320. }
  2321. }
  2322. /*************************************************************************************
  2323. * Function: CntlSetVerifyInfoPicture
  2324. * Object: 控制设置确认住院信息画面
  2325. * 输入: 无
  2326. * 输出: 无
  2327. * 备注: 1、enter键短按下一项选择
  2328. * 2、运行停止键短按前一项选择
  2329. * 3、power键长按关机
  2330. * 4、加减键短按选项数字加减
  2331. * 5、其它键无效
  2332. * 6、此页面有自动关机功能
  2333. **************************************************************************************/
  2334. void CntlSetVerifyInfoPicture( void )
  2335. {
  2336. uint8_t i;
  2337. /*if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_CLEAR )//从进入此界面开始自动关机倒计时
  2338. {
  2339. TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_WAIT;
  2340. TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;
  2341. }*/
  2342. if( TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_CLEAR )//从进入此界面开始未操作提示倒计时
  2343. {
  2344. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WAIT;
  2345. TaskSchedulerTimer.NoActionHintTimer = THIRTY_MINUTE_TIMER;
  2346. }
  2347. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  2348. {
  2349. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2350. // TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;//清除自动关机计时
  2351. switch( verifyInfo.modifyInfoType )
  2352. {
  2353. case HOSPITALNO_SELECTED:
  2354. if( modifyStep < EngineeringModeValue.hospitalNOQty )
  2355. {
  2356. modifyStep++;
  2357. emSysWorkStep = EnterSetVerifyInfo;
  2358. emDisplayPicture = SetVerifyInfoDisp;
  2359. }
  2360. else
  2361. {
  2362. // WriteParameterRecord();//设置完成在此处保存一下
  2363. verifyInfo.hospitalNO = 0;
  2364. for( i = 0 ; i < EngineeringModeValue.hospitalNOQty - 1 ; i++ )
  2365. {
  2366. verifyInfo.hospitalNO += setParamInfo.hospitalNO[i];
  2367. verifyInfo.hospitalNO *= 10;
  2368. }
  2369. verifyInfo.hospitalNO += setParamInfo.hospitalNO[i];//最后一位不用乘10倍
  2370. WriteParameterRecord();//设置完成在此处保存一下
  2371. emSysWorkStep = EnterVerifyInfo;
  2372. emDisplayPicture = VerifyInfoDisp;
  2373. verifyInfo.modifyInfoType = BEDNO_SELECTED;
  2374. modifyStep = 1;
  2375. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2376. sysPromptToneCounts = 0;//蜂鸣器-计数
  2377. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  2378. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2379. }
  2380. TaskSchedulerFlag.HistoryDontSetFlag = TASK_FLAG_SET;//进入住院号设置界面即可认为住院号已经设置
  2381. break;
  2382. case BEDNO_SELECTED:
  2383. if( modifyStep < ( EngineeringModeValue.sickroomQty + EngineeringModeValue.bedNOQty ) )
  2384. {
  2385. modifyStep++;
  2386. emSysWorkStep = EnterSetVerifyInfo;
  2387. emDisplayPicture = SetVerifyInfoDisp;
  2388. }
  2389. else
  2390. {
  2391. // WriteParameterRecord();//设置完成在此处保存一下
  2392. verifyInfo.sickroom = 0;
  2393. for( i = 0 ; i < ( EngineeringModeValue.sickroomQty - 1 ) ; i++ )
  2394. {
  2395. verifyInfo.sickroom += setParamInfo.sickroom[i];
  2396. verifyInfo.sickroom *= 10;
  2397. }
  2398. verifyInfo.sickroom += setParamInfo.sickroom[i];//最后一位不用乘10倍
  2399. verifyInfo.bedNO = 0;
  2400. for( i = 0 ; i < ( EngineeringModeValue.bedNOQty - 1 ) ; i++ )
  2401. {
  2402. verifyInfo.bedNO += setParamInfo.bedNO[i];
  2403. verifyInfo.bedNO *= 10;
  2404. }
  2405. verifyInfo.bedNO += setParamInfo.bedNO[i];
  2406. WriteParameterRecord();//设置完成在此处保存一下
  2407. emSysWorkStep = EnterVerifyInfo;
  2408. emDisplayPicture = VerifyInfoDisp;
  2409. modifyStep = 1;
  2410. verifyInfo.modifyInfoType = BEDNO_SELECTED;
  2411. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2412. sysPromptToneCounts = 0;//蜂鸣器-计数
  2413. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  2414. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2415. }
  2416. break;
  2417. default:break;
  2418. }
  2419. }
  2420. if(( KeyActionFlag.keyRunPause == emKeyflagShortPress)||(KeyActionFlag.keyPS == emKeyflagShortPress) )//运行/停止键
  2421. {
  2422. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2423. // TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;//清除自动关机计时
  2424. switch( verifyInfo.modifyInfoType )
  2425. {
  2426. case HOSPITALNO_SELECTED:
  2427. if( modifyStep == 1 )//选择上一项
  2428. {
  2429. // WriteParameterRecord();//设置完成在此处保存一下
  2430. verifyInfo.hospitalNO = 0;
  2431. for( i = 0 ; i < ( EngineeringModeValue.hospitalNOQty - 1 ) ; i++ )
  2432. {
  2433. verifyInfo.hospitalNO += setParamInfo.hospitalNO[i];
  2434. verifyInfo.hospitalNO *= 10;
  2435. }
  2436. verifyInfo.hospitalNO += setParamInfo.hospitalNO[i];//最后一位不用乘10倍
  2437. WriteParameterRecord();//设置完成在此处保存一下
  2438. emSysWorkStep = EnterVerifyInfo;
  2439. emDisplayPicture = VerifyInfoDisp;
  2440. verifyInfo.modifyInfoType = BEDNO_SELECTED;
  2441. modifyStep = 1;
  2442. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2443. sysPromptToneCounts = 0;//蜂鸣器-计数
  2444. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  2445. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2446. }
  2447. else
  2448. {
  2449. modifyStep--;
  2450. emSysWorkStep = EnterSetVerifyInfo;
  2451. emDisplayPicture = SetVerifyInfoDisp;
  2452. }
  2453. TaskSchedulerFlag.HistoryDontSetFlag = TASK_FLAG_SET;//进入住院号设置界面即可认为住院号已经设置
  2454. break;
  2455. case BEDNO_SELECTED:
  2456. if( modifyStep == 1 )//选择上一项
  2457. {
  2458. // WriteParameterRecord();//设置完成在此处保存一下
  2459. verifyInfo.sickroom = 0;
  2460. for( i = 0 ; i < ( EngineeringModeValue.sickroomQty - 1 ) ; i++ )
  2461. {
  2462. verifyInfo.sickroom += setParamInfo.sickroom[i];
  2463. verifyInfo.sickroom *= 10;
  2464. }
  2465. verifyInfo.sickroom += setParamInfo.sickroom[i];//最后一位不用乘10倍
  2466. verifyInfo.bedNO = 0;
  2467. for( i = 0 ; i < ( EngineeringModeValue.bedNOQty - 1 ) ; i++ )
  2468. {
  2469. verifyInfo.bedNO += setParamInfo.bedNO[i];
  2470. verifyInfo.bedNO *= 10;
  2471. }
  2472. verifyInfo.bedNO += setParamInfo.bedNO[i];
  2473. WriteParameterRecord();//设置完成在此处保存一下
  2474. emSysWorkStep = EnterVerifyInfo;
  2475. emDisplayPicture = VerifyInfoDisp;
  2476. modifyStep = 1;
  2477. verifyInfo.modifyInfoType = BEDNO_SELECTED;
  2478. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2479. sysPromptToneCounts = 0;//蜂鸣器-计数
  2480. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  2481. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2482. }
  2483. else
  2484. {
  2485. modifyStep--;
  2486. emSysWorkStep = EnterSetVerifyInfo;
  2487. emDisplayPicture = SetVerifyInfoDisp;
  2488. }
  2489. break;
  2490. default:break;
  2491. }
  2492. }
  2493. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  2494. {
  2495. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按操作释放按键
  2496. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2497. // TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;//清除自动关机计时
  2498. switch( verifyInfo.modifyInfoType )
  2499. {
  2500. case HOSPITALNO_SELECTED:
  2501. if( setParamInfo.hospitalNO[modifyStep-1] < 9 )//选项加1
  2502. {
  2503. setParamInfo.hospitalNO[modifyStep-1]++;
  2504. }
  2505. else
  2506. {
  2507. setParamInfo.hospitalNO[modifyStep-1] = 0;
  2508. }
  2509. break;
  2510. case BEDNO_SELECTED:
  2511. if( modifyStep <= EngineeringModeValue.sickroomQty )//选项加1病区
  2512. {
  2513. if( setParamInfo.sickroom[modifyStep - 1] < 9 )
  2514. {
  2515. setParamInfo.sickroom[modifyStep - 1]++;
  2516. }
  2517. else
  2518. {
  2519. setParamInfo.sickroom[modifyStep-1] = 0;
  2520. }
  2521. }
  2522. else//选项加1病床
  2523. {
  2524. if( setParamInfo.bedNO[modifyStep - EngineeringModeValue.sickroomQty - 1] < 9 )
  2525. {
  2526. setParamInfo.bedNO[modifyStep - EngineeringModeValue.sickroomQty - 1]++;
  2527. }
  2528. else
  2529. {
  2530. setParamInfo.bedNO[modifyStep - EngineeringModeValue.sickroomQty - 1] = 0;
  2531. }
  2532. }
  2533. break;
  2534. default:break;
  2535. }
  2536. emSysWorkStep = EnterSetVerifyInfo;
  2537. emDisplayPicture = SetVerifyInfoDisp;
  2538. }
  2539. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  2540. {
  2541. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按操作释放按键
  2542. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2543. // TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;//清除自动关机计时
  2544. switch( verifyInfo.modifyInfoType )
  2545. {
  2546. case HOSPITALNO_SELECTED:
  2547. if( setParamInfo.hospitalNO[modifyStep-1] > 0 )//选项减1
  2548. {
  2549. setParamInfo.hospitalNO[modifyStep-1]--;
  2550. }
  2551. else
  2552. {
  2553. setParamInfo.hospitalNO[modifyStep-1] = 9;
  2554. }
  2555. break;
  2556. case BEDNO_SELECTED:
  2557. if( modifyStep <= EngineeringModeValue.sickroomQty )//选项减1病区
  2558. {
  2559. if( setParamInfo.sickroom[modifyStep - 1] > 0 )
  2560. {
  2561. setParamInfo.sickroom[modifyStep - 1]--;
  2562. }
  2563. else
  2564. {
  2565. setParamInfo.sickroom[modifyStep-1] = 9;
  2566. }
  2567. }
  2568. else//选项减1病床
  2569. {
  2570. if( setParamInfo.bedNO[modifyStep - EngineeringModeValue.sickroomQty - 1] > 0 )
  2571. {
  2572. setParamInfo.bedNO[modifyStep - EngineeringModeValue.sickroomQty - 1]--;
  2573. }
  2574. else
  2575. {
  2576. setParamInfo.bedNO[modifyStep - EngineeringModeValue.sickroomQty - 1] = 9;
  2577. }
  2578. }
  2579. break;
  2580. default:break;
  2581. }
  2582. emSysWorkStep = EnterSetVerifyInfo;
  2583. emDisplayPicture = SetVerifyInfoDisp;
  2584. }
  2585. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  2586. {
  2587. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2588. realTimeData.stateRun = Poweroff;//关机发送
  2589. /* 切断电源,关机 */
  2590. emDisplayPicture = ClearDisp;
  2591. emSysWorkStep = EnterPowerOFF;
  2592. }
  2593. }
  2594. /*************************************************************************************
  2595. * Function: CntlInpatienPicture(void)
  2596. * Object: 控制住院号未设置提醒界面
  2597. * 输入: 无
  2598. * 输出: 无
  2599. * 备注: 未设置住院号不能进入参数设置界面,进入此界面,按返回按键返回到设置住院号界面
  2600. **************************************************************************************/
  2601. void CntlInpatienPicture(void)
  2602. {
  2603. if( TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_CLEAR )//从进入此界面开始未操作提示倒计时
  2604. {
  2605. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WAIT;
  2606. TaskSchedulerTimer.NoActionHintTimer = THIRTY_MINUTE_TIMER;
  2607. }
  2608. if(( KeyActionFlag.keyPS == emKeyflagShortPress )||(KeyActionFlag.keyRunPause == emKeyflagShortPress))//返回键
  2609. {
  2610. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;
  2611. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2612. emSysWorkStep = EnterVerifyInfo;
  2613. emDisplayPicture = VerifyInfoDisp;
  2614. verifyInfo.modifyInfoType = HOSPITALNO_SELECTED;
  2615. }
  2616. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  2617. {
  2618. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2619. realTimeData.stateRun = Poweroff;//关机发送
  2620. /* 切断电源,关机 */
  2621. emDisplayPicture = ClearDisp;
  2622. emSysWorkStep = EnterPowerOFF;
  2623. }
  2624. }
  2625. /*************************************************************************************
  2626. * Function: CntlSetParamPicture
  2627. * Object: 控制设置参数画面
  2628. * 输入: 无
  2629. * 输出: 无
  2630. * 备注: 1、enter键短按下一项选择,循环选择
  2631. * 2、运行停止键短按进入运行界面,并且保存参数
  2632. * 3、power键长按关机
  2633. * 4、加减键短按选项数字加减
  2634. * 5、Airout键短按进入排气界面
  2635. * 6、密码/静音键短按进入密码设置界面
  2636. * 7、其它键无效
  2637. * 8、此页面有自动关机功能
  2638. **************************************************************************************/
  2639. void CntlSetParamPicture( void )
  2640. {
  2641. /*if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_CLEAR )//从进入此界面开始自动关机倒计时
  2642. {
  2643. TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_WAIT;
  2644. TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;
  2645. }*/
  2646. if( TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_CLEAR )//从进入此界面开始未操作提示倒计时
  2647. {
  2648. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WAIT;
  2649. TaskSchedulerTimer.NoActionHintTimer = THIRTY_MINUTE_TIMER;
  2650. // TaskSchedulerTimer.NoActionHintTimer = THREE_MINUTE_TIMER;
  2651. }
  2652. TaskSchedulerFlag.PCAOneTimeFlag=TASK_FLAG_WAIT;
  2653. TaskSchedulerTimer.pcaOneHourTimer=ONE_HOUR_TIMER;
  2654. // if( ( KeyActionFlag.keyEnter == emKeyflagShortPress ) || ( KeyActionFlag.keyEnter == emKeyflagLongPress ) )//Enter键
  2655. if(( KeyActionFlag.keyEnter == emKeyflagShortPress )&&(KEY_Enter_action == 1))
  2656. {
  2657. KeyActionFlag.keyEnter = emKeyflagShortRelease;//短按操作释放按键
  2658. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2659. if(SetParametersAgain == 0)
  2660. {
  2661. switch( setParamInfo.emModifyParam )
  2662. {
  2663. case TotalDose:
  2664. setParamInfo.emModifyParam = FirstDose;
  2665. break;
  2666. case FirstDose:
  2667. setParamInfo.emModifyParam = Superaddition;
  2668. break;
  2669. case Superaddition:
  2670. setParamInfo.emModifyParam = continueDose;
  2671. break;
  2672. case continueDose:
  2673. setParamInfo.emModifyParam = LockTime;
  2674. break;
  2675. case LockTime:
  2676. setParamInfo.emModifyParam = LimitDose;
  2677. break;
  2678. case LimitDose:
  2679. setParamInfo.emModifyParam = TotalDose;
  2680. break;
  2681. default:break;
  2682. }
  2683. }
  2684. else
  2685. {
  2686. switch( setParamInfo.emModifyParam )
  2687. {
  2688. case FirstDose:
  2689. setParamInfo.emModifyParam = Superaddition;
  2690. break;
  2691. case Superaddition:
  2692. setParamInfo.emModifyParam = continueDose;
  2693. break;
  2694. case continueDose:
  2695. setParamInfo.emModifyParam = LockTime;
  2696. break;
  2697. case LockTime:
  2698. setParamInfo.emModifyParam = LimitDose;
  2699. break;
  2700. case LimitDose:
  2701. setParamInfo.emModifyParam = FirstDose;
  2702. break;
  2703. default:break;
  2704. }
  2705. }
  2706. emSysWorkStep = EnterSetParam;
  2707. emDisplayPicture = SetParamDisp;
  2708. }
  2709. if( KeyActionFlag.keyEnter == emKeyflagLongPress )
  2710. {
  2711. // KeyActionFlag.keyEnter = emKeyflagShortRelease;//短按操作释放按键
  2712. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2713. if(TaskSchedulerFlag.EnterDelayFlag == TASK_FLAG_SET)
  2714. {
  2715. if(SetParametersAgain == 0)
  2716. {
  2717. switch( setParamInfo.emModifyParam )
  2718. {
  2719. case TotalDose:
  2720. setParamInfo.emModifyParam = FirstDose;
  2721. break;
  2722. case FirstDose:
  2723. setParamInfo.emModifyParam = Superaddition;
  2724. break;
  2725. case Superaddition:
  2726. setParamInfo.emModifyParam = continueDose;
  2727. break;
  2728. case continueDose:
  2729. setParamInfo.emModifyParam = LockTime;
  2730. break;
  2731. case LockTime:
  2732. setParamInfo.emModifyParam = LimitDose;
  2733. break;
  2734. case LimitDose:
  2735. setParamInfo.emModifyParam = TotalDose;
  2736. break;
  2737. default:break;
  2738. }
  2739. }
  2740. else
  2741. {
  2742. switch( setParamInfo.emModifyParam )
  2743. {
  2744. case FirstDose:
  2745. setParamInfo.emModifyParam = Superaddition;
  2746. break;
  2747. case Superaddition:
  2748. setParamInfo.emModifyParam = continueDose;
  2749. break;
  2750. case continueDose:
  2751. setParamInfo.emModifyParam = LockTime;
  2752. break;
  2753. case LockTime:
  2754. setParamInfo.emModifyParam = LimitDose;
  2755. break;
  2756. case LimitDose:
  2757. setParamInfo.emModifyParam = FirstDose;
  2758. break;
  2759. default:break;
  2760. }
  2761. }
  2762. TaskSchedulerFlag.EnterDelayFlag = TASK_FLAG_CLEAR;
  2763. TaskSchedulerTimer.EnterDelayTimer = EnterDelay_TIMER;
  2764. emSysWorkStep = EnterSetParam;
  2765. emDisplayPicture = SetParamDisp;
  2766. }
  2767. }
  2768. if( KeyActionFlag.keyPS == emKeyflagShortPress )//返回键
  2769. {
  2770. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2771. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2772. if(SetParametersAgain == 0)
  2773. {
  2774. switch( setParamInfo.emModifyParam )
  2775. {
  2776. case TotalDose:
  2777. setParamInfo.emModifyParam = LimitDose;
  2778. break;
  2779. case FirstDose:
  2780. setParamInfo.emModifyParam = TotalDose;
  2781. break;
  2782. case Superaddition:
  2783. setParamInfo.emModifyParam = FirstDose;
  2784. break;
  2785. case continueDose:
  2786. setParamInfo.emModifyParam = Superaddition;
  2787. break;
  2788. case LockTime:
  2789. setParamInfo.emModifyParam = continueDose;
  2790. break;
  2791. case LimitDose:
  2792. setParamInfo.emModifyParam = LockTime;
  2793. break;
  2794. default:break;
  2795. }
  2796. }
  2797. else
  2798. {
  2799. switch( setParamInfo.emModifyParam )
  2800. {
  2801. case FirstDose:
  2802. setParamInfo.emModifyParam = LimitDose;
  2803. break;
  2804. case Superaddition:
  2805. setParamInfo.emModifyParam = FirstDose;
  2806. break;
  2807. case continueDose:
  2808. setParamInfo.emModifyParam = Superaddition;
  2809. break;
  2810. case LockTime:
  2811. setParamInfo.emModifyParam = continueDose;
  2812. break;
  2813. case LimitDose:
  2814. setParamInfo.emModifyParam = LockTime;
  2815. break;
  2816. default:break;
  2817. }
  2818. }
  2819. emSysWorkStep = EnterSetParam;
  2820. emDisplayPicture = SetParamDisp;
  2821. }
  2822. if( KeyActionFlag.keyRunPause == emKeyflagShortPress )//运行/停止键
  2823. {
  2824. ran = 1; //只要运行按键开启置1,在暂停中判断上次是否为1,防止暂停按键按压后实际运行的参数并没有变化这种现象发生
  2825. WriteParameterRecord();//设置完成在此保存一下
  2826. RunParamUpdate();//更新运行参数
  2827. start_flag = 1; //当按下运行按键时,置位该标志
  2828. ElectStartCount=0;
  2829. self_adaption_Pressure=0;//运行时,清除自适应压力值
  2830. self_adaption_cont=0;
  2831. self_adaption_flag=0; //自适应压力参数处理完成标志,用于后面压力报警判断
  2832. // RunToLorawawn_flag=1; //按运行按键时,置位标志,立即发送数据
  2833. StartToRun_flag=1; //当按下运行按键的时候,置位该标志
  2834. /*新增加测试开关打开时,以20s发送短数据包*/
  2835. if(EngineeringModeValue.test == 0)
  2836. {
  2837. TaskSchedulerTimer.rtdXmitTimer = TWENTY_SECOND_TIMER;//20s发送一次
  2838. }
  2839. /******************************************/
  2840. /* 如果首次量没有设置,则直接进入到运行界面,否则进入首次量 */
  2841. if( setParamInfo.firstDose != 0 )
  2842. {
  2843. InfusionControl( FirstDoseMode );
  2844. realTimeData.stateRun = FirstRun;//进入首次运行状态,运行发送
  2845. emDisplayPicture = RunFirstDoseDisp;
  2846. emSysWorkStep = EnterRunFirstDose;
  2847. }
  2848. else
  2849. {
  2850. InfusionControl( ContinueMode );
  2851. realTimeData.stateRun = MainRun;//进入运行状态,运行发送
  2852. emDisplayPicture = RunMainDisp;
  2853. emSysWorkStep = EnterRunMain;
  2854. }
  2855. // runParamInfo.pwmSetValue = 1000;
  2856. // realTimeData.invalidCount = 0;
  2857. // realTimeData.validCount = 0;
  2858. sysAlarmFlag.Zhentongxiaoguo = ALARM_OFF; //重新设置参数后阵痛不足报警解除
  2859. pca_count = 0; //设置参数时镇痛不足计数清零
  2860. realTimeData.motorSelfTestCount = 0;
  2861. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  2862. TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;//电机停止等待时间
  2863. realTimeData.lockTime = 0;//PCA锁时
  2864. TaskSchedulerFlag.pcaLockFlag = TASK_FLAG_CLEAR;//清除PCA锁时
  2865. realTimeData.hall1Counter = 0;
  2866. realTimeData.preHall1 = 0;
  2867. realTimeData.hall2Counter = 0;
  2868. realTimeData.preHall2 = 0;
  2869. modifyStep = 1;
  2870. historyRefreshFlag = 0;//清除历史数据存储刷新标志
  2871. TaskSchedulerTimer.totalDoseOneHourTimer = ONE_HOUR_TIMER;
  2872. realTimeData.inputLimitDose = 0;//极限量累加值清零
  2873. TaskSchedulerFlag.limitJudgeFlag = TASK_FLAG_SET;
  2874. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_CLEAR;//清除锁屏
  2875. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;
  2876. TaskSchedulerFlag.unlockPasswordFlag = TASK_FLAG_CLEAR;//清除锁写密码状态
  2877. TaskSchedulerFlag.SuperadditionFlag = TASK_FLAG_CLEAR;//清除追加标志
  2878. TaskSchedulerTimer.totalDoseOneHourTimer = ONE_HOUR_TIMER;//极限量输注判断时间为1小时
  2879. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  2880. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  2881. // if(SetParametersAgain == 0)
  2882. // {
  2883. // setParamInfo.emModifyParam = TotalDose;
  2884. // }
  2885. // else
  2886. // {
  2887. // setParamInfo.emModifyParam = FirstDose;
  2888. // }
  2889. sysPromptToneCounts = 0;//蜂鸣器-计数
  2890. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  2891. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2892. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2893. }
  2894. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  2895. {
  2896. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按操作释放按键
  2897. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2898. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2899. switch( setParamInfo.emModifyParam )
  2900. {
  2901. case TotalDose:
  2902. if( setParamInfo.totalDose >= 999 )
  2903. {
  2904. setParamInfo.totalDose = 0;
  2905. }
  2906. else
  2907. {
  2908. setParamInfo.totalDose++;
  2909. }
  2910. break;
  2911. case FirstDose:
  2912. if( setParamInfo.firstDose >= 50 )
  2913. {
  2914. setParamInfo.firstDose = 0;
  2915. }
  2916. else
  2917. {
  2918. setParamInfo.firstDose++;
  2919. }
  2920. break;
  2921. case continueDose:
  2922. /* 0~10,按0.1调,10~50按1调 */
  2923. if( setParamInfo.continueDose1 < 100 )
  2924. {
  2925. setParamInfo.continueDose1++;
  2926. }
  2927. else if( ( setParamInfo.continueDose1 < 500 ) && ( setParamInfo.continueDose1 >= 100 ) )
  2928. {
  2929. setParamInfo.continueDose1 += 10;
  2930. }
  2931. else if( setParamInfo.continueDose1 >= 500 )
  2932. {
  2933. setParamInfo.continueDose1 = 0;
  2934. }
  2935. break;
  2936. case Superaddition:
  2937. if( setParamInfo.superaddition1 >= 100 )
  2938. {
  2939. setParamInfo.superaddition1 = 0;
  2940. }
  2941. else if( ( setParamInfo.superaddition1 >= 60 ) && ( setParamInfo.superaddition1 < 100 ) )
  2942. {
  2943. setParamInfo.superaddition1 += 10;
  2944. }
  2945. else
  2946. {
  2947. setParamInfo.superaddition1++;
  2948. }
  2949. break;
  2950. case LockTime:
  2951. if( setParamInfo.lockTime1 >= 99 )//1440
  2952. {
  2953. setParamInfo.lockTime1 = 0;
  2954. }
  2955. else
  2956. {
  2957. setParamInfo.lockTime1++;
  2958. }
  2959. break;
  2960. case LimitDose:
  2961. if( setParamInfo.limitDose1 >= 90 )
  2962. {
  2963. setParamInfo.limitDose1 = 1;
  2964. }
  2965. else
  2966. {
  2967. setParamInfo.limitDose1 += 1;
  2968. }
  2969. break;
  2970. default:break;
  2971. }
  2972. emSysWorkStep = EnterSetParam;
  2973. emDisplayPicture = SetParamDisp;
  2974. }
  2975. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  2976. {
  2977. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按操作释放按键
  2978. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  2979. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  2980. switch( setParamInfo.emModifyParam )
  2981. {
  2982. case TotalDose:
  2983. if( setParamInfo.totalDose <= 0 )
  2984. {
  2985. setParamInfo.totalDose = 999;
  2986. }
  2987. else
  2988. {
  2989. setParamInfo.totalDose--;
  2990. }
  2991. break;
  2992. case FirstDose:
  2993. if( setParamInfo.firstDose <= 0 )
  2994. {
  2995. setParamInfo.firstDose = 50;
  2996. }
  2997. else
  2998. {
  2999. setParamInfo.firstDose--;
  3000. }
  3001. break;
  3002. case continueDose:
  3003. if( ( setParamInfo.continueDose1 <= 100 ) && ( setParamInfo.continueDose1 > 0 ) )
  3004. {
  3005. setParamInfo.continueDose1--;
  3006. }
  3007. else if( ( setParamInfo.continueDose1 <= 500 ) && ( setParamInfo.continueDose1 > 100 ) )
  3008. {
  3009. setParamInfo.continueDose1 -= 10;
  3010. }
  3011. else if( setParamInfo.continueDose1 == 0 )
  3012. {
  3013. setParamInfo.continueDose1 = 500;
  3014. }
  3015. break;
  3016. case Superaddition:
  3017. if( setParamInfo.superaddition1 <= 0 )
  3018. {
  3019. setParamInfo.superaddition1 = 100;
  3020. }
  3021. else if( ( setParamInfo.superaddition1 <= 100 ) && ( setParamInfo.superaddition1 > 60 ) )
  3022. {
  3023. setParamInfo.superaddition1 -= 10;
  3024. }
  3025. else
  3026. {
  3027. setParamInfo.superaddition1--;
  3028. }
  3029. break;
  3030. case LockTime:
  3031. if( setParamInfo.lockTime1 <= 0 )
  3032. {
  3033. setParamInfo.lockTime1 = 99;//1440
  3034. }
  3035. else
  3036. {
  3037. setParamInfo.lockTime1--;
  3038. }
  3039. break;
  3040. case LimitDose:
  3041. if( setParamInfo.limitDose1 <= 1 )
  3042. {
  3043. setParamInfo.limitDose1 = 90; //2017.3.22 修改极限量为90
  3044. }
  3045. else
  3046. {
  3047. setParamInfo.limitDose1 -= 1;
  3048. }
  3049. break;
  3050. default:break;
  3051. }
  3052. emSysWorkStep = EnterSetParam;
  3053. emDisplayPicture = SetParamDisp;
  3054. }
  3055. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  3056. {
  3057. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3058. realTimeData.stateRun = Poweroff;//关机发送
  3059. /* 切断电源,关机 */
  3060. emDisplayPicture = ClearDisp;
  3061. emSysWorkStep = EnterPowerOFF;
  3062. }
  3063. /* 按airout键进入排气前的密码 只有在暂停时有效 */
  3064. if( KeyActionFlag.keyAirout == emKeyflagShortPress )//Airout键排气呼叫
  3065. {
  3066. WriteParameterRecord();//设置完成在此保存一下
  3067. // runParamInfo.pwmSetValue = 1000;//用最大转数排气
  3068. realTimeData.airoutValue = 0;
  3069. motorWorkState = MOTOR_WORK_OFF;
  3070. emSysWorkStep = EnterAirout;
  3071. emDisplayPicture = AiroutDisp;
  3072. modifyStep = 1;
  3073. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3074. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  3075. }
  3076. /* 按PS键进入密码设置界面 */
  3077. /*if( KeyActionFlag.keyPS == emKeyflagShortPress )//密码/静音键
  3078. {
  3079. WriteParameterRecord();//设置完成在此保存一下
  3080. emDisplayPicture = PasswordSetDisp;
  3081. emSysWorkStep = EnterSetPassword;
  3082. modifyStep = 1;
  3083. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3084. TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  3085. }*/
  3086. }
  3087. /*************************************************************************************
  3088. * Function: CntlAiroutPicture
  3089. * Object: 控制排气画面
  3090. * 输入: 无
  3091. * 输出: 无
  3092. * 备注: 1、enter键短按进入参数设置界面
  3093. * 2、power键长按关机
  3094. * 3、Airout键短按一下进行一次排气,长按时直到松开按键排气结束
  3095. * 4、其它键无效
  3096. **************************************************************************************/
  3097. void CntlAiroutPicture( void )
  3098. {
  3099. realTimeData.stateRun = Airout;
  3100. if( TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_CLEAR )//从进入此界面开始未操作提示倒计时
  3101. {
  3102. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WAIT;
  3103. TaskSchedulerTimer.NoActionHintTimer = THIRTY_MINUTE_TIMER;
  3104. }
  3105. /* 按enter键退出排气,进入参数设置 */
  3106. // if( KeyActionFlag.keyPS == emKeyflagShortPress )//返回键
  3107. // {
  3108. // TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  3109. // /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  3110. // TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  3111. // TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  3112. // if( motorWorkState == MOTOR_WORK_OFF )
  3113. // {
  3114. // emSysWorkStep = EnterSetParam;
  3115. // emDisplayPicture = SetParamDisp;
  3116. // setParamInfo.emModifyParam = TotalDose;
  3117. // realTimeData.stateRun = StartWork;//系统运行状态:工作
  3118. // emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3119. // }
  3120. // }
  3121. // if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  3122. // {
  3123. // emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3124. // realTimeData.stateRun = Poweroff;//关机发送
  3125. // /* 切断电源,关机 */
  3126. // emDisplayPicture = ClearDisp;
  3127. // emSysWorkStep = EnterPowerOFF;
  3128. // }
  3129. if((( KeyActionFlag.keyAirout == emKeyflagLongPress )||( KeyActionFlag.keyAirout == emKeyflagShortPress ))
  3130. &&(TaskSchedulerFlag.AirOutFlag == TASK_FLAG_CLEAR))//Airout键
  3131. {
  3132. TaskSchedulerFlag.AirOutFlag = TASK_FLAG_SET;//排气过程中按下返回按键
  3133. KeyActionFlag.keyAirout = emKeyflagLongRelease;//长按松开
  3134. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  3135. KeyActionFlag.keyAirout = emKeyflagShortRelease;//短按操作释放按键
  3136. motorWorkState = MOTOR_WORK_ON;//按一次就执行一次排气,长按就直到松开排气键结束
  3137. realTimeData.motorSelfTestCount = 0;
  3138. realTimeData.airoutValue = 0;
  3139. realTimeData.stateRun = Airout;
  3140. }
  3141. /**/
  3142. // if(( KeyActionFlag.keyAirout == emKeyflagLongPress )&&(TaskSchedulerFlag.AirOutFlag == TASK_FLAG_CLEAR))//Airout键
  3143. // {
  3144. // TaskSchedulerFlag.AirOutFlag = TASK_FLAG_SET;//排气过程中按下返回按键
  3145. // KeyActionFlag.keyAirout = emKeyflagLongRelease;//长按松开
  3146. // TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  3147. // KeyActionFlag.keyAirout = emKeyflagShortRelease;//短按操作释放按键
  3148. // motorWorkState = MOTOR_WORK_ON;//按一次就执行一次排气,长按就直到松开排气键结束
  3149. // realTimeData.motorSelfTestCount = 0;
  3150. // realTimeData.airoutValue = 0;
  3151. // realTimeData.stateRun = Airout;
  3152. // }
  3153. if((realTimeData.airoutValue == 20)||((TaskSchedulerFlag.AirOutFlag == TASK_FLAG_SET)&&(KeyActionFlag.keyAirout == emKeyflagShortPress)))
  3154. {
  3155. TaskSchedulerFlag.AirOutFlag = TASK_FLAG_CLEAR;//排气过程中按下返回按键
  3156. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  3157. KeyActionFlag.keyPS = emKeyflagShortRelease;//短按操作释放按键
  3158. emSysWorkStep = EnterSetParam;
  3159. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3160. emDisplayPicture = SetParamDisp;
  3161. if(SetParametersAgain == 1)//重新设置参数
  3162. {
  3163. setParamInfo.emModifyParam = FirstDose; //首次量
  3164. }
  3165. else
  3166. {
  3167. setParamInfo.emModifyParam = TotalDose; //总量
  3168. }
  3169. realTimeData.stateRun = WaitState;
  3170. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  3171. }
  3172. /* 进入排气界面未排气时按返回键退出排气,进入参数设置 */
  3173. if(( KeyActionFlag.keyPS == emKeyflagShortPress )&&(TaskSchedulerFlag.AirOutFlag == TASK_FLAG_CLEAR))//返回键
  3174. {
  3175. TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  3176. emSysWorkStep = EnterSetParam;
  3177. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3178. emDisplayPicture = SetParamDisp;
  3179. if(SetParametersAgain == 1)//重新设置参数
  3180. {
  3181. setParamInfo.emModifyParam = FirstDose; //首次量
  3182. }
  3183. else
  3184. {
  3185. setParamInfo.emModifyParam = TotalDose; //总量
  3186. }
  3187. realTimeData.stateRun = WaitState;
  3188. }
  3189. // if( KeyActionFlag.keyAirout == emKeyflagShortPress ) //Airout键
  3190. // {
  3191. // TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  3192. // KeyActionFlag.keyAirout = emKeyflagShortRelease;//短按操作释放按键
  3193. // motorWorkState = MOTOR_WORK_ON;//按一次就执行一次排气,长按就直到松开排气键结束
  3194. // realTimeData.motorSelfTestCount = 0;
  3195. //// realTimeData.stateRun = Airout;
  3196. // }
  3197. // else if( KeyActionFlag.keyAirout == emKeyflagLongPress )
  3198. // {
  3199. // TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_CLEAR;//清除未操作提示标志
  3200. // motorWorkState = MOTOR_WORK_ON;//按一次就执行一次排气,长按就直到松开排气键结束
  3201. // realTimeData.motorSelfTestCount = 0;
  3202. //// realTimeData.stateRun = Airout;
  3203. // }
  3204. }
  3205. /*************************************************************************************
  3206. * Function: CntlLockPasswordPicture
  3207. * Object: 控制锁定密码界面
  3208. * 输入: 无
  3209. * 输出: 无
  3210. * 备注: 1、enter键短按下一项选择,直到最后一个密码,正确则进入相应界面,否则到第一个密码处
  3211. * 2、加减键短按选项数字加减
  3212. * 3、uint8_t tempSetPassword[3];临时密码存储
  3213. * 4、uint8_t tempUnlockState = 0;//解锁状态,成功 or 失败
  3214. * 5、暂停按键都能作为返回按键
  3215. **************************************************************************************/
  3216. void CntlLockPasswordPicture( void )
  3217. {
  3218. uint8_t tempSetPassword[3];
  3219. uint8_t i;
  3220. uint8_t tempUnlockState = 0;//解锁状态,成功 or 失败
  3221. /* 按enter键进入密码对比,正确进入下一界面 */
  3222. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  3223. {
  3224. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;//只要有按键操作就清除跳转时间
  3225. switch( modifyStep )
  3226. {
  3227. case 1:
  3228. modifyStep = 2;
  3229. emSysWorkStep = EnterLockPassword;
  3230. emDisplayPicture = LockPasswordDisp;
  3231. break;
  3232. case 2:
  3233. modifyStep = 3;
  3234. emSysWorkStep = EnterLockPassword;
  3235. emDisplayPicture = LockPasswordDisp;
  3236. break;
  3237. case 3:
  3238. tempSetPassword[0] = SYS_PASSWORD_DEFAULT / 100;
  3239. tempSetPassword[1] = ( SYS_PASSWORD_DEFAULT % 100 ) / 10;
  3240. tempSetPassword[2] = SYS_PASSWORD_DEFAULT % 10;
  3241. for( i = 0 ; i < 3 ; i++ )//默认密码对比
  3242. {
  3243. if( verifyPasswordBuf[i] != tempSetPassword[i] )
  3244. {
  3245. tempUnlockState = 1;
  3246. break;
  3247. }
  3248. }
  3249. if( tempUnlockState == 1 )//如果默认密码不对,与设置密码对比
  3250. {
  3251. for( i = 0 ; i < 3 ; i++ )
  3252. {
  3253. if( verifyPasswordBuf[i] != setPasswordBuf[i] )
  3254. {
  3255. tempUnlockState = 2;
  3256. break;
  3257. }
  3258. else
  3259. {
  3260. tempUnlockState = 0;
  3261. }
  3262. }
  3263. }
  3264. if( tempUnlockState == 0 )//密码匹配跳入相应界面
  3265. {
  3266. modifyStep = 1;
  3267. TaskSchedulerFlag.unlockPasswordFlag = TASK_FLAG_SET;
  3268. if(emLockPasswordStep == EnterPowerOFF)
  3269. {
  3270. realTimeData.stateRun = Poweroff;
  3271. }
  3272. else
  3273. {
  3274. realTimeData.stateRun = Pause;
  3275. }
  3276. emSysWorkStep = emLockPasswordStep;
  3277. emDisplayPicture = emLockPassowrdPicture;
  3278. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3279. }
  3280. else
  3281. {
  3282. modifyStep = 3;
  3283. emSysWorkStep = EnterLockPassword;
  3284. emDisplayPicture = LockPasswordDisp;
  3285. TaskSchedulerFlag.unlockPasswordFlag = TASK_FLAG_CLEAR;
  3286. }
  3287. break;
  3288. default:break;
  3289. }
  3290. }
  3291. if(( KeyActionFlag.keyPS == emKeyflagShortPress)||( KeyActionFlag.keyRunPause == emKeyflagShortPress))//返回键//暂停按键都能作为返回按键
  3292. {
  3293. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;//只要有按键操作就清除跳转时间
  3294. switch( modifyStep )
  3295. {
  3296. case 3:
  3297. modifyStep = 2;
  3298. emSysWorkStep = EnterLockPassword;
  3299. emDisplayPicture = LockPasswordDisp;
  3300. break;
  3301. case 2:
  3302. modifyStep = 1;
  3303. emSysWorkStep = EnterLockPassword;
  3304. emDisplayPicture = LockPasswordDisp;
  3305. break;
  3306. case 1:
  3307. modifyStep = 1;
  3308. emSysWorkStep = EnterLockPassword;
  3309. emDisplayPicture = LockPasswordDisp;
  3310. break;
  3311. default:break;
  3312. }
  3313. }
  3314. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  3315. {
  3316. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按操作释放按键
  3317. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;//只要有按键操作就清除跳转时间
  3318. switch( modifyStep )//选项加1
  3319. {
  3320. case 1: case 2: case 3:
  3321. if( verifyPasswordBuf[modifyStep-1] < 9 )
  3322. {
  3323. verifyPasswordBuf[modifyStep-1]++;
  3324. }
  3325. else
  3326. {
  3327. verifyPasswordBuf[modifyStep-1] = 0;
  3328. }
  3329. break;
  3330. default:break;
  3331. }
  3332. emSysWorkStep = EnterLockPassword;
  3333. emDisplayPicture = LockPasswordDisp;
  3334. }
  3335. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  3336. {
  3337. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按操作释放按键
  3338. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;//只要有按键操作就清除跳转时间
  3339. switch( modifyStep )//选项减1
  3340. {
  3341. case 1: case 2: case 3:
  3342. if( verifyPasswordBuf[modifyStep-1] > 0 )
  3343. {
  3344. verifyPasswordBuf[modifyStep-1]--;
  3345. }
  3346. else
  3347. {
  3348. verifyPasswordBuf[modifyStep-1] = 9;
  3349. }
  3350. break;
  3351. default:break;
  3352. }
  3353. emSysWorkStep = EnterLockPassword;
  3354. emDisplayPicture = LockPasswordDisp;
  3355. }
  3356. }
  3357. /*************************************************************************************
  3358. * Function: CntlRunFirstDosePicture
  3359. * Object: 控制运行-首次量界面
  3360. * 输入: 无
  3361. * 输出: 无
  3362. * 备注: 1、当注射完首次量后进入运行主页面
  3363. * 2、关机时需要密码,如果密码匹配则可以进行关机操作
  3364. * 3、if( realTimeData.firstDose == 0 )//判断首次量是否输注完毕
  3365. * 4、在非锁屏的情况下,运行/停止键进行输注运行或停止输注操作
  3366. * 5、暂停情况下可关机
  3367. * 6、暂停情况下长按enter键进入参数设置界面
  3368. * 7、加减键同时按下解锁,加锁
  3369. * 8、长按airout键用来呼叫
  3370. * 9、if( realTimeData.inputDose >= runParamInfo.totalDose )//判断是否输液完毕
  3371. **************************************************************************************/
  3372. void CntlRunFirstDosePicture( void )
  3373. {
  3374. uint8_t InputTotalDoseBuff[4];
  3375. if( TaskSchedulerFlag.unlockPasswordFlag == TASK_FLAG_SET )//密码解锁成功则进入关机
  3376. {
  3377. realTimeData.stateRun = Poweroff;//关机发送
  3378. /* 切断电源,关机 */
  3379. emSysWorkStep = EnterPowerOFF;
  3380. emDisplayPicture = ClearDisp;
  3381. return;
  3382. }
  3383. if( realTimeData.firstDose == 0 )//判断首次量是否输注完毕
  3384. {
  3385. LimitBeginsTime=1;
  3386. realTimeData.stateRun = MainRun;
  3387. emDisplayPicture = RunMainDisp;
  3388. emSysWorkStep = EnterRunMain;
  3389. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3390. if(TaskSchedulerFlag.StartToRunDontSend == SendSuceed)//
  3391. {
  3392. RunToLorawawn_flag=1; //首次量输注完毕后,置位标志,立即发送数据
  3393. }
  3394. }
  3395. else
  3396. {
  3397. LimitBeginsTime=0;
  3398. if( TaskSchedulerFlag.lockDispFlag == TASK_FLAG_CLEAR )//在非锁屏情况下按键好使
  3399. {
  3400. /*if(realTimeData.stateRun == Pause)
  3401. {
  3402. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键 运行过程中直接关机需要输入密码
  3403. {
  3404. KeyActionFlag.keyPower = emKeyflagNonePress;
  3405. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  3406. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  3407. realTimeData.stateRun = Pause;//暂停发送
  3408. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3409. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3410. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3411. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3412. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3413. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  3414. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  3415. if( historyRefreshFlag == 0 )
  3416. {
  3417. HistoryQtyAdd();
  3418. WriteHistoryRecordQTY();
  3419. historyRefreshFlag = 1;
  3420. }
  3421. WriteHistoryRecord();
  3422. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_ON )
  3423. {
  3424. emSysWorkStep = EnterLockPassword;
  3425. emDisplayPicture = LockPasswordDisp; //进入密码界面
  3426. emLockPasswordStep = EnterPowerOFF;
  3427. emLockPassowrdPicture = ClearDisp; //密码成功关机
  3428. emLockPasswordFailStep = EnterRunFirstDose;
  3429. emLockPassowrdFailPicture = RunFirstDoseDisp;//密码解除失败返回原界面
  3430. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;
  3431. modifyStep = 1;
  3432. return;
  3433. }
  3434. else
  3435. {
  3436. realTimeData.stateRun = Poweroff;//关机发送
  3437. // 切断电源,关机
  3438. emSysWorkStep = EnterPowerOFF;
  3439. emDisplayPicture = ClearDisp;
  3440. return;
  3441. }
  3442. }
  3443. }*/
  3444. if( KeyActionFlag.keyRunPause == emKeyflagLongPress )//运行/停止键
  3445. {
  3446. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3447. if( realTimeData.stateRun == FirstRun )
  3448. {
  3449. /* 即使暂停也不是按下暂停键就马上电机停止工作,而是要把本次输注完成再暂停,所以不能马上将电机工作状态改为停止 */
  3450. //motorWorkState = MOTOR_WORK_OFF;//电机停止触发
  3451. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  3452. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  3453. emDisplayPicture = RunFirstDoseDisp;
  3454. realTimeData.stateRun = Pause;//暂停发送
  3455. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  3456. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3457. }
  3458. }
  3459. // else if((KeyActionFlag.keyPS == emKeyflagShortPress) || (KeyActionFlag.keyRunPause == emKeyflagShortPress))//返回
  3460. else if(KeyActionFlag.keyRunPause == emKeyflagShortPress)
  3461. {
  3462. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3463. if( realTimeData.stateRun == Pause )
  3464. {
  3465. StartToRun_flag=1; //当按下运行按键的时候,置位该标志
  3466. ElectStartCount=0;
  3467. start_flag = 1; //当按下运行按键时,置位该标志
  3468. self_adaption_Pressure=0;//运行时,清除自适应压力值
  3469. self_adaption_cont=0;
  3470. self_adaption_flag=0; //自适应压力参数处理完成标志,用于后面压力报警判断
  3471. InfusionControl( FirstDoseMode );
  3472. // runParamInfo.pwmSetValue = 1000;//200;
  3473. realTimeData.motorSelfTestCount = 0;
  3474. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  3475. TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;//电机停止等待时间
  3476. emDisplayPicture = RunFirstDoseDisp;
  3477. emSysWorkStep = EnterRunFirstDose;
  3478. realTimeData.stateRun = FirstRun;//运行发送
  3479. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  3480. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3481. }
  3482. }
  3483. if( realTimeData.stateRun == Pause )//只有在暂停情况下可用power键
  3484. {
  3485. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  3486. {
  3487. KeyActionFlag.keyPower = emKeyflagNonePress;
  3488. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3489. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3490. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3491. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3492. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3493. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  3494. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  3495. if( historyRefreshFlag == 0 )
  3496. {
  3497. HistoryQtyAdd();
  3498. WriteHistoryRecordQTY();
  3499. historyRefreshFlag = 1;
  3500. }
  3501. WriteHistoryRecord();
  3502. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_ON )
  3503. {
  3504. emSysWorkStep = EnterLockPassword;
  3505. emDisplayPicture = LockPasswordDisp;
  3506. emLockPasswordStep = EnterPowerOFF;
  3507. emLockPassowrdPicture = ClearDisp;
  3508. emLockPasswordFailStep = EnterRunFirstDose;
  3509. emLockPassowrdFailPicture = RunFirstDoseDisp;
  3510. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;
  3511. modifyStep = 1;
  3512. return;
  3513. }
  3514. else
  3515. {
  3516. realTimeData.stateRun = Poweroff;//关机发送
  3517. /* 切断电源,关机 */
  3518. emSysWorkStep = EnterPowerOFF;
  3519. emDisplayPicture = ClearDisp;
  3520. return;
  3521. }
  3522. }
  3523. if( KeyActionFlag.keyEnter == emKeyflagLongPress )//enter键
  3524. {
  3525. SetParametersAgain = 1; //运行过程中重新设置参数标志
  3526. setParamInfo.emModifyParam = FirstDose;//重新设置参数,标志直接跳到首次量
  3527. KeyActionFlag.keyEnter = emKeyflagNonePress;
  3528. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3529. modifyStep = 1;
  3530. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3531. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3532. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3533. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3534. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  3535. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  3536. if( historyRefreshFlag == 0 )
  3537. {
  3538. HistoryQtyAdd();
  3539. WriteHistoryRecordQTY();
  3540. historyRefreshFlag = 1;
  3541. }
  3542. WriteHistoryRecord();
  3543. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_ON )
  3544. {
  3545. emSysWorkStep = EnterLockPassword;
  3546. emDisplayPicture = LockPasswordDisp;
  3547. emLockPasswordStep = EnterSetParam;
  3548. emLockPassowrdPicture = SetParamDisp;
  3549. emLockPasswordFailStep = EnterRunFirstDose;
  3550. emLockPassowrdFailPicture = RunFirstDoseDisp;
  3551. realTimeData.stateRun = Pause;
  3552. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;
  3553. return;
  3554. }
  3555. else
  3556. {
  3557. emSysWorkStep = EnterSetParam;
  3558. emDisplayPicture = SetParamDisp;
  3559. realTimeData.stateRun = Pause;
  3560. }
  3561. }
  3562. }
  3563. if( ( MoreKeyActionFlag.keyPlus == emKeyflagShortPress ) && ( MoreKeyActionFlag.keyMinus == emKeyflagShortPress ) && ( GPIO_ReadInputDataBit( KEY_GPIO_PORT,MINUS_GPIO_PIN ) != 0 ) )
  3564. {
  3565. MoreKeyActionFlag.keyPlus = emKeyflagNonePress;
  3566. MoreKeyActionFlag.keyMinus = emKeyflagNonePress;
  3567. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_SET;
  3568. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//清锁屏时间
  3569. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3570. /*emDisplayPicture = RunFirstDoseDisp;*/
  3571. }
  3572. }
  3573. else//在不解键盘锁的情况下可操作的键,同时短按加/减键解键盘
  3574. {
  3575. if( ( MoreKeyActionFlag.keyPlus == emKeyflagShortPress ) && ( MoreKeyActionFlag.keyMinus == emKeyflagShortPress ) && ( GPIO_ReadInputDataBit( KEY_GPIO_PORT,MINUS_GPIO_PIN ) != 0 ) )
  3576. {
  3577. MoreKeyActionFlag.keyPlus = emKeyflagNonePress;
  3578. MoreKeyActionFlag.keyMinus = emKeyflagNonePress;
  3579. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_CLEAR;
  3580. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3581. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3582. /*emDisplayPicture = RunFirstDoseDisp;*/
  3583. }
  3584. }
  3585. }
  3586. /* 按airout键进入呼叫功能,在任何情况下都可呼叫 */
  3587. /* if( KeyActionFlag.keyAirout == emKeyflagLongPress )//Airout键
  3588. {
  3589. //airout键用来呼叫
  3590. KeyActionFlag.keyAirout = emKeyflagLongRelease;//长按释放按键
  3591. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//清锁屏时间
  3592. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_CLEAR;//清锁屏标志
  3593. if( TaskSchedulerFlag.callFunctionFlag == TASK_FLAG_CLEAR )
  3594. {
  3595. TaskSchedulerFlag.callFunctionFlag = TASK_FLAG_SET;
  3596. }
  3597. else
  3598. {
  3599. TaskSchedulerFlag.callFunctionFlag = TASK_FLAG_CLEAR;
  3600. }
  3601. // TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  3602. emDisplayPicture = RunFirstDoseDisp;
  3603. // sysPromptToneCounts = 255;//蜂鸣器-计数
  3604. // sysPromptToneType = WarringTone;//蜂鸣器-PCA未到追加时间报警
  3605. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  3606. }*/
  3607. /* 当已输入量 >= 总量时输注完毕 */
  3608. if( realTimeData.inputDose >= runParamInfo.totalDose )//判断是否输液完毕
  3609. {
  3610. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  3611. motorWorkState = MOTOR_WORK_OFF;
  3612. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  3613. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  3614. // sysPromptToneCounts = 0;//蜂鸣器-计数
  3615. SysHornToneType = InfusionTone;
  3616. // realTimeData.stateRun = Finsh;
  3617. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  3618. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  3619. emSysWorkStep = EnterTransfuseOver;
  3620. emDisplayPicture = TransfuseOverDisp;
  3621. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//置位蜂鸣器
  3622. // SpeakerCtl( DRIVER_OFF );
  3623. modifyStep = 1;
  3624. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3625. // if(Input_End==0)
  3626. // {
  3627. // Input_End=1; //输液结束,置位该标志,20170418
  3628. // historyRefreshFlag=0;
  3629. // }
  3630. }
  3631. }
  3632. /*************************************************************************************
  3633. * Function: CntlRunMainPicture
  3634. * Object: 控制运行主界面
  3635. * 输入: 无
  3636. * 输出: 无
  3637. * 备注: 1、当注射完总量后进入输注完成界面
  3638. * 2、关机时需要密码,如果密码匹配则可以进行关机操作
  3639. * 3、if( realTimeData.inputDose >= runParamInfo.totalDose )//判断是否输液完毕
  3640. * 4、在非锁屏的情况下,运行/停止键进行输注运行或停止输注操作
  3641. * 5、暂停情况下可关机
  3642. * 6、暂停情况下长按enter键进入参数设置界面
  3643. * 7、非暂停情况下长按enter键进入随访界面
  3644. * 7、加减键同时按下解锁,加锁
  3645. * 8、长按airout键用来呼叫
  3646. * 9、非暂停情况下按PCA可进行PCA模式输注
  3647. * 10、在PCA模式下再次按下PCA键则计为一次无效输注,累计5次无效输注则上传镇痛效果不好报警
  3648. * 11、if( realTimeData.superaddition == 0 )//追加量每次都重新计数,当追加量降为0时PCA停止
  3649. * 12、PCA模式输注完成,则开始计算锁时,TaskSchedulerTimer.pcaLockTimer = runParamInfo.lockTime * 60000;
  3650. * 13、密码/静音键短按可调出压力显示界面,3秒后返回输注界面
  3651. **************************************************************************************/
  3652. void CntlRunMainPicture( void )
  3653. {
  3654. uint8_t InputTotalDoseBuff[4];
  3655. if( TaskSchedulerFlag.unlockPasswordFlag == TASK_FLAG_SET )//密码解锁成功则进入关机
  3656. {
  3657. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3658. realTimeData.stateRun = Poweroff;//关机发送
  3659. /* 切断电源,关机 */
  3660. emSysWorkStep = EnterPowerOFF;
  3661. emDisplayPicture = ClearDisp;
  3662. return;
  3663. }
  3664. /*镇痛效果不足判断机制*/
  3665. if(sysAlarmFlag.Zhentongxiaoguo != ALARM_ON)
  3666. {
  3667. if(pca_count>=3)//镇痛效果不足判断机制
  3668. {
  3669. if(TaskSchedulerFlag.PCAOneTimeFlag==TASK_FLAG_SET)
  3670. {
  3671. sysAlarmFlag.Zhentongxiaoguo = ALARM_CONTINUE;
  3672. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  3673. TaskSchedulerFlag.PCAOneTimeFlag=TASK_FLAG_WAIT;
  3674. if( sysAlarmFlag.Zhentongxiaoguo == ALARM_CONTINUE )//镇痛效果
  3675. {
  3676. sysAlarmFlag.Zhentongxiaoguo = ALARM_ON;
  3677. if(TaskSchedulerFlag.StartToRunDontSend == SendSuceed)//
  3678. {
  3679. RunToLorawawn_flag=1; //首次量输注完毕后,置位标志,立即发送数据
  3680. }
  3681. }
  3682. pca_count = 0;
  3683. }
  3684. }
  3685. else if(TaskSchedulerFlag.PCAOneTimeFlag == TASK_FLAG_CLEAR)
  3686. {
  3687. if(pca_count<3)
  3688. {
  3689. TaskSchedulerTimer.pcaOneHourTimer=ONE_HOUR_TIMER;
  3690. TaskSchedulerFlag.PCAOneTimeFlag=TASK_FLAG_OVERTIME;
  3691. pca_count = 0;
  3692. }
  3693. }
  3694. }
  3695. if( TaskSchedulerFlag.lockDispFlag == TASK_FLAG_CLEAR )//在非锁屏情况下按键好使
  3696. {
  3697. if( KeyActionFlag.keyRunPause == emKeyflagLongPress )//运行/停止键
  3698. {
  3699. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3700. if( realTimeData.stateRun == MainRun )
  3701. {
  3702. emDisplayPicture = RunMainDisp;
  3703. realTimeData.stateRun = Pause;//暂停发送
  3704. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  3705. /* 即使暂停也不是按下暂停键就马上电机停止工作,而是要把本次输注完成再暂停,所以不能马上将电机工作状态改为停止 */
  3706. //motorWorkState = MOTOR_WORK_OFF;//电机停止触发
  3707. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  3708. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  3709. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3710. }
  3711. else if( realTimeData.stateRun == PCARun )
  3712. {
  3713. emDisplayPicture = RunMainDisp;
  3714. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3715. realTimeData.stateRun = Pause;//暂停发送
  3716. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  3717. realTimeData.superaddition = 0;//表明PCA输注完毕
  3718. /* 即使暂停也不是按下暂停键就马上电机停止工作,而是要把本次输注完成再暂停,所以不能马上将电机工作状态改为停止 */
  3719. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  3720. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  3721. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3722. }
  3723. }
  3724. else if((KeyActionFlag.keyPS == emKeyflagShortPress) || (KeyActionFlag.keyRunPause == emKeyflagShortPress))//返回按键返回输注界面
  3725. {
  3726. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3727. if( realTimeData.stateRun == Pause )
  3728. {
  3729. /*
  3730. (void) memset (&PressureF1_bf, 0, sizeof(PressureF1_bf)); //在报警解除的时候,将pressureF1_bf数据清零20170506
  3731. (void) memset (&PressureF1_bf2, 0, sizeof(PressureF1_bf2)); //在报警解除的时候,将pressureF1_bf2数据清零20170506
  3732. Pressurebf_Cont=0; //在报警解除的时候,将Pressurebf_Cont数据清零20170506
  3733. average_Pressure_bf=0; //在报警解除的时候,将Pressurebf_Cont数据清零20170506
  3734. */
  3735. StartToRun_flag=1; //当按下运行按键的时候,置位该标志
  3736. ElectStartCount=0;
  3737. start_flag = 1; //当按下运行按键时,置位该标志
  3738. self_adaption_Pressure=0;//运行时,清除自适应压力值
  3739. // self_adaption_cont=0;
  3740. // self_adaption_flag=0; //自适应压力参数处理完成标志,用于后面压力报警判断
  3741. // InfusionControl( ContinueMode );
  3742. // runParamInfo.pwmSetValue = 1000;//200;
  3743. realTimeData.motorSelfTestCount = 0;
  3744. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  3745. TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;//电机停止等待时间
  3746. // emDisplayPicture = RunMainDisp;
  3747. // emSysWorkStep = EnterRunMain;
  3748. // realTimeData.stateRun = MainRun;//运行发送
  3749. if((PCADontRun_Flag == 1)||(realTimeData.superaddition != 0))
  3750. {
  3751. PCADontRun_Flag = 0;
  3752. infusionMode = SuperadditionMode;
  3753. InfusionControl( SuperadditionMode );
  3754. realTimeData.stateRun = PCARun;//运行发送
  3755. }
  3756. else
  3757. {
  3758. InfusionControl( ContinueMode );
  3759. emDisplayPicture = RunMainDisp;
  3760. emSysWorkStep = EnterRunMain;
  3761. realTimeData.stateRun = MainRun;//运行发送
  3762. }
  3763. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3764. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  3765. }
  3766. }
  3767. if( ( MoreKeyActionFlag.keyPlus == emKeyflagShortPress ) && ( MoreKeyActionFlag.keyMinus == emKeyflagShortPress ) && ( GPIO_ReadInputDataBit( KEY_GPIO_PORT,MINUS_GPIO_PIN ) != 0 ) )
  3768. {
  3769. MoreKeyActionFlag.keyPlus = emKeyflagNonePress;
  3770. MoreKeyActionFlag.keyMinus = emKeyflagNonePress;
  3771. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_SET;
  3772. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//清锁屏时间
  3773. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3774. /*if( emCurrentPicture == RunMainDisp )
  3775. {
  3776. emDisplayPicture = RunMainDisp;
  3777. }
  3778. else if( emCurrentPicture == RunPCADisp )
  3779. {
  3780. emDisplayPicture = RunPCADisp;
  3781. }*/
  3782. /*if(( realTimeData.stateRun == PCARun )||(realTimeData.superaddition != 0))
  3783. {
  3784. emDisplayPicture = RunPCADisp;
  3785. }
  3786. else
  3787. {
  3788. emDisplayPicture = RunMainDisp;
  3789. }*/
  3790. }
  3791. else if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) && ( KeyActionFlag.keyMinus == emKeyflagNonePress ) )
  3792. {
  3793. KeyActionFlag.keyPlus = emKeyflagShortRelease;
  3794. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3795. /*if( (realTimeData.stateRun == PCARun)||(realTimeData.superaddition != 0) )
  3796. {
  3797. emDisplayPicture = RunPCADisp;
  3798. }
  3799. else
  3800. {
  3801. emDisplayPicture = RunMainDisp;
  3802. }*/
  3803. if( TaskSchedulerFlag.pcaCountDispFlag == TASK_FLAG_CLEAR )//有效变无效,无效数值要闪烁,闪10下
  3804. {
  3805. TaskSchedulerFlag.pcaCountDispFlag = TASK_FLAG_SET;
  3806. TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_SET;//LCD闪烁置位
  3807. TaskSchedulerFlag.lcdFlashFlag1 = TASK_FLAG_SET;//允许PCA有无效次数刷新标志
  3808. TaskSchedulerTimer.pcaCountsDispTimer = TEN_SECOND_TIMER;//无效次数显示计时
  3809. }
  3810. else//无效变有效,清除数值闪烁
  3811. {
  3812. TaskSchedulerFlag.pcaCountDispFlag = TASK_FLAG_CLEAR;
  3813. TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_CLEAR;//LCD闪烁清除
  3814. TaskSchedulerTimer.pcaCountsDispTimer = TEN_SECOND_TIMER;//无效次数显示计时
  3815. TaskSchedulerFlag.lcdFlashFlag1 = TASK_FLAG_SET;//允许PCA有无效次数刷新标志
  3816. }
  3817. }
  3818. /* 只有在停止状态下enter、power键有效 */
  3819. if( realTimeData.stateRun == Pause )
  3820. {
  3821. if( KeyActionFlag.keyEnter == emKeyflagLongPress )//enter键
  3822. {
  3823. SetParametersAgain = 1; //运行过程中重新设置参数标志
  3824. setParamInfo.emModifyParam = FirstDose;//重新设置参数,标志直接跳到首次量
  3825. KeyActionFlag.keyEnter = emKeyflagNonePress;
  3826. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3827. modifyStep = 1;
  3828. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3829. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3830. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3831. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3832. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  3833. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  3834. if( historyRefreshFlag == 0 )
  3835. {
  3836. HistoryQtyAdd();
  3837. WriteHistoryRecordQTY();
  3838. historyRefreshFlag = 1;
  3839. }
  3840. WriteHistoryRecord();
  3841. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_ON )
  3842. {
  3843. emSysWorkStep = EnterLockPassword;
  3844. emDisplayPicture = LockPasswordDisp;
  3845. emLockPasswordStep = EnterSetParam;
  3846. emLockPassowrdPicture = SetParamDisp;
  3847. if(realTimeData.superaddition != 0)
  3848. {
  3849. emLockPasswordFailStep = EnterRunMain;
  3850. emLockPassowrdFailPicture = RunPCADisp;
  3851. }
  3852. else
  3853. {
  3854. emLockPasswordFailStep = EnterRunMain;
  3855. emLockPassowrdFailPicture = RunMainDisp;
  3856. }
  3857. realTimeData.stateRun = Pause;
  3858. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;
  3859. return;
  3860. }
  3861. else
  3862. {
  3863. emSysWorkStep = EnterSetParam;
  3864. emDisplayPicture = SetParamDisp;
  3865. realTimeData.stateRun = Pause;
  3866. }
  3867. }
  3868. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  3869. {
  3870. KeyActionFlag.keyPower = emKeyflagNonePress;
  3871. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3872. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3873. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  3874. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  3875. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  3876. if( historyRefreshFlag == 0 )
  3877. {
  3878. HistoryQtyAdd();
  3879. WriteHistoryRecordQTY();
  3880. historyRefreshFlag = 1;
  3881. }
  3882. WriteHistoryRecord();
  3883. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3884. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3885. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_ON )
  3886. {
  3887. emSysWorkStep = EnterLockPassword;
  3888. emDisplayPicture = LockPasswordDisp;
  3889. emLockPasswordStep = EnterPowerOFF;
  3890. emLockPassowrdPicture = ClearDisp;
  3891. if(realTimeData.superaddition != 0)
  3892. {
  3893. emLockPasswordFailStep = EnterRunMain;
  3894. emLockPassowrdFailPicture = RunPCADisp;
  3895. }
  3896. else
  3897. {
  3898. emLockPasswordFailStep = EnterRunMain;
  3899. emLockPassowrdFailPicture = RunMainDisp;
  3900. }
  3901. realTimeData.stateRun = Pause;
  3902. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;
  3903. modifyStep = 1;
  3904. return;
  3905. }
  3906. else
  3907. {
  3908. realTimeData.stateRun = Poweroff;//关机发送
  3909. /* 切断电源,关机 */
  3910. emSysWorkStep = EnterPowerOFF;
  3911. emDisplayPicture = ClearDisp;
  3912. return;
  3913. }
  3914. }
  3915. }
  3916. else
  3917. {
  3918. /* 在非暂停情况下长按enter键进入随访评价 */
  3919. // if( EngineeringModeValue.evaluateState == ENGINEERINGMODE_ON )
  3920. {
  3921. if(( KeyActionFlag.keyEnter == emKeyflagLongPress )&&(realTimeData.stateRun != PCARun ))//enter键,PCA运行期间不能进入镇痛评价界面
  3922. {
  3923. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  3924. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_CLEAR;//清锁屏标志
  3925. // TaskSchedulerFlag.pcaLockFlag = TASK_FLAG_SET;
  3926. //
  3927. // realTimeData.lockTime = runParamInfo.lockTime;
  3928. // TaskSchedulerTimer.pcaLockTimer = runParamInfo.lockTime * 60000;
  3929. // TaskSchedulerFlag.SuperadditionFlag = TASK_FLAG_CLEAR;
  3930. // realTimeData.superaddition = 0;
  3931. /* 即使暂停也不是按下暂停键就马上电机停止工作,而是要把本次输注完成再暂停,所以不能马上将电机工作状态改为停止 */
  3932. // motorWorkState = MOTOR_WORK_OFF;//电机停止触发
  3933. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  3934. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  3935. realTimeData.stateRun = Pause;//暂停发送
  3936. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  3937. emSysWorkStep = EnterEvaluateTransfuse;
  3938. emDisplayPicture = EvaluateTransfuseDisp;
  3939. emEvaluateTransfuseChoose = Pruritus;//随访评价选项
  3940. modifyStep = 1;
  3941. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  3942. }
  3943. }
  3944. }
  3945. }
  3946. else//在不解键盘锁的情况下可操作的键,同时短按加/减键解键盘
  3947. {
  3948. if( ( MoreKeyActionFlag.keyPlus == emKeyflagShortPress ) && ( MoreKeyActionFlag.keyMinus == emKeyflagShortPress ) && ( GPIO_ReadInputDataBit( KEY_GPIO_PORT,MINUS_GPIO_PIN ) != 0 ) )
  3949. {
  3950. MoreKeyActionFlag.keyPlus = emKeyflagNonePress;
  3951. MoreKeyActionFlag.keyMinus = emKeyflagNonePress;
  3952. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_CLEAR;
  3953. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//清锁屏时间
  3954. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  3955. // if( (realTimeData.stateRun == PCARun)||(realTimeData.superaddition != 0) )
  3956. // {
  3957. // emDisplayPicture = RunPCADisp;
  3958. // }
  3959. // else
  3960. // {
  3961. // emDisplayPicture = RunMainDisp;
  3962. // }
  3963. if( emCurrentPicture == RunMainDisp )
  3964. {
  3965. emDisplayPicture = RunMainDisp;
  3966. }
  3967. else if( emCurrentPicture == RunPCADisp )
  3968. {
  3969. emDisplayPicture = RunPCADisp;
  3970. }
  3971. }
  3972. }
  3973. if( realTimeData.stateRun != Pause )
  3974. {
  3975. if( KeyActionFlag.keyPCA == emKeyflagShortPress )//PCA键
  3976. {
  3977. KeyActionFlag.keyPCA = emKeyflagNonePress;
  3978. /* 进入追加模式,此时如果正在锁定时间内则无效PCA计一次,否则进入PCA模式 */
  3979. if( ( TaskSchedulerFlag.pcaLockFlag != TASK_FLAG_SET ) && ( TaskSchedulerFlag.SuperadditionFlag != TASK_FLAG_SET ) && ( runParamInfo.superaddition != 0 ) )
  3980. {
  3981. TaskSchedulerFlag.SuperadditionFlag = TASK_FLAG_SET;
  3982. InfusionControl( SuperadditionMode );
  3983. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  3984. TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;//电机停止等待时间
  3985. // sysPromptToneCounts = 0;//蜂鸣器-计数
  3986. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  3987. emDisplayPicture = RunPCADisp;
  3988. emPictureRunState = FirstEnter;
  3989. realTimeData.stateRun = PCARun;
  3990. realTimeData.validCount++;//追加量有效次数加1
  3991. realTimeData.superaddition = runParamInfo.superaddition;
  3992. if(realTimeData.validCount == 1)
  3993. {
  3994. TaskSchedulerFlag.PCAOneTimeFlag=TASK_FLAG_SET;
  3995. }
  3996. if( sysAlarmFlag.Zhentongxiaoguo != ALARM_ON )//镇痛效果
  3997. {
  3998. pca_count++; //阵痛不足次数加1
  3999. }
  4000. else
  4001. {
  4002. pca_count = 0;
  4003. }
  4004. if( TaskSchedulerFlag.PCAOneTimeFlag == TASK_FLAG_OVERTIME)//pca一小时任务超时
  4005. {
  4006. TaskSchedulerFlag.PCAOneTimeFlag=TASK_FLAG_SET;
  4007. }
  4008. }
  4009. else if ( TaskSchedulerFlag.pcaLockFlag == TASK_FLAG_SET )//在PCA模式下,并且在PCA锁时内,无效次数才能开始计数
  4010. {
  4011. realTimeData.invalidCount++;
  4012. // TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  4013. /* if( realTimeData.invalidCount >= 5 )//镇痛效果,无效次数>5报警
  4014. {
  4015. sysAlarmFlag.Zhentongxiaoguo = ALARM_CONTINUE;
  4016. }
  4017. if( sysAlarmFlag.Zhentongxiaoguo == ALARM_CONTINUE )//镇痛效果
  4018. {
  4019. sysAlarmFlag.Zhentongxiaoguo = ALARM_ON;
  4020. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  4021. }
  4022. sysPromptToneCounts = 255;//蜂鸣器-计数
  4023. SysHornToneType = Sound_prepore;//蜂鸣器-PCA未到追加时间报警
  4024. */
  4025. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  4026. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  4027. if( TaskSchedulerFlag.pcaLockFlag == TASK_FLAG_SET )
  4028. {
  4029. TaskSchedulerFlag.pcaLockTimeFlag = TASK_FLAG_SET;
  4030. // TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_SET;
  4031. TaskSchedulerFlag.PCATimerFlashFlag1 = TASK_FLAG_SET;
  4032. TaskSchedulerTimer.pcaLockTimeDispTimer = FIVE_SECOND_TIMER;//无效次数显示计时
  4033. }
  4034. if( realTimeData.stateRun == PCARun )
  4035. {
  4036. emDisplayPicture = RunPCADisp;
  4037. // if( TaskSchedulerFlag.SuperadditionFlag == TASK_FLAG_SET )
  4038. {
  4039. TaskSchedulerFlag.pcaCountDispFlag = TASK_FLAG_SET;
  4040. TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_SET;//LCD闪烁置位
  4041. TaskSchedulerTimer.pcaCountsDispTimer = TEN_SECOND_TIMER;//无效次数显示计时
  4042. }
  4043. }
  4044. else
  4045. {
  4046. emDisplayPicture = RunMainDisp;
  4047. }
  4048. }
  4049. }
  4050. }
  4051. /* 按airout键进入呼叫功能,在任何情况下都可呼叫 */
  4052. /* if( KeyActionFlag.keyAirout == emKeyflagLongPress )//Airout键
  4053. {
  4054. //airout键用来呼叫
  4055. KeyActionFlag.keyAirout = emKeyflagLongRelease;//长按释放按键
  4056. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//清锁屏时间
  4057. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_CLEAR;//清锁屏标志
  4058. if( TaskSchedulerFlag.callFunctionFlag == TASK_FLAG_CLEAR )
  4059. {
  4060. TaskSchedulerFlag.callFunctionFlag = TASK_FLAG_SET;
  4061. }
  4062. else
  4063. {
  4064. TaskSchedulerFlag.callFunctionFlag = TASK_FLAG_CLEAR;
  4065. }
  4066. // TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  4067. if( (realTimeData.stateRun == PCARun)||(realTimeData.superaddition != 0) )
  4068. {
  4069. emDisplayPicture = RunPCADisp;
  4070. }
  4071. else
  4072. {
  4073. emDisplayPicture = RunMainDisp;
  4074. }
  4075. // sysPromptToneCounts = 255;//蜂鸣器-计数
  4076. // sysPromptToneType = WarringTone;//蜂鸣器-PCA未到追加时间报警
  4077. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  4078. }*/
  4079. /* else if( ( KeyActionFlag.keyPS == emKeyflagShortPress ) && ( KeyActionFlag.keyPCA == emKeyflagNonePress ) )//密码/静音键
  4080. {
  4081. // TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//有键盘操作清锁屏时间
  4082. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_S_JUMP;//压力界面自动跳转计时
  4083. emSysWorkStep = EnterRunPressure;
  4084. emDisplayPicture = RunPressureDisp;
  4085. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4086. } */
  4087. if( TaskSchedulerFlag.SuperadditionFlag == TASK_FLAG_SET )//追加量工作模式
  4088. {
  4089. if( realTimeData.superaddition == 0 )//追加量每次都重新计数,当追加量降为0时PCA停止
  4090. {
  4091. TaskSchedulerFlag.pcaLockFlag = TASK_FLAG_SET;
  4092. realTimeData.lockTime = runParamInfo.lockTime;
  4093. TaskSchedulerTimer.pcaLockTimer = runParamInfo.lockTime * 60000;
  4094. TaskSchedulerFlag.SuperadditionFlag = TASK_FLAG_CLEAR;
  4095. InfusionControl( ContinueMode );//转为持续量输入,追加量输入完毕后等待持续量时间后进入持续量输入
  4096. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  4097. TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;//电机停止等待时间
  4098. emDisplayPicture = RunMainDisp;
  4099. emPictureRunState = FirstEnter;
  4100. if(TaskSchedulerFlag.StartToRunDontSend == SendSuceed)//
  4101. {
  4102. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  4103. RunToLorawawn_flag=1; //PCA量运行完时,置位标志,立即发送数据
  4104. }
  4105. if( (realTimeData.stateRun == PCARun )||(AppendComplete==1))//当前状态为PCA运行时进入主运行
  4106. {
  4107. realTimeData.stateRun = MainRun;
  4108. AppendComplete=0;
  4109. }
  4110. else//否则为暂停状态
  4111. {
  4112. realTimeData.stateRun = Pause;
  4113. }
  4114. }
  4115. }
  4116. else if( TaskSchedulerFlag.SuperadditionFlag == TASK_FLAG_CLEAR )//持续量工作模式
  4117. {
  4118. //在暂停模式下PCA受暂停控制,所以PCA执行完成后要在这将标志位置位,防止在暂停模式下持续输入还在运行
  4119. if( realTimeData.stateRun == Pause )
  4120. {
  4121. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  4122. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  4123. }
  4124. else
  4125. {
  4126. InfusionControl( ContinueMode );
  4127. TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;
  4128. TaskSchedulerFlag.SuperadditionFlag = TASK_FLAG_WAIT;
  4129. }
  4130. }
  4131. /* 当已输入量 >= 总量时输注完毕 */
  4132. if( realTimeData.inputDose >= runParamInfo.totalDose )//判断是否输液完毕
  4133. {
  4134. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  4135. motorWorkState = MOTOR_WORK_OFF;
  4136. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  4137. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  4138. // sysPromptToneCounts = 0;//蜂鸣器-计数
  4139. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  4140. SysHornToneType = InfusionTone;
  4141. // realTimeData.stateRun = Finsh;
  4142. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  4143. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  4144. emSysWorkStep = EnterTransfuseOver;
  4145. emDisplayPicture = TransfuseOverDisp;
  4146. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//置位蜂鸣器
  4147. // SpeakerCtl( DRIVER_OFF );
  4148. modifyStep = 1;
  4149. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4150. // if(Input_End==0)
  4151. // {
  4152. // Input_End=1; //输液结束,置位该标志,20170418
  4153. // historyRefreshFlag=0;
  4154. // }
  4155. }
  4156. }
  4157. /*************************************************************************************
  4158. * Function: CntlTransfuseOverPicture
  4159. * Object: 控制输液完毕界面
  4160. * 输入: 无
  4161. * 输出: 无
  4162. * 备注: 1、当注射完总量后进入输注完毕页面
  4163. * 2、长按enter键进入随访界面
  4164. * 3、长按密码/静音键进入静音状态
  4165. * 4、长按airout键用来呼叫
  4166. * 5、长按关机键关机
  4167. **************************************************************************************/
  4168. void CntlTransfuseOverPicture( void )
  4169. {
  4170. if( ( realTimeData.stateRun == FirstRun ) || ( realTimeData.stateRun == MainRun ) || ( realTimeData.stateRun == PCARun )||( realTimeData.stateRun == Pause ))
  4171. {
  4172. realTimeData.stateRun = Finsh;
  4173. InpudingComplete = 1;
  4174. if(InpudingComplete ==1)
  4175. {
  4176. InpudingComplete = 0;
  4177. if(TaskSchedulerFlag.StartToRunDontSend == SendSuceed)
  4178. {
  4179. RunToLorawawn();//调用发送数据包
  4180. }
  4181. }
  4182. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  4183. sysAlarmFlag.InputEnding = ALARM_OFF;
  4184. sysAlarmFlag.InputEnd = ALARM_ON;
  4185. if( historyRefreshFlag == 0 )
  4186. {
  4187. // if(Input_End==0)
  4188. {
  4189. HistoryQtyAdd();
  4190. }
  4191. WriteHistoryRecordQTY();
  4192. historyRefreshFlag = 1;
  4193. //alarmRecord.alarmType = 8;//输注结束
  4194. }
  4195. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  4196. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  4197. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  4198. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  4199. alarmRecord.alarmType = 8;//输注结束
  4200. WriteHistoryRecord();
  4201. }
  4202. // if( EngineeringModeValue.evaluateState == ENGINEERINGMODE_ON )
  4203. {
  4204. /* 长按enter键进入随访评价 */
  4205. if( KeyActionFlag.keyEnter == emKeyflagLongPress )//enter键
  4206. {
  4207. // TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//清除蜂鸣器响
  4208. emSysWorkStep = EnterEvaluateTransfuse;
  4209. emDisplayPicture = EvaluateTransfuseDisp;
  4210. emEvaluateTransfuseChoose = Pruritus;//随访评价选项
  4211. modifyStep = 1;
  4212. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4213. SysHornToneType = SoundOff;//关闭报警声音
  4214. if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )//电池电量低
  4215. {
  4216. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  4217. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  4218. }
  4219. else
  4220. {
  4221. Y_LED_OFF;//黄色LED关闭
  4222. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  4223. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_CLEAR;
  4224. }
  4225. }
  4226. }
  4227. // if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  4228. // {
  4229. // if( historyRefreshFlag == 0 )
  4230. // {
  4231. // historyRecordQTY++;
  4232. // WriteHistoryRecordQTY();
  4233. // historyRefreshFlag = 1;
  4234. // }
  4235. // WriteHistoryRecord();
  4236. // emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4237. // realTimeData.stateRun = Poweroff;//关机发送
  4238. // /* 切断电源,关机 */
  4239. // emDisplayPicture = ClearDisp;
  4240. // emSysWorkStep = EnterPowerOFF;
  4241. // }
  4242. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  4243. {
  4244. WriteHistoryRecord();
  4245. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4246. realTimeData.stateRun = Poweroff;//关机发送
  4247. TaskSchedulerTimer.rtdXmitTimer = THREE_MSEC_TIMER;//准备快速发送实时数据
  4248. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  4249. // speakerWorkStep = emSpeakerNoneWork;
  4250. sysPromptToneType=SoundOff;
  4251. // sysAlarmFlag.VoltLowest = ALARM_OFF;
  4252. // LcdFlicker_Flag = TASK_FLAG_CLEAR;
  4253. /* 切断电源,关机 */
  4254. emDisplayPicture = ClearDisp;
  4255. emSysWorkStep = EnterPowerOFF;
  4256. return;
  4257. }
  4258. /* 按PS静音 */
  4259. // if( KeyActionFlag.keyPS == emKeyflagShortPress )//密码/静音键
  4260. // {
  4261. // KeyActionFlag.keyPS = emKeyflagNonePress;
  4262. //// TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  4263. //// TaskSchedulerFlag.silenceFlag = TASK_FLAG_SET;//静音标志
  4264. //// //TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除
  4265. //// //TaskSchedulerTimer.alarmLCDFlashTimer = 0;
  4266. // emDisplayPicture = TransfuseOverDisp;
  4267. // if(TaskSchedulerFlag.silenceFlag == TASK_FLAG_CLEAR)
  4268. // {
  4269. // TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  4270. // TaskSchedulerFlag.silenceFlag = TASK_FLAG_SET;//静音标志
  4271. // }
  4272. // else if(TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET)
  4273. // {
  4274. // TaskSchedulerFlag.silenceFlag = TASK_FLAG_CLEAR;//静音标志
  4275. // DrawSilenceDisplay();//静音
  4276. // TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  4277. // speakerWorkStep = emSpeakerNoneWork;
  4278. // sysPromptToneType=InfusionTone;//静音回复后,之前的状态回复
  4279. // }
  4280. // }
  4281. /* 按airout键进入呼叫功能,在任何情况下都可呼叫 */
  4282. /*if( KeyActionFlag.keyAirout == emKeyflagLongPress )//Airout键
  4283. {
  4284. //airout键用来呼叫
  4285. KeyActionFlag.keyAirout = emKeyflagLongRelease;//长按释放按键
  4286. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;//清锁屏时间
  4287. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_CLEAR;//清锁屏标志
  4288. if( TaskSchedulerFlag.callFunctionFlag == TASK_FLAG_CLEAR )
  4289. {
  4290. TaskSchedulerFlag.callFunctionFlag = TASK_FLAG_SET;
  4291. }
  4292. else
  4293. {
  4294. TaskSchedulerFlag.callFunctionFlag = TASK_FLAG_CLEAR;
  4295. }
  4296. // TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  4297. emDisplayPicture = TransfuseOverDisp;
  4298. // SysHornToneType = WarringTone;//蜂鸣器-PCA未到追加时间报警
  4299. // TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  4300. }*/
  4301. }
  4302. /*************************************************************************************
  4303. * Function: CntlEvaluateTransfusePicture
  4304. * Object: 控制随访画面
  4305. * 输入: 无
  4306. * 输出: 无
  4307. * 备注: 1、enter键短按下一项选择
  4308. * 2、运行停止键短按进行前一项选择
  4309. * 3、power键长按关机
  4310. * 4、加减键短按选项数字加减
  4311. * 5、其它键无效
  4312. **************************************************************************************/
  4313. void CntlEvaluateTransfusePicture( void )
  4314. {
  4315. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  4316. {
  4317. switch( emEvaluateTransfuseChoose )
  4318. {
  4319. case Pruritus://瘙痒
  4320. emEvaluateTransfuseChoose = RASS;
  4321. break;
  4322. case RASS://镇静评分
  4323. emEvaluateTransfuseChoose = PONV;
  4324. break;
  4325. case PONV://恶心呕吐
  4326. emEvaluateTransfuseChoose = LimbMyodynamia;
  4327. break;
  4328. case LimbMyodynamia://四肢肌力
  4329. emEvaluateTransfuseChoose = PainEvaluate;
  4330. break;
  4331. case PainEvaluate://疼痛评价
  4332. emEvaluateTransfuseChoose = VerifyEvaluate;
  4333. break;
  4334. case VerifyEvaluate://确认评价
  4335. emEvaluateTransfuseChoose = VerifyEvaluate;
  4336. break;
  4337. default:break;
  4338. }
  4339. emSysWorkStep = EnterEvaluateTransfuse;
  4340. emDisplayPicture = EvaluateTransfuseDisp;
  4341. }
  4342. if(( KeyActionFlag.keyRunPause == emKeyflagShortPress)||(KeyActionFlag.keyPS == emKeyflagShortPress) )//运行/停止键
  4343. {
  4344. switch( emEvaluateTransfuseChoose )
  4345. {
  4346. case Pruritus://瘙痒
  4347. emEvaluateTransfuseChoose = Pruritus;
  4348. break;
  4349. case RASS://镇静评分
  4350. emEvaluateTransfuseChoose = Pruritus;
  4351. break;
  4352. case PONV://恶心呕吐
  4353. emEvaluateTransfuseChoose = RASS;
  4354. break;
  4355. case LimbMyodynamia://四肢肌力
  4356. emEvaluateTransfuseChoose = PONV;
  4357. break;
  4358. case PainEvaluate://疼痛评价
  4359. emEvaluateTransfuseChoose = LimbMyodynamia;
  4360. break;
  4361. case VerifyEvaluate://确认评价
  4362. emEvaluateTransfuseChoose = PainEvaluate;
  4363. break;
  4364. default:break;
  4365. }
  4366. emSysWorkStep = EnterEvaluateTransfuse;
  4367. emDisplayPicture = EvaluateTransfuseDisp;
  4368. }
  4369. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  4370. {
  4371. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按操作释放按键
  4372. switch( emEvaluateTransfuseChoose )
  4373. {
  4374. case Pruritus://瘙痒 0~3
  4375. if( evaluateTransfuseValue.pruritus >= 3 )
  4376. {
  4377. evaluateTransfuseValue.pruritus = 0;
  4378. }
  4379. else
  4380. {
  4381. evaluateTransfuseValue.pruritus++;
  4382. }
  4383. emDisplayPicture = EvaluateTransfuseDisp;
  4384. break;
  4385. case RASS://镇静评分 0~2
  4386. if( evaluateTransfuseValue.RASS >= 2 )
  4387. {
  4388. evaluateTransfuseValue.RASS = 0;
  4389. }
  4390. else
  4391. {
  4392. evaluateTransfuseValue.RASS++;
  4393. }
  4394. emDisplayPicture = EvaluateTransfuseDisp;
  4395. break;
  4396. case PONV://恶心呕吐 0~2
  4397. if( evaluateTransfuseValue.PONV >= 2 )
  4398. {
  4399. evaluateTransfuseValue.PONV = 0;
  4400. }
  4401. else
  4402. {
  4403. evaluateTransfuseValue.PONV++;
  4404. }
  4405. emDisplayPicture = EvaluateTransfuseDisp;
  4406. break;
  4407. case LimbMyodynamia://四肢肌力
  4408. emEvaluateTransfuseChoose = LeftArm;
  4409. emSysWorkStep = EnterLimbMyodynamia;
  4410. emDisplayPicture = LimbMyodynamiaDisp;
  4411. modifyStep = 1;
  4412. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4413. break;
  4414. case PainEvaluate://疼痛评价
  4415. emEvaluateTransfuseChoose = Static;
  4416. emSysWorkStep = EnterEvaluatePain;
  4417. emDisplayPicture = EvaluatePainDisp;
  4418. modifyStep = 1;
  4419. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4420. break;
  4421. case VerifyEvaluate://确认评价
  4422. emEvaluateTransfuseChoose = Valuer;
  4423. emSysWorkStep = EnterEvaluateVerify;
  4424. emDisplayPicture = EvaluateUploadEnterDisp;
  4425. modifyStep = 1;
  4426. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4427. break;
  4428. default:
  4429. emEvaluateTransfuseChoose = Pruritus;
  4430. emDisplayPicture = EvaluateTransfuseDisp;
  4431. break;
  4432. }
  4433. }
  4434. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  4435. {
  4436. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按操作释放按键
  4437. switch( emEvaluateTransfuseChoose )
  4438. {
  4439. case Pruritus://瘙痒 0~3
  4440. if( evaluateTransfuseValue.pruritus <= 0 )
  4441. {
  4442. evaluateTransfuseValue.pruritus = 3;
  4443. }
  4444. else
  4445. {
  4446. evaluateTransfuseValue.pruritus--;
  4447. }
  4448. break;
  4449. case RASS://镇静评分 0~2
  4450. if( evaluateTransfuseValue.RASS <= 0 )
  4451. {
  4452. evaluateTransfuseValue.RASS = 2;
  4453. }
  4454. else
  4455. {
  4456. evaluateTransfuseValue.RASS--;
  4457. }
  4458. break;
  4459. case PONV://恶心呕吐 0~2
  4460. if( evaluateTransfuseValue.PONV <= 0 )
  4461. {
  4462. evaluateTransfuseValue.PONV = 2;
  4463. }
  4464. else
  4465. {
  4466. evaluateTransfuseValue.PONV--;
  4467. }
  4468. break;
  4469. default:break;
  4470. }
  4471. emDisplayPicture = EvaluateTransfuseDisp;
  4472. }
  4473. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  4474. {
  4475. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4476. realTimeData.stateRun = Poweroff;//关机发送
  4477. // 切断电源,关机
  4478. emDisplayPicture = ClearDisp;
  4479. emSysWorkStep = EnterPowerOFF;
  4480. }
  4481. }
  4482. /*************************************************************************************
  4483. * Function: CntlEvaluatePainPicture
  4484. * Object: 控制疼痛评价画面
  4485. * 输入: 无
  4486. * 输出: 无
  4487. * 备注: 1、enter键短按下一项选择
  4488. * 2、运行停止键短按进行前一项选择
  4489. * 3、power键长按关机
  4490. * 4、加减键短按选项数字加减
  4491. * 5、其它键无效
  4492. **************************************************************************************/
  4493. void CntlEvaluatePainPicture( void )
  4494. {
  4495. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  4496. {
  4497. switch( emEvaluateTransfuseChoose )
  4498. {
  4499. case Static://静止
  4500. emEvaluateTransfuseChoose = Activity;
  4501. emDisplayPicture = EvaluatePainDisp;
  4502. break;
  4503. case Activity://活动
  4504. emEvaluateTransfuseChoose = CACSI;
  4505. emDisplayPicture = EvaluatePainDisp;
  4506. break;
  4507. case CACSI://满意度
  4508. emEvaluateTransfuseChoose = VerifyEvaluate;
  4509. emDisplayPicture = EvaluateTransfuseDisp;
  4510. emSysWorkStep = EnterEvaluateTransfuse;
  4511. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4512. sysPromptToneCounts = 0;//蜂鸣器-计数
  4513. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  4514. break;
  4515. default:
  4516. emDisplayPicture = EvaluatePainDisp;
  4517. break;
  4518. }
  4519. }
  4520. if(( KeyActionFlag.keyRunPause == emKeyflagShortPress)||(KeyActionFlag.keyPS == emKeyflagShortPress) )//运行/停止键
  4521. {
  4522. switch( emEvaluateTransfuseChoose )
  4523. {
  4524. case Static://静止
  4525. emEvaluateTransfuseChoose = Static;
  4526. emDisplayPicture = EvaluatePainDisp;
  4527. break;
  4528. case Activity://活动
  4529. emEvaluateTransfuseChoose = Static;
  4530. emDisplayPicture = EvaluatePainDisp;
  4531. break;
  4532. case CACSI://满意度
  4533. emEvaluateTransfuseChoose = Activity;
  4534. emDisplayPicture = EvaluatePainDisp;
  4535. break;
  4536. default:
  4537. emDisplayPicture = EvaluatePainDisp;
  4538. break;
  4539. }
  4540. }
  4541. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  4542. {
  4543. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按操作释放按键
  4544. switch( emEvaluateTransfuseChoose )
  4545. {
  4546. case Static://静止 0~3
  4547. if( evaluateTransfuseValue.Static >= 3 )
  4548. {
  4549. evaluateTransfuseValue.Static = 3;
  4550. }
  4551. else
  4552. {
  4553. evaluateTransfuseValue.Static++;
  4554. }
  4555. break;
  4556. case Activity://活动 0~3
  4557. if( evaluateTransfuseValue.Activity >= 3 )
  4558. {
  4559. evaluateTransfuseValue.Activity = 3;
  4560. }
  4561. else
  4562. {
  4563. evaluateTransfuseValue.Activity++;
  4564. }
  4565. break;
  4566. case CACSI://满意度 0~3
  4567. if( evaluateTransfuseValue.CACSI >= 3 )
  4568. {
  4569. evaluateTransfuseValue.CACSI = 3;
  4570. }
  4571. else
  4572. {
  4573. evaluateTransfuseValue.CACSI++;
  4574. }
  4575. break;
  4576. default:break;
  4577. }
  4578. emDisplayPicture = EvaluatePainDisp;
  4579. }
  4580. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  4581. {
  4582. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按操作释放按键
  4583. switch( emEvaluateTransfuseChoose )
  4584. {
  4585. case Static://静止 0~3
  4586. if( evaluateTransfuseValue.Static <= 0 )
  4587. {
  4588. evaluateTransfuseValue.Static = 0;
  4589. }
  4590. else
  4591. {
  4592. evaluateTransfuseValue.Static--;
  4593. }
  4594. break;
  4595. case Activity://活动 0~3
  4596. if( evaluateTransfuseValue.Activity <= 0 )
  4597. {
  4598. evaluateTransfuseValue.Activity = 0;
  4599. }
  4600. else
  4601. {
  4602. evaluateTransfuseValue.Activity--;
  4603. }
  4604. break;
  4605. case CACSI://满意度 0~3
  4606. if( evaluateTransfuseValue.CACSI <= 0 )
  4607. {
  4608. evaluateTransfuseValue.CACSI = 0;
  4609. }
  4610. else
  4611. {
  4612. evaluateTransfuseValue.CACSI--;
  4613. }
  4614. break;
  4615. default:break;
  4616. }
  4617. emDisplayPicture = EvaluatePainDisp;
  4618. }
  4619. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  4620. {
  4621. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4622. realTimeData.stateRun = Poweroff;//关机发送
  4623. //切断电源,关机
  4624. emDisplayPicture = ClearDisp;
  4625. emSysWorkStep = EnterPowerOFF;
  4626. }
  4627. }
  4628. /*************************************************************************************
  4629. * Function: CntlLimbMyodynamiaPicture
  4630. * Object: 控制四肢肌力评价画面
  4631. * 输入: 无
  4632. * 输出: 无
  4633. * 备注: 1、enter键短按下一项选择
  4634. * 2、运行停止键短按进行前一项选择
  4635. * 3、power键长按关机
  4636. * 4、加减键短按选项数字加减
  4637. * 5、其它键无效
  4638. **************************************************************************************/
  4639. void CntlLimbMyodynamiaPicture( void )
  4640. {
  4641. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  4642. {
  4643. switch( emEvaluateTransfuseChoose )
  4644. {
  4645. case LeftArm://左上肢
  4646. emEvaluateTransfuseChoose = LeftLeg;
  4647. emDisplayPicture = LimbMyodynamiaDisp;
  4648. break;
  4649. case LeftLeg://左下肢
  4650. emEvaluateTransfuseChoose = RightArm;
  4651. emDisplayPicture = LimbMyodynamiaDisp;
  4652. break;
  4653. case RightArm://右上肢
  4654. emEvaluateTransfuseChoose = RightLeg;
  4655. emDisplayPicture = LimbMyodynamiaDisp;
  4656. break;
  4657. case RightLeg://右下肢
  4658. emEvaluateTransfuseChoose = PainEvaluate;
  4659. emDisplayPicture = EvaluateTransfuseDisp;
  4660. emSysWorkStep = EnterEvaluateTransfuse;
  4661. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4662. sysPromptToneCounts = 0;//蜂鸣器-计数
  4663. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  4664. break;
  4665. default:
  4666. emDisplayPicture = LimbMyodynamiaDisp;
  4667. break;
  4668. }
  4669. }
  4670. if(( KeyActionFlag.keyRunPause == emKeyflagShortPress)||(KeyActionFlag.keyPS == emKeyflagShortPress) )//运行/停止键
  4671. {
  4672. switch( emEvaluateTransfuseChoose )
  4673. {
  4674. case LeftArm://左上肢
  4675. emEvaluateTransfuseChoose = LeftArm;
  4676. emDisplayPicture = LimbMyodynamiaDisp;
  4677. break;
  4678. case LeftLeg://左下肢
  4679. emEvaluateTransfuseChoose = LeftArm;
  4680. emDisplayPicture = LimbMyodynamiaDisp;
  4681. break;
  4682. case RightArm://右上肢
  4683. emEvaluateTransfuseChoose = LeftLeg;
  4684. emDisplayPicture = LimbMyodynamiaDisp;
  4685. break;
  4686. case RightLeg://右下肢
  4687. emEvaluateTransfuseChoose = RightArm;
  4688. emDisplayPicture = LimbMyodynamiaDisp;
  4689. break;
  4690. default:
  4691. emDisplayPicture = LimbMyodynamiaDisp;
  4692. break;
  4693. }
  4694. }
  4695. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  4696. {
  4697. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按操作释放按键
  4698. switch( emEvaluateTransfuseChoose )
  4699. {
  4700. case LeftArm://左上肢 0~2
  4701. if( evaluateTransfuseValue.LeftArm >= 2 )
  4702. {
  4703. evaluateTransfuseValue.LeftArm = 2;
  4704. }
  4705. else
  4706. {
  4707. evaluateTransfuseValue.LeftArm++;
  4708. }
  4709. break;
  4710. case LeftLeg://左下肢 0~2
  4711. if( evaluateTransfuseValue.LeftLeg >= 2 )
  4712. {
  4713. evaluateTransfuseValue.LeftLeg = 2;
  4714. }
  4715. else
  4716. {
  4717. evaluateTransfuseValue.LeftLeg++;
  4718. }
  4719. break;
  4720. case RightArm://右上肢 0~2
  4721. if( evaluateTransfuseValue.RightArm >= 2 )
  4722. {
  4723. evaluateTransfuseValue.RightArm = 2;
  4724. }
  4725. else
  4726. {
  4727. evaluateTransfuseValue.RightArm++;
  4728. }
  4729. break;
  4730. case RightLeg://右下肢 0~2
  4731. if( evaluateTransfuseValue.RightLeg >= 2 )
  4732. {
  4733. evaluateTransfuseValue.RightLeg = 2;
  4734. }
  4735. else
  4736. {
  4737. evaluateTransfuseValue.RightLeg++;
  4738. }
  4739. break;
  4740. default:break;
  4741. }
  4742. emDisplayPicture = LimbMyodynamiaDisp;
  4743. }
  4744. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  4745. {
  4746. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按操作释放按键
  4747. switch( emEvaluateTransfuseChoose )
  4748. {
  4749. case LeftArm://左上肢 0~2
  4750. if( evaluateTransfuseValue.LeftArm <= 0 )
  4751. {
  4752. evaluateTransfuseValue.LeftArm = 0;
  4753. }
  4754. else
  4755. {
  4756. evaluateTransfuseValue.LeftArm--;
  4757. }
  4758. break;
  4759. case LeftLeg://左下肢 0~2
  4760. if( evaluateTransfuseValue.LeftLeg <= 0 )
  4761. {
  4762. evaluateTransfuseValue.LeftLeg = 0;
  4763. }
  4764. else
  4765. {
  4766. evaluateTransfuseValue.LeftLeg--;
  4767. }
  4768. break;
  4769. case RightArm://右上肢 0~2
  4770. if( evaluateTransfuseValue.RightArm <= 0 )
  4771. {
  4772. evaluateTransfuseValue.RightArm = 0;
  4773. }
  4774. else
  4775. {
  4776. evaluateTransfuseValue.RightArm--;
  4777. }
  4778. break;
  4779. case RightLeg://右下肢 0~2
  4780. if( evaluateTransfuseValue.RightLeg <= 0 )
  4781. {
  4782. evaluateTransfuseValue.RightLeg = 0;
  4783. }
  4784. else
  4785. {
  4786. evaluateTransfuseValue.RightLeg--;
  4787. }
  4788. break;
  4789. default:break;
  4790. }
  4791. emDisplayPicture = LimbMyodynamiaDisp;
  4792. }
  4793. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  4794. {
  4795. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4796. realTimeData.stateRun = Poweroff;//关机发送
  4797. // 切断电源,关机
  4798. emDisplayPicture = ClearDisp;
  4799. emSysWorkStep = EnterPowerOFF;
  4800. }
  4801. }
  4802. /*************************************************************************************
  4803. * Function: CntlEvaluateVerifyPicture
  4804. * Object: 控制确认评价画面
  4805. * 输入: 无
  4806. * 输出: 无
  4807. * 备注: 1、enter键短按下一项选择
  4808. * 2、运行停止键短按进行前一项选择
  4809. * 3、power键长按关机
  4810. * 4、加减键短按选项数字加减
  4811. * 5、其它键无效
  4812. **************************************************************************************/
  4813. void CntlEvaluateVerifyPicture( void )
  4814. {
  4815. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  4816. {
  4817. switch( emEvaluateTransfuseChoose )
  4818. {
  4819. case Valuer://评价人
  4820. emEvaluateTransfuseChoose = VerifyUpload;
  4821. emDisplayPicture = EvaluateUploadEnterDisp;
  4822. break;
  4823. case VerifyUpload://上传确认
  4824. // TaskSchedulerFlag.zigbeeETXmitFlag = TASK_FLAG_WAIT;
  4825. // TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送评价数据
  4826. emEvaluateTransfuseChoose = Uploading;
  4827. emDisplayPicture = EvaluateUploadEnterDisp;
  4828. // sysPromptToneCounts = 0;//蜂鸣器-计数
  4829. sysPromptToneType = VerificationTone;//蜂鸣器-确认
  4830. break;
  4831. case Uploading:
  4832. //EvaluateToZigbeeHandle();
  4833. emEvaluateTransfuseChoose = UploadFinshed;
  4834. emDisplayPicture = EvaluateUploadEnterDisp;
  4835. break;
  4836. default:break;
  4837. }
  4838. }
  4839. if(( KeyActionFlag.keyRunPause == emKeyflagShortPress)||(emEvaluateTransfuseChoose == UploadFinshed) )//运行/停止键
  4840. {
  4841. emEvaluateTransfuseChoose = VerifyEvaluate;
  4842. if(realTimeData.inputDose >= runParamInfo.totalDose)
  4843. {
  4844. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  4845. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  4846. emDisplayPicture = TransfuseOverDisp;
  4847. emSysWorkStep = EnterTransfuseOver;//EnterEvaluateTransfuse;
  4848. SysHornToneType = InfusionTone;
  4849. }
  4850. else
  4851. {
  4852. emSysWorkStep = EnterRunMain;//EnterEvaluateTransfuse;
  4853. emDisplayPicture = RunMainDisp;
  4854. }
  4855. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4856. // sysPromptToneCounts = 0;//蜂鸣器-计数
  4857. // sysPromptToneType = VerificationTone;//蜂鸣器-确认
  4858. }
  4859. if( KeyActionFlag.keyPS == emKeyflagShortPress )
  4860. {
  4861. switch( emEvaluateTransfuseChoose )
  4862. {
  4863. case Valuer://评价人
  4864. emEvaluateTransfuseChoose = Valuer;
  4865. emDisplayPicture = EvaluateUploadEnterDisp;
  4866. break;
  4867. case VerifyUpload://上传确认
  4868. emEvaluateTransfuseChoose = Valuer;
  4869. emDisplayPicture = EvaluateUploadEnterDisp;
  4870. break;
  4871. default:break;
  4872. }
  4873. }
  4874. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  4875. {
  4876. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按操作释放按键
  4877. switch( emEvaluateTransfuseChoose )
  4878. {
  4879. case Valuer://评价人 0~10
  4880. if( evaluateTransfuseValue.Valuer >= 10 )
  4881. {
  4882. evaluateTransfuseValue.Valuer = 10;
  4883. }
  4884. else
  4885. {
  4886. evaluateTransfuseValue.Valuer++;
  4887. }
  4888. break;
  4889. default:break;
  4890. }
  4891. emDisplayPicture = EvaluateUploadEnterDisp;
  4892. }
  4893. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  4894. {
  4895. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按操作释放按键
  4896. switch( emEvaluateTransfuseChoose )
  4897. {
  4898. case Valuer://评价人 0~10
  4899. if( evaluateTransfuseValue.Valuer <= 0 )
  4900. {
  4901. evaluateTransfuseValue.Valuer = 0;
  4902. }
  4903. else
  4904. {
  4905. evaluateTransfuseValue.Valuer--;
  4906. }
  4907. break;
  4908. default:break;
  4909. }
  4910. emDisplayPicture = EvaluateUploadEnterDisp;
  4911. }
  4912. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  4913. {
  4914. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  4915. realTimeData.stateRun = Poweroff;//关机发送
  4916. // 切断电源,关机
  4917. emDisplayPicture = ClearDisp;
  4918. emSysWorkStep = EnterPowerOFF;
  4919. }
  4920. }
  4921. /*************************************************************************************
  4922. * Function: CntlAlarmPicture
  4923. * Object: 控制报警画面
  4924. * 输入: 无
  4925. * 输出: 无
  4926. * 备注: 1、根据sysAlarmFlag变量中相应项目标志位置位来选择报警项,报警有先后顺序
  4927. * 2、运行停止键长按返回输注暂停界面
  4928. * 3、power键长按关机
  4929. * 4、密码/静音键短按静音
  4930. * 5、其它键无效
  4931. * 6、此页面有自动关机功能
  4932. * 7、解除电池电量低报警
  4933. * 8、增加手动解除堵塞报警,回到输注前界面
  4934. **************************************************************************************/
  4935. void CntlAlarmPicture( void )
  4936. {
  4937. //uint16_t i=0;
  4938. uint8_t InputTotalDoseBuff[4];
  4939. /*if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_CLEAR )//从进入此界面开始自动关机倒计时
  4940. {
  4941. TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_WAIT;
  4942. TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;
  4943. }*/
  4944. if( KeyActionFlag.keyRunPause == emKeyflagLongPress )//运行/停止键
  4945. {
  4946. KeyActionFlag.keyRunPause = emKeyflagNonePress;
  4947. /*接触报警后,解除所有报警标志和报警检测次数,防止多报警同时发生或者临近发生对下次报警造成影响*/
  4948. SysAlarmJudge.BubbleFaultJudgeCounts = 0; //气泡无液报警检测次数清零
  4949. ElectSmallCount = 0; //未装药盒报警检测次数清零
  4950. ElectLargeCount = 0; //堵塞报警检测次数清零
  4951. BlockageRecovery=0; //堵塞自检恢复标志
  4952. SysAlarmJudge.JamFaultJudgeFlag = TASK_FLAG_CLEAR; //堵塞报警标志清除
  4953. SysAlarmJudge.BubbleFaultJudgeFlag = TASK_FLAG_CLEAR; //气泡无液报警标志清除
  4954. SysAlarmJudge.NonePillCaseJudgeFlag = TASK_FLAG_CLEAR; //未装药盒报警标志清除
  4955. /*********************************************************************************************/
  4956. if( sysAlarmFlag.VoltLowest == ALARM_ON) //如果电量耗尽报警,按暂停键不可以进入主运行界面
  4957. return;
  4958. if( sysAlarmFlag.InputTotal == ALARM_ON) //如果输入总量报警,按暂停键不可以进入主运行界面
  4959. return;
  4960. if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )//电池电量低
  4961. {
  4962. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  4963. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  4964. }
  4965. else
  4966. {
  4967. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除
  4968. }
  4969. if( sysAlarmFlag.MaxFault == ALARM_ON )//极限值故障
  4970. {
  4971. sysAlarmFlag.MaxFault = ALARM_OFF;
  4972. if( realTimeData.inputDose >= runParamInfo.totalDose )
  4973. {
  4974. alarmRecord.alarmType = 8;//输注结束
  4975. // return;//最新添加
  4976. }
  4977. else
  4978. {
  4979. SysHornToneType = SoundOff;
  4980. }
  4981. }
  4982. // SysHornToneType = SoundOff;
  4983. if( sysAlarmFlag.BubbleFault == ALARM_ON )//气泡或无液故障
  4984. {
  4985. sysAlarmFlag.BubbleFault = ALARM_OFF;
  4986. SysHornToneType = SoundOff;
  4987. }
  4988. if( sysAlarmFlag.NonePillCase == ALARM_ON )//未装药盒故障
  4989. {
  4990. sysAlarmFlag.NonePillCase = ALARM_OFF;
  4991. SysHornToneType = SoundOff;
  4992. }
  4993. if( sysAlarmFlag.LineLost == ALARM_ON )//管道脱落
  4994. {
  4995. sysAlarmFlag.LineLost = ALARM_OFF;
  4996. SysHornToneType = SoundOff;
  4997. }
  4998. if( sysAlarmFlag.JamFault == ALARM_ON )
  4999. {
  5000. sysAlarmFlag.JamFault = ALARM_OFF;
  5001. TaskSchedulerFlag.JamSelfcheckingFlag = TASK_FLAG_WAIT; //堵塞自检标志等待
  5002. TaskSchedulerTimer.JamSelfcheckingTimer = FIVE_MINUTE_TIMER;//堵塞自检计时5min
  5003. SysHornToneType = SoundOff;
  5004. // speakerWorkStep = emSpeakerNoneWork;
  5005. }
  5006. historyRefreshFlag = 0;//清除历史数据存储刷新标志
  5007. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;
  5008. // TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//清除蜂鸣器响
  5009. sysPromptToneType = SoundOff;
  5010. realTimeData.stateRun = Pause;
  5011. //emSysWorkStep = emAlarmRecordStep;
  5012. /* if(realTimeData.firstDose != 0)//
  5013. {
  5014. emSysWorkStep = EnterRunFirstDose;
  5015. emDisplayPicture = RunFirstDoseDisp;
  5016. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5017. }
  5018. else
  5019. {
  5020. emSysWorkStep = EnterRunMain;//2017.04.10修改自控时报警,按暂停键暂停,再启动乱码问题,现在直接进入主运行界面
  5021. emDisplayPicture = RunMainDisp;
  5022. //emDisplayPicture = emAlarmRecordPicture;
  5023. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5024. }*/
  5025. if(realTimeData.firstDose != 0)//堵塞自检通过后返回首次量未完成状态
  5026. {
  5027. emSysWorkStep = EnterRunFirstDose;
  5028. emDisplayPicture = RunFirstDoseDisp;
  5029. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5030. }
  5031. else if(realTimeData.superaddition != 0)//堵塞自检通过后返回PCA未完成状态
  5032. {
  5033. PCADontRun_Flag = 1;
  5034. // TaskSchedulerFlag.SuperadditionFlag = TASK_FLAG_CLEAR;
  5035. // realTimeData.lockTime = runParamInfo.lockTime;
  5036. // TaskSchedulerTimer.pcaLockTimer = runParamInfo.lockTime * 60000;
  5037. // realTimeData.superaddition = 0;
  5038. emSysWorkStep = EnterRunMain;
  5039. emDisplayPicture = RunPCADisp;
  5040. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5041. }
  5042. else
  5043. {
  5044. emSysWorkStep = EnterRunMain;
  5045. emDisplayPicture = RunMainDisp;
  5046. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5047. }
  5048. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  5049. //--------------------------
  5050. // TaskSchedulerFlag.pcaLockFlag = TASK_FLAG_CLEAR;
  5051. // TaskSchedulerFlag.SuperadditionFlag = TASK_FLAG_CLEAR;
  5052. // runParamInfo.superaddition = setParamInfo.superaddition1;
  5053. // realTimeData.superaddition=0;
  5054. // TaskSchedulerFlag.silenceFlag = TASK_FLAG_CLEAR;//静音标志,清除
  5055. // DrawSilenceDisplay();//静音
  5056. // speakerWorkStep = emSpeakerNoneWork;
  5057. //--------------------------------
  5058. }
  5059. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  5060. {
  5061. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  5062. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  5063. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  5064. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  5065. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  5066. WriteHistoryRecord();
  5067. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5068. realTimeData.stateRun = Pause;//等待状态
  5069. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_ON )
  5070. {
  5071. emPictureRunState = FirstEnter;
  5072. emSysWorkStep = EnterLockPassword;
  5073. emDisplayPicture = LockPasswordDisp;
  5074. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR; //关闭蜂鸣器
  5075. LcdFlicker_Flag = TASK_FLAG_CLEAR; //关闭led灯
  5076. emLockPasswordStep = EnterPowerOFF;
  5077. emLockPassowrdPicture = ClearDisp;
  5078. emLockPasswordFailStep = emAlarmRememberStep;
  5079. emLockPassowrdFailPicture = emAlarmRememberPicture;
  5080. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;
  5081. modifyStep = 1;
  5082. return;
  5083. }
  5084. else
  5085. {
  5086. realTimeData.stateRun = Poweroff;//关机发送
  5087. /* 切断电源,关机 */
  5088. emSysWorkStep = EnterPowerOFF;
  5089. emDisplayPicture = ClearDisp;
  5090. return;
  5091. }
  5092. }
  5093. /* 按PS静音 */
  5094. // if( KeyActionFlag.keyPS == emKeyflagShortPress )//密码/静音键
  5095. // {
  5096. // KeyActionFlag.keyPS = emKeyflagNonePress;
  5097. // Key_Quiet_Cont=1;
  5098. // Quiet_Timedata=1000;
  5099. // Quiet_Timedata_flag=0;
  5100. // }
  5101. if( historyRefreshFlag == 0 )
  5102. {
  5103. // historyRecordQTY++; //报警和关机在同一条保存信息里面,不能把指针变量改变
  5104. HistoryQtyAdd();
  5105. WriteHistoryRecordQTY();
  5106. historyRefreshFlag = 1;
  5107. }
  5108. if( Alarm_flag == 1)
  5109. {
  5110. WriteHistoryRecord();
  5111. Alarm_flag=0;
  5112. }
  5113. // CntOpenHornInit();//报警前打开功放管脚的初始化
  5114. // if( (Key_Quiet_Cont == 1) && (Quiet_Timedata_flag == 1))
  5115. // {
  5116. // Key_Quiet_Cont=0;
  5117. // Quiet_Timedata_flag=0;
  5118. // if(TaskSchedulerFlag.silenceFlag == TASK_FLAG_CLEAR)
  5119. // {
  5120. // TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  5121. // TaskSchedulerFlag.silenceFlag = TASK_FLAG_SET;//静音标志
  5122. // emDisplayPicture = emCurrentPicture;
  5123. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_CLEAR;//清除自动关机标志
  5124. // }
  5125. // else if(TaskSchedulerFlag.silenceFlag == TASK_FLAG_SET)
  5126. // {
  5127. // TaskSchedulerFlag.silenceFlag = TASK_FLAG_CLEAR;//静音标志
  5128. // DrawSilenceDisplay();//静音
  5129. // TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  5130. // speakerWorkStep = emSpeakerNoneWork;
  5131. // sysPromptToneType=WarringTone;//静音回复后,之前的状态回复
  5132. // }
  5133. // }
  5134. if(TaskSchedulerFlag.JamSelfcheckingFlag == TASK_FLAG_CLEAR)
  5135. {
  5136. motorWorkState = MOTOR_WORK_ON; //自检一次
  5137. if(realTimeData.firstDose != 0)
  5138. {
  5139. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER; //闪烁标志清除
  5140. if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )//电池电量低
  5141. {
  5142. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  5143. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  5144. }
  5145. else
  5146. {
  5147. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除
  5148. LcdFlicker_Flag = TASK_FLAG_CLEAR; //关闭报警指示灯
  5149. Y_LED_OFF ;
  5150. }
  5151. sysPromptToneType = SoundOff;
  5152. speakerWorkStep = emSpeakerNoneWork; //关闭蜂鸣器报警
  5153. sysAlarmFlag.JamFault = ALARM_OFF;//结束报警
  5154. emSysWorkStep = EnterRunFirstDose;
  5155. emDisplayPicture = RunFirstDoseDisp;
  5156. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5157. infusionMode = FirstDoseMode;
  5158. InfusionControl( FirstDoseMode );
  5159. // realTimeData.firstDose = FirstSurplusDose;
  5160. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  5161. TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;//电机停止等待时间
  5162. realTimeData.stateRun = FirstRun;//运行发送
  5163. }
  5164. else if(realTimeData.superaddition != 0)//堵塞自检通过后返回PCA未完成状态
  5165. {
  5166. TaskSchedulerFlag.SuperadditionFlag = TASK_FLAG_SET;
  5167. // TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_CLEAR;
  5168. if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )//电池电量低
  5169. {
  5170. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  5171. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  5172. }
  5173. else
  5174. {
  5175. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除
  5176. LcdFlicker_Flag = TASK_FLAG_CLEAR; //关闭报警指示灯
  5177. Y_LED_OFF ;
  5178. }
  5179. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER; //闪烁标志清除
  5180. sysPromptToneType = SoundOff; //关闭蜂鸣器报警
  5181. speakerWorkStep = emSpeakerNoneWork;
  5182. sysAlarmFlag.JamFault = ALARM_OFF;//结束报警
  5183. emSysWorkStep = EnterRunMain;
  5184. emDisplayPicture = RunPCADisp;
  5185. realTimeData.stateRun = PCARun;
  5186. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5187. infusionMode = SuperadditionMode;
  5188. InfusionControl( SuperadditionMode );
  5189. // realTimeData.superaddition = PCASurplusDose;
  5190. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  5191. }
  5192. else
  5193. {
  5194. if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )//电池电量低
  5195. {
  5196. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  5197. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  5198. }
  5199. else
  5200. {
  5201. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除
  5202. LcdFlicker_Flag = TASK_FLAG_CLEAR; //关闭报警指示灯
  5203. Y_LED_OFF ;
  5204. }
  5205. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER; //闪烁标志清除
  5206. sysPromptToneType = SoundOff; //关闭蜂鸣器报警
  5207. speakerWorkStep = emSpeakerNoneWork;
  5208. sysAlarmFlag.JamFault = ALARM_OFF;//结束报警
  5209. emSysWorkStep = EnterRunMain;
  5210. emDisplayPicture = RunMainDisp;
  5211. realTimeData.stateRun = MainRun;
  5212. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5213. infusionMode = ContinueMode;
  5214. InfusionControl( ContinueMode );
  5215. TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;//电机停止等待时间
  5216. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  5217. }
  5218. TaskSchedulerFlag.JamSelfcheckingFlag = TASK_FLAG_WCLEAR;
  5219. }
  5220. if(TaskSchedulerFlag.PasswordTimeOverFlag == TASK_FLAG_SET)
  5221. {
  5222. if((sysAlarmFlag.NonePillCase == ALARM_ON)||(sysAlarmFlag.BubbleFault == ALARM_ON)||(sysAlarmFlag.LineLost == ALARM_ON)
  5223. ||(sysAlarmFlag.JamFault == ALARM_ON)||(sysAlarmFlag.MaxFault == ALARM_ON)||(sysAlarmFlag.InputTotal == ALARM_ON)||
  5224. ( sysAlarmFlag.VoltLowest == ALARM_ON) )
  5225. {
  5226. realTimeData.stateRun = Alarm;
  5227. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  5228. SysHornToneType = WarringTone;
  5229. TaskSchedulerFlag.PasswordTimeOverFlag = TASK_FLAG_CLEAR;
  5230. }
  5231. }
  5232. }
  5233. /*************************************************************************************
  5234. * Function: CntMechanicalFaultPicture
  5235. * Object: 控制机械报警画面
  5236. * 输入: 无
  5237. * 输出: 无
  5238. * 备注: 1、此报警是不可恢复,一旦发生只能关机
  5239. * 3、power键长按关机
  5240. * 4、密码/静音键短按静音
  5241. * 5、其它键无效
  5242. * 6、此页面有自动关机功能
  5243. * 7、关闭自动关机,增加关机输入密码,密码界面3min,3min过后回到原来界面
  5244. **************************************************************************************/
  5245. void CntMechanicalFaultPicture( void )
  5246. {
  5247. uint8_t InputTotalDoseBuff[4];
  5248. // if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_CLEAR )//从进入此界面开始自动关机倒计时
  5249. // {
  5250. // TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_WAIT;
  5251. // TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;
  5252. // }
  5253. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  5254. {
  5255. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  5256. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  5257. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  5258. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  5259. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  5260. if( historyRefreshFlag == 0 )
  5261. {
  5262. // historyRecordQTY++;
  5263. HistoryQtyAdd();
  5264. WriteHistoryRecordQTY();
  5265. historyRefreshFlag = 1;
  5266. }
  5267. WriteHistoryRecord();
  5268. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5269. realTimeData.stateRun = Pause;//关机发送
  5270. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_ON )
  5271. {
  5272. emSysWorkStep = EnterLockPassword;
  5273. emDisplayPicture = LockPasswordDisp;
  5274. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//关闭蜂鸣器
  5275. LcdFlicker_Flag = TASK_FLAG_CLEAR; //关闭led灯
  5276. emLockPasswordStep = EnterPowerOFF;
  5277. emLockPassowrdPicture = ClearDisp;
  5278. emLockPasswordFailStep = emAlarmRememberStep;
  5279. emLockPassowrdFailPicture = emAlarmRememberPicture;
  5280. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;
  5281. modifyStep = 1;
  5282. return;
  5283. }
  5284. else
  5285. {
  5286. realTimeData.stateRun = Poweroff;//关机发送
  5287. /* 切断电源,关机 */
  5288. emSysWorkStep = EnterPowerOFF;
  5289. emDisplayPicture = ClearDisp;
  5290. return;
  5291. }
  5292. }
  5293. /* 按keyAirout静音 */
  5294. /* if( KeyActionFlag.keyAirout == emKeyflagShortPress )//密码/静音键
  5295. {
  5296. TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;
  5297. TaskSchedulerFlag.silenceFlag = TASK_FLAG_SET;//静音标志
  5298. emDisplayPicture = AlarmDeviceDisp;
  5299. }
  5300. if(TaskSchedulerFlag.PasswordTimeOverFlag == TASK_FLAG_SET)
  5301. {
  5302. if(sysAlarmFlag.MechanicalFault == ALARM_ON)
  5303. {
  5304. realTimeData.stateRun = Alarm;
  5305. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
  5306. sysPromptToneType = WarringTone;
  5307. TaskSchedulerFlag.PasswordTimeOverFlag = TASK_FLAG_CLEAR;
  5308. }
  5309. }*/
  5310. }
  5311. /*************************************************************************************
  5312. * Function: CntlEngineeringMode1Picture
  5313. * Object: 控制工程1画面
  5314. * 输入: 无
  5315. * 输出: 无
  5316. * 备注: 1、enter键短按下一项选择,循环选择
  5317. * 2、运行停止键短按进行前一项选择
  5318. * 3、power键长按关机,并保存工程模式参数
  5319. * 4、加减键短按选项数字加减
  5320. * 5、其它键无效
  5321. **************************************************************************************/
  5322. void CntlEngineeringMode1Picture( void )
  5323. {
  5324. uint8_t InputTotalDoseBuff[4];
  5325. if( KeyActionFlag.keyEnter == emKeyflagShortPress )//enter键
  5326. {
  5327. switch( emEngineeringMode1Choose)
  5328. {
  5329. case SickroomQty://病区
  5330. emEngineeringMode1Choose = NetworkState;
  5331. emDisplayPicture = EngineeringMode1Disp;
  5332. break;
  5333. case NetworkState://网络
  5334. emEngineeringMode1Choose = BedNOQty;
  5335. emDisplayPicture = EngineeringMode1Disp;
  5336. break;
  5337. case BedNOQty://病床
  5338. emEngineeringMode1Choose = SeachState;
  5339. emDisplayPicture = EngineeringMode1Disp;
  5340. break;
  5341. case SeachState://查询
  5342. emEngineeringMode1Choose = Selfcontrol;
  5343. emDisplayPicture = EngineeringMode1Disp;
  5344. break;
  5345. case Selfcontrol://自控流速
  5346. emEngineeringMode1Choose = PasswordState;
  5347. emDisplayPicture = EngineeringMode1Disp;
  5348. break;
  5349. case PasswordState://密码
  5350. emEngineeringMode1Choose = HospitalNOQty;
  5351. emDisplayPicture = EngineeringMode1Disp;
  5352. break;
  5353. case HospitalNOQty://住院号
  5354. emEngineeringMode1Choose = DeviceAlarm;
  5355. emPictureRunState = FirstEnter;
  5356. emDisplayPicture = EngineeringMode2Disp;
  5357. break;
  5358. case DeviceAlarm://机械报警
  5359. emEngineeringMode1Choose = SilenceState;
  5360. emDisplayPicture = EngineeringMode2Disp;
  5361. break;
  5362. case SilenceState://静音
  5363. emEngineeringMode1Choose = BubbleAlarm;
  5364. emDisplayPicture = EngineeringMode2Disp;
  5365. break;
  5366. case BubbleAlarm://气泡/无液
  5367. emEngineeringMode1Choose = ClosedState;
  5368. emDisplayPicture = EngineeringMode2Disp;
  5369. break;
  5370. case ClosedState://扣合
  5371. emEngineeringMode1Choose = Automatic;
  5372. emDisplayPicture = EngineeringMode2Disp;
  5373. break;
  5374. case Automatic://自动调整
  5375. emEngineeringMode1Choose = JamAlarm;
  5376. emDisplayPicture = EngineeringMode2Disp;
  5377. break;
  5378. case JamAlarm://堵塞
  5379. emEngineeringMode1Choose = pressure_button;
  5380. emDisplayPicture = EngineeringMode2Disp;
  5381. break;
  5382. case pressure_button://压力显示
  5383. emEngineeringMode1Choose = test;
  5384. emDisplayPicture = EngineeringMode2Disp;
  5385. break;
  5386. case test:
  5387. emEngineeringMode1Choose = test;
  5388. emDisplayPicture = EngineeringMode2Disp;
  5389. break;
  5390. default:break;
  5391. }
  5392. }
  5393. if((KeyActionFlag.keyRunPause == emKeyflagShortPress )||(KeyActionFlag.keyPS == emKeyflagShortPress))//暂停键具有返回功能
  5394. {
  5395. switch( emEngineeringMode1Choose)
  5396. {
  5397. case SickroomQty://病区
  5398. emEngineeringMode1Choose = SickroomQty;
  5399. emDisplayPicture = EngineeringMode1Disp;
  5400. break;
  5401. case NetworkState://网络
  5402. emEngineeringMode1Choose = SickroomQty;
  5403. emDisplayPicture = EngineeringMode1Disp;
  5404. break;
  5405. case BedNOQty://病床
  5406. emEngineeringMode1Choose = NetworkState;
  5407. emDisplayPicture = EngineeringMode1Disp;
  5408. break;
  5409. case SeachState://查询
  5410. emEngineeringMode1Choose = BedNOQty;
  5411. emDisplayPicture = EngineeringMode1Disp;
  5412. break;
  5413. case Selfcontrol://自控流速
  5414. emEngineeringMode1Choose = SeachState;
  5415. emDisplayPicture = EngineeringMode1Disp;
  5416. break;
  5417. case PasswordState://密码
  5418. emEngineeringMode1Choose = Selfcontrol;
  5419. emDisplayPicture = EngineeringMode1Disp;
  5420. break;
  5421. case HospitalNOQty://住院号
  5422. emEngineeringMode1Choose = PasswordState;
  5423. emDisplayPicture = EngineeringMode1Disp;
  5424. break;
  5425. case DeviceAlarm://机械报警
  5426. emPictureRunState = FirstEnter;
  5427. emEngineeringMode1Choose = SickroomQty;
  5428. emDisplayPicture = EngineeringMode1Disp;
  5429. break;
  5430. case SilenceState://静音
  5431. emEngineeringMode1Choose = DeviceAlarm;
  5432. emDisplayPicture = EngineeringMode2Disp;
  5433. break;
  5434. case BubbleAlarm://气泡/无液
  5435. emEngineeringMode1Choose = SilenceState;
  5436. emDisplayPicture = EngineeringMode2Disp;
  5437. break;
  5438. case ClosedState://扣合
  5439. emEngineeringMode1Choose = BubbleAlarm;
  5440. emDisplayPicture = EngineeringMode2Disp;
  5441. break;
  5442. case Automatic://自动调整
  5443. emEngineeringMode1Choose = ClosedState;
  5444. emDisplayPicture = EngineeringMode2Disp;
  5445. break;
  5446. case JamAlarm://堵塞
  5447. emEngineeringMode1Choose = Automatic;
  5448. emDisplayPicture = EngineeringMode2Disp;
  5449. break;
  5450. case pressure_button://压力显示
  5451. emEngineeringMode1Choose = JamAlarm;
  5452. emDisplayPicture = EngineeringMode2Disp;
  5453. break;
  5454. case test:
  5455. emEngineeringMode1Choose = pressure_button;
  5456. emDisplayPicture = EngineeringMode2Disp;
  5457. break;
  5458. default:break;
  5459. }
  5460. }
  5461. if( ( KeyActionFlag.keyPlus == emKeyflagShortPress ) || ( KeyActionFlag.keyPlus == emKeyflagLongPress ) )//加键
  5462. {
  5463. KeyActionFlag.keyPlus = emKeyflagShortRelease;//短按释放按键
  5464. switch( emEngineeringMode1Choose)
  5465. {
  5466. case SickroomQty://病区
  5467. if( EngineeringModeValue.sickroomQty >= 3 )
  5468. {
  5469. EngineeringModeValue.sickroomQty = 1;
  5470. }
  5471. else
  5472. {
  5473. EngineeringModeValue.sickroomQty++;
  5474. }
  5475. emDisplayPicture = EngineeringMode1Disp;
  5476. break;
  5477. case NetworkState://网络
  5478. if( EngineeringModeValue.networkState == ENGINEERINGMODE_OFF )
  5479. {
  5480. EngineeringModeValue.networkState = ENGINEERINGMODE_ON;
  5481. }
  5482. emDisplayPicture = EngineeringMode1Disp;
  5483. break;
  5484. case BedNOQty://病床
  5485. if( EngineeringModeValue.bedNOQty >= 3 )
  5486. {
  5487. EngineeringModeValue.bedNOQty = 1;
  5488. }
  5489. else
  5490. {
  5491. EngineeringModeValue.bedNOQty++;
  5492. }
  5493. emDisplayPicture = EngineeringMode1Disp;
  5494. break;
  5495. /*case EvaluateState://随访
  5496. if( EngineeringModeValue.evaluateState == 0 )
  5497. {
  5498. EngineeringModeValue.evaluateState = 1;
  5499. }
  5500. emDisplayPicture = EngineeringMode1Disp;
  5501. break;*/
  5502. case Selfcontrol://自控流速
  5503. if( EngineeringModeValue.selfcontrol >= 100 )
  5504. {
  5505. EngineeringModeValue.selfcontrol = 0;
  5506. }
  5507. else
  5508. {
  5509. EngineeringModeValue.selfcontrol++;
  5510. }
  5511. emDisplayPicture = EngineeringMode1Disp;
  5512. break;
  5513. case SeachState://查询
  5514. if( EngineeringModeValue.seachState == 1 )
  5515. {
  5516. EngineeringModeValue.seachState = 0;
  5517. }
  5518. emDisplayPicture = EngineeringMode1Disp;
  5519. break;
  5520. case HospitalNOQty://住院号
  5521. if( EngineeringModeValue.hospitalNOQty >= 9 )
  5522. {
  5523. EngineeringModeValue.hospitalNOQty = 1;
  5524. }
  5525. else
  5526. {
  5527. EngineeringModeValue.hospitalNOQty++;
  5528. }
  5529. emDisplayPicture = EngineeringMode1Disp;
  5530. break;
  5531. case PasswordState://密码
  5532. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_OFF )
  5533. {
  5534. EngineeringModeValue.passwordState = ENGINEERINGMODE_ON;
  5535. }
  5536. emDisplayPicture = EngineeringMode1Disp;
  5537. break;
  5538. case DeviceAlarm://机械报警
  5539. if( EngineeringModeValue.deviceAlarm == 1 )
  5540. {
  5541. EngineeringModeValue.deviceAlarm = 0;
  5542. }
  5543. emDisplayPicture = EngineeringMode2Disp;
  5544. break;
  5545. case SilenceState://声音
  5546. if( EngineeringModeValue.silenceState == 0)
  5547. {
  5548. EngineeringModeValue.silenceState = 1;
  5549. }
  5550. emDisplayPicture = EngineeringMode2Disp;
  5551. break;
  5552. case BubbleAlarm://气泡/无液
  5553. if( EngineeringModeValue.bubbleAlarm == 1 )
  5554. {
  5555. EngineeringModeValue.bubbleAlarm = 0;
  5556. }
  5557. emDisplayPicture = EngineeringMode2Disp;
  5558. break;
  5559. case ClosedState://扣合
  5560. if( EngineeringModeValue.closedState == 1 )
  5561. {
  5562. EngineeringModeValue.closedState = 0;
  5563. }
  5564. emDisplayPicture = EngineeringMode2Disp;
  5565. break;
  5566. case Automatic://自动调整
  5567. if( EngineeringModeValue.automatic == 1 )
  5568. {
  5569. EngineeringModeValue.automatic = 0;
  5570. TotalDoesChange0 = 1;
  5571. TotalDoesChange1 = 0;
  5572. }
  5573. emDisplayPicture = EngineeringMode2Disp;
  5574. break;
  5575. case JamAlarm://堵塞
  5576. if( EngineeringModeValue.jamAlarm == 1 )
  5577. {
  5578. EngineeringModeValue.jamAlarm = 0;
  5579. }
  5580. emDisplayPicture = EngineeringMode2Disp;
  5581. break;
  5582. case pressure_button://压力显示
  5583. if( EngineeringModeValue.pressure_switch == 1 )
  5584. {
  5585. EngineeringModeValue.pressure_switch = 0;
  5586. }
  5587. emDisplayPicture = EngineeringMode2Disp;
  5588. break;
  5589. case test:
  5590. if(EngineeringModeValue.test == 1)
  5591. {
  5592. EngineeringModeValue.test = 0; //测试关
  5593. // TestSwitch = 0; //测试关闭,正常发送其他数据
  5594. }
  5595. emDisplayPicture = EngineeringMode2Disp;
  5596. break;
  5597. default:break;
  5598. }
  5599. }
  5600. if( ( KeyActionFlag.keyMinus == emKeyflagShortPress ) || ( KeyActionFlag.keyMinus == emKeyflagLongPress ) )//减键
  5601. {
  5602. KeyActionFlag.keyMinus = emKeyflagShortRelease;//短按释放按键
  5603. switch( emEngineeringMode1Choose)
  5604. {
  5605. case SickroomQty://病区
  5606. if( EngineeringModeValue.sickroomQty <= 1 )
  5607. {
  5608. EngineeringModeValue.sickroomQty = 3;
  5609. }
  5610. else
  5611. {
  5612. EngineeringModeValue.sickroomQty--;
  5613. }
  5614. emDisplayPicture = EngineeringMode1Disp;
  5615. break;
  5616. case NetworkState://网络
  5617. if( EngineeringModeValue.networkState == ENGINEERINGMODE_ON )
  5618. {
  5619. EngineeringModeValue.networkState = ENGINEERINGMODE_OFF;
  5620. }
  5621. emDisplayPicture = EngineeringMode1Disp;
  5622. break;
  5623. case BedNOQty://病床
  5624. if( EngineeringModeValue.bedNOQty <= 1 )
  5625. {
  5626. EngineeringModeValue.bedNOQty = 3;
  5627. }
  5628. else
  5629. {
  5630. EngineeringModeValue.bedNOQty--;
  5631. }
  5632. emDisplayPicture = EngineeringMode1Disp;
  5633. break;
  5634. /*case EvaluateState://随访
  5635. if( EngineeringModeValue.evaluateState == 1 )
  5636. {
  5637. EngineeringModeValue.evaluateState = 0;
  5638. }
  5639. emDisplayPicture = EngineeringMode1Disp;
  5640. break;*/
  5641. case Selfcontrol://自控流速
  5642. if( EngineeringModeValue.selfcontrol <= 0 )
  5643. {
  5644. EngineeringModeValue.selfcontrol = 100;
  5645. }
  5646. else
  5647. {
  5648. EngineeringModeValue.selfcontrol--;
  5649. }
  5650. emDisplayPicture = EngineeringMode1Disp;
  5651. break;
  5652. case SeachState://查询
  5653. if( EngineeringModeValue.seachState == 0 )
  5654. {
  5655. EngineeringModeValue.seachState = 1;
  5656. }
  5657. emDisplayPicture = EngineeringMode1Disp;
  5658. break;
  5659. case HospitalNOQty://住院号
  5660. if( EngineeringModeValue.hospitalNOQty <= 1 )
  5661. {
  5662. EngineeringModeValue.hospitalNOQty = 9;
  5663. }
  5664. else
  5665. {
  5666. EngineeringModeValue.hospitalNOQty--;
  5667. }
  5668. emDisplayPicture = EngineeringMode1Disp;
  5669. break;
  5670. case PasswordState://密码
  5671. if( EngineeringModeValue.passwordState == ENGINEERINGMODE_ON )
  5672. {
  5673. EngineeringModeValue.passwordState = ENGINEERINGMODE_OFF;
  5674. }
  5675. emDisplayPicture = EngineeringMode1Disp;
  5676. break;
  5677. case DeviceAlarm://机械报警
  5678. if( EngineeringModeValue.deviceAlarm == 0 )
  5679. {
  5680. EngineeringModeValue.deviceAlarm = 1;
  5681. }
  5682. emDisplayPicture = EngineeringMode2Disp;
  5683. break;
  5684. case SilenceState://声音
  5685. if( EngineeringModeValue.silenceState == 1 )
  5686. {
  5687. EngineeringModeValue.silenceState = 0;
  5688. }
  5689. emDisplayPicture = EngineeringMode2Disp;
  5690. break;
  5691. case BubbleAlarm://气泡/无液
  5692. if( EngineeringModeValue.bubbleAlarm == 0 )
  5693. {
  5694. EngineeringModeValue.bubbleAlarm = 1;
  5695. }
  5696. emDisplayPicture = EngineeringMode2Disp;
  5697. break;
  5698. case ClosedState://扣合
  5699. if( EngineeringModeValue.closedState == 0 )
  5700. {
  5701. EngineeringModeValue.closedState = 1;
  5702. }
  5703. emDisplayPicture = EngineeringMode2Disp;
  5704. break;
  5705. case Automatic://自动调整
  5706. if( EngineeringModeValue.automatic == 0 )
  5707. {
  5708. EngineeringModeValue.automatic = 1;
  5709. TotalDoesChange0 = 0;
  5710. TotalDoesChange1 = 1;
  5711. }
  5712. emDisplayPicture = EngineeringMode2Disp;
  5713. break;
  5714. case JamAlarm://堵塞
  5715. if( EngineeringModeValue.jamAlarm == 0 )
  5716. {
  5717. EngineeringModeValue.jamAlarm = 1;
  5718. }
  5719. emDisplayPicture = EngineeringMode2Disp;
  5720. break;
  5721. case pressure_button://压力显示
  5722. if( EngineeringModeValue.pressure_switch == 0)
  5723. {
  5724. EngineeringModeValue.pressure_switch = 1;
  5725. }
  5726. emDisplayPicture = EngineeringMode2Disp;
  5727. break;
  5728. case test:
  5729. if(EngineeringModeValue.test == 0)
  5730. {
  5731. EngineeringModeValue.test = 1; //测试开
  5732. }
  5733. emDisplayPicture = EngineeringMode2Disp;
  5734. break;
  5735. default:break;
  5736. }
  5737. }
  5738. if( KeyActionFlag.keyPower == emKeyflagLongPress )//power键
  5739. {
  5740. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  5741. WriteParameterRecord();//设置完成在此处保存一下
  5742. if( EngineeringModeValue.automatic == 1 )//自动调整
  5743. {
  5744. if(TotalDoesChange1 == 1)
  5745. {
  5746. InputTotalDoseBuff[0]=0;
  5747. InputTotalDoseBuff[1]=0;
  5748. InputTotalDoseBuff[2]=0;
  5749. InputTotalDoseBuff[3]=0;
  5750. //Write_Multi31256RAM(HISTORY31256_DATA_InputTotalDose,InputTotalDoseBuff,4);
  5751. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  5752. }
  5753. }
  5754. else
  5755. {
  5756. if(TotalDoesChange0 == 1)
  5757. {
  5758. InputTotalDoseBuff[0]=(uint8_t)(149000>>24);
  5759. InputTotalDoseBuff[1]=(uint8_t)(149000>>16);
  5760. InputTotalDoseBuff[2]=(uint8_t)(149000>>8);
  5761. InputTotalDoseBuff[3]=(uint8_t)149000;
  5762. //Write_Multi31256RAM(HISTORY31256_DATA_InputTotalDose,InputTotalDoseBuff,4);
  5763. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  5764. }
  5765. }
  5766. realTimeData.stateRun = Poweroff;//关机发送
  5767. /* 切断电源,关机 */
  5768. emDisplayPicture = ClearDisp;
  5769. emSysWorkStep = EnterPowerOFF;
  5770. }
  5771. }
  5772. /*************************************************************************************
  5773. * Function: CntlSystemWorkStep
  5774. * Object: 控制系统工作流程
  5775. * 输入: 无
  5776. * 输出: 无
  5777. * 备注: 此函数是整个系统最重要的函数,其中包括所有控制流程
  5778. * 其中最重要的变量emSysWorkStep,通过此变量赋值来控制当前工作流程
  5779. **************************************************************************************/
  5780. void CntlSystemWorkStep( void )
  5781. {
  5782. switch( emSysWorkStep )
  5783. {
  5784. //进入供电状态
  5785. case EnterPowerON:
  5786. CntlPowerONWork();
  5787. break;
  5788. //进入断电状态
  5789. case EnterPowerOFF:
  5790. CntlPowerOFFWork();
  5791. break;
  5792. //进入开机页
  5793. case EnterStartup:
  5794. CntlStartupPicture();
  5795. break;
  5796. //进入历史回顾
  5797. case EnterHistory:
  5798. CntlHistoryPicture();
  5799. break;
  5800. //进入设备ID设置
  5801. case EnterDeviceID:
  5802. CntlDeviceIDPicture();
  5803. break;
  5804. //进入时间显示
  5805. case EnterDispTime:
  5806. CntlDispTimePicture();
  5807. break;
  5808. //进入时间设置
  5809. case EnterSetTime:
  5810. CntlSetTimePicture();
  5811. break;
  5812. /*//进入密码设置
  5813. case EnterSetPassword:
  5814. CntlSetPasswordPicture();
  5815. break;*/
  5816. //进入确认住院信息
  5817. case EnterVerifyInfo:
  5818. CntlVerifyInfoPicture();
  5819. break;
  5820. //进入设置确认住院信息
  5821. case EnterSetVerifyInfo:
  5822. CntlSetVerifyInfoPicture();
  5823. break;
  5824. //进入参数设置
  5825. case EnterSetParam:
  5826. CntlSetParamPicture();
  5827. break;
  5828. //进入排气
  5829. case EnterAirout:
  5830. CntlAiroutPicture();
  5831. break;
  5832. //进入锁定密码
  5833. case EnterLockPassword:
  5834. CntlLockPasswordPicture();
  5835. break;
  5836. //进入运行首次量
  5837. case EnterRunFirstDose:
  5838. CntlRunFirstDosePicture();
  5839. break;
  5840. //进入运行主界面
  5841. case EnterRunMain:
  5842. CntlRunMainPicture();
  5843. break;
  5844. //输液完毕
  5845. case EnterTransfuseOver:
  5846. CntlTransfuseOverPicture();
  5847. break;
  5848. //随访
  5849. case EnterEvaluateTransfuse://
  5850. CntlEvaluateTransfusePicture();
  5851. break;
  5852. //疼痛评价
  5853. case EnterEvaluatePain://
  5854. CntlEvaluatePainPicture();
  5855. break;
  5856. //四肢肌力评价
  5857. case EnterLimbMyodynamia://
  5858. CntlLimbMyodynamiaPicture();
  5859. break;
  5860. //确认评价
  5861. case EnterEvaluateVerify://
  5862. CntlEvaluateVerifyPicture();
  5863. break;
  5864. //机械故障,只能关机
  5865. case EnterMechanicalFault://
  5866. CntMechanicalFaultPicture();
  5867. break;
  5868. case EnterJamFault:
  5869. case EnterMaxFault:
  5870. case EnterBubbleFault:
  5871. case EnterNonePillCaseFault:
  5872. case EnterLineLost:
  5873. case EnterInputTotal: //输入总量超限
  5874. //电池电量低
  5875. case EnterBatteryVoltLow:
  5876. CntlAlarmPicture();
  5877. break;
  5878. //进入工程模式1
  5879. case EnterEngineeringMode1:
  5880. CntlEngineeringMode1Picture();
  5881. break;
  5882. case EnterInpatien:
  5883. CntlInpatienPicture();
  5884. break;
  5885. default:break;
  5886. }
  5887. }
  5888. /*************************************************************************************
  5889. * Function: CntlSystemWorkTimer
  5890. * Object: 控制系统工作计时
  5891. * 输入: 无
  5892. * 输出: 无
  5893. * 备注: 根据emSysWorkStep变量,相应步骤执行时有特定的工作计时
  5894. **************************************************************************************/
  5895. void CntlSystemWorkTimer( void )
  5896. {
  5897. switch( emSysWorkStep )
  5898. {
  5899. case EnterStartup://5秒enter键没有动作直接跳入设备ID页面
  5900. if(TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_SET)
  5901. {
  5902. if( TaskSchedulerTimer.dispAutoJumpTimer != 0 )
  5903. {
  5904. TaskSchedulerTimer.dispAutoJumpTimer--;
  5905. }
  5906. else
  5907. {
  5908. controlTimerCounts++;
  5909. if( controlTimerCounts >= 2 )//如果时间加载2次,则按自动跳转处理
  5910. {
  5911. controlTimerCounts = 0;
  5912. emSysWorkStep = EnterDeviceID;
  5913. emDisplayPicture = DeviceID;
  5914. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;
  5915. realTimeData.stateRun = StartWork;//系统运行状态:工作
  5916. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  5917. // motorWorkState = MOTOR_WORK_OFF;
  5918. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  5919. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  5920. }
  5921. else
  5922. {
  5923. //如果在自动跳转时间内有按键按下,则再等待一个长按键的时间
  5924. if( KeyScanStatus.keyEnter == emKyeActionScanSet )//表明在自动跳转过程中有按下按键的动作,重新进入自动跳转倒计时
  5925. {
  5926. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;
  5927. }
  5928. else
  5929. {
  5930. controlTimerCounts = 0;
  5931. emSysWorkStep = EnterDeviceID;
  5932. emDisplayPicture = DeviceID;
  5933. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;
  5934. realTimeData.stateRun = StartWork;//系统运行状态:工作
  5935. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  5936. // motorWorkState = MOTOR_WORK_OFF;
  5937. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  5938. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  5939. }
  5940. }
  5941. }
  5942. }
  5943. break;
  5944. case EnterHistory:
  5945. if( TaskSchedulerTimer.dispAutoJumpTimer != 0 )
  5946. {
  5947. TaskSchedulerTimer.dispAutoJumpTimer--;
  5948. }
  5949. else
  5950. {
  5951. if( emCurrentPicture == HistoryFisrtDisp )
  5952. {
  5953. emDisplayPicture = HistorySecondDisp;
  5954. }
  5955. else if( emCurrentPicture == HistorySecondDisp )
  5956. {
  5957. emDisplayPicture = HistoryFisrtDisp;
  5958. }
  5959. emSysWorkStep = EnterHistory;
  5960. TaskSchedulerTimer.dispAutoJumpTimer = FIVE_SECOND_TIMER;
  5961. }
  5962. break;
  5963. case EnterDeviceID:
  5964. if( TaskSchedulerTimer.dispAutoJumpTimer != 0 )
  5965. {
  5966. TaskSchedulerTimer.dispAutoJumpTimer--;
  5967. }
  5968. else
  5969. {
  5970. controlTimerCounts++;
  5971. if( controlTimerCounts >= 2 )//如果时间加载2次,则按自动跳转处理
  5972. {
  5973. controlTimerCounts = 0;
  5974. emSysWorkStep = EnterDispTime;
  5975. emDisplayPicture = TimeDisp;
  5976. // emSysWorkStep = EnterVerifyInfo;
  5977. // emDisplayPicture = VerifyInfoDisp;
  5978. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;
  5979. //TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_SET;
  5980. }
  5981. else
  5982. {
  5983. //如果在自动跳转时间内有按键按下,则再等待一个长按键的时间
  5984. if( KeyScanStatus.keyPower == emKyeActionScanSet )
  5985. {
  5986. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;
  5987. }
  5988. else
  5989. {
  5990. controlTimerCounts = 0;
  5991. emSysWorkStep = EnterDispTime;
  5992. emDisplayPicture = TimeDisp;
  5993. // emSysWorkStep = EnterVerifyInfo;
  5994. // emDisplayPicture = VerifyInfoDisp;
  5995. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;
  5996. // TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_SET;
  5997. }
  5998. }
  5999. }
  6000. break;
  6001. case EnterRunFirstDose:
  6002. // if( motorWorkState == MOTOR_WORK_ON )//从电机开始工作开始计时一小时总输注量
  6003. {
  6004. // if( TaskSchedulerTimer.totalDoseOneHourTimer != 0 )
  6005. // {
  6006. // TaskSchedulerTimer.totalDoseOneHourTimer--;
  6007. // }
  6008. // else
  6009. // {
  6010. // TaskSchedulerTimer.totalDoseOneHourTimer = ONE_HOUR_TIMER;
  6011. // }
  6012. }
  6013. if( TaskSchedulerFlag.lockDispFlag == TASK_FLAG_CLEAR )
  6014. {
  6015. if( TaskSchedulerTimer.lockDispTimer != 0 )
  6016. {
  6017. TaskSchedulerTimer.lockDispTimer--;
  6018. }
  6019. else
  6020. {
  6021. TaskSchedulerTimer.lockDispTimer = runParamInfo.lockTime;
  6022. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_SET;
  6023. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  6024. /*emDisplayPicture = RunFirstDoseDisp;*/
  6025. }
  6026. }
  6027. if( realTimeData.stateRun != Pause )//用来做进度条显示控制
  6028. {
  6029. if( TaskSchedulerTimer.universalTimer != 0 )
  6030. {
  6031. TaskSchedulerTimer.universalTimer--;
  6032. }
  6033. else
  6034. {
  6035. TaskSchedulerFlag.rtdUpdateFlag = TASK_FLAG_SET;
  6036. // emDisplayPicture = RunFirstDoseDisp;
  6037. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  6038. TaskSchedulerTimer.universalTimer = ONE_SECOND_TIMER;
  6039. }
  6040. }
  6041. // if( TaskSchedulerFlag.sensorPWPressureFlag == TASK_FLAG_CLEAR )//每10s打开一次主芯片,以保证节能
  6042. // {
  6043. // if( TaskSchedulerTimer.hostPowerSaveTimer != 0 )
  6044. // {
  6045. // TaskSchedulerTimer.hostPowerSaveTimer--;
  6046. // }
  6047. // else
  6048. // {
  6049. // TaskSchedulerFlag.sensorPWPressureFlag = TASK_FLAG_SET;//传感器电源-压力打开
  6050. // TaskSchedulerTimer.hostPowerSaveTimer = TEN_SECOND_TIMER;
  6051. // }
  6052. // }
  6053. break;
  6054. case EnterRunMain:
  6055. // if( TaskSchedulerTimer.totalDoseOneHourTimer != 0 )
  6056. // {
  6057. // TaskSchedulerTimer.totalDoseOneHourTimer--;
  6058. // }
  6059. // else
  6060. // {
  6061. // TaskSchedulerFlag.limitJudgeFlag = TASK_FLAG_CLEAR;
  6062. // TaskSchedulerTimer.totalDoseOneHourTimer = ONE_HOUR_TIMER;
  6063. // }
  6064. LimitBeginsTime = 1;
  6065. /*PCA锁时计时处理,暂停时时间继续计时*/
  6066. /* if(realTimeData.stateRun != Pause)
  6067. {
  6068. if( TaskSchedulerFlag.pcaLockFlag == TASK_FLAG_SET )
  6069. {
  6070. if( TaskSchedulerTimer.pcaLockTimer != 0 )
  6071. {
  6072. TaskSchedulerTimer.pcaLockTimer--;
  6073. if( TaskSchedulerTimer.pcaLockTimer % 60000 == 0 )
  6074. {
  6075. realTimeData.lockTime--;//每60s锁时减1
  6076. }
  6077. }
  6078. else
  6079. {
  6080. realTimeData.lockTime = 0;
  6081. TaskSchedulerFlag.pcaLockFlag = TASK_FLAG_CLEAR;//清除PCA锁时
  6082. TaskSchedulerTimer.pcaLockTimer = runParamInfo.lockTime * 60000;
  6083. TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除,防止PCA锁时为0的情况下,进入PCA有效次数不显示
  6084. }
  6085. }
  6086. }
  6087. */
  6088. // if(realTimeData.stateRun != Pause)
  6089. {
  6090. if(TaskSchedulerFlag.PCAOneTimeFlag==TASK_FLAG_SET)
  6091. {
  6092. if(TaskSchedulerTimer.pcaOneHourTimer!=0)
  6093. {
  6094. TaskSchedulerTimer.pcaOneHourTimer--;
  6095. }
  6096. else
  6097. {
  6098. TaskSchedulerFlag.PCAOneTimeFlag=TASK_FLAG_CLEAR;
  6099. }
  6100. }
  6101. }
  6102. /*PCA有效无效次数闪烁显示*/
  6103. if( TaskSchedulerFlag.pcaCountDispFlag == TASK_FLAG_SET )
  6104. {
  6105. if( TaskSchedulerTimer.pcaCountsDispTimer != 0 )
  6106. {
  6107. TaskSchedulerTimer.pcaCountsDispTimer--;
  6108. if( TaskSchedulerTimer.pcaCountsDispTimer % 500 == 0 )
  6109. {
  6110. if(TaskSchedulerFlag.lcdFlashFlag == TASK_FLAG_CLEAR)
  6111. {
  6112. TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_SET;
  6113. TaskSchedulerFlag.lcdFlashFlag1 = TASK_FLAG_SET;//
  6114. }
  6115. else if(TaskSchedulerFlag.lcdFlashFlag == TASK_FLAG_WAIT)
  6116. {
  6117. TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_WSET;
  6118. TaskSchedulerFlag.lcdFlashFlag1 = TASK_FLAG_SET;//仅用于刷新PCA有无效此数
  6119. }
  6120. // if( (realTimeData.stateRun == PCARun)||(realTimeData.superaddition != 0) )//界面刷新时间更新,有效无效次数闪烁处理
  6121. // {
  6122. // emDisplayPicture = RunPCADisp;
  6123. // }
  6124. // else
  6125. // {
  6126. // emDisplayPicture = RunMainDisp;
  6127. // }
  6128. /*if( emCurrentPicture == RunMainDisp )
  6129. {
  6130. emDisplayPicture = RunMainDisp;
  6131. }
  6132. else if( emCurrentPicture == RunPCADisp )
  6133. {
  6134. emDisplayPicture = RunPCADisp;
  6135. }*/
  6136. }
  6137. }
  6138. else
  6139. {
  6140. TaskSchedulerFlag.pcaCountDispFlag = TASK_FLAG_CLEAR;//无效显示清除
  6141. TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除
  6142. TaskSchedulerTimer.pcaCountsDispTimer = TEN_SECOND_TIMER;//无效次数显示计时
  6143. }
  6144. }
  6145. /*PCA锁时闪烁显示*/
  6146. if( TaskSchedulerFlag.pcaLockTimeFlag == TASK_FLAG_SET )
  6147. {
  6148. if( TaskSchedulerTimer.pcaLockTimeDispTimer != 0 )
  6149. {
  6150. TaskSchedulerTimer.pcaLockTimeDispTimer--;
  6151. if( TaskSchedulerTimer.pcaLockTimeDispTimer % 500 == 0 )
  6152. {
  6153. if(TaskSchedulerFlag.PCATimerFlashFlag == TASK_FLAG_CLEAR)
  6154. {
  6155. TaskSchedulerFlag.PCATimerFlashFlag = TASK_FLAG_SET;
  6156. TaskSchedulerFlag.PCATimerFlashFlag1 = TASK_FLAG_SET;
  6157. }
  6158. else if(TaskSchedulerFlag.PCATimerFlashFlag == TASK_FLAG_WAIT)
  6159. {
  6160. TaskSchedulerFlag.PCATimerFlashFlag = TASK_FLAG_WSET;
  6161. TaskSchedulerFlag.PCATimerFlashFlag1 = TASK_FLAG_SET;
  6162. }
  6163. /*界面刷新时间更新,PCA锁时闪烁处理*/
  6164. // if( (realTimeData.stateRun == PCARun)||(realTimeData.superaddition != 0) )
  6165. // {
  6166. // emDisplayPicture = RunPCADisp;
  6167. // }
  6168. // else if(realTimeData.stateRun == MainRun)
  6169. // {
  6170. // emDisplayPicture = RunMainDisp;
  6171. // }
  6172. /*if( emCurrentPicture == RunMainDisp )
  6173. {
  6174. emDisplayPicture = RunMainDisp;
  6175. }
  6176. else if( emCurrentPicture == RunPCADisp )
  6177. {
  6178. emDisplayPicture = RunPCADisp;
  6179. }*/
  6180. }
  6181. }
  6182. else
  6183. {
  6184. TaskSchedulerFlag.pcaLockTimeFlag = TASK_FLAG_CLEAR;//无效显示清除
  6185. TaskSchedulerFlag.PCATimerFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除
  6186. TaskSchedulerTimer.pcaLockTimeDispTimer = FIVE_SECOND_TIMER;//无效次数显示计时
  6187. }
  6188. }
  6189. if( TaskSchedulerFlag.lockDispFlag == TASK_FLAG_CLEAR )
  6190. {
  6191. if( TaskSchedulerTimer.lockDispTimer != 0 )
  6192. {
  6193. TaskSchedulerTimer.lockDispTimer--;
  6194. }
  6195. else
  6196. {
  6197. TaskSchedulerFlag.lockDispFlag = TASK_FLAG_SET;
  6198. TaskSchedulerTimer.lockDispTimer = DISP_TIME_LOCK_JUMP;
  6199. TaskSchedulerFlag.LcdLogoFlag = TASK_FLAG_SET;
  6200. /*if( (realTimeData.stateRun == PCARun)||(realTimeData.superaddition != 0) )
  6201. {
  6202. emDisplayPicture = RunPCADisp;
  6203. }
  6204. else
  6205. {
  6206. emDisplayPicture = RunMainDisp;
  6207. }*/
  6208. }
  6209. }
  6210. if( realTimeData.stateRun != Pause )//用来做进度条显示控制
  6211. {
  6212. if( TaskSchedulerTimer.universalTimer != 0 )
  6213. {
  6214. TaskSchedulerTimer.universalTimer--;
  6215. }
  6216. else
  6217. {
  6218. TaskSchedulerFlag.rtdUpdateFlag = TASK_FLAG_SET;
  6219. /*if( emCurrentPicture == RunMainDisp )
  6220. {
  6221. emDisplayPicture = RunMainDisp;
  6222. }
  6223. else if( emCurrentPicture == RunPCADisp )
  6224. {
  6225. emDisplayPicture = RunPCADisp;
  6226. }*/
  6227. // if(realTimeData.stateRun == MainRun)
  6228. // {
  6229. // emDisplayPicture = RunMainDisp;
  6230. // }
  6231. // else if( (realTimeData.stateRun == PCARun)||(realTimeData.superaddition != 0) )
  6232. // {
  6233. // emDisplayPicture = RunPCADisp;
  6234. // }
  6235. TaskSchedulerTimer.universalTimer = ONE_SECOND_TIMER;
  6236. }
  6237. }
  6238. break;
  6239. /*case EnterRunPressure:
  6240. if( TaskSchedulerTimer.dispAutoJumpTimer != 0 )
  6241. {
  6242. TaskSchedulerTimer.dispAutoJumpTimer--;
  6243. if( TaskSchedulerTimer.dispAutoJumpTimer % 500 == 0 )//显示时每500ms更新一次数据
  6244. {
  6245. emDisplayPicture = RunPressureDisp;
  6246. }
  6247. }
  6248. else
  6249. {
  6250. emSysWorkStep = EnterRunMain;
  6251. if( realTimeData.stateRun == PCARun )
  6252. {
  6253. emDisplayPicture = RunPCADisp;
  6254. }
  6255. else
  6256. {
  6257. emDisplayPicture = RunMainDisp;
  6258. }
  6259. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  6260. TaskSchedulerTimer.dispAutoJumpTimer = DISP_TIME_AUTO_JUMP;//因为只跳转一次,所以赋通用时间值
  6261. }
  6262. break;*/
  6263. case EnterLockPassword:
  6264. if( TaskSchedulerTimer.lockPassWordTimer != 0 )
  6265. {
  6266. TaskSchedulerTimer.lockPassWordTimer--;
  6267. }
  6268. else
  6269. {
  6270. modifyStep = 1;
  6271. emSysWorkStep = emLockPasswordFailStep;
  6272. emDisplayPicture = emLockPassowrdFailPicture;
  6273. emPictureRunState = FirstEnter;//判断页面是否是第一次被执行,更新数据用
  6274. TaskSchedulerTimer.lockPassWordTimer = THREE_MINUTE_TIMER;
  6275. TaskSchedulerFlag.unlockPasswordFlag = TASK_FLAG_CLEAR;//解锁不成功
  6276. TaskSchedulerFlag.PasswordTimeOverFlag = TASK_FLAG_SET;
  6277. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//密码界面未操作返回报警界面时报警声音打开
  6278. }
  6279. break;
  6280. case EnterEvaluateVerify:
  6281. if(emEvaluateTransfuseChoose == Uploading)
  6282. {
  6283. if(TaskSchedulerTimer.PainAssessmentUploadTimer != 0)
  6284. {
  6285. TaskSchedulerTimer.PainAssessmentUploadTimer --;
  6286. }
  6287. else
  6288. {
  6289. emEvaluateTransfuseChoose = UploadFinshed;
  6290. emDisplayPicture = EvaluateUploadEnterDisp;
  6291. TaskSchedulerTimer.PainAssessmentUploadTimer = ONE_SECOND_TIMER;//疼痛评价确认上传时间,假时间
  6292. }
  6293. }
  6294. break;
  6295. // case EnterJamFault:
  6296. // case EnterMaxFault:
  6297. // case EnterBubbleFault:
  6298. // case EnterNonePillCaseFault:
  6299. // case EnterLineLost:
  6300. // case EnterBatteryVoltLow:
  6301. // case EnterMechanicalFault:
  6302. // case EnterTransfuseOver:
  6303. // case EnterInputTotal:
  6304. // /*if( TaskSchedulerTimer.alarmLCDFlashTimer != 0 )
  6305. // {
  6306. // TaskSchedulerTimer.alarmLCDFlashTimer--;
  6307. // if( TaskSchedulerTimer.alarmLCDFlashTimer % 3300 == 0 )
  6308. // {
  6309. // TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  6310. // }
  6311. // }
  6312. // else
  6313. // {
  6314. // TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除
  6315. // }*/
  6316. //
  6317. // if( TaskSchedulerTimer.alarmLCDFlashTimer != 0 )
  6318. // {
  6319. // TaskSchedulerTimer.alarmLCDFlashTimer--;
  6320. // if( TaskSchedulerTimer.alarmLCDFlashTimer >= TWO_SECOND_TIMER )
  6321. // {
  6322. // LcdFlicker_Flag = TASK_FLAG_SET;
  6323. // }
  6324. // else if( TaskSchedulerTimer.alarmLCDFlashTimer < TWO_SECOND_TIMER )
  6325. // {
  6326. // LcdFlicker_Flag = TASK_FLAG_CLEAR;
  6327. // }
  6328. // }
  6329. // else
  6330. // {
  6331. // TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//闪烁标志清除
  6332. // }
  6333. // break;
  6334. default:break;
  6335. }
  6336. if((emSysWorkStep == EnterJamFault) || (emSysWorkStep == EnterMaxFault) || (emSysWorkStep == EnterBubbleFault)
  6337. || (emSysWorkStep == EnterNonePillCaseFault) || (emSysWorkStep == EnterLineLost) || (emSysWorkStep == EnterBatteryVoltLow)
  6338. || (emSysWorkStep == EnterMechanicalFault) || (emSysWorkStep == EnterTransfuseOver) || (emSysWorkStep == EnterInputTotal) )
  6339. {
  6340. if( TaskSchedulerTimer.alarmLCDFlashTimer != 0 )
  6341. {
  6342. TaskSchedulerTimer.alarmLCDFlashTimer--;
  6343. if( TaskSchedulerTimer.alarmLCDFlashTimer >= TWO_SECOND_TIMER )
  6344. {
  6345. LcdFlicker_Flag = TASK_FLAG_SET;
  6346. if(LCDBlackFlashCount < 3)
  6347. {
  6348. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;
  6349. }
  6350. }
  6351. else if( TaskSchedulerTimer.alarmLCDFlashTimer < TWO_SECOND_TIMER )
  6352. {
  6353. LcdFlicker_Flag = TASK_FLAG_CLEAR;
  6354. if(LCDBlackFlashCount < 3)
  6355. {
  6356. TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_CLEAR;
  6357. }
  6358. }
  6359. }
  6360. else
  6361. {
  6362. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//闪烁标志清除
  6363. LCDBlackFlashCount ++;
  6364. if(LCDBlackFlashCount >= 3)
  6365. {
  6366. LCDBlackFlashCount = 3;
  6367. }
  6368. }
  6369. if(TaskSchedulerFlag.JamSelfcheckingFlag == TASK_FLAG_SET)
  6370. {
  6371. if(TaskSchedulerTimer.JamSelfcheckingTimer != 0)
  6372. {
  6373. TaskSchedulerTimer.JamSelfcheckingTimer--;
  6374. }
  6375. else
  6376. {
  6377. TaskSchedulerTimer.JamSelfcheckingTimer = FIVE_MINUTE_TIMER;
  6378. TaskSchedulerFlag.JamSelfcheckingFlag = TASK_FLAG_CLEAR;
  6379. }
  6380. }
  6381. }
  6382. else
  6383. {
  6384. LCDBlackFlashCount = 0;
  6385. }
  6386. /*PCA锁时不约束于任何暂停报警界面,都将进行计时*/
  6387. if( TaskSchedulerFlag.pcaLockFlag == TASK_FLAG_SET )
  6388. {
  6389. if( TaskSchedulerTimer.pcaLockTimer != 0 )
  6390. {
  6391. TaskSchedulerTimer.pcaLockTimer--;
  6392. if( TaskSchedulerTimer.pcaLockTimer % 60000 == 0 )
  6393. {
  6394. realTimeData.lockTime--;//每60s锁时减1
  6395. TaskSchedulerFlag.PCATimerFlashFlag1 = TASK_FLAG_SET;
  6396. }
  6397. }
  6398. else
  6399. {
  6400. realTimeData.lockTime = 0;
  6401. TaskSchedulerFlag.pcaLockFlag = TASK_FLAG_CLEAR;//清除PCA锁时
  6402. TaskSchedulerTimer.pcaLockTimer = runParamInfo.lockTime * 60000;
  6403. TaskSchedulerFlag.lcdFlashFlag = TASK_FLAG_CLEAR;//闪烁标志清除,防止PCA锁时为0的情况下,进入PCA有效次数不显示
  6404. }
  6405. }
  6406. }
  6407. /*************************************************************************************
  6408. * Function: RealTimeStateUpdate
  6409. * Object: 实时数据及状态更新
  6410. * 输入: 无
  6411. * 输出: 无
  6412. * 备注: 在电机工作时根据当前工作状态(此变量motorWorkState)更新输注值
  6413. **************************************************************************************/
  6414. void RealTimeStateUpdate( void )
  6415. {
  6416. uint8_t InputTotalDoseBuff[4];
  6417. if( motorWorkState == MOTOR_WORK_ON )//电机工作
  6418. {
  6419. if( ( realTimeData.stateRun == FirstRun ) || ( realTimeData.stateRun == MainRun ) || ( realTimeData.stateRun == Airout ) || ( realTimeData.stateRun == PCARun ) )
  6420. {
  6421. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_WAIT;//检测电机动作是否超时
  6422. TaskSchedulerFlag.sysStandbyFlag = TASK_FLAG_CLEAR;//关闭待机模式
  6423. realTimeData.ctlSlaveRun = StartWork;
  6424. }
  6425. TaskSchedulerFlag.sensorPWHallFlag = TASK_FLAG_SET;//传感器电源-霍尔打开
  6426. if( ( emSysWorkStep == EnterRunFirstDose ) || ( emSysWorkStep == EnterRunMain ) )
  6427. {
  6428. TaskSchedulerFlag.sensorPWPressureFlag = TASK_FLAG_SET;//传感器电源-压力打开
  6429. }
  6430. if(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_13 ) != 0) //判断电机是否运行,避免重复赋值
  6431. {
  6432. if( sysAlarmFlag.VoltLowest != ALARM_PREPARE )//当预报警时,指示灯亮黄色
  6433. {
  6434. G_LED_ON;//电机运行,点亮绿地
  6435. }
  6436. G_Led_Time=TWO_MSEC_TIMER;//自检LED点亮500ms
  6437. BubbleCheckTime = TWO_MSEC_TIMER;//电机开始运行,给气泡检测传感器重新赋值
  6438. BubbleCountFlag=TASK_FLAG_CLEAR;//在电机运行时,清除该标志进行气泡采集
  6439. ElectricityCheckTime = SEVEN_MSECOND_TIMER; // 电机开始运行,给电流检测传感器重新赋值
  6440. ElectCountFlag=TASK_FLAG_CLEAR;//在电机运行时,清除该标志进行电流采集
  6441. ElectricityOffTime = ONE_SECOND_TIMER; //1s检测一下
  6442. ElectricityOFFflag=0;//定时到,置位该标志
  6443. }
  6444. CntlMotorWork( 10 );
  6445. }
  6446. else
  6447. {
  6448. if( ( realTimeData.stateRun == FirstRun ) || ( realTimeData.stateRun == MainRun ) || ( realTimeData.stateRun == Airout ) || ( realTimeData.stateRun == PCARun ) )
  6449. {
  6450. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_SET;//电机停止工作时清除电机等待标志,等待下次启动
  6451. TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
  6452. TaskSchedulerFlag.sysStandbyFlag = TASK_FLAG_SET;//开启待机模式
  6453. }
  6454. CntlMotorWork(0);
  6455. TaskSchedulerFlag.sensorPWHallFlag = TASK_FLAG_CLEAR;//传感器电源-霍尔关闭
  6456. TaskSchedulerFlag.sensorPWPressureFlag = TASK_FLAG_CLEAR;//传感器电源-压力关闭
  6457. }
  6458. if( TaskSchedulerFlag.ipnutFlag == TASK_FLAG_SET )//输注完一次参数变化一次
  6459. {
  6460. switch( realTimeData.stateRun )
  6461. {
  6462. case FirstRun:
  6463. if(TaskSchedulerFlag.JamSelfcheckingFlag == TASK_FLAG_WAIT)//其他量堵塞时,自恢复过程中不计入已输入量
  6464. {
  6465. realTimeData.inputDose += 1;//实时数据的已输入量增加1ml
  6466. inputDose_bf=realTimeData.inputDose;
  6467. realTimeData.InputTotalDose += 1;//实时数据的已输入总量增加1ml
  6468. if( (realTimeData.inputDose % 10) == 0)
  6469. {
  6470. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  6471. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  6472. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  6473. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  6474. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  6475. if( historyRefreshFlag == 0 )
  6476. {
  6477. // historyRecordQTY++;
  6478. HistoryQtyAdd();
  6479. WriteHistoryRecordQTY();
  6480. historyRefreshFlag = 1;
  6481. }
  6482. WriteHistoryRecord();
  6483. }
  6484. realTimeData.firstDose -= 1;//实时数据的首次量每运行一次增加1ml
  6485. realTimeData.surplusDose -= 1;//剩余量减1ml
  6486. TaskSchedulerFlag.ipnutFlag = TASK_FLAG_CLEAR;
  6487. emDisplayPicture = RunFirstDoseDisp;
  6488. }
  6489. break;
  6490. case MainRun:
  6491. case PCARun:
  6492. if(TaskSchedulerFlag.JamSelfcheckingFlag == TASK_FLAG_WAIT)//其他量堵塞时,自恢复过程中不计入已输入量
  6493. {
  6494. if( TaskSchedulerFlag.SuperadditionFlag == TASK_FLAG_SET )
  6495. {
  6496. realTimeData.superaddition -= 1;
  6497. }
  6498. realTimeData.inputDose += 1;//实时数据的已输入量增加1ml
  6499. inputDose_bf=realTimeData.inputDose;
  6500. realTimeData.InputTotalDose += 1;//实时数据的已输入总量增加1ml
  6501. if( (realTimeData.inputDose % 10) == 0)
  6502. {
  6503. InputTotalDoseBuff[0]=(uint8_t)((realTimeData.InputTotalDose>>24)&0x00ff); //输入量变化,向FM31256里写入新的数据
  6504. InputTotalDoseBuff[1]=(uint8_t)((realTimeData.InputTotalDose>>16)&0x00ff); //输入量变化,向FM31256里写入新的数据
  6505. InputTotalDoseBuff[2]=(uint8_t)((realTimeData.InputTotalDose>>8)&0x00ff); //输入量变化,向FM31256里写入新的数据
  6506. InputTotalDoseBuff[3]=(uint8_t)(realTimeData.InputTotalDose&0x00ff);
  6507. FlashWriteOperate( InputTotalDoseBuff,4,HISTORY31256_DATA_InputTotalDose );
  6508. if( historyRefreshFlag == 0 )
  6509. {
  6510. // historyRecordQTY++;
  6511. HistoryQtyAdd();
  6512. WriteHistoryRecordQTY();
  6513. historyRefreshFlag = 1;
  6514. }
  6515. WriteHistoryRecord();
  6516. }
  6517. realTimeData.surplusDose -= 1;//剩余量减
  6518. realTimeData.inputLimitDose += 1;//极限量值累加
  6519. TaskSchedulerFlag.ipnutFlag = TASK_FLAG_CLEAR;
  6520. if( emCurrentPicture == RunMainDisp )
  6521. {
  6522. emDisplayPicture = RunMainDisp;
  6523. }
  6524. else if( emCurrentPicture == RunPCADisp )
  6525. {
  6526. emDisplayPicture = RunPCADisp;
  6527. }
  6528. // if(realTimeData.stateRun == MainRun)
  6529. // {
  6530. // emDisplayPicture = RunMainDisp;
  6531. // }
  6532. // else if( realTimeData.stateRun == PCARun )
  6533. // {
  6534. // emDisplayPicture = RunPCADisp;
  6535. // }
  6536. }
  6537. break;
  6538. case Pause:
  6539. if(ran == 1)
  6540. {
  6541. if(realTimeData.firstDose != 0)
  6542. {
  6543. realTimeData.firstDose -= 1;
  6544. realTimeData.inputDose += 1;//实时数据的已输入量增加1ml
  6545. inputDose_bf=realTimeData.inputDose;
  6546. realTimeData.InputTotalDose += 1;//实时数据的已输入总量增加1ml
  6547. // emPictureRunState = FirstEnter ;
  6548. DrawRunFirstDosePicture();
  6549. }
  6550. else
  6551. {
  6552. realTimeData.inputDose += 1;//实时数据的已输入量增加1ml
  6553. inputDose_bf=realTimeData.inputDose;
  6554. realTimeData.InputTotalDose += 1;//实时数据的已输入总量增加1ml
  6555. // emPictureRunState = FirstEnter ;
  6556. DrawRunMainPicture();
  6557. }
  6558. TaskSchedulerFlag.ipnutFlag = TASK_FLAG_CLEAR;
  6559. }
  6560. break;
  6561. case Airout:
  6562. realTimeData.airoutValue++;//排气量就是电机转动次数
  6563. TaskSchedulerFlag.ipnutFlag = TASK_FLAG_CLEAR;
  6564. if(realTimeData.airoutValue == 20)
  6565. {
  6566. emDisplayPicture = SetParamDisp;
  6567. }
  6568. else
  6569. {
  6570. emDisplayPicture = AiroutDisp;
  6571. }
  6572. break;
  6573. default:
  6574. TaskSchedulerFlag.ipnutFlag = TASK_FLAG_CLEAR;
  6575. break;
  6576. }
  6577. }
  6578. }