123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111 |
- // CCOS.Dev.GEN.DEMO.cpp : 定义 DLL 应用程序的导出函数。
- //
- #include "stdafx.h"
- #include <assert.h>
- #include <functional>
- using namespace std::placeholders;
- //#include "ResDataObject.h"
- #include "CCOS.Dev.Generator.Salmon.h"
- #include "logger.temp.h"
- #include "Helper.JSON.hpp"
- //#include <SimpleLog.hpp>
- //extern SimpleLog* g_SLogger;
- using namespace CCOS::Dev::Detail::Generator;
- namespace nsGEN = CCOS::Dev::Detail::Generator;
- #pragma warning (disable:4244) // warning C4244: “初始化”: 从“double”转换到“float”,可能丢失数据
- #pragma warning (disable:4305) // warning C4305: “参数”: 从“double”到“float”截断
- #pragma warning (disable:4267) // warning C4267 : “初始化”: 从“size_t”转换到“int”,可能丢失数据
- static const int msTimeOut_Lock = 500;
- const char* EXPOSUREEVENT = "Global\\ExpoureEvent";
- #ifdef WIN_64BIT
- #ifdef _DEBUG
- #pragma comment (lib,"lib_64\\libaxnclientif.lib")
- #else
- #pragma comment (lib,"lib_64\\libaxnclientif.lib")
- #endif
- #else
- #ifdef _DEBUG
- #pragma comment (lib,"lib_32\\libaxnclientif.lib")
- #else
- #pragma comment (lib,"lib_32\\libaxnclientif.lib")
- #endif
- #endif
- //-----------------------------------------------------------------------------
- // SMZDevice
- //-----------------------------------------------------------------------------
- nsGEN::SMZDevice::SMZDevice (std::shared_ptr <IOEventCenter> center,string ConfigPath)
- : super (center)
- , m_bExited(false)
- , m_bReGetTurnOn(false)
- , m_nLastErrorCount(0)
- , m_nGenSTMode(-1)
- , m_bGenService(false)
- , m_bExposureStatus(false)
- , m_nDAPUnit(0)
- , m_bSelectORG(false)
- , m_nSelectOGPWaitingTime(50)
- , m_nAPRCommandSynFlag(0)
- , m_nTUICOMMANDSENDWAITTIME(200)
- , m_bInExam(false)
- , m_nFDCLostConnectNumber(0)
- , m_nLostConnectNumber(0)
- , m_nSettingWS(0)
- , m_bCalibMode(false)
- , m_bSetAPR(false)
- , m_bGetIGENANZ(false)
- , m_bSetEnable(false)
- , m_nExposureIndex(0)
- , m_nBackup_Restre_Identifier(17)
- , m_tmDetectorStart(0)
- , m_nXwindowTime(100)
- , m_hEventExposure(NULL)
- , m_bAlreadyExposure(false)
- , m_nIdfrstatus(0)
- {
- assert (EventCenter);
- //CreateLogger("Salmon");
- m_strConfigPath = ConfigPath;
- m_DoseUnit.m_KV.reset(new KVMould(0.0, 40.0, 150.0, 1.0));
- m_DoseUnit.m_MA.reset(new MAMould(0.0, 8.0, 1000.0, 0.1));
- m_DoseUnit.m_MS.reset(new MSMould(0.0, 1.0, 10000.0, 0.01));
- m_DoseUnit.m_MAS.reset(new MASMould(0.0, 0.0, 1000.0, 0.01));
- m_DoseUnit.m_Techmode.reset(new TECHMODEMould(1, 0, 2, 1));
- m_DoseUnit.m_WS.reset(new WORKSTATIONMould(1, 0, 5, 1));
- m_DoseUnit.m_Focus.reset(new FOCUSMould(1, 0, 1, 1));
- m_DoseUnit.m_AECField.reset(new AECFIELDMould(0, 0, 111, 1));
- m_DoseUnit.m_AECFilm.reset(new AECFILMMould(0, 0, 2, 1));
- m_DoseUnit.m_AECDensity.reset(new AECDENSITYMould(0, -4, 4, 1));
- m_DoseUnit.m_HE.reset(new TUBEHEATMould(0, 0, 100, 1));
- m_DoseUnit.m_PostKV.reset(new POSTKVMould(0.0, 0.0, 150.0, 1.0));
- m_DoseUnit.m_PostMA.reset(new POSTMAMould(0.0, 0.0, 1000.0, 0.1));
- m_DoseUnit.m_PostMS.reset(new POSTMSMould(0.0, 0.0, 10000.0, 0.01));
- m_DoseUnit.m_PostMAS.reset(new POSTMASMould(0.0, 0.0, 1000.0, 0.01));
- m_DoseUnit.m_GenSynState.reset(new GENSYNSTATEMould(0, AttrKey::GENERATOR_SYNC_ERR, AttrKey::GENERATOR_RAD_XRAYOFF, 1));
- m_DoseUnit.m_GenState.reset(new GENSTATEMould(0, AttrKey::GENERATOR_STATUS_SHUTDOWN, AttrKey::GENERATOR_STATUS_MAX, 1));
- m_DoseUnit.m_GenTotalExpNumber.reset(new TOTALEXPNUMMould(0, 0, 9999, 1));
- m_DoseUnit.m_GenTotalAcqTimes.reset(new TOTALACQTIMESMould(0, 0, 9999, 1));
- m_DoseUnit.m_GenTubeCoolWaitTimes.reset(new TUBECOOLTIMEMould(0, 0, 9999, 1));
- m_DoseUnit.m_GenTubeOverLoadNumber.reset(new TUBEOVERLOADNUMMould(0, 0, 9999, 1));
- m_DoseUnit.m_GenCurrentExpNumber.reset(new CUREXPNUMMould(0, 0, 99999999, 1));
- m_DoseUnit.m_BatteryChargeState.reset(new BATTERYCHARGSTATEMould(-1,0,5,1));
- m_DoseUnit.m_ReferenceAirKerma.reset(new REFERENCEAIRKERMAMould(0.0,0.0,999999.0,0.01));
- m_DoseUnit.m_KVList.reset(new KVLISTMould(""));
- m_DoseUnit.m_mAsList.reset(new MASLISTMould(""));
- m_UIClientUnit.m_ERA.reset(new DevUIClient::ERAMould(-1,0,9999999,1));
- m_UIClientUnit.m_RSI.reset(new DevUIClient::RSIMould(-1, 0, 30000, 1));
- m_UIClientUnit.m_RMV.reset(new DevUIClient::RMVMould(-1, 0, 10, 1));
- m_UIClientUnit.m_CFM.reset(new DevUIClient::CFMMould(-1, 0, 10, 1));
- m_UIClientUnit.m_BRM.reset(new DevUIClient::BRMMould(-1, 0, 10, 1));
- m_UIClientUnit.m_PLS.reset(new DevUIClient::PLSMould(-1, 0, 2, 1));
- m_UIClientUnit.m_UDO.reset(new DevUIClient::UDOMould(-1, 0, 2, 1));
- m_UIClientUnit.m_SHS.reset(new DevUIClient::SHSMould(-1, 0, 2, 1));
- m_UIClientUnit.m_STM.reset(new DevUIClient::STMMould(-1, 0, 2, 1));
- m_UIClientUnit.m_SDF.reset(new DevUIClient::SDFMould(-1, 0, 10, 1));
- m_UIClientUnit.m_SOP.reset(new DevUIClient::SOPMould(""));
- m_UIClientUnit.m_SCREENLOCK.reset(new DevUIClient::SCREENLOCKMould(-1, 0, 5, 1));
- m_UIClientUnit.m_SDN.reset(new DevUIClient::SDNMould(""));
- m_UIClientUnit.m_AutoConfig.reset(new DevUIClient::AUTOCONFIGMould(-1, 0, 5, 1));
- m_UIClientUnit.m_WS2FD.reset(new DevUIClient::WS2FDMould(-1, 0, 10, 1));
- m_UIClientUnit.m_AuditMessage.reset(new DevUIClient::AUDITMSGMould(""));
- m_CollimatorUnit.m_XSize.reset(new DevCollimator::XSIZEMould(0, 0, 4300, 1));
- m_CollimatorUnit.m_YSize.reset(new DevCollimator::YSIZEMould(0, 0, 4300, 1));
- m_CollimatorUnit.m_Filter.reset(new DevCollimator::FILTERMould(0, 0, 10, 1));
- m_CollimatorUnit.m_SID.reset(new DevCollimator::SIDMould(0, 0, 18000, 1));
- m_CollimatorUnit.m_Angle.reset(new DevCollimator::ANGLEMould(0, 0, 360.0, 0.1));
- m_CollimatorUnit.m_Mode.reset(new DevCollimator::MODEMould(0, 0, 6, 1));
- m_CollimatorUnit.m_Light.reset(new DevCollimator::LIGHTMould(0, 0, 1, 1));
-
- m_MSGUnit.reset(new nsDetail::MSGUnit(center, GeneratorUnitType));
- m_DAP.reset(new DevDAP::DOSEMould(0, 0, 999999.0, 0.01));
- m_FPDGUnit.reset(new DevFPDClient::CFPDCommunicateWithOtherDevice());
- m_FPDGUnit->SetEventCenter(center);
- m_pAxnClient = NULL;
- m_pFDCAxnClient = NULL;
- m_hXCUDataEvent = NULL;
- m_hFDCDataEvent = NULL;
- m_hGenPostEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- m_hGenPostDAPEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- m_hFDCDataEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- m_hXCUDataEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- m_hGenSelectOGPEvent = CreateEvent(NULL, false, false, NULL);
- m_hDUMMYEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- m_hWaitForDapEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- m_hEventExposure = CreateEvent(NULL, FALSE, FALSE, EXPOSUREEVENT);
- m_hXCUDataThread = NULL;
- m_hXCUDataRevThread = NULL;
- m_hFDCDataDealThread = NULL;
- m_hFDCDataRevThread = NULL;
- m_hOGPWorkThread = NULL;
- m_hWaitForDummyThread = NULL;
- m_pBuffer = new axn_byte[MAX_LEN_ACS_OBJ];
- m_pFDCBuffer = new axn_byte[MAX_LEN_ACS_OBJ];
- InitializeCriticalSection(&m_csXCUData);
- InitializeCriticalSection(&m_csFDCData);
- InitializeCriticalSection(&m_csStatus);
- g_KV_List = { 400, 405, 410, 415, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 535, 550, 560, 570, 585, 600, 615, 630, 645, 660, 680, 700, 715, 730, 750, 770, 790, 810, 830, 850, 875, 900, 930, 960, 1000, 1020, 1050, 1090, 1130, 1170, 1210, 1250, 1290, 1330, 1370, 1410, 1450, 1500 };//<!--KV * 10-->
- g_MAS_List = { 500, 560, 630, 710, 800, 900, 1000, 1100, 1250, 1400, 1600, 1800, 2000, 2200, 2500, 2800, 3200, 3600, 4000, 4500, 5000, 5600, 6300, 7100, 8000, 9000, 10000, 11000, 12500, 14000, 16000, 18000, 20000, 22000, 25000, 28000, 32000,
- 36000, 40000, 45000, 50000, 56000, 63000, 71000, 80000, 90000, 100000, 110000, 125000, 140000, 160000, 180000, 200000, 220000, 250000, 280000, 320000, 360000, 400000, 450000, 500000, 560000, 630000, 710000, 800000, 900000, 1000000 }; // <MAS * 1000-->
- g_MS_List = { 20000, 22000, 25000, 28000, 32000, 36000, 40000, 45000, 50000, 56000, 63000, 71000, 80000, 90000, 100000, 110000, 125000, 140000, 160000, 180000, 200000, 220000, 250000, 280000, 320000, 360000, 400000, 450000,
- 500000, 560000, 630000, 710000, 800000, 900000, 1000000, 1100000, 1250000, 1400000, 1600000, 1800000, 2000000, 2200000, 2500000, 2800000, 3200000, 3600000, 4000000, 4500000, 5000000 };//<!--ms * 1000-->
- g_AECDensity_List = { -20, -15, -10, -5, 0, 5, 10, 15, 20 };// <!--density * 10-->
- g_AECDOSE_List = { 89, 125, 179, 250, 357, 500, 714 }; //<!--AECDose * 100-->
- g_AECFILM_List = { 200, 400, 800 }; //<!--AECFILM-->
- g_FILTER_List = { 0, 1, 2, 3 }; //FILTER * 10
- AprParamBackup.nWS = WS_TABLE;
- AprParamBackup.nFocus = FOCUS_LARGE;
- AprParamBackup.nTechmode = TECHMODE_NOAEC_3P;
- AprParamBackup.nAECField = FIELD_CENTER;
- AprParamBackup.nAECFilm = GEN_AECFILM_U;
- AprParamBackup.nAECDensity = 0;
- AprParamBackup.fKV = 70.0f;
- AprParamBackup.fMA = 10.0f;
- AprParamBackup.fMS = 100.0f;
- AprParamBackup.fMAS = 1.0f;
- m_bAutoHandSwitch = false;
- m_wHeaderLength = 2 * sizeof(ACS_WORD) + 4 * sizeof(ACS_BYTE);
- Register ();
- ResDataObject temp;
- temp.loadFile(m_strConfigPath.c_str());
- m_GenConfig = temp["CONFIGURATION"];
- TransJsonText(m_GenConfig);
- }
- nsGEN::SMZDevice::~SMZDevice ()
- {
- m_bExited = true;
- if (m_hGenSelectOGPEvent != NULL)
- {
- CloseHandle(m_hGenSelectOGPEvent);
- m_hGenSelectOGPEvent = NULL;
- }
- if (m_hXCUDataEvent != NULL)
- {
- CloseHandle(m_hXCUDataEvent);
- m_hXCUDataEvent = NULL;
- }
- if (m_hFDCDataEvent != NULL)
- {
- CloseHandle(m_hFDCDataEvent);
- m_hFDCDataEvent = NULL;
- }
- if (m_hDUMMYEvent != NULL)
- {
- CloseHandle(m_hDUMMYEvent);
- m_hDUMMYEvent = NULL;
- }
- if (m_pFDCBuffer != NULL)
- {
- delete[] m_pFDCBuffer;
- m_pFDCBuffer = NULL;
- }
- if (m_pBuffer != NULL)
- {
- delete[] m_pBuffer;
- m_pBuffer = NULL;
- }
- m_hXCUDataThread = NULL;
- m_hFDCDataDealThread = NULL;
- m_hFDCDataRevThread = NULL;
- m_hOGPWorkThread = NULL;
- m_hWaitForDummyThread = NULL;
- m_hWaitForDapThread = NULL;
- //ReleaseLogger();
- CloseHandle(m_hGenPostEvent);
- CloseHandle(m_hGenPostDAPEvent);
- CloseHandle(m_hWaitForDapEvent);
- }
- std::string nsGEN::SMZDevice::GetGUID() const
- {
- printf("\n===============GetGUID : %s ===================\n", GeneratorUnitType);
- return GeneratorUnitType;
- }
- void nsGEN::SMZDevice::Register()
- {
- auto Disp = &Dispatch;
- superGen::Register (Disp);
- superGen::RegisterRAD (Disp);
- superGen::RegisterAEC (Disp);
- superGen::RegisterExpEnable (Disp);
- superGen::RegisterGeneratortoSyncStatus(Disp);
- superUIClient::Register(Disp);
- superCollimatorClient::Register(Disp);
- Disp->Get.Push(m_MSGUnit->GetKey().c_str(), [this](std::string& out) { out = m_MSGUnit->JSGet(); return RET_STATUS::RET_SUCCEED; });
- auto fun_Clear_DAP = [this](auto a, auto&)
- {
- return Clear_DAP();
- };
- Disp->Action.Push ("Clear_DAP", fun_Clear_DAP);
- auto fun_GetValue_DAP = [this](auto a, auto& b)
- {
- float value = 0;
- RET_STATUS ret = GetValue_DAP(value);
- b = ToJSON(value);
- return ret;
- };
- Disp->Action.Push("GetValue_DAP", fun_GetValue_DAP);
- Disp->Get.Push("DAP", [this](std::string& out) { out = m_DAP->JSGet(); return RET_STATUS::RET_SUCCEED; });
-
- Disp->Get.Push("GetAPRms", m_FPDGUnit.get(), &DevFPDClient::CFPDCommunicateWithOtherDevice::JSGetAPRms);
- Disp->Get.Push("XrayStatus", m_FPDGUnit.get(), &DevFPDClient::CFPDCommunicateWithOtherDevice::JSXrayStatus);
- Disp->Action.Push("SetLTEthreshold", m_FPDGUnit.get(), &DevFPDClient::CFPDCommunicateWithOtherDevice::JSSetLTEthreshold);
- Disp->Action.Push("SetFPDCalibrationStatus", this, &nsGEN::SMZDevice::JSSetFPDCalibrationStatus);
- Disp->Action.Push("SetPanelSN", this, &nsGEN::SMZDevice::JSSetPanelSN);
- Disp->Action.Push("SendFPDError", this, &nsGEN::SMZDevice::JSSendFPDError);
- Disp->Action.Push("ClearFPDError", this, &nsGEN::SMZDevice::JSClearFPDError);
- Disp->Action.Push("SendFPDWarn", this, &nsGEN::SMZDevice::JSSendFPDWarn);
- Disp->Action.Push("FPDSTATUS", this, &nsGEN::SMZDevice::JSSendFPDStatus);
- Disp->Action.Push("FPDXWINDOWOPEN", this, &nsGEN::SMZDevice::JSFPDXWindowOpen);
- }
- bool nsGEN::SMZDevice::Prepare()
- {
- SerialPortOpen();
- m_hEventExitExposureThread = CreateEvent(NULL, FALSE, FALSE, NULL);
- m_hExposureEventArray[0] = m_hEventExitExposureThread;
- m_hExposureEventArray[1] = m_hEventExposure;
- m_hExposureThread = CreateThread(0, 0, ExposureThread, this, 0, &m_ExposureThreadID);
- if (m_hExposureThread == NULL)
- {
- PRINTA_DEBUG("Start Exposure Thread Failed!\n");
- }
- else
- {
- PRINTA_DEBUG("Start Exposure Thread End\n");
- }
- return true;
- }
- DWORD WINAPI SMZDevice::ExposureThread(LPVOID pParam)
- {
- SMZDevice* pCurMoniOpr = (SMZDevice*)pParam;
- BOOL bExit = false;
- DWORD dwResult;
- PRINTA_DEBUG("ExposureThread Start!!!!\n");
- DWORD curThreadPri = GetThreadPriority(GetCurrentThread());
- if (curThreadPri != THREAD_PRIORITY_TIME_CRITICAL)
- {
- if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL))
- {
- PRINTA_DEBUG("Failed to enter timecritical priority.lasterror (%d)\n", GetLastError());
- }
- PRINTA_DEBUG("Set timecritical priority.ok\n");
- }
- while (!bExit)
- {
- dwResult = WaitForMultipleObjects(2, pCurMoniOpr->m_hExposureEventArray, FALSE, INFINITE);
- switch (dwResult)
- {
- case WAIT_OBJECT_0: // m_hEventExitExposureThread
- bExit = true;
- PRINTA_DEBUG("Start to Exit Exposure Thread");
- break;
- case WAIT_OBJECT_0 + 1: // m_hEventExposure
- PRINTA_DEBUG("Get Exposure Event");
- {
- pCurMoniOpr->DoExposure();
- ResetEvent(pCurMoniOpr->m_hEventExposure);
- }
- break;
- default:
- DWORD nErrorCode;
- nErrorCode = GetLastError();
- PRINTA_DEBUG("Exposure Thread unknown Exit Mercu event! error code: %d \n", nErrorCode);
- bExit = true;
- break;
- }
- }
- PRINTA_DEBUG("ExposureThread Exit!!!!");
- return 0;
- }
- /*********************************************************************************
- 函数名称:SerialPortOpen
- 功能描述:建立通讯
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SerialPortOpen()
- {
- //与AXIM节点建立通讯 及接收线程启动
- m_sCallbackData.clear();
- DWORD dwThreadId;
- if (NULL == m_hXCUDataThread)
- m_hXCUDataThread = CreateThread(NULL, 0, XCUDataThread, this, 0, &dwThreadId);
- if (m_hXCUDataThread == NULL)
- {
- PRINTA_DEBUG("Open XCUDataThread Failed\n");
- return false;
- }//ENDIF
- if (ConnectXCS())
- {
- PRINTA_DEBUG("Init Siemens XCS(F3) generator: connected\n");
- printf("Init XCU(F3): connect success\n");
- //接收线程
- if (NULL == m_hXCUDataRevThread)
- m_hXCUDataRevThread = CreateThread(NULL, 0, ReveiveXCUData, this, 0, &dwThreadId);
- if (m_hXCUDataRevThread == NULL)
- {
- PRINTA_DEBUG("Open XCUDataThread Failed");
- return false;
- }//ENDIF
- if (NULL == m_hWaitForDummyThread)
- m_hWaitForDummyThread = CreateThread(NULL, 0, WaitForDummyThread, this, 0, &dwThreadId);
- if (m_hWaitForDummyThread == NULL)
- {
- PRINTA_DEBUG("Open WaitForDummyThread Failed\n");
- return false;
- }//ENDIF
- }
- else
- {
- printf("Init XCU(F3): connect failed");
- return false;
- }
- // end
- //与FDC节点建立通讯 及接收线程启动
- m_sFDCCallbackData.clear();
- if (NULL == m_hFDCDataDealThread)
- m_hFDCDataDealThread = CreateThread(NULL, 0, FDCDataThread, this, 0, &dwThreadId);
- if (m_hFDCDataDealThread == NULL)
- {
- PRINTA_DEBUG("Open XCUDataThread Failed");
- return false;
- }//ENDIF
- if (FDCConnectXCS())
- {
- PRINTA_DEBUG( "Init FDC(F4): connected");
- printf("Init FDC(F4): connect success\n");
- if (NULL == m_hFDCDataRevThread)
- m_hFDCDataRevThread = CreateThread(NULL, 0, ReveiveFDCData, this, 0, &dwThreadId);
- if (m_hFDCDataRevThread == NULL)
- {
- PRINTA_DEBUG("Open XCUDataThread Failed\n");
- return false;
- }//ENDIF
- }
- else
- {
- printf("Init FDC(F4): connect failed\n");
- return false;
- }
- // 完成与AXIM FDC F4节点建立通讯连接
- Sleep(1000);
- printf("connect success\n");
- //Sleep(20000);
- return true;
- }
- /*********************************************************************************
- 函数名称:SerialPortClose
- 功能描述:关闭通讯
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SerialPortClose() //在哪调用?
- {
- m_bExited = true;
- //关闭FDC通讯
- TurnOffFDCRequest();
- DisconnectFDCAxn();
- Sleep(1000);
- ////关闭XCU通讯
- TurnOffRequest();
- DisconnectAxn();
- Sleep(100);
- if (m_pFDCAxnClient != NULL)
- {
- m_pFDCAxnClient = NULL;
- }
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient = NULL;
- }
- PRINTA_DEBUG( "SerialPortClose End\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:ConnectXCS
- 功能描述:连接XCS服务器
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::ConnectXCS(void)
- {
- axn_word wtimeout = 10; //默认值 该值会影响recvobject()函数的返回时间,现场使用的时间为该值*200(程序放大值)*3(经验值);针对turn off时间由5秒延迟到10s,与SSME周超保持一致
- axn_status status;
- if (m_pAxnClient)
- {
- CAxnClientIFCreator::deleteAxnClientIF(m_pAxnClient);
- m_pAxnClient = NULL;
- PRINTA_INFO("ConnectXCS,deleteAxnClientIF\n");
- }
- m_pAxnClient = CAxnClientIFCreator::newAxnClientIF();
- if (m_pAxnClient == NULL)
- {
- PRINTA_INFO("newAxnClientIF fail\n");
- return false;
- }//ENDIF
- Sleep(100);
- int nConnectTime = 0; //初始化0
- PRINTA_INFO( "== SEND == : connectToServer AxnClient\n");
- while ((status = m_pAxnClient->connectToServer(Clientsender, wtimeout)) != ACS_AXN_OK)
- {
- PRINTA_WARN("Connect Time: %d\n", nConnectTime);
- printf("F3 Connect Time: %d\n", nConnectTime);
- if (nConnectTime >= 20)
- {
- break;
- }
- else
- {
- nConnectTime++;
- Sleep(1000);
- }
- }
- if (nConnectTime >= 20)
- {
- PRINTA_ERROR("Tried %d times, still failed to connect XCS, return\n", nConnectTime);
- string code = "ConnectError";
- string info = "Can't connect to Axim, Please reboot the system.";
- int level = CONNECTIONERROR;
- m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(),0xF3);
- return false;
- }
- else
- {
- string code = "ConnectError";
- string info = "";
- int level = CONNECTIONERROR;
- m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
- return true;
- }
- }
- void nsGEN::SMZDevice::DisconnectAxn()
- {
- if (m_pAxnClient)
- {
- CAxnClientIFCreator::deleteAxnClientIF(m_pAxnClient);
- m_pAxnClient = NULL;
- EnterCriticalSection(&m_csStatus);
- m_bIdentStatus = false;
- m_bReGetTurnOn = true;
- PRINTA_INFO("callback: DisconnectAxn, m_bIdentStatus = false,m_bReGetTurnOn = true\n");
- LeaveCriticalSection(&m_csStatus);
- PRINTA_INFO( "deleteAxnClientIF\n");
- }
- }
- DWORD nsGEN::SMZDevice::ReveiveXCUData(LPVOID pParam)
- {
- nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
- while (1)
- {
- if (pCurOpr->m_pAxnClient == NULL)
- {
- return 1;
- }
- try {
- axn_status status;
- ::ZeroMemory(pCurOpr->m_pBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
- status = pCurOpr->m_pAxnClient->recvObject((ACS_BYTE*)pCurOpr->m_pBuffer);
- if (status == ACS_AXN_NOK)
- {
- PRINTA_ERROR("XCU Some Error when AxnClient recvObject\n");
- Sleep(2 * AXN_DUMMYTIME_BASE_RATE_IN_MS * 1);
- if (pCurOpr->m_nLostConnectNumber >= 5)
- {
- string code = "ReceiveError";
- string info = "Can't receive the command from generator,Please reboot the system.";
- int level = CONNECTIONERROR;
- pCurOpr->m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(), 0xF3);
- }
- else
- {
- pCurOpr->m_nLostConnectNumber++;
- }
- PRINTA_ERROR("XCU communication fail\n");
- printf("XCU communication fail!!!!!!!! \n");
- pCurOpr->DisconnectAxn();
- Sleep(2000);
- pCurOpr->ConnectXCS();
- }
- else if (status == ACS_AXN_TIMEOUT)
- {
- PRINTA_ERROR("XCU receive communication Timeout\n");
- }
- else
- {
- if (pCurOpr->m_nLostConnectNumber > 0)
- {
- pCurOpr->m_nLostConnectNumber = 0;
- }
- if (pCurOpr->m_pBuffer != NULL)
- {
- acs_obj_header_t* tel_hdr_p;
- tel_hdr_p = (acs_obj_header_t*)pCurOpr->m_pBuffer;
- try {
- if (tel_hdr_p->length <= MAX_LEN_ACS_OBJ)
- {
- SetEvent(pCurOpr->m_hDUMMYEvent);
- //PRINTA_DEBUG("ReveiveXCUData: recvObject id: 0x%x,Sender: 0x%x,,Target:0x%x", tel_hdr_p->id,tel_hdr_p->sender,tel_hdr_p->target); //just for test
- if (tel_hdr_p->id != DUMMY_MSG)
- {
- PRINTA_DEBUG("ReveiveXCUData: recvObject id: %x", tel_hdr_p->id);
- axn_byte* pBuffer;
- pBuffer = new axn_byte[MAX_LEN_ACS_OBJ];
- ::ZeroMemory(pBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
- ::memcpy(pBuffer, pCurOpr->m_pBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
- EnterCriticalSection(&pCurOpr->m_csXCUData);
- pCurOpr->m_sCallbackData.push_back(pBuffer);
- LeaveCriticalSection(&pCurOpr->m_csXCUData);
- SetEvent(pCurOpr->m_hXCUDataEvent);
- }
- else
- {
- //ACS_DUMMY Dummy1 = (*(ACS_DUMMY*)(pCurOpr->m_pBuffer + sizeof(acs_obj_header_t)));
- //ACS_DUMMY Dummy2 = (*(ACS_DUMMY*)(pCurOpr->m_pBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DUMMY)));
- //ACS_DUMMY Dummy3 = (*(ACS_DUMMY*)(pCurOpr->m_pBuffer + sizeof(acs_obj_header_t) + 2 * sizeof(ACS_DUMMY)));
- //ACS_DUMMY Dummy4 = (*(ACS_DUMMY*)(pCurOpr->m_pBuffer + sizeof(acs_obj_header_t) + 3 * sizeof(ACS_DUMMY)));
- //PRINTA_DEBUG("ReveiveXCUData: recvObject DUMMY id: 0x%x,Sender: 0x%x,,Target:0x%x,Length: %d,group_index:%d,mode: %d,Dummy1:0x%x,Dummy2:0x%x,Dummy3:0x%x,Dummy4:0x%x",
- //tel_hdr_p->id, tel_hdr_p->sender, tel_hdr_p->target, tel_hdr_p->length, tel_hdr_p->group_index,tel_hdr_p->mode,Dummy1, Dummy2, Dummy3, Dummy4); //just for test
- }
- if (pCurOpr->m_nTimeoutCount != 0)
- {
- pCurOpr->m_nTimeoutCount = 0;
- PRINTA_INFO("ReceiveCommand get command, then set TimeoutCount to 0\n");
- }
- }
- else
- {
- PRINTA_ERROR("Get a error command: > max_len_acs_obj\n");
- }
- }
- catch (...)
- {
- PRINTA_ERROR("Crash log 1, other error\n");
- }
- }
- else
- {
- PRINTA_ERROR("m_pBuffer = NULL\n");
- }
- }
- }
- catch (...)
- {
- PRINTA_ERROR("Crash log 2, other error\n");
- }
- if (pCurOpr->m_bExited)
- {
- break;
- }
- }
-
- return 0;
- }
- DWORD nsGEN::SMZDevice::XCUDataThread(LPVOID pParam)
- {
- nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
- while (true)
- {
- axn_byte* dd;
- bool bGetData = false;
- EnterCriticalSection(&pCurOpr->m_csXCUData);
- if (!pCurOpr->m_sCallbackData.empty())
- {
- bGetData = true;
- dd = pCurOpr->m_sCallbackData.front();
- pCurOpr->m_sCallbackData.pop_front();
- LeaveCriticalSection(&pCurOpr->m_csXCUData);
- //PRINTA_DEBUG("Callback XCUData push the data\n");
- }
- else
- {
- LeaveCriticalSection(&pCurOpr->m_csXCUData);
- WaitForSingleObject(pCurOpr->m_hXCUDataEvent, 50);
- }
- if (bGetData)
- {
- pCurOpr->CallbackXCU((acs_obj_header_t*)dd);
- if (dd != NULL)
- {
- delete[] dd;
- dd = NULL;
- }
- }//ENDIF
- if (pCurOpr->m_bExited)
- {
- break;
- }
- }
- return 0;
- }
- bool nsGEN::SMZDevice::CallbackXCU(const acs_obj_header_t* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Callback: Get command is Null\n");
- return false;
- }//ENDIF
- printf("== IN == XCU Telegram ID: %x \n", pCommand->id);
- try
- {
- switch (pCommand->id)
- {
- case UINT16(INIT_MSG):
- PRINTA_DEBUG("== IN == : INIT_MSG\n");
- SendList();
- SendTelegramLog("INIT_MSG");
- break;
- case UINT16(TURN_ON):
- PRINTA_DEBUG("== IN == : TURN_ON\n");
- CallbackTurnOn((ACS_BYTE*)pCommand);
- break;
- case UINT16(TURN_OFF):
- PRINTA_DEBUG("== IN == : TURN_OFF\n");
- CallBackTurnOff((ACS_BYTE*)pCommand);
- break;
- case UINT16(INETZAUFNAHME):
- PRINTA_DEBUG("== IN == : INETZAUFNAHME\n");
- SendTelegramLog("INETZAUFNAHME");
- m_bIdentStatus = true;
- SendDate();
- Sleep(50);
- SendIfeStatus(WARTEND);
- break;
- case UINT16(SAPPLIKATION):
- PRINTA_DEBUG("== IN == : SAPPLIKATION\n");
- SendTelegramLog("SAPPLIKATION");
- SendIfeStatus(BETRIEBSBEREIT);
- SendErrorLog();
- break;
- case UINT16(AISTWERTE): //xcu wait
- PRINTA_DEBUG("== IN == : AISTWERTE\n");
- SendiISTWERTE();
- SendTelegramLog("AISTWERTE");
- break;
- case UINT16(SINIT):
- PRINTA_DEBUG("== IN == : SINIT\n");
- SendTelegramLog("SINIT");
- sinit_t1_tag* sinit_p;
- sinit_p = (sinit_t1_tag*)pCommand;
- if (sinit_p->initkennung == 0)
- {
- SendIfeStatus(BETRIEBSBEREIT);
- }
- break;
- case UINT16(AKENNDATEN):
- PRINTA_DEBUG("== IN == : AKENNDATEN\n");
- SendTelegramLog("AKENNDATEN");
- Sleep(50);
- QueryExposureNumber(); //20200604 增加曝光查询次数
- break;
- case UINT16(IPASSWORT):
- break;
- case UINT16(IORGANANZ2): //get organanz for paramlist, orgdate
- PRINTA_DEBUG("== IN == : IORGANANZ2\n");
- break;
- case UINT16(SAUSLBED):
- PRINTA_DEBUG("== IN == : SAUSLBED\n");//TODO
- //CallbackSauslBed((ACS_BYTE*)pCommand);
- break;
- case UINT16(IGENANZ):
- PRINTA_DEBUG("== IN == : IGENANZ\n");
- CallbackGenParam((ACS_BYTE*)pCommand);
- break;
- //case UINT16(ISTRMANANZ):
- // PRINTA_DEBUG("== IN == : ISTRMANANZ\n");
- // //CallbackstrmananzParam((istrmananz_t1_tag*)pCommand); 不需要实现
- // break;
- case UINT16(IFILTERANZ):
- PRINTA_DEBUG("== IN == : IFILTERANZ\n");
- CallbackIFILTERANZParam((ACS_BYTE*)pCommand);
- break;
- case UINT16(IFILTER):
- PRINTA_DEBUG("== IN == : IFILTER\n");
- //CallbackIFILTERParam((ACS_BYTE*)pCommand); 不需要实现
- break;
- case UINT16(IDFPANZ2):
- PRINTA_DEBUG("== IN == : IDFPANZ2\n");
- //CallbackDAPParam((ACS_BYTE *)pCommand); //本报文原用于获取DAP,但目前已经不起作用,可以不予解析;2018/9/26
- break;
- case UINT16(IERRORLOG2): //Error message set to log file
- PRINTA_DEBUG("== IN == : IERRORLOG2\n");
- CallbackErrorParam((ACS_BYTE*)pCommand);
- break;
- case UINT16(ERROR_MSG):
- PRINTA_DEBUG("== IN == : ERROR_MSG\n");
- SendTelegramLog("ERROR_MSG");
- break;
- case UINT16(IFEHLER): //error type;
- PRINTA_DEBUG("== IN == : IFEHLER\n");
- SendTelegramLog("IFEHLER");
- break;
- case UINT16(ISYSTEMANZ):
- PRINTA_DEBUG("== IN == : ISYSTEMANZ\n");
- CallbackWorkstationFromXCU((ACS_BYTE*)pCommand);
- break;
- case UINT16(SAUFNAUSL):
- PRINTA_DEBUG("== IN == : SAUFNAUSL\n");
- CallbackAufnAusl((ACS_BYTE*)pCommand);
- break;
- //case UINT16(SBILD):
- // PRINTA_DEBUG("== IN == : SBILD\n");
- // CallbackSBILD((ACS_BYTE*)pCommand);
- // break;
- case UINT16(SORGANSELECT): //set finish the view value
- PRINTA_DEBUG("== IN == : SORGANSELECT\n");
- CallbackSORGANSELECT((ACS_BYTE*)pCommand);
- break;
- case UINT16(SH_LIST):
- PRINTA_DEBUG("== IN == : SH_LIST\n");
- CallBackShowList((ACS_BYTE*)pCommand);
- break;
- case UINT16(DUMMY_MSG):
- break;
- case UINT16(IIONANZ):
- PRINTA_DEBUG("== IN == : IIONANZ\n");
- CallbackGetField((ACS_BYTE*)pCommand);
- break;
- case UINT16(INACHANZ): //post exposure parameters
- PRINTA_DEBUG("== IN == : INACHANZ\n");
- CallbackPostGenParam((ACS_BYTE*)pCommand);
- break;
- case UINT16(IAUFNDATEN):
- PRINTA_DEBUG("== IN == : IAUFNDATEN\n");
- SendTelegramLog("IAUFNDATEN");
- break;
- case UINT16(IDAPVALUE): //dap not in using
- PRINTA_DEBUG("== IN == : IDAPVALUE\n");
- SendTelegramLog("IDAPVALUE");
- break;
- case UINT16(IDFRALLGANZ2):
- PRINTA_DEBUG("== IN == : IDFRALLGANZ2\n");
- CallBackIdrallganz2((ACS_BYTE*)pCommand);
- break;
- case UINT16(IFEHLERANZ2): //dispaly the message to UI
- PRINTA_DEBUG("== IN == : IFEHLERANZ2\n");
- CallBackIfehleranz2((ACS_BYTE*)pCommand);
- break;
- //case UINT16(IINFOCOMP):
- // PRINTA_DEBUG("== IN == : IINFOCOMP\n");
- // CallBackIINFOCOMP((ACS_BYTE*)pCommand);
- // break;
- case UINT16(SDETEKTORSTART):
- PRINTA_DEBUG("== IN == : SDETEKTORSTART\n"); //二级手闸信号;
- m_bAlreadyExposure = false;
- m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_READY);
- FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- PRINTA_INFO("<GEN EXP>the generator ready \n");
- SendTelegramLog("SDETEKTORSTART","", pCommand->sender);
- break;
- case UINT16(STESTCMD):
- PRINTA_DEBUG("== IN == : STESTCMD\n");
- SendTelegramLog("STESTCMD");
- break;
- case UINT16(ST_MODE):
- PRINTA_DEBUG("== IN == : ST_MODE\n");
- CallBackST_MODE((ACS_BYTE*)pCommand);
- break;
- case UINT16(SDFRNAHBED2):
- PRINTA_DEBUG("== IN == : SDFRNAHBED2\n");
- CallBackSDFRNAHBED2((ACS_BYTE*)pCommand);
- break;
- case UINT16(ST_ORGAN_PROG):
- PRINTA_DEBUG("== IN == : ST_ORGAN_PROG\n");
- CallBackST_ORGAN_PROG((ACS_BYTE*)pCommand);
- break;
- case UINT16(SRESETFEHLER):
- PRINTA_DEBUG("== IN == : SRESETFEHLER\n");
- CallBackSRESETFEHLER((ACS_BYTE*)pCommand);
- SendTelegramLog("SRESETFEHLER");
- break;
- case UINT16(IFFA): //get SID
- PRINTA_DEBUG("== IN == : IFFA(SID)\n");
- CallBackSID((ACS_BYTE*)pCommand);
- break;
- //case UINT16(SBEDSYS): // Get Workstation //from TUI select
- // PRINTA_DEBUG("== IN == : SBEDSYS(WorkStation)\n");
- // CallBackWorkStationFromTUI((ACS_BYTE*)pCommand);
- // break;
- case UINT16(IBLENDEANZ): //(Collimator)
- PRINTA_DEBUG("== IN == : IBLENDEANZ(Collimator)\n");
- CallBackCollimator((ACS_BYTE*)pCommand);
- break;
- case UINT16(IRASTERANZ): //(Grid)
- PRINTA_DEBUG("== IN == : IRASTERANZ(Grid)\n");
- CallBackGrid((ACS_BYTE*)pCommand);
- break;
- case UINT16(RQ_FDR_DATA): //(Request FPD Data)
- PRINTA_DEBUG("== IN == : RQ_FDR_DATA\n");
- CallBackRQ_FDR_DATA((ACS_BYTE*)pCommand);
- break;
- case UINT16(ST_ADJUST):
- PRINTA_DEBUG("== IN == : ST_ADJUST\n");
- CallBackAdjust((ACS_BYTE*)pCommand);
- break;
- case UINT16(IGGANZ2):
- PRINTA_DEBUG("== IN == : IGGANZ2\n");
- //GeneratorDriver::SetGeneratorStatus(GENERATOR_STATUS_STANDBY); //202110 待完善
- m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_STANDBY);
- CallBackIGGANZ2((ACS_BYTE*)pCommand);
- break;
- case UINT16(IROEANZ):
- PRINTA_DEBUG("== IN == : IROEANZ\n");
- CallBackTubeHeat((ACS_BYTE*)pCommand);
- break;
- case UINT16(ST_DIAG):
- PRINTA_DEBUG( "== IN == : PMS ST_DIAG, request system status information\n");
- CallBackSTDIAG((ACS_BYTE*)pCommand);
- break;
- case UINT16(RQ_OBJECT):
- PRINTA_DEBUG("== IN == : PMS RQ_OBJECT, request system Version information\n");
- CallBackRQOBJECT((ACS_BYTE*)pCommand);
- break;
- case UINT16(IALLGANZ):
- PRINTA_DEBUG("== IN == : IALLGANZ\n");
- CallBackDoorStatus((ACS_BYTE*)pCommand);
- break;
- case UINT16(ST_CONFIG):
- PRINTA_DEBUG("== IN == : PMS ST_CONFIG\n");
- CallBackSTCONFIG((ACS_BYTE*)pCommand);
- break;
- case UINT16(ST_DATA_TRANS):
- PRINTA_DEBUG("== IN == : PMS ST_DATA_TRANS\n");
- CallBackST_DATA_TRANS((ACS_BYTE*)pCommand);
- break;
- case UINT16(ST_SYSTEM_STATE):
- PRINTA_DEBUG("== IN == : PMS ST_SYSTEM_STATE\n");
- CallBackPMSSystemStatus((ACS_BYTE*)pCommand);
- break;
- case UINT16(SFANZLOESCHEN):
- PRINTA_DEBUG("== IN == : PMS SFANZLOESCHEN\n");
- CallBackSFANZLOESCHEN((ACS_BYTE*)pCommand);
- break;
- case UINT16(ISERVBETRIEB):
- PRINTA_DEBUG("== IN == : ISERVBETRIEB\n");
- CallbackExposureNumber((ACS_BYTE*)pCommand);
- break;
- case UINT16(IWATERVALACQ):
- PRINTA_DEBUG("== IN == : IWATERVALACQ\n");
- CallbackIWATERVALACQ((ACS_BYTE*)pCommand);
- break;
- case UINT16(ISOD):
- PRINTA_DEBUG("== IN == : ISOD\n");
- CallBackSOD((ACS_BYTE*)pCommand);
- break;
- case UINT16(IACSS):
- PRINTA_DEBUG("== IN == : IACSS\n");
- CallbackIACSS((ACS_BYTE*)pCommand);
- break;
- case UINT16(IXRAY):
- PRINTA_DEBUG("== IN == : IXRAY\n");
- CallbackIXRAY((ACS_BYTE*)pCommand);
- break;
- case UINT16(IPRINTAUFN):
- PRINTA_DEBUG("== IN == : IPRINTAUFN\n");
- break;
- case UINT16(IERWALLGANZ):
- PRINTA_DEBUG("== IN == : IERWALLGANZ\n");
- CallbackIERWALLGANZ((ACS_BYTE*)pCommand);
- break;
- case UINT16(SORTHO):
- PRINTA_DEBUG("== IN == : SORTHO\n");
- CallbackSORTHO((ACS_BYTE*)pCommand);
- break;
- case UINT16(SORTHOACTSIZE):
- PRINTA_DEBUG("== IN == : SORTHOACTSIZE\n");
- //CallbackSORTHOACTSIZE((ACS_BYTE*)pCommand); //2021-04:不需要实现
- break;
- case UINT16(SH_STPAR_RFP):
- PRINTA_DEBUG("== IN == : SH_STPAR_RFP\n");
- CallbackSH_STPAR_RFP((ACS_BYTE*)pCommand);
- break;
- case UINT16(ST_PWR_OFF):
- PRINTA_DEBUG("== IN == : ST_PWR_OFF\n");
- CallbackST_PWR_OFF((ACS_BYTE*)pCommand);
- break;
- case UINT16(IANLBEREIT):
- PRINTA_INFO("== IN == : IANLBEREIT\n");
- CallBackIANLBEREIT((ACS_BYTE*)pCommand);
- break;
- default:
- break;
- }
- }
- catch (...)
- {
- PRINTA_ERROR("Callback Deal XCU data Crash: id:%x\n", pCommand->id);
- printf("Callback Deal XCU data Crash: id:%x\n", pCommand->id);
- }
- return true;
- }
- /*********************************************************************************
- 函数名称:SendList
- 功能描述:设置DROC端需要从SCU端接收的报文清单
- 修改记录:
- 2015-04-20 创建
- 2017-03-04 增加DAP报文
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendList(void)
- {
- ACS_WORD szID[XCS_MESSAGE_NUM] = { INETZAUFNAHME,
- SAPPLIKATION,
- SINIT,
- AKENNDATEN,
- IPASSWORT,
- TURN_OFF,
- DUMMY_MSG,
- IGENANZ,
- TURN_ON,
- IORGANANZ2,
- //ISTRMANANZ,
- IFILTERANZ,
- IDFPANZ2,
- IERRORLOG2,
- ERROR_MSG,
- IFEHLER,
- IFEHLER2,
- ISYSTEMANZ,
- SAUFNAUSL,
- //SBILD,
- SORGANSELECT,
- IIONANZ,
- AISTWERTE,
- IFEHLERANZ2,
- IDFRALLGANZ2,
- SH_LIST,
- INACHANZ,
- IDAPVALUE,
- //IINFOCOMP,
- SDETEKTORSTART,
- SAUSLBED,
- STESTCMD,
- ST_MODE,
- SDFRNAHBED2,
- ST_ORGAN_PROG,
- SRESETFEHLER,
- IFILTER,
- IANLBEREIT,
- IFFA,
- IBLENDEANZ,
- IRASTERANZ,
- RQ_FDR_DATA,
- ST_ADJUST,
- IGGANZ2,
- IROEANZ,
- ST_DIAG,
- SH_VERSION,
- RQ_OBJECT,
- SH_CONFIG,
- ST_DATA_TRANS,
- IALLGANZ,
- ST_SYSTEM_STATE,
- SFANZLOESCHEN,
- ISERVBETRIEB,
- IWATERVALACQ,
- ISOD,
- IACSS,
- IXRAY,
- IPRINTAUFN,
- IERWALLGANZ,
- IBETRIEBSART,
- ST_PWR_OFF,
- IANLBEREIT
- };
- inlist_enh_t1_tag szSendGen = {};
- m_stGenCommand.id = INLIST_ENH;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.mode = 0;
- m_stGenCommand.target = 0;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.length = m_wHeaderLength + (XCS_MESSAGE_NUM + 1) * sizeof(ACS_WORD);
- szSendGen.no_objects = XCS_MESSAGE_NUM;
- szSendGen.header = m_stGenCommand;
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- ::memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- ::memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_wHeaderLength + sizeof(ACS_WORD));
- ::memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_WORD)),
- (ACS_BYTE*)(&szID), XCS_MESSAGE_NUM * sizeof(ACS_WORD));
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- SendTelegramLog("INLIST_ENH", "", m_stGenCommand.sender,0);
- }//ENDIF
- delete[]p_ID;
- p_ID = NULL;
- PRINTA_DEBUG("== SEND == : INLIST_ENH( LIST)\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SendiISTWERTE
- 功能描述:设置组件状态
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendiISTWERTE(void)
- {
- iistwertequit_t1 szSendGen = {};
- m_stGenCommand.id = IISTWERTEQUIT;
- m_stGenCommand.length = m_wHeaderLength;
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- PRINTA_DEBUG("== SEND == : IISTWERTEQUIT\n");
- SendTelegramLog("IISTWERTEQUIT", "", m_stGenCommand.sender);
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:SendIdent
- 功能描述:设置与XCU交互的第一条报文
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendIdent(void)
- {
- iident_t1 szSendGen = {};
- m_stGenCommand.id = IIDENT;
- m_stGenCommand.length = m_wHeaderLength + 3 * sizeof(ACS_BYTE) + 10 * sizeof(ACS_STRING_8) + 3 * sizeof(ACS_DUMMY);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- szSendGen.fetyp = BILDVERARBEITUNG;
- szSendGen.knotenid = Clientsender;
- szSendGen.apid = Clientsender;
- ACS_STRING_8 temp[10] = "FLSP_COMP";
- ::memcpy(szSendGen.kompname, temp, 10);
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- PRINTA_DEBUG("== SEND == : IIDENT\n");
- SendTelegramLog("IIDENT", "", m_stGenCommand.sender);
- }//ENDIF
- else
- {
- PRINTA_DEBUG("== SEND == : IIDENT is not successful\n");
- }
- return true;
- }
- /*********************************************************************************
- 函数名称:SendErrorLog
- 功能描述:设置当前DROC保存的错误个数到XCU端
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendErrorLog(void)
- {
- ierrorlogsync_t1_tag szSendGen = {};
- m_stGenCommand.id = IERRORLOGSYNC;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_WORD) + 2 * sizeof(ACS_DUMMY);
- szSendGen.errcnt = m_nLastErrorCount; //需要读取配置
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- PRINTA_DEBUG("IS: errcnt: %lu", szSendGen.errcnt);
- SendTelegramLog("IERRORLOGSYNC", "", m_stGenCommand.sender);
- }//ENDIF
- PRINTA_DEBUG("== SEND == : IERRORLOGSYNC\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SendDate
- 功能描述:设置当前时间到XCU端,保持时间同步
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendDate(void)
- {
- sdate_t1_tag szSendGen = {};
- SYSTEMTIME SysCurrentTime;
- GetLocalTime(&SysCurrentTime);
- m_stGenCommand.id = SDATE;
- m_stGenCommand.length = m_wHeaderLength + 6 * sizeof(ACS_BYTE) + 2 * sizeof(ACS_DUMMY);
- szSendGen.day = SysCurrentTime.wDay; //day
- szSendGen.year = SysCurrentTime.wYear - 2000; //year Siemens要求
- szSendGen.month = SysCurrentTime.wMonth; //month
- szSendGen.hour = SysCurrentTime.wHour; //hour
- szSendGen.minute = SysCurrentTime.wMinute; //minute
- szSendGen.second = SysCurrentTime.wSecond; //second
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- SendTelegramLog("SDATE", "", m_stGenCommand.sender);
- }//ENDIF
- PRINTA_DEBUG("== SEND == : SDATE\n");
- //SendErrorLog(); //Siemens要求,在此时间点设置该指令 20210512 符合AXIM流程
- return true;
- }
- ///*********************************************************************************
- //函数名称:QueryExposureNumber
- //功能描述: 查询当前曝光的次数(ASERVBETRIEB )
- //修改记录:
- //2021-04-20 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::QueryExposureNumber() //2021-04 待完善功能:需要客户端根据需要进行调用
- {
- aservbetrieb_t1 QueryExposureNumber = {};
- m_stGenCommand.id = ASERVBETRIEB;
- m_stGenCommand.length = m_wHeaderLength;
- QueryExposureNumber.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&QueryExposureNumber);
- SendTelegramLog("ASERVBETRIEB", "", m_stGenCommand.sender);
- }//ENDIF
- PRINTA_INFO("QueryExposureNumber\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SendIfeStatus
- 功能描述:设置组件状态
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendIfeStatus(int IfeStatusValue)
- {
- ifestatus_t1_tag szSendGen = {};
- m_stGenCommand.id = IFESTATUS;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_BYTE) + sizeof(ACS_DUMMY) * 3;
- szSendGen.festatus = IfeStatusValue;
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- PRINTA_DEBUG("IS: festatus: %d, Send to 0x%x\n", szSendGen.festatus, szSendGen.header.target);
- SendTelegramLog("IFESTATUS", "", m_stGenCommand.sender);
- }//ENDIF
- szSendGen.header.target = SFServer;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- PRINTA_DEBUG("IS: festatus: %d, Send to 0x%x\n", szSendGen.festatus, szSendGen.header.target);
- SendTelegramLog("IFESTATUS", "Send to SFServer", m_stGenCommand.sender);
- }//ENDIF
- PRINTA_INFO("== SEND == : IFESTATUS: %d\n", IfeStatusValue);
- return true;
- }
- ///*********************************************************************************
- //函数名称:SetSH_Mode
- //功能描述: 返回SH_mode报文,对应ST_mode
- //修改记录:
- //2021-04-23 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::SetSH_Mode(int nMode)
- {
- sh_mode_t1_tag SendSH_Mode = {};
- m_stGenCommand.id = SH_MODE;
- m_stGenCommand.target = ClientPMS;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY);
- SendSH_Mode.header = m_stGenCommand;
- SendSH_Mode.system_mode = (int)nMode;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&SendSH_Mode);
- std::ostringstream buffer;
- buffer << "IS: system_mode:" << (int)SendSH_Mode.system_mode;
- string str = buffer.str();
- SendTelegramLog("IFESTATUS", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- PRINTA_INFO("== SEND == : SetSH_Mode: SendSH_Mode.system_mode: %d\n", SendSH_Mode.system_mode);
- return true;
- }
- /*********************************************************************************
- 函数名称:SendIdfrnahbed
- 功能描述:对iDfrBed报文的确认
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendIdfrnahbed(int nCode, int nData) //2021-04 待完善功能:需要客户端设置 设置TOD参数
- {
- idfrnahbed_t1_tag szSendGen = {};
- m_stGenCommand.id = IDFRNAHBED;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_COUNT) + 2 * sizeof(ACS_INT) + 3 * sizeof(ACS_DUMMY);
- szSendGen.header = m_stGenCommand;
- szSendGen.aktanzahl = 1;
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_wHeaderLength + sizeof(ACS_COUNT) + 3 * sizeof(ACS_DUMMY));
- idfrnahbed_t2_tag szSendGen2 = {};
- szSendGen2.aktcode = nCode; //MARK_R_POSITION;
- szSendGen2.aktdata = nData; //0; //Siemens 要求
- memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_COUNT) + 3 * sizeof(ACS_DUMMY)), (ACS_BYTE*)(&szSendGen2),
- 2 * sizeof(ACS_INT));
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- std::ostringstream buffer;
- buffer << "IS: F3 aktcode:" << (int)szSendGen2.aktcode << ",aktdata: " << (int)szSendGen2.aktdata;
- string str = buffer.str();
- SendTelegramLog("IDFRNAHBED", str.c_str(), m_stGenCommand.sender,0);
- }//ENDIF
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : IDFRNAHBED\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SendAdjust
- 功能描述:发送AP的读写结果到PMS
- 修改记录:
- 2021-04-23 创建
- 2021-06-01 已经不使用了
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendAdjust(int nResult)
- {
- return true;
- sh_adjust_t1_tag shAdjustData = {};
- m_stGenCommand.id = SH_ADJUST;
- m_stGenCommand.target = ClientPMS;
- int nAdjustLength = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + 3 * sizeof(ACS_INT) + sizeof(ACS_DCOUNT);
- int nAdjust2Length = 0;
- string strPath = "";
- if (ACS_ADJ_FILETRANS_OK == nResult) //6
- {
- nAdjust2Length = strlen(strPath.c_str()) * sizeof(ACS_BYTE);
- shAdjustData.adj_status = ACS_ADJ_FILETRANS_OK; //6
- }
- else if (ACS_ADJ_FILETRANS_NOK == nResult) //7
- {
- shAdjustData.adj_status = ACS_ADJ_FILETRANS_NOK;//7
- }
- else if (ACS_ADJ_RUNNING == nResult) //1
- {
- shAdjustData.adj_status = ACS_ADJ_RUNNING;// 1
- }
- else if (ACS_ADJ_FILETRANS_NODATA == nResult)
- {
- shAdjustData.adj_status = ACS_ADJ_FILETRANS_NODATA;// 9
- }//ENDIF
- shAdjustData.identifier = ACS_ADJUST_ID_FD_WLAN; //22
- m_stGenCommand.length = nAdjustLength + nAdjust2Length;
- shAdjustData.header = m_stGenCommand;
- shAdjustData.no_adj_data = nAdjust2Length;
- ACS_BYTE* pCommand = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(pCommand, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)pCommand, (ACS_BYTE*)(&shAdjustData), nAdjustLength);
- if (ACS_ADJ_FILETRANS_OK == nResult)
- {
- PRINTA_INFO("Copy ScalanceWlanAccesspoint.xml\n");
- sh_adjust_t2_tag shAdjustData2 = {};
- for (int i = 0; i < sizeof(strPath); i++)
- {
- shAdjustData2.adj_data = (ACS_BYTE)(strPath[i]);
- memcpy((ACS_BYTE*)(pCommand + nAdjustLength + i * sizeof(ACS_BYTE)), (ACS_BYTE*)(&shAdjustData2), sizeof(ACS_BYTE));
- }
- }//ENDIF
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject(pCommand);//pCommand
- SendTelegramLog("SH_ADJUST", "", m_stGenCommand.sender, 0);
- }//ENDIF;
- PRINTA_INFO("== SEND == : SH_ADJUST Path:%s\n", strPath);
- delete[]pCommand;
- pCommand = NULL;
- m_stGenCommand.target = Clienttarget;
- return true;
- }
- /*********************************************************************************
- 函数名称:SetSystemStatusInformation
- 功能描述:设置当前软件系统的状态信息
- 参数描述:
- nStatusIndex:
- VERSIONINFOR_SOFTWARE (3)
- HOSTID (4)
- SOFTWAREDONGLEID (5)
- FREESPACEOFHARDDISK (6)
- FREESPACEOFMEMORY (7)
- CONFIGFILEISSUE (8)
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetSystemStatusInformation(int nStatusIndex, const char* strInfor, ACS_ENUM nDealStatus) //需要客户端设置 各版本信息 202110 SSI
- {
- sh_diag_t1_tag SendSystemStatusInformation = {};
- m_stGenCommand.id = SH_DIAG;
- m_stGenCommand.target = ClientPMS;
- m_stGenCommand.length = m_wHeaderLength + 5 * sizeof(ACS_INT)
- + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT) + DIAG_STRING_LENGTH * sizeof(ACS_STRING) * strlen(strInfor);
- SendSystemStatusInformation.header = m_stGenCommand;
- int nSH_DIAGLength = m_wHeaderLength + 5 * sizeof(ACS_INT) + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT);
- SendSystemStatusInformation.par_2 = 108;
- SendSystemStatusInformation.obj_count = ACS_ONLY_ONE_OBJECT;
- SendSystemStatusInformation.diag_status = nDealStatus;
- SendSystemStatusInformation.identifier = (ACS_INT)nStatusIndex;
- SendSystemStatusInformation.diag_duration = 0;
- SendSystemStatusInformation.lostr_diag = (int)strlen(strInfor);
- ACS_BYTE* pCommand = new ACS_BYTE[m_stGenCommand.length];
- memset(pCommand, 0, m_stGenCommand.length * sizeof(ACS_BYTE));
- memcpy((ACS_BYTE*)pCommand, (ACS_BYTE*)(&SendSystemStatusInformation), nSH_DIAGLength);
- //int unicodeLen = MultiByteToWideChar(CP_ACP, 0, strInfor, -1, NULL, 0);
- //wchar_t* pUnicode;
- //pUnicode = new wchar_t[(unicodeLen + 1) * 2];
- //memset(pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t) * 2);
- //size_t nUnicodeLenSize = unicodeLen + 1;
- //mbstowcs_s(&nUnicodeLenSize, pUnicode, 200, strInfor, _TRUNCATE);
- sh_diag_t2_tag strDiagInfor = {};
- for (int i = 0; i < (int)strlen(strInfor); i++)
- {
- memset(strDiagInfor.diag_string, 0, DIAG_STRING_LENGTH * sizeof(ACS_STRING));
- strDiagInfor.diag_string[0] = strInfor[i];
- memcpy((ACS_BYTE*)(pCommand + (nSH_DIAGLength + i * sizeof(sh_diag_t2_tag))),
- (ACS_BYTE*)(&strDiagInfor), sizeof(sh_diag_t2_tag));
- }
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)pCommand);
- }//ENDIF
- delete[]pCommand;
- pCommand = NULL;
- //delete[] pUnicode;
- //pUnicode = NULL;
- m_stGenCommand.target = Clienttarget;
- PRINTA_INFO("== SEND == : SH_DIAG: fOrgStatus: %d, strInfor:%s,Length: %d,diag_status:%d\n",
- nStatusIndex, strInfor, m_stGenCommand.length, SendSystemStatusInformation.diag_status);
- std::ostringstream buffer;
- buffer << "nStatusIndex:" << nStatusIndex << "strInfor:" << strInfor <<"diag_status:"<< SendSystemStatusInformation.diag_status;
- string str = buffer.str();
- SendTelegramLog("SH_DIAG", str.c_str(), m_stGenCommand.sender);
- return true;
- }
- /*********************************************************************************
- 函数名称:SendIdfrStatus
- 功能描述:设置当前系统曝光状态到XCU端
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendIdfrStatus(int nDRStatus, int nRFStatus, int bSaveParm) //2021-04 待完善功能:需要客户端设置 客户端或子系统会根据不同的界面及系统状态进行设置 //202110 STA
- {
- if (bSaveParm == 1)
- {
- m_nIdfrstatus = nDRStatus;
- }
- if (m_nScreenSaver >= 1)
- {
- PRINTA_DEBUG("SCreenSave: return IDFRSTATUS(dfraufnbereit: %d, dfrdlbereit:%d)\n", nDRStatus, nRFStatus);
- return true;
- }
- idfrstatus_t1_tag szSendGen = {};
- m_stGenCommand.id = IDFRSTATUS;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_BYTE);
- szSendGen.dfraufnbereit = nDRStatus;
- szSendGen.dfrdlbereit = nRFStatus;
- if (nDRStatus == 27) //DROC_IQAP_RECEIVED
- {
- m_stGenCommand.target = ClientPMS;
- }
- else
- {
- //m_stGenCommand.mode = ACS_MODE_DIRECT; //normal
- }
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- }//ENDIF
- PRINTA_DEBUG("== SEND == : IDFRSTATUS(dfraufnbereit: %d, dfrdlbereit:%d),mode: %d,target:%x \n", nDRStatus, nRFStatus, m_stGenCommand.mode, m_stGenCommand.target);
- m_stGenCommand.target = Clienttarget;
- std::ostringstream buffer;
- buffer << "dfraufnbereit:" << nDRStatus << "dfrdlbereit:" << nRFStatus;
- string str = buffer.str();
- SendTelegramLog("IDFRSTATUS", str.c_str(), m_stGenCommand.sender);
- return true;
- }
- /*********************************************************************************
- 函数名称:SelectORG
- 功能描述:设置当前UI端选中的view到UI端
- 修改记录:
- 2021-04-22 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SelectORG(int nCode, int nParam, int nNeedOGP) //2021-4-22 待完善功能:需要客户端设置
- {
- m_stGenCommand.id = SBEDORG;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
- sbedorg_t1_tag szSendGen = {};
- szSendGen.bedeinh = DFR_BEDIENUNG;
- szSendGen.fktscodeorg = (ACS_INT)nCode;
- szSendGen.bedienobj = SELEKTIONSTASTEN;
- szSendGen.param = (ACS_INT)nParam;
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy(p_ID, &m_stGenCommand, 8);
- memcpy(p_ID + 8, &szSendGen.bedeinh, 1);
- memcpy(p_ID + 9, &szSendGen.bedienobj, 1);
- memcpy(p_ID + 10, &szSendGen.fktscodeorg, 2);
- memcpy(p_ID + 12, &szSendGen.param, 2);
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- std::ostringstream buffer;
- buffer << "IS: fktscodeorg(code):" << (int)szSendGen.fktscodeorg << ",param:" << (int)szSendGen.param;
- string str = buffer.str();
- SendTelegramLog("SBEDORG", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : SBEDORG | SelectORG(code:%d,param:%d) \n", nCode, nParam /*m_nAPRCommandSynFlag*/);
- m_nSetViewNumber = nParam;
- if (nCode == 451) //Siemens要求 设置OGP选择
- {
- if (nNeedOGP == 0)
- {
- PRINTA_INFO("== SelectORG == : Send ORT, don't need back OGP\n");
- return true;
- }
- else if (nNeedOGP == 2)
- {
- /*m_data.m_gen.m_nmSelectOGP = nParam;*/ //待完善功能:需要设置到UI端
- PRINTA_INFO("== SelectORG == : Send ORG,need back OGP,but don't need SelectOGP\n");
- return true;
- }
- if (m_bCalibMode)
- {
- PRINTA_INFO("AutoCalibration mode, No Send No OGP Selected\n");
- }
- else
- {
- SendIdfrStatus(NO_OGP_SELECTED, NO_OGP_SELECTED);
- PRINTA_INFO("No AutoCalibration mode,Send No OGP Selected\n");
- }
- DWORD dwThreadId;
- if (NULL == m_hXCUDataThread)
- m_hOGPWorkThread = CreateThread(NULL, 0, OGPWorkThread, this, 0, &dwThreadId);
- if (m_hOGPWorkThread == NULL)
- {
- PRINTA_DEBUG("Open XCUDataThread Failed\n");
- return false;
- }//ENDIF
- }
- if ((m_nAPRCommandSynFlag == 0) || (m_nAPRCommandSynFlag == 2)) //Siemens 要求
- {
- EnterCriticalSection(&m_csStatus);
- m_nAPRCommandSynFlag = 1; //清除当前的变量标识,重新统计
- LeaveCriticalSection(&m_csStatus);
- PRINTA_INFO("SelectORG:: m_nAPRCommandSynFlag++,m_nAPRCommandSynFlag = %d\n", m_nAPRCommandSynFlag);
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:OGPWorkThread
- 功能描述: 等待OGP(VIEW)确认返回线程
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- DWORD nsGEN::SMZDevice::OGPWorkThread(LPVOID pParam)
- {
- nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
- pCurOpr->m_bSelectORG = true;
- if (WaitForSingleObject(pCurOpr->m_hGenSelectOGPEvent, pCurOpr->m_nSelectOGPWaitingTime) == WAIT_OBJECT_0)
- {
- //pCurOpr->m_pGenSiemensSalmon_Mech->Mech::UpdateViewID(pCurOpr->m_nTargetViewNumber); //202110
- PRINTA_INFO("Get OGP view back, TargetView: %d\n", pCurOpr->m_nTargetViewNumber);
- }
- else
- {
- //pCurOpr->m_pGenSiemensSalmon_Mech->Mech::UpdateViewID(pCurOpr->m_nSetViewNumber + 1); //202110
- PRINTA_INFO("can't Get OGP view back,direct send view number\n");
- }
- pCurOpr->m_bSelectORG = false;
- return true;
- }
- /*********************************************************************************
- 函数名称:WaitForDummyThread
- 功能描述: 等待Dummy message
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- DWORD nsGEN::SMZDevice::WaitForDummyThread(LPVOID pParam)
- {
- nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
- while (1)
- {
- if (WaitForSingleObject(pCurOpr->m_hDUMMYEvent, 2500/*pCurOpr->m_nSelectOGPWaitingTime*/) == WAIT_OBJECT_0) //20220328 dission with SSME, use the 2500ms for dummy message timeout
- {
- //According to the SSME's message,the dummy message will be send from Axim every 600ms Normally;
- //if (!pCurOpr->m_bIdentStatus)
- {
- //EnterCriticalSection(&pCurOpr->m_csStatus);
- //pCurOpr->m_bIdentStatus = true;
- //pCurOpr->m_bReGetTurnOn = false;
- //LeaveCriticalSection(&pCurOpr->m_csStatus);
- //string code = "0";
- //string info = "";
- //int level = CONNECTIONERROR;
- //pCurOpr->m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
- }
- }
- else
- {
- PRINTA_ERROR("Get Dummy message timeout\n");
- //if (pCurOpr->m_bIdentStatus)
- {
- //EnterCriticalSection(&pCurOpr->m_csStatus);
- //pCurOpr->m_bIdentStatus = false;
- //pCurOpr->m_bReGetTurnOn = true;
- //LeaveCriticalSection(&pCurOpr->m_csStatus);
- //PRINTA_INFO("WaitForDummyThread: m_bIdentStatus = false,m_bReGetTurnOn = true\n");
- //string code = "LostDummyMessage";
- //string info = "Lost communication to generator,Please reboot the system.";
- //int level = CONNECTIONERROR;
- //pCurOpr->m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str());
- }//ENDIF
- }
- if (pCurOpr->m_bExited)
- {
- break;
- }
- }
- return true;
- }
- /*********************************************************************************
- 函数名称:WaitForDapThread
- 功能描述: 等待Dap message
- 修改记录:
- 2022-10-11 创建
- *******************************************************************************/
- DWORD nsGEN::SMZDevice::WaitForDapThread(LPVOID pParam)
- {
- nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
-
- int nWaitForDap = 5000;
- try
- {
- nWaitForDap = (int)(pCurOpr->m_GenConfig["DAPTimeOut"]);
- }
- catch (...)
- {
- PRINTA_ERROR("Can't get the DAPTimeOut value,default = 5000ms\n");
- }
- if (WaitForSingleObject(pCurOpr->m_hWaitForDapEvent, nWaitForDap) == WAIT_OBJECT_0)
- {
- PRINTA_INFO("WaitForDapThread: Get DAP value");
- }
- else
- {
- PRINTA_ERROR("WaitForDapThread: Get Dap value timeout\n");
- string code = "DapTimeOut";
- string info = "DAP display impaired. Turn off / on system. If error still persists, contact service.";
- int level = MESSAGEBOX_CLEARERROR;
- pCurOpr->m_MSGUnit->AddWarnMessage(code.c_str(), level, info.c_str(), 0xF0);
- }
- return true;
- }
- RET_STATUS nsGEN::SMZDevice::EnterExam() //202110 对外接口
- {
- if (!SelectORG(450, 20)) //must send it to Generator, otherwise, can't enable exposure
- {
- PRINTA_ERROR("Select OGP (450,20) fail\n");
- return RET_STATUS::RET_FAILED;
- }//ENDIF
- if (!m_bInExam)
- {
- SendTUIButtonStatus(BTN_RESTORE_OGP, NORMAL);
- }
- m_bInExam = true;
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::ExitExam() //202110 对外接口
- {
- if (m_bInExam)
- {
- SendTUIButtonStatus(BTN_RESTORE_OGP, DIMMED);
- Sleep(200);
- SetPatientStatus(ACS_PAT_CLOSED);
- }
- m_bInExam = false;
- return RET_STATUS::RET_SUCCEED;
- }
- /*********************************************************************************
- 函数名称:SendTUIButton
- 功能描述:设置TUI上Button按钮状态
- 修改记录:
- 2021-04-25 创建 (设置病人体型、设置TuiUndo信息)
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendTUIButtonStatus(int nButtonType, int nStatus) ////2021-04 待完善功能:需要客户端设置 设置TUI Undo功能
- {
- stuibuttons_2_t1_tag PatientSize = {};
- m_stGenCommand.id = STUIBUTTONS_2;
- m_stGenCommand.target = TUI_IFtarget;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
- PatientSize.header = m_stGenCommand;
- PatientSize.dummy1 = 0;
- PatientSize.dummy2 = 0;
- PatientSize.no_func = 1;
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&PatientSize), m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY));
- stuibuttons_2_t2_tag TUIButton2 = {};
- TUIButton2.tui_item = nButtonType;
- TUIButton2.item_state = nStatus;
- memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY)),
- (ACS_BYTE*)(&TUIButton2), sizeof(ACS_INT) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE));
- if (m_pAxnClient != NULL)
- {
- Sleep(m_nTUICOMMANDSENDWAITTIME);
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- SendTelegramLog("STUIBUTTONS_2", "", m_stGenCommand.sender);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : SendTUIButtonStatus: ECOM ButtonType: %d,status: %d\n", nButtonType, nStatus);
- return true;
- }
- /*********************************************************************************
- 函数名称:SetPatientStatus
- 功能描述:进入检查时通知XCU进入检查;退出时,通知XCU退出检查;
- 修改记录:
- 2021-04-25 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetPatientStatus(int nPatientStatus) //2021-04 待完善功能:需要客户端设置
- {
- sdfrpatwechsel_t1_tag szSendGen = {};
- m_stGenCommand.id = SDFRPATWECHSEL;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- szSendGen.header = m_stGenCommand;
- szSendGen.pat_action = nPatientStatus;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- std::ostringstream buffer;
- buffer << "IS: pat_action: " << (int)szSendGen.pat_action;
- string str = buffer.str();
- SendTelegramLog("SDFRPATWECHSEL", str.c_str(), m_stGenCommand.sender, 0);
- }
- PRINTA_INFO("== SEND == : SetPatientStatus: PatientStatus:%d\n", nPatientStatus);
- return true;
- }
- /*********************************************************************************
- 函数名称:SetVersionInfor
- 功能描述:设置版本信息
- 参数描述:
- nModuleIndex:
- VERSIONINFOR_VISUALIZOR (1)
- VERSIONINFOR_PIXRAD (2)
- VERSIONINFOR_SOFTWARE (3)
- 修改记录:
- 2021-04-25 创建
- 需要获得报文后继续完善
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetVersionInfor(const char* strModuleName, const char* strVersionInfor) // 设置版本信息 //202110 SMV
- {
- sh_version_check_t1_tag SendVersionInfor = {};
- m_stGenCommand.id = SH_VERSION_CHECK;
- m_stGenCommand.target = ClientPMS;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_DCOUNT)
- + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + UNIT_ID_LONG_LENGTH * sizeof(ACS_STRING) + VERSION_LONG_LENGTH * sizeof(ACS_STRING);
- SendVersionInfor.header = m_stGenCommand;
- SendVersionInfor.obj_count = -1; //Simenes 要求
- SendVersionInfor.no_versions_long = 1;
- ACS_BYTE* pCommand = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(pCommand, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)pCommand, (ACS_BYTE*)(&SendVersionInfor),
- (m_wHeaderLength + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_DCOUNT)));
- //打包状态信息
- sh_version_check_t2_tag strDiagInfor = {};
- string strTemp = strModuleName;
- int nstrNameLength = (int)strlen(strModuleName);
- //Function code
- if (strTemp.find("_FW") != string::npos) //更改命名规则 20191024
- {
- strDiagInfor.vers_type = ACS_FIRMWARE;
- nstrNameLength = nstrNameLength - 3;
- }
- else
- {
- strDiagInfor.vers_type = ACS_SOFTWARE;
- }
-
- if (nstrNameLength >= UNIT_ID_LONG_LENGTH)
- {
- nstrNameLength = UNIT_ID_LONG_LENGTH;
- }
- memset(strDiagInfor.unit_id_long, 0, UNIT_ID_LONG_LENGTH * sizeof(ACS_STRING));
- for (int j = 0; j < nstrNameLength; j++)
- {
- strDiagInfor.unit_id_long[j] = strModuleName[j];
- }
- memset(strDiagInfor.version_long, 0, VERSION_LONG_LENGTH * sizeof(ACS_STRING));
- int nstrVersionInforLength = (int)strlen(strVersionInfor);
- if (nstrVersionInforLength >= VERSION_LONG_LENGTH)
- {
- nstrVersionInforLength = VERSION_LONG_LENGTH;
- }
- for (int j = 0; j < nstrVersionInforLength; j++)
- {
- strDiagInfor.version_long[j] = strVersionInfor[j];
- }
- memcpy((ACS_BYTE*)(pCommand + (m_wHeaderLength + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_DCOUNT))),
- (ACS_BYTE*)(&strDiagInfor), sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + UNIT_ID_LONG_LENGTH * sizeof(ACS_STRING) + VERSION_LONG_LENGTH * sizeof(ACS_STRING));
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)pCommand);
- std::ostringstream buffer;
- buffer << "IS: SetVersionInfor: ModuleName: " << strModuleName << ", strDiagInfor.vers_type:" << strDiagInfor.vers_type << ", strDiagInfor.version_long:" << strVersionInfor;
- string str = buffer.str();
- SendTelegramLog("SH_VERSION_CHECK", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- delete[]pCommand;
- pCommand = NULL;
- m_stGenCommand.target = Clienttarget;
- PRINTA_INFO("== SEND == : SetVersionInfor: ModuleName: %s, NameLength:%d,Vers_type:%d,strVersionInfor:%s,VersionInforLength:%d\n", strModuleName, nstrNameLength, strDiagInfor.vers_type, strVersionInfor, nstrVersionInforLength);
- return true;
- }
- ///*********************************************************************************
- //函数名称:SetSH_DATA_TRANS
- //功能描述:设置配置文件Backup/Resort状态
- //修改记录:Backup
- //2021-04-25 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::SetSH_DATA_TRANS(float fResult, int nIdent) //2021-04 待完善功能:需要客户端设置 //202110 BRM
- {
- sh_data_trans_t1_tag SendSH_DATA_TRANS = {};
- m_stGenCommand.id = SH_DATA_TRANS;
- m_stGenCommand.target = ClientPMS;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT) + sizeof(ACS_BYTE);
- SendSH_DATA_TRANS.header = m_stGenCommand;
- SendSH_DATA_TRANS.data_ack = (int)fResult;
- SendSH_DATA_TRANS.data_ident = nIdent;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&SendSH_DATA_TRANS);
- std::ostringstream buffer;
- buffer << "IS: SendSH_DATA_TRANS.data_ack: " << SendSH_DATA_TRANS.data_ack << ", SendSH_DATA_TRANS.data_ident:" << SendSH_DATA_TRANS.data_ident;
- string str = buffer.str();
- SendTelegramLog("SH_DATA_TRANS", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- PRINTA_INFO("== SEND == : SetSH_DATA_TRANS: SendSH_DATA_TRANS.data_ack: %d, SendSH_DATA_TRANS.data_ident: %d\n",
- SendSH_DATA_TRANS.data_ack, SendSH_DATA_TRANS.data_ident);
- return true;
- }
- /*********************************************************************************
- 函数名称:SetSatetySwitch
- 功能描述:设置当前工作模式(主要设置到自动校正)
- 修改记录:
- 2021-04-22 改进代码风格
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetSatetySwitch()//TODO: AutoCalibration //202110 校正接口 FPD
- {
- st_ss_t1_tag szSendGen = {};
- m_stGenCommandFDC.id = ST_SS;
- m_stGenCommandFDC.length = m_wHeaderLength + 3 * sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
- m_stGenCommandFDC.mode = Clientmode;
- m_stGenCommandFDC.sender = FDC_Controlsender;
- m_stGenCommandFDC.group_index = Clientgroup_index;
- m_stGenCommandFDC.target = Gentarget;
- szSendGen.header = m_stGenCommandFDC;
- szSendGen.sttype = ACS_CHANGE_IMMEDIATELY;
- szSendGen.idx = NULL;
- szSendGen.sw_switch = ACS_ON;
- szSendGen.xray_man_enable = ACS_ENABLE_XRAY;
- ACS_BYTE* sCommmand = new ACS_BYTE[m_stGenCommandFDC.length * 2];
- memset(sCommmand, 0, m_stGenCommandFDC.length * sizeof(ACS_BYTE) * 2);
- memcpy(sCommmand, &m_stGenCommandFDC, 8);
- memcpy(sCommmand + 8, &szSendGen.sttype, sizeof(ACS_ENUM));
- memcpy(sCommmand + 9, &szSendGen.idx, sizeof(ACS_BYTE));
- memcpy(sCommmand + 10, &szSendGen.sw_switch, sizeof(ACS_ENUM));
- memcpy(sCommmand + 11, &szSendGen.xray_man_enable, sizeof(ACS_ENUM));
- if (m_pFDCAxnClient != NULL)
- {
- m_pFDCAxnClient->sendObject(sCommmand);
- std::ostringstream buffer;
- buffer << "IS: szSendGen.sttype: " << szSendGen.sttype << ", szSendGen.sw_switch:" << szSendGen.sw_switch;
- string str = buffer.str();
- SendTelegramLog("ST_SS", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- delete[] sCommmand;
- sCommmand = NULL;
- PRINTA_INFO("== SEND == : ST_SS,SetSatetySwitch\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SendIDFRABSCHALTUNG
- 功能描述:通知SCU当前view结束
- 修改记录:
- 2021-04-22 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendIDFRABSCHALTUNG()//TODO: 一张view结束; //202110 for校正接口 FPD
- {
- idfrabschaltung_t1_tag szSendGen = {};
- m_stGenCommand.id = IDFRABSCHALTUNG;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY);
- szSendGen.header = m_stGenCommand;
- szSendGen.abschgrund = 1; //Siemens要求
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- SendTelegramLog("IDFRABSCHALTUNG", "", m_stGenCommand.sender, 0);
- }//ENDIF
- PRINTA_INFO("== SEND == : IDFRABSCHALTUNG\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:GetSwitchState
- 功能描述:获取当前工作模式
- 修改记录:
- 2021-04-22 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::GetSwitchState()//TODO: AutoCalibration 202110 for CAM FPD
- {
- rq_object_t1_tag szSendGen = {};
- m_stGenCommandFDC.id = RQ_OBJECT;
- m_stGenCommandFDC.length = m_wHeaderLength + sizeof(ACS_WORD) + sizeof(ACS_DUMMY) + 2 * sizeof(ACS_ENUM) + 3 * sizeof(ACS_BYTE);
- m_stGenCommandFDC.mode = Clientmode;//??
- m_stGenCommandFDC.sender = FDC_Controlsender;
- m_stGenCommandFDC.group_index = Clientgroup_index;//??
- m_stGenCommandFDC.target = Gentarget;
- szSendGen.header = m_stGenCommandFDC;
- szSendGen.object_id = SH_SS;
- szSendGen.send_rj = ACS_NO;
- szSendGen.address_mode = 0; //Siemens提供默认值
- szSendGen.ap_id = 0xFF;
- szSendGen.version_rqobject = ACS_V_RQOBJECT;
- szSendGen.procedure_id = 0; //Siemens提供默认值
- szSendGen.dummy1 = 0; //Siemens提供默认值
- ACS_BYTE* sCommmand = new ACS_BYTE[(m_stGenCommandFDC.length + 1) * 2];
- memset(sCommmand, 0, (m_stGenCommandFDC.length + 1) * sizeof(ACS_BYTE) * 2);
- memcpy(sCommmand, &m_stGenCommandFDC, 8);
- memcpy(sCommmand + 8, &szSendGen.object_id, sizeof(ACS_WORD));
- memcpy(sCommmand + 10, &szSendGen.send_rj, sizeof(ACS_ENUM));
- memcpy(sCommmand + 11, &szSendGen.address_mode, sizeof(ACS_ENUM));
- memcpy(sCommmand + 12, &szSendGen.ap_id, sizeof(ACS_BYTE));
- memcpy(sCommmand + 13, &szSendGen.version_rqobject, sizeof(ACS_BYTE));
- memcpy(sCommmand + 14, &szSendGen.procedure_id, sizeof(ACS_BYTE));
- memcpy(sCommmand + 15, &szSendGen.dummy1, sizeof(ACS_DUMMY));
- if (m_pFDCAxnClient != NULL)
- {
- m_pFDCAxnClient->sendObject(sCommmand);
- std::ostringstream buffer;
- buffer << "IS: szSendGen.object_id: " << szSendGen.object_id << ", szSendGen.send_rj:" << szSendGen.send_rj << ", szSendGen.address_mode:" << szSendGen.address_mode;
- string str = buffer.str();
- SendTelegramLog("RQ_OBJECT", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- delete[] sCommmand;
- sCommmand = NULL;
- PRINTA_INFO("== SEND == : RQ_OBJECT,GetSwitchState Over\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SetFDErrorCode
- 功能描述:设置SetFDErrorCode
- 修改记录:
- 2021-04-25 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetFDErrorCode(int nErrorCode, int nErrorType, string& strSN) //202110 for FPD接口
- {
- PRINTA_INFO("SetFDErrorCode\n");
- ifehler2_t1_tag szSendGen = {};
- m_stGenCommand.id = IFEHLER2;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_WORD) + sizeof(ACS_BYTE) + sizeof(ACS_ENUM) + STRARG_LENGTH * sizeof(ACS_STRING) + sizeof(ACS_DUMMY) * 2 + sizeof(ACS_DCOUNT);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- szSendGen.header = m_stGenCommand;
- szSendGen.fehlernummer = nErrorCode;
- szSendGen.category = nErrorType; //Siemens 要求 WARNUNG 0x01 warning, BEHEB_FEHLER 0x02 error
- szSendGen.no_args = 0; //siemens 要求 20191120
- string strTempSN = strSN.substr(0, min(sizeof(strSN), STRARG_LENGTH));
- for (int j = 0; j < sizeof(strTempSN); j++)
- {
- szSendGen.strarg[j] = strTempSN[j];
- }
- PRINTA_INFO("== SEND == : IFEHLER2 ErrorCode: %d ErrorCategory: %d,SN:%s\n", szSendGen.fehlernummer, szSendGen.category, strTempSN);
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- std::ostringstream buffer;
- buffer << "IS:fehlernummer:" << (int)szSendGen.fehlernummer << ",category:" << (int)szSendGen.category
- << ", strarg: " << szSendGen.strarg;
- string str = buffer.str();
- SendTelegramLog("IFEHLER2", str.c_str(), m_stGenCommand.sender, 0);
- return true;
- }
- else
- {
- return false;
- }
- }
- /*********************************************************************************
- 函数名称:SendPatientSize
- 功能描述: 设置病人体型到XCU
- 修改记录:
- 2021-04-25 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendPatientSize(int nPatientSize) //2021-04 待完善功能:需要客户端设置 设置给TUI端 202110 SetStudyInfo
- {
- stuibuttons_2_t1_tag PatientSize = {};
- m_stGenCommand.id = STUIBUTTONS_2;
- m_stGenCommand.target = TUI_IFtarget;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
- PatientSize.header = m_stGenCommand;
- PatientSize.dummy1 = 0;
- PatientSize.dummy2 = 0;
- PatientSize.no_func = 1; //默认设置1组病人信息
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&PatientSize), m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY));
- stuibuttons_2_t2_tag PatientSize2 = {};
- PatientSize2.tui_item = BTN_PATIENT_SIZE; //PAT_SIZE_SELECTION;
- PatientSize2.item_state = NORMAL; // This TUI Button should be normally visible.
- switch (nPatientSize) //备用 用于转换参数
- {
- case PATIENT_BODYSIZE_CUSTOM:
- PatientSize2.param_8 = PATIENT_FLC_SIZE_CUSTOM;
- break;
- case PATIENT_BODYSIZE_LARGE:
- PatientSize2.param_8 = PATIENT_FLC_SIZE_BIG;
- break;
- case PATIENT_BODYSIZE_MEDIUM:
- PatientSize2.param_8 = PATIENT_FLC_SIZE_MEDIUM;
- break;
- case PATIENT_BODYSIZE_SMALL:
- PatientSize2.param_8 = PATIENT_FLC_SIZE_SMALL;
- break;
- default:
- PatientSize2.param_8 = PATIENT_FLC_SIZE_MEDIUM;
- break;
- }
- memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY)),
- (ACS_BYTE*)(&PatientSize2), sizeof(ACS_INT) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE));
- if (m_pAxnClient != NULL)
- {
- Sleep(m_nTUICOMMANDSENDWAITTIME);
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- std::ostringstream buffer;
- buffer << "IS: PatientSize.no_func: " << PatientSize.no_func << ", PatientSize2.param_8:" << PatientSize2.param_8;
- string str = buffer.str();
- SendTelegramLog("STUIBUTTONS_2", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : SendPatientSize: ECOM patientsize: %d,PatientType: %d(150), Patient Size:%d\n", nPatientSize, PatientSize2.tui_item, PatientSize2.param_8);
- return true;
- }
- /*********************************************************************************
- 函数名称:SendPatientInfor
- 功能描述: 设置病人名及病人ID
- 修改记录:
- 2021-04-25 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendPatientInfor(wstring& wstrPatientName, wstring& wstrPatientID) //set Patient Information to XCU //2021-04 待完善功能:需要客户端设置 设置病人名及ID号 202110 SetStudyInfo
- {
- int PatientInfoPart1Length = m_wHeaderLength + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_DCOUNT) + sizeof(ACS_BYTE);
- int PatientInfoPart2Length = sizeof(ACS_ENUM) + sizeof(ACS_DUMMY) + sizeof(ACS_WORD) + DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING);
- PRINTA_INFO("PatientInfoPart1: %d,PatientInfoPart2:%d\n", PatientInfoPart1Length, PatientInfoPart2Length);
- sh_disp_long_t1 PatientInfoDisplayPart1 = {};
- m_stGenCommand.id = SH_DISP_LONG;
- m_stGenCommand.target = TUItarget;
- m_stGenCommand.mode = 0;
- m_stGenCommand.length = PatientInfoPart1Length + PatientInfoPart2Length * 2;
- PatientInfoDisplayPart1.header = m_stGenCommand;
- PatientInfoDisplayPart1.no_disp_long = 2;//default
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&PatientInfoDisplayPart1),
- PatientInfoPart1Length);
- PRINTA_INFO("Start PatientNameDisplayPart2\n");
- sh_disp_long_t2 PatientInfoDisplayPart2_Name = {};
- PatientInfoDisplayPart2_Name.disp_func = AXCS_DISP_PATIENT_DATA1; //Name
- memset(PatientInfoDisplayPart2_Name.disp_value_long, 0, DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING));
- int nPatientNameLength = (int)(wstrPatientName.size());
- if (nPatientNameLength > DISP_VALUE_LONG_LENGTH)
- {
- nPatientNameLength = DISP_VALUE_LONG_LENGTH;
- }
- for (int j = 0; j < nPatientNameLength; j++)
- {
- PatientInfoDisplayPart2_Name.disp_value_long[j] = wstrPatientName[j];
- }
- memcpy((ACS_BYTE*)(p_ID + PatientInfoPart1Length),
- (ACS_BYTE*)(&PatientInfoDisplayPart2_Name), PatientInfoPart2Length);
- PRINTA_INFO("end PatientInfoDisplayPart2_Name\n");
- sh_disp_long_t2 PatientInfoDisplayPart2_ID = {};
- PatientInfoDisplayPart2_ID.disp_func = AXCS_DISP_PATIENT_DATA2; //ID
- memset(PatientInfoDisplayPart2_ID.disp_value_long, 0, DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING));
- int nPatientIDLength = (int)(wstrPatientID.size());
- if (nPatientIDLength > DISP_VALUE_LONG_LENGTH)
- {
- nPatientIDLength = DISP_VALUE_LONG_LENGTH;
- }
- for (int j = 0; j < nPatientIDLength; j++)
- {
- PatientInfoDisplayPart2_ID.disp_value_long[j] = wstrPatientID[j];
- }
- memcpy((ACS_BYTE*)(p_ID + PatientInfoPart1Length + PatientInfoPart2Length),
- (ACS_BYTE*)(&PatientInfoDisplayPart2_ID), PatientInfoPart2Length);
- PRINTA_INFO("end PatientInfoDisplayPart2_ID\n");
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- m_stGenCommand.mode = Clientmode;
- delete[] p_ID;
- p_ID = NULL;
- return true;
- }
- /*********************************************************************************
- 函数名称:SendPositionImageName
- 功能描述: 设置当前选中的View的缩略图名称到TUI
- 修改记录:
- 2021-04-25 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendPositionImageName(string& strPatientPositionImageName) //2021-04 待完善功能:需要客户端设置
- {
- int PatientInfoPart1Length = m_wHeaderLength + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + sizeof(ACS_DCOUNT) + sizeof(ACS_BYTE);
- int PatientInfoPart2Length = sizeof(ACS_ENUM) + sizeof(ACS_DUMMY) + sizeof(ACS_WORD) + DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING);
- PRINTA_INFO("PatientInfoPart1: %d,PatientInfoPart2:%d\n", PatientInfoPart1Length, PatientInfoPart2Length);
- sh_disp_long_t1 PatientInfoDisplayPart1 = {};
- m_stGenCommand.id = SH_DISP_LONG;
- m_stGenCommand.target = TUItarget;
- m_stGenCommand.mode = 0;
- m_stGenCommand.length = PatientInfoPart1Length + PatientInfoPart2Length * 2;
- PatientInfoDisplayPart1.header = m_stGenCommand;
- PatientInfoDisplayPart1.no_disp_long = 1;//default
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&PatientInfoDisplayPart1),
- PatientInfoPart1Length);
- //Patient Name
- sh_disp_long_t2 PatientInfoDisplayPart2_Name = {};
- //Function code
- PatientInfoDisplayPart2_Name.disp_func = AXCS_DISP_PATIENT_POS1; //Name
- memset(PatientInfoDisplayPart2_Name.disp_value_long, 0, DISP_VALUE_LONG_LENGTH * sizeof(ACS_STRING));
- int nstrPatientInfoLength = (int)sizeof(strPatientPositionImageName);
- for (int j = 0; j < nstrPatientInfoLength; j++)
- {
- PatientInfoDisplayPart2_Name.disp_value_long[j] = strPatientPositionImageName[j];
- }
- memcpy((ACS_BYTE*)(p_ID + PatientInfoPart1Length),
- (ACS_BYTE*)(&PatientInfoDisplayPart2_Name), PatientInfoPart2Length);
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- SendTelegramLog("SH_DISP_LONG", "", m_stGenCommand.sender, 0);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- m_stGenCommand.mode = Clientmode;
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : SendPatient Position: name: %s\n", strPatientPositionImageName);
- return true;
- }
- /*********************************************************************************
- 函数名称:SendFPDSerialNumber
- 功能描述: 设置探测器序列号到PMS端
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendFPDSerialNumber(int nFPDType, const char* strFPDNumber)
- {
- int nSiemensWS = -1;
- switch (nFPDType)
- {
- case WS_PARAM_TABLE_ECOM:
- nSiemensWS = ACS_FD_TABLE;
- break;
- case WS_PARAM_WALL_ECOM:
- nSiemensWS = ACS_FD_WALL;
- break;
- case WS_PARAM_FREE_ECOM:
- nSiemensWS = ACS_FD_PORTABLE;
- break;
- case WS_PARAM_FREE1_LARGE_ECOM:
- nSiemensWS = ACS_FD_PORTABLE;
- break;
- case WS_PARAM_FREE2_SMALL_ECOM:
- nSiemensWS = ACS_FD_SMALL_PORTABLE;
- break;
- default:
- nSiemensWS = nFPDType;
- break;
- }
- sh_fdr_data_t1_tag FPDSerialNumber = {};
- m_stGenCommand.id = SH_FDR_DATA;
- m_stGenCommand.target = ClientPMS;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_DCOUNT) + 2 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + 3 * sizeof(ACS_ENUM) + sizeof(ACS_BYTE) + FDR_PARAM_LENGTH * sizeof(ACS_STRING_8);
- FPDSerialNumber.header = m_stGenCommand;
- FPDSerialNumber.obj_count = -1; //siemens要求
- if (strFPDNumber == "")
- {
- FPDSerialNumber.fdr_ack = ACS_NOK;
- }
- else
- {
- FPDSerialNumber.fdr_ack = ACS_OK;
- }
- FPDSerialNumber.fdr_rq_index = 1; //siemens要求
- FPDSerialNumber.detector_plane = nSiemensWS; //VE61X
- FPDSerialNumber.no_fdr_data = 1; //siemens要求
- ACS_BYTE* pCommand = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(pCommand, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)pCommand, (ACS_BYTE*)(&FPDSerialNumber), m_wHeaderLength + sizeof(ACS_DCOUNT) + sizeof(ACS_DUMMY) + sizeof(ACS_INT) + 2 * sizeof(ACS_ENUM) + sizeof(ACS_BYTE));
- if (strFPDNumber != "")
- {
- sh_fdr_data_t2_tag FPDSerialNumber2 = {};
- FPDSerialNumber2.fdr_param_tag = ACS_FDR_SERNUM; // Serial Number VE61X Siemens 确认过
- FPDSerialNumber2.dummy2 = 0; //Serial Number
- memset(FPDSerialNumber2.fdr_param, 0, FDR_PARAM_LENGTH * sizeof(ACS_STRING_8));
- int nstrFPDSerialNumberLength = (int)strlen(strFPDNumber);
- for (int j = 0; j < nstrFPDSerialNumberLength; j++)
- {
- FPDSerialNumber2.fdr_param[j] = strFPDNumber[j];
- }
- memcpy((ACS_BYTE*)(pCommand + m_wHeaderLength + sizeof(ACS_DCOUNT) + sizeof(ACS_DUMMY) + sizeof(ACS_INT) + 2 * sizeof(ACS_ENUM) + sizeof(ACS_BYTE)),
- (ACS_BYTE*)(&FPDSerialNumber2), FDR_PARAM_LENGTH * sizeof(ACS_STRING_8) + sizeof(ACS_ENUM) + sizeof(ACS_DUMMY));
- }
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)pCommand);
- std::ostringstream buffer;
- buffer << "IS:detector_plane:" << (int)nFPDType << ", FPDSerialNumber:" << strFPDNumber;
- string str = buffer.str();
- SendTelegramLog("SH_FDR_DATA", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- delete[] pCommand;
- pCommand = NULL;
- PRINTA_INFO("== SEND == : SendFPDSerialNumber: Detect Type: %d,SiemensWS: %d,FPDSerialNumber: %s\n", nFPDType, nSiemensWS, strFPDNumber);
- return true;
- }
- /*********************************************************************************
- 函数名称:TubeHeatTest
- 功能描述: 模拟测试球管热容量
- 对应需求:IS_display_heatunits_test(VERSION_RAD3-VA10)
- 修改记录:
- 2021-04-25 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::TubeHeatTest(void)
- {
- sservtestcmd_t1 szSendGen = {};
- m_stGenCommand.id = SSERVTESTCMD;
- m_stGenCommand.length = m_wHeaderLength + 4 * sizeof(ACS_BYTE) + sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- szSendGen.header = m_stGenCommand;
- szSendGen.apid = Clienttarget;
- szSendGen.cmdkennung = 5; //Siemens要求
- szSendGen.anzahldaten = 1; //Siemens要求
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen),
- m_stGenCommand.length - sizeof(ACS_BYTE));
- sservtestcmd_t2 szSendGen2 = {};
- szSendGen2.daten = 0; //默认要求
- memcpy((ACS_BYTE*)p_ID + (m_stGenCommand.length - sizeof(ACS_BYTE)), (ACS_BYTE*)(&szSendGen2),
- sizeof(ACS_BYTE));
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- SendTelegramLog("SSERVTESTCMD", "", m_stGenCommand.sender, 0);
- }
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : TubeHeatTest\n");
- return true;
- }
- ///*********************************************************************************
- //函数名称:SetSHCONFIG
- //功能描述: 配置文件结果处理,对应ST_CONFIG
- //修改记录:
- //2021-04-25 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::SetSHCONFIG(float fResult) //2021-04 待完善功能:需要客户端设置
- {
- sh_config_t1_tag SendSHConfig = {};
- m_stGenCommand.id = SH_CONFIG;
- m_stGenCommand.target = ClientPMS;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 5 * sizeof(ACS_DUMMY) + sizeof(ACS_DCOUNT);
- SendSHConfig.header = m_stGenCommand;
- /* Parameter: cfg_ack (Defines) --------------------------------------------------------------------------------------*/
- /* ACS_OK 1 the operation is accepted */
- /* ACS_NOK 2 the operation is not accepted */
- /* ACS_NODATA 3 no data available */
- /* */
- /*####################################################################################################################*/
- SendSHConfig.cfg_ack = (int)fResult;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&SendSHConfig);
- std::ostringstream buffer;
- buffer << "IS: SendSHConfig.cfg_ack:" << (int)SendSHConfig.cfg_ack;
- string str = buffer.str();
- SendTelegramLog("SH_CONFIG", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- PRINTA_INFO("== SEND == : SetSHCONFIG: fResult: %f, SendSHConfig.cfg_ack: %d\n", fResult, SendSHConfig.cfg_ack);
- return true;
- }
- /*********************************************************************************
- 函数名称:SetPanelRotate
- 功能描述:设置探测器旋转方向
- 修改记录:
- 2021-04-25 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetPanelRotate(int nPanelRotate) //2021-04 待完善功能:需要客户端设置
- {
- PRINTA_INFO("Set PanelRotate: %d\n", nPanelRotate);
- ibewegung2_t1_tag szSendGen = {};
- m_stGenCommand.id = IBEWEGUNG2;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_DUMMY) * 3 + sizeof(ACS_COUNT) + sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_ENUM);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- szSendGen.header = m_stGenCommand;
- szSendGen.aktanzahl = 1;
- ibewegung2_t2_tag szSendGen2 = {};
- szSendGen2.antrieb = ACS_DETECTOR_ORIENTATION;
- szSendGen2.antriebstatus = STOP_MIT_ZIELPOSITION;
- szSendGen2.physposition = nPanelRotate;
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_wHeaderLength + sizeof(ACS_DUMMY) * 3 + sizeof(ACS_COUNT)); //指令默认长度
- memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_DUMMY) * 3 + sizeof(ACS_COUNT)), (ACS_BYTE*)(&szSendGen2), sizeof(ACS_INT) + sizeof(ACS_BYTE) + sizeof(ACS_ENUM)); //默认指令长度
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- std::ostringstream buffer;
- buffer << "IS:aktanzahl: " << (int)szSendGen.aktanzahl << ",physposition: " << (int)szSendGen2.physposition;
- string str = buffer.str();
- SendTelegramLog("IBEWEGUNG2", str.c_str(), m_stGenCommand.sender, 0);
- }
- else
- {
- PRINTA_INFO("IBEWEGUNG2 : m_pAxnClient = null\n");
- }
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : IBEWEGUNG2\n");
- return TRUE;
- }
- /*********************************************************************************
- 函数名称:SetScreenSaver
- 功能描述:控制锁屏功能(1:锁屏启动;0:锁屏关闭)
- 对应需求:
- 修改记录:
- 2021-4-25 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetScreenSaver(int nScreenSaver) //2021-04 待完善功能:需要客户端设置
- {
- if (nScreenSaver >= 1)
- {
- SendIdfrStatus(0, 0, 0);
- }
- m_stGenCommand.id = SBEDALLG;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- sbedallg_t1_tag szSendGen = {};
- szSendGen.bedeinh = GERAETENAHBEDIENUNG;
- szSendGen.bedienobj = EIN_AUS_TASTE;
- szSendGen.fktscodeallg = SCREENSAVER_ON_OFF;
- if (nScreenSaver >= 1)
- {
- szSendGen.param = DRUCKORIENTIERTE_TASTE;
- }
- else
- {
- szSendGen.param = ACS_NO_INFORMATION;
- }
- szSendGen.dummy1 = 0;
- szSendGen.dummy2 = 0;
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- std::ostringstream buffer;
- buffer << "IS:ScreenSaver param: " << (int)szSendGen.param;
- string str = buffer.str();
- SendTelegramLog("SBEDALLG", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- PRINTA_INFO("== SEND == : SBEDALLG nScreenSaver: %d,szSendGen.param: %d\n", nScreenSaver,(int)szSendGen.param);
- m_nScreenSaver = nScreenSaver;
- if (nScreenSaver == 0)
- {
- SendIdfrStatus(m_nIdfrstatus, m_nIdfrstatus);
- }
- return true;
- }
- ///*********************************************************************************
- //函数名称:GetLastErrorAmount
- //功能描述:获取当前的错误数量
- //对应需求:
- //修改记录:
- //2021-4-25 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::GetLastErrorAmount()
- {
- m_GenConfig["LastErrorCount"] = m_nErrorCount;
- m_UIClientUnit.m_ERA->Update(m_nErrorCount);
- FireNotify(m_UIClientUnit.m_ERA->GetKey(), m_UIClientUnit.m_ERA->JSGet());
- ResDataObject config, writecontent;
- writecontent.add("CONFIGURATION", m_GenConfig);
- writecontent.SaveFile(m_strConfigPath.c_str());
- PRINTA_INFO("GetLastErrorAmount: Write the error number: %d,bResult:%d\n", m_nErrorCount);
- return true;
- }
- ///*********************************************************************************
- //函数名称:SetST_SYSTEM_STATE
- //功能描述:设置ST_SYSTEM_STATE报文
- //修改记录:
- //2021-07-21 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::SetST_SYSTEM_STATE(int nStatus) //202110 for 校正时调用 设置系统状态
- {
- st_system_state_t1_tag szSendGen = {};
- m_stGenCommand.id = ST_SYSTEM_STATE;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_SET) + sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
- szSendGen.header = m_stGenCommand;
- szSendGen.system_state = nStatus; //Siemens要求
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- std::ostringstream buffer;
- buffer << "IS: szSendGen.system_state:" << (int)szSendGen.system_state;
- string str = buffer.str();
- SendTelegramLog("ST_SYSTEM_STATE", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- PRINTA_INFO("== SEND == : ST_SYSTEM_STATE: %d\n", nStatus);
- return true;
- }
- /*********************************************************************************
- 函数名称:SendOrthoLocalParam
- 功能描述:设置拼接协议,包括曝光参数及位置信息
- 修改记录:
- 2021-4-21 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendOrthoLocalParam(int nWS, float fKV, float fMA, float fMS, float fMAS, int nFO, int nET, int nAECFieldSel, int nAECFilmSel,
- float fAECDensity, ACS_BYTE nTarget, float fCollimatorWidth, float fCollimatorHeight, float fAECDose, int nFilter,
- int nTubeLoad, int nGridType, int nOrthoType, float fRelativePosition, float fSID, float fBeamAngle, int nOrthoDir, int nPartialCP,
- int nPatientSize, int nOperationMode, int nAlignmentMode, int nTracking, int nSidTracking)
- {
- PRINTA_INFO("SendOrthoLocalParam IS:nWS:%d, nFO:%d, nET:%d, fKV:%f, fMA:%f, fMS:%f, fMAS:%f\n",
- nWS, nFO, nET, fKV, fMA, fMS, fMAS);
- st_cp_data_t1_tag szSendGen;
- m_stGenCommand.id = ST_CP_DATA;
- m_stGenCommand.target = nTarget;
- m_stGenCommand.length = m_wHeaderLength + 9 * sizeof(ACS_INT)
- + 12 * sizeof(ACS_ENUM) + 10 * sizeof(ACS_BYTE) + 2 * sizeof(ACS_LINT) + 2 * sizeof(ACS_WORD) + 2 * sizeof(ACS_DUMMY);
- szSendGen.header = m_stGenCommand;
- //WorkStation
- int nGenWS = 0;
- OrthoWSUI2Gen(nWS, nGenWS); //for ortho, table:0; wall:1
- szSendGen.exp_target = nGenWS;
- szSendGen.strahler = 1; //siemens
- szSendGen.relative_cp_pos_usage = ACS_USE_REL_POS; //Siemens 要求
- szSendGen.partial_cp = nPartialCP;
- //Tech Mode
- nET = TECHMODE_NOAEC_2P; //临时代码 待完善
- switch (nET)
- {
- case TECHMODE_AEC_1P:
- m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_1P);
- szSendGen.technik = _1_PUNKT_TECHNIK;
- break;
- case TECHMODE_AEC_3P:
- m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_3P);
- szSendGen.technik = _1_PUNKT_TECHNIK;
- break;
- case TECHMODE_AEC_1P_REDUCEMA:
- m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_1P_REDUCEMA);
- szSendGen.technik = _1_PUNKT_TECHNIK_RED_STROM;
- break;
- case TECHMODE_NOAEC_2P:
- m_DoseUnit.m_Techmode->Update(TECHMODE_NOAEC_2P);
- szSendGen.technik = _2_PUNKT_TECHNIK;
- break;
- case TECHMODE_NOAEC_3P:
- m_DoseUnit.m_Techmode->Update(TECHMODE_NOAEC_3P);
- szSendGen.technik = _3_PUNKT_TECHNIK;
- break;
- default:
- break;
- }
- FireNotify(AttrKey::TECHMODE, m_DoseUnit.m_Techmode->JSGet());
- int nOperationModeBK = nOperationMode;
- //if ((int)m_SiemensSalmon_Element[CMD_ELEMENT_OPERATIONMODE].fSetValue == OPM_NORMAL)
- {
- if (nWS == WS_CONVENTIONAL)
- {
- nOperationMode = OPM_CASSETTE;
- }
- else
- {
- nOperationMode = OPM_NORMAL;
- }
- }
- //else if ((int)m_SiemensSalmon_Element[CMD_ELEMENT_OPERATIONMODE].fSetValue == OPM_ORTHO)
- //{
- // nOperationMode = OPM_ORTHO;
- //}
- //else
- //{
- // nOperationMode = OPM_NORMAL;
- //}
- szSendGen.operation_mode = nOperationMode;
- PRINTA_INFO("SendOrthoLocalParam: WS: %d, Operation mode : %d,Original Operation mode: %d\n", nWS, nOperationMode, nOperationModeBK);
- //return true;
- //kv
- //int nKV = (int)(fKV * 10);
- //int nKvPos = GetFacKvValue(nKV);
- //szSendGen.kv = g_KV_List[nKvPos];
- szSendGen.kv = (int)(fKV * 10);
- //mas
- //int nMAS = (int)(fMAS * 1000);
- //int nMasPos = GetFacmAsValue(nMAS);
- //szSendGen.mas = (int)(g_MAS_List[nMasPos] / 10); //取整
- szSendGen.mas = (int)(fMAS * 100);
- //MS
- if (nET == TECHMODE_NOAEC_3P)
- {
- int nms = (int)(fMS * 1000);
- int nPos = GetFacmSValue(nms);
- PRINTA_INFO("nPos: %d\n", nPos);
- if (nPos < (int)(sizeof(g_MS_List) / sizeof(int)))
- {
- nms = g_MS_List[nPos] / 100;
- }
- else
- {
- nPos = (int)(sizeof(g_MS_List) / sizeof(int)) - 1;
- nms = g_MS_List[nPos] / 100;
- }
- PRINTA_INFO("Set ARP ms: %d\n", nms);
- szSendGen.ms = nms;
- }
- else
- {
- szSendGen.ms = (ACS_LINT)(m_DoseUnit.m_MS->Get() * 10);
- }
- //dose
- int nAECDose = (int)(fAECDose * 100);
- int nAECDosePos = 0;
- nAECDosePos = GetFacAECDoseValue(nAECDose); //for salmon
- if (nWS == WS_CONVENTIONAL)
- {
- switch (nAECFilmSel)
- {
- case GEN_AECFILM_H:
- szSendGen.dosis = GEN_AECFILM_H; //siemens 要求
- break;
- case GEN_AECFILM_U:
- szSendGen.dosis = GEN_AECFILM_U; //siemens 要求
- break;
- case GEN_AECFILM_D:
- szSendGen.dosis = GEN_AECFILM_D; //siemens 要求
- break;
- default:
- szSendGen.dosis = GEN_AECFILM_U; //siemens 要求
- break;
- }
- }
- else
- {
- szSendGen.dosis = g_AECDOSE_List[nAECDosePos] * 10;
- }
- //kv dr
- szSendGen.kvdr = 0; //siemens 要求
- //blackening correction
- szSendGen.schwaerzkorr = (ACS_INT)(fAECDensity * 4); //density
- //size
- szSendGen.szeit = 1; //siemens 要求
- //曝光曲线
- szSendGen.kennl = 1; //siemens 要求
- //焦点
- if (nFO == FOCUS_SMALL)
- {
- nFO = KLEINER_FOKUS;
- }
- else if (nFO == FOCUS_LARGE)
- {
- nFO = GROSSER_FOKUS;
- }
- else
- {
- nFO = _3_FOKUS;
- }
- szSendGen.fokus = nFO;
- //szSendGen.proz = 80; // tube Load
- szSendGen.proz = nTubeLoad; // tube Load
- //regstop
- szSendGen.regstop = 0; //siemens 要求
- //filteraufn
- switch (nFilter)
- {
- case GEN_FILTER_CU_0:
- szSendGen.filteraufn = Cu_00mm;
- break;
- case GEN_FILTER_CU_1:
- szSendGen.filteraufn = Cu_01mm;
- break;
- case GEN_FILTER_CU_2:
- szSendGen.filteraufn = Cu_02mm;
- break;
- case GEN_FILTER_CU_3:
- szSendGen.filteraufn = Cu_03mm;
- break;
- default:
- szSendGen.filteraufn = Cu_00mm;
- break;
- }
- //Grid number
- szSendGen.grid_requested = SwitchGridFocusECOM2SIEMENSORTHO(nWS, nGridType); //Ortho下 Grid 类型需要进一步提供
- szSendGen.ortho_range_def_method = nOrthoType; //20200410
- if (m_bCalibMode)
- {
- szSendGen.cp_category = CP_FD_CALIB;
- }
- else
- {
- szSendGen.cp_category = CP_NORMAL;
- }
- //height of collimation
- szSendGen.coll_height = (ACS_INT)(fCollimatorHeight * 100); // 0.1mm
- //width of collimation
- szSendGen.coll_width = (ACS_INT)(fCollimatorWidth * 100); //0.1mm
- szSendGen.auto_zoom = ACS_NO_INFORMATION; //siemens
- //add 映射
- switch (nPatientSize)
- {
- case PATIENT_BODYSIZE_LARGE:
- szSendGen.pat_bmi = PAT_THN_L;
- break;
- case PATIENT_BODYSIZE_MEDIUM:
- szSendGen.pat_bmi = PAT_THN_M;
- break;
- case PATIENT_BODYSIZE_SMALL:
- szSendGen.pat_bmi = PAT_THN_S;
- break;
- case PATIENT_BODYSIZE_CUSTOM:
- default:
- szSendGen.pat_bmi = PAT_THN_M;
- break;
- }
- szSendGen.position_cp = fRelativePosition;
- szSendGen.sid = (int)fSID;
- szSendGen.oblique_beam_angle = fBeamAngle * 100;
- szSendGen.alignment_mode = nAlignmentMode; //siemens
- szSendGen.tracking = nTracking; //siemens
- szSendGen.sid_tracking = nSidTracking; //siemens
- szSendGen.ortho_dir = nOrthoDir;
- int nAECField2Gen = 0;
- switch (nAECFieldSel)
- {
- case FIELD_RIGHT:
- nAECField2Gen = RECHTS;
- break;
- case FIELD_CENTER:
- nAECField2Gen = MITTE;
- break;
- case FIELD_RIGHT_CENTER:
- nAECField2Gen = MITTE_RECHTS;
- break;
- case FIELD_LEFT:
- nAECField2Gen = LINKS;
- break;
- case FIELD_LEFT_RIGHT:
- nAECField2Gen = LINKS_RECHTS;
- break;
- case FIELD_CENTER_LEFT:
- nAECField2Gen = LINKS_MITTE;
- break;
- case FIELD_LEFT_CENTER_RIGHT:
- nAECField2Gen = LINKS_MITTE_RECHTS;
- break;
- default:
- break;
- }
- szSendGen.frate = 0; //siemens要求 VE61X
- szSendGen.gewmessf = nAECField2Gen;
- szSendGen.xrpt_flrad = 500;
- if ((nET == TECHMODE_NOAEC_3P) && (szSendGen.ms > 500))
- {
- szSendGen.xrpt_flrad = 3200;
- }
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- ::memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- ::memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_stGenCommand.length); //指令默认长度
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- }
- else
- {
- PRINTA_INFO("== SEND == : m_pAxnClient = NULL");
- }
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : ST_CP_DATA IS:exp_target: %d,fokus:%d,technik:%d,kv:%d, mas: %d,ms:%d,\
- position_cp: %d,alignment_mode: %d, szSendGen.operation_mode: %d,szSendGen.cp_category: %d\n",
- szSendGen.exp_target, szSendGen.fokus, szSendGen.technik, szSendGen.kv, szSendGen.mas, szSendGen.ms,
- szSendGen.position_cp,szSendGen.alignment_mode, szSendGen.operation_mode,szSendGen.cp_category);
- if (nTarget == ClientPMS)
- {
- m_stGenCommand.target = Clienttarget;
- }
- std::ostringstream buffer;
- buffer << "IS:exp_target:" << (int)szSendGen.exp_target << ", fokus:" << (int)szSendGen.fokus
- << ", technik :" << (int)szSendGen.technik << ", gewmessf(AECFieldSel) : " << (int)szSendGen.gewmessf
- << ", schwaerzkorr(AECDensity):" << (int)szSendGen.schwaerzkorr << ",kv:" << (int)szSendGen.kv
- << ",mas:" << (int)szSendGen.mas << ", ms : " << (int)szSendGen.ms << ",filteraufn(Filter):"
- << (int)szSendGen.filteraufn << ",dosis:" << (int)szSendGen.dosis << ",proz(TubeLoad):" << (int)szSendGen.proz
- << ", coll_height :" << (int)szSendGen.coll_height << ",coll_width :" << (int)szSendGen.coll_width
- << ", grid_requested(GridType) :" << (int)szSendGen.grid_requested << ",ortho_range_def_method:" << (int)szSendGen.ortho_range_def_method << ", position_cp: " << szSendGen.position_cp
- << ", SID :" << (int)szSendGen.sid << ", oblique_beam_angle :" << (int)szSendGen.oblique_beam_angle
- << ", ortho_dir :" << (int)szSendGen.ortho_dir << ",alignment_mode :" << (int)szSendGen.alignment_mode
- << ", szSendGen.operation_mode : " << (int)szSendGen.operation_mode << ",pat_bmi:" << (int)szSendGen.pat_bmi
- << ", tracking:" << (int)szSendGen.tracking << ", sid_tracking:" << (int)szSendGen.sid_tracking
- << ", sid :" << (int)szSendGen.sid << ", szSendGen.xrpt_flrad :" << (int)szSendGen.xrpt_flrad;
- string str = buffer.str();
- SendTelegramLog("ST_CP_DATA", str.c_str(), m_stGenCommand.sender);
- return true;
- }
- /*********************************************************************************
- 函数名称:SendGenData
- 功能描述:调节参数指令(增加或减少)
- 对应需求:IS_buttons_kv_mAs_ms(VERSION_RAD3-VA10)
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendGenData(int interfaceType, int AdjustMode, int nFunctionID, int nGenData, int nUnitChange) //adjust parameter
- {
- sbedgen_t1 szSendGen;
- m_stGenCommand.id = SBEDGEN;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
- szSendGen.bedeinh = interfaceType;
- szSendGen.bedienobj = AdjustMode;
- szSendGen.fktscodegen = nFunctionID;
- //szSendGen.param = (ACS_INT)nGenData;
- if (nUnitChange == 1)
- {
- szSendGen.param = (ACS_INT)nGenData / 10;
- }
- else
- {
- szSendGen.param = (ACS_INT)nGenData;
- }
- szSendGen.header = m_stGenCommand;
- ACS_BYTE* sCommmand = new ACS_BYTE[(m_stGenCommand.length + 1) * 2];
- ::memset(sCommmand, 0, (m_stGenCommand.length + 1) * sizeof(ACS_BYTE) * 2);
- ::memcpy(sCommmand, &m_stGenCommand, 8);
- ::memcpy(sCommmand + 8, &szSendGen.bedeinh, 1);
- ::memcpy(sCommmand + 9, &szSendGen.bedienobj, 1);
- ::memcpy(sCommmand + 10, &szSendGen.fktscodegen, 2);
- ::memcpy(sCommmand + 12, &szSendGen.param, 2);
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject(sCommmand);
- //std::ostringstream buffer;
- //buffer << "IS: szSendGen.bedeinh:" << (int)szSendGen.bedeinh << ", szSendGen.bedienobj:" << szSendGen.bedienobj << ", szSendGen.fktscodegen" << szSendGen.fktscodegen << ", szSendGen.param:" << szSendGen.param;
- //string str = buffer.str();
- //SendTelegramLog("SBEDGEN", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- PRINTA_INFO("=== Send GenData == fktscodegen:%d,param:%d\n", nFunctionID, nGenData);
- delete[] sCommmand;
- sCommmand = NULL;
- //==============================================================SBEDGEN2=============================================
- //send SBEDGEN2报文
- sbedgen2_t1 szSendGen2;
- m_stGenCommand.id = SBEDGEN2;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + sizeof(ACS_INT) + sizeof(ACS_LINT);
- szSendGen2.bedeinh = interfaceType;
- szSendGen2.bedienobj = AdjustMode;
- szSendGen2.fktscodegen = nFunctionID;
- szSendGen2.param_32 = (ACS_LINT)nGenData;
- szSendGen2.header = m_stGenCommand;
- ACS_BYTE* sCommmand2 = new ACS_BYTE[m_stGenCommand.length];
- ::memset(sCommmand2, 0, m_stGenCommand.length * sizeof(ACS_BYTE));
- ::memcpy(sCommmand2, &m_stGenCommand, 8);
- ::memcpy(sCommmand2 + 8, &szSendGen2.bedeinh, 1);
- ::memcpy(sCommmand2 + 9, &szSendGen2.bedienobj, 1);
- ::memcpy(sCommmand2 + 10, &szSendGen2.fktscodegen, 2);
- szSendGen2.param_32 = (ACS_LINT)nGenData;
- ::memcpy(sCommmand2 + 12, &szSendGen2.param_32, sizeof(ACS_LINT));
- szSendGen2.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject(sCommmand2);
- std::ostringstream buffer;
- buffer << "IS: szSendGen.bedeinh:" << (int)szSendGen2.bedeinh << ", szSendGen.bedienobj:" << szSendGen2.bedienobj << ", szSendGen.fktscodegen" << szSendGen2.fktscodegen << ", szSendGen.param_32:" << szSendGen2.param_32;
- string str = buffer.str();
- SendTelegramLog("SBEDGEN2", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- PRINTA_INFO("=== Send GenData2 == fktscodegen:%d,param:%d\n", nFunctionID, nGenData);
- delete[] sCommmand2;
- sCommmand2 = NULL;
- return true;
- }
- /*********************************************************************************
- 函数名称:SendsBEDSP
- 功能描述:调节参数指令(对应Dose)
- 对应需求:IS_buttons_DOSE(VERSION_RAD3-VA10)
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendsBEDSP(int interfaceType, int AdjustMode, int nFunctionID, int nGenData) //adjust parameter
- {
- sbedsp_t1 szSendGen;
- m_stGenCommand.id = SBEDSP;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
- szSendGen.bedeinh = interfaceType;
- szSendGen.bedienobj = AdjustMode;
- szSendGen.fktscodesp = nFunctionID;
- szSendGen.param = (ACS_INT)nGenData;
- szSendGen.header = m_stGenCommand;
- ACS_BYTE* sCommmand = new ACS_BYTE[(m_stGenCommand.length + 1) * 2];
- ::memset(sCommmand, 0, (m_stGenCommand.length + 1) * sizeof(ACS_BYTE) * 2);
- ::memcpy(sCommmand, &m_stGenCommand, 8);
- ::memcpy(sCommmand + 8, &szSendGen.bedeinh, 1);
- ::memcpy(sCommmand + 9, &szSendGen.bedienobj, 1);
- ::memcpy(sCommmand + 10, &szSendGen.fktscodesp, 2);
- ::memcpy(sCommmand + 12, &szSendGen.param, 2);
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject(sCommmand);
- std::ostringstream buffer;
- buffer << "IS: szSendGen.bedeinh:" << (int)szSendGen.bedeinh << ", szSendGen.bedienobj:" << szSendGen.bedienobj << ", szSendGen.fktscodesp" << szSendGen.fktscodesp << ", szSendGen.param:" << szSendGen.param;
- string str = buffer.str();
- SendTelegramLog("SBEDSP", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- PRINTA_INFO("=== Send GenData == fktscodegen:%d,param:%d\n", nFunctionID, nGenData);
- delete[] sCommmand;
- sCommmand = NULL;
- return true;
- }
- /*********************************************************************************
- 函数名称:SetFilter
- 功能描述:设置Filter参数
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetFilter(int nFilterType)
- {
- GetFacFilterValue(nFilterType);
- m_stGenCommand.id = SBEDSTRM;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- sbedstrm_t1_tag szSendGen = {};
- szSendGen.bedeinh = DFR_BEDIENUNG;
- szSendGen.bedienobj = SELEKTIONSTASTEN;
- szSendGen.fktscodestrm = FILTER_EINFAHREN;
- switch (nFilterType)
- {
- case GEN_FILTER_CU_0:
- szSendGen.param = 0; // Cu_00mm;
- break;
- case GEN_FILTER_CU_1:
- szSendGen.param = 1;// Cu_01mm;
- break;
- case GEN_FILTER_CU_2:
- szSendGen.param = 2;// Cu_02mm;
- break;
- case GEN_FILTER_CU_3:
- szSendGen.param = 3;// Cu_03mm;
- break;
- default:
- szSendGen.param = 0;// Cu_00mm;
- break;
- }
- szSendGen.dummy1 = 0;
- szSendGen.dummy2 = 0;
- szSendGen.header = m_stGenCommand;
- //CString strLog = "";
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- PRINTA_INFO("IS: Filter param: %d\n", szSendGen.param);
- std::ostringstream buffer;
- buffer << "IS: Filter param:" << (int)szSendGen.param;
- string str = buffer.str();
- SendTelegramLog("SBEDSTRM", str.c_str(), m_stGenCommand.sender);
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:SetTubeLoad
- 功能描述:设置TubeLoad参数
- 对应需求:IS_rad_button_tube_load
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetTubeLoad(int nTubeLoad)
- {
- return SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, ROEHRENAUSLASTUNG, nTubeLoad);
- }
- /*********************************************************************************
- 函数名称:GetFacKvValue
- 功能描述:将设置的KV值映射到当前KV参数列表的位置
- 修改记录:
- 2021-04-21 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::GetFacKvValue(int& nkv)
- {
- if (nkv <= 0)
- {
- nkv = g_KV_List[0];
- return 0;
- }//ENDIF
- int nlength = static_cast <int>(g_KV_List.size());
- int nPos = 0;
- int nValue = 0;
- if (nkv <= g_KV_List[0])
- {
- nPos = 0;
- }
- else if (nkv >= g_KV_List[nlength - 1])
- {
- nPos = nlength - 1;
- }//endif
- else
- {
- for (int i = 0; i < nlength; i++)
- {
- if (i == nlength - 1)
- {
- nPos = i;
- break;
- }
- else
- {
- if ((nkv >= g_KV_List[i]) && (nkv < g_KV_List[i + 1]))
- {
- nPos = i;
- break;
- }//ENDIF
- }
- }
- }
- nkv = g_KV_List[nPos];
- return nPos;
- }
- /*********************************************************************************
- 函数名称:GetFacmSValue
- 功能描述:将设置的MS值映射到当前MS参数列表的位置
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::GetFacmSValue(int& nms)
- {
- if (nms <= 0)
- {
- nms = g_MS_List[0];
- return 0;
- }//ENDIF
- int nlength = static_cast<int> (g_MS_List.size());
- int nPos = 0;
- int nValue = 0;
- if (nms <= g_MS_List[0])
- {
- nPos = 0;
- }
- else if (nms >= g_MS_List[nlength - 1])
- {
- nPos = nlength - 1;
- }
- else
- {
- for (int i = 0; i < nlength; i++)
- {
- if (i == nlength - 1)
- {
- nPos = i;
- break;
- }
- else
- {
- if ((nms >= g_MS_List[i]) && (nms < g_MS_List[i + 1]))
- {
- nPos = i;
- break;
- }//ENDIF
- }//ENDIF
- }
- }
- nms = g_MS_List[nPos];
- return nPos;
- }
- /*********************************************************************************
- 函数名称:GetFacmASValue
- 功能描述:将设置的MAS值映射到当前MAS参数列表的位置
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::GetFacmAsValue(int& nmAs)
- {
- if (nmAs <= 0)
- {
- nmAs = g_MAS_List[0];
- return 0;
- }//ENDIF
- int nlength = static_cast<int> (g_MAS_List.size());
- int nPos = 0;
- int nValue = 0;
- if (nmAs <= g_MAS_List[0])
- {
- nPos = 0;
- }
- else if (nmAs >= g_MAS_List[nlength - 1])
- {
- nPos = nlength - 1;
- }
- else
- {
- for (int i = 0; i < nlength; i++)
- {
- if (i == nlength - 1)
- {
- nPos = i;
- break;
- }
- else
- {
- if ((nmAs >= g_MAS_List[i]) && (nmAs < g_MAS_List[i + 1]))
- {
- int nmAsMed = (g_MAS_List[i] + g_MAS_List[i + 1]) / 2;
- if (nmAs >= nmAsMed)
- {
- nPos = i + 1;
- }
- else
- {
- nPos = i;
- }
- break;
- }//ENDIF
- }//ENDIF
- }
- }
- nmAs = g_MAS_List[nPos];
- PRINTA_INFO("Set GetFacmAsValue: nlength: %d, nPos:%d,nmas: %d\n", nlength, nPos, nmAs);
- return nPos;
- }
- /*********************************************************************************
- 函数名称:GetFacDensityValue
- 功能描述:将设置的AECDensity值映射到当前AECDensity参数列表的位置
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::GetFacDensityValue(int& nDensity)
- {
- int nlength = static_cast<int> (g_AECDensity_List.size());
- int nPos = 0;
- int nValue = 0;
- if (nDensity <= g_AECDensity_List[0])
- {
- nPos = 0;
- }
- else if (nDensity >= g_AECDensity_List[nlength - 1])
- {
- nPos = nlength - 1;
- }
- else
- {
- for (int i = 0; i < nlength; i++)
- {
- if (i == nlength - 1)
- {
- nPos = i;
- break;
- }
- else
- {
- if ((nDensity >= g_AECDensity_List[i]) && (nDensity < g_AECDensity_List[i + 1]))
- {
- nPos = i;
- break;
- }//ENDIF
- }//ENDIF
- }
- }
- nDensity = g_AECDensity_List[nPos];
- return nPos;
- }
- /*********************************************************************************
- 函数名称:GetFacAECDoseValue
- 功能描述:将设置的AECDOSE值映射到当前AECDOSE参数列表的位置
- 参数内容:实际值*100
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::GetFacAECDoseValue(int& nAECDose)
- {
- int nlength = static_cast<int> (g_AECDOSE_List.size());
- int nPos = 0;
- int nValue = 0;
- if (nAECDose <= g_AECDOSE_List[0])
- {
- nPos = 0;
- }
- else if (nAECDose >= g_AECDOSE_List[nlength - 1])
- {
- nPos = nlength - 1;
- }
- else
- {
- for (int i = 0; i < nlength; i++)
- {
- if (i == nlength - 1)
- {
- nPos = i;
- break;
- }
- else
- {
- if ((nAECDose >= g_AECDOSE_List[i]) && (nAECDose < g_AECDOSE_List[i + 1]))
- {
- nPos = i;
- break;
- }
- }//ENDIF
- }
- }
- nAECDose = g_AECDOSE_List[nPos];
- return nPos;
- }
- /*********************************************************************************
- 函数名称:GetFacFilterValue
- 功能描述:将设置的Filter值映射到当前Filter参数列表的位置
- 参数内容:实际值*10
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::GetFacFilterValue(int& nFilter)
- {
- int nlength = static_cast<int> (g_FILTER_List.size());
- int nPos = 0;
- int nValue = 0;
- if (nFilter <= g_FILTER_List[0])
- {
- nPos = 0;
- }
- else if (nFilter >= g_FILTER_List[nlength - 1])
- {
- nPos = nlength - 1;
- }
- else
- {
- for (int i = 0; i < nlength; i++)
- {
- if (i == nlength - 1)
- {
- nPos = i;
- break;
- }
- else
- {
- if ((nFilter <= g_FILTER_List[i]) && (nFilter < g_FILTER_List[i + 1]))
- {
- nPos = i;
- break;
- }//endif
- }
- }//ENDIF
- }
- nFilter = g_FILTER_List[nPos];
- return nPos;
- }
- /*********************************************************************************
- 函数名称:OrthoWSUI2Gen
- 功能描述:切换workstations从UI到XCU,用于映射对应的workstation值
- 修改记录:
- 2021-04-21 创建
- *******************************************************************************/
- void nsGEN::SMZDevice::OrthoWSUI2Gen(int nUIWS, int& nGenWS)
- {
- try
- {
- if (nUIWS == WS_TABLE) //lying: cross mode
- {
- nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoTable"]);
- }
- else if (nUIWS == WS_WALL) //standing mode
- {
- nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoWall"]);
- }
- else if (nUIWS == WS_FREE) //mobile mode
- {
- nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoFree"]);
- }
- else if (nUIWS == WS_TOMO) //tomo mode
- {
- nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoFree"]);
- }
- else if (nUIWS == WS_CONVENTIONAL) //Conventional table
- {
- nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoConventional"]);
- }
- else
- {
- nGenWS = (int)(m_GenConfig["WorkStation"]["OrthoFree"]);
- }
- }
- catch (ResDataObjectExption& exp)
- {
- PRINTA_ERROR("Get configuration failed, %s\n", exp.what());
- }
- PRINTA_INFO("Ortho Set WS: %d,Generator workstaion: %d\n", nUIWS, nGenWS);
- }
- /*********************************************************************************
- 函数名称:SwitchGridFocusECOM2SIEMENSORTHO
- 功能描述:切换workstations从UI到XCU,用于映射对应的workstation值
- 修改记录:
- 2021-04-21 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::SwitchGridFocusECOM2SIEMENSORTHO(int nWS, int nECOMGridType)
- {
- int nSiemensGridType = GRID_FOCUS_NOGRID;
- switch (nECOMGridType)
- {
- case GRID_FOCUS_UNIVERSAL:
- {
- if (nWS == WS_TABLE)
- {
- nSiemensGridType = ORTHO_GRID_FOCUS_UNIVERSAL_TABLE_SIEMSN;
- }
- else if (nWS == WS_WALL)
- {
- nSiemensGridType = ORTHO_GRID_FOCUS_UNIVERSAL_WALL_SIEMENS;
- }
- break;
- }
- case GRID_FOCUS_1800:
- if (nWS == WS_TABLE)
- {
- nSiemensGridType = ORTHO_GRID_FOCUS_1800;
- }
- else if (nWS == WS_WALL)
- {
- nSiemensGridType = ORTHO_GRID_FOCUS_1800_WALL_SIEMENS;
- }
- break;
- default:
- nSiemensGridType = nECOMGridType;
- break;
- }
- if ((nWS != WS_TABLE) && (nWS != WS_WALL))
- {
- nSiemensGridType = GRID_FOCUS_NOGRID; //Siemens要求:在free和casste模式下,不设置Gridtype;
- }
- return nSiemensGridType;
- }
- /*********************************************************************************
- 函数名称:TurnOffFDCRequest
- 功能描述: 确认探测器Turnoff请求
- 修改记录:
- 2021-04-25 创建
- *******************************************************************************/
- void nsGEN::SMZDevice::TurnOffFDCRequest()
- {
- if (m_pFDCAxnClient)
- {
- inlist_red_t1 inlistRedObj = {};
- int no_objects_p = 0;
- inlist_red_t2* pinlist_red_t2_p = NULL;
- unsigned int iObjectSize = sizeof(*pinlist_red_t2_p) * no_objects_p;
- inlistRedObj.header.length = (int)(sizeof(inlistRedObj)) + iObjectSize;
- inlistRedObj.header.mode = ACS_MODE_FUNCTIONAL;
- inlistRedObj.header.target = ACS_NO_TARGET;
- inlistRedObj.header.group_index = 0x01;
- inlistRedObj.header.sender = FDC_Controlsender;
- inlistRedObj.header.id = INLIST_RED;
- inlistRedObj.no_objects = (ACS_DCOUNT)no_objects_p;
- // Allocate memory for the data to be sent.
- ACS_BYTE* pDataForSending = new ACS_BYTE[inlistRedObj.header.length * 2];
- if (pDataForSending == NULL)
- {
- //DO NOTHING
- }//ENDIF
- // Copy all objects together in a continous section of memory.
- ACS_BYTE* pCh = pDataForSending;
- memcpy(pCh, &inlistRedObj, sizeof(inlistRedObj));
- pCh += sizeof(inlistRedObj);
- memcpy(pCh, pinlist_red_t2_p, iObjectSize);
- // Send the resulting memory section.
- ACS_ENUM axnResult = CAxnClientIF::sendObjectToServer(pDataForSending);
- // Release memory.
- delete[] pDataForSending;
- pDataForSending = NULL;
- pCh = NULL;
- if (axnResult != ACS_AXN_OK)
- {
- // Error while sending.
- }//ENDIF
- PRINTA_INFO("Turnoff FDC request\n");
- }//ENDIF
- }
- /*********************************************************************************
- 函数名称:SendIasuStatus
- 功能描述:设置当前系统状态到XCU端
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendIasuStatus(int nDRStatus, int nRFStatus)
- {
- iasustatus_t1_tag szSendGen = {};
- m_stGenCommand.id = IASUSTATUS;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_BYTE) + 2 * sizeof(ACS_DUMMY);
- szSendGen.dfraufnbereit = nDRStatus;
- szSendGen.dfrdlbereit = nDRStatus;
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- std::ostringstream buffer;
- buffer << "IS: dfraufnbereit: " << (int)szSendGen.dfraufnbereit << ",dfrdlbereit: " << (int)szSendGen.dfrdlbereit;
- string str = buffer.str();
- SendTelegramLog("IASUSTATUS", str.c_str(), m_stGenCommand.sender,0);
- }//ENDIF
- PRINTA_INFO("== SEND == : IASUSTATUS dfraufnbereit: %d, dfrdlbereit:%d\n", nDRStatus, nRFStatus);
- return true;
- }
- RET_STATUS nsGEN::SMZDevice::SetExpEnable() //202110 对外接口
- {
- PRINTA_INFO("SetExpEnable\n");
- if (m_bCalibMode)
- {
- if (m_bGetIGENANZ)
- {
- EnableExposure(1);
- m_bGetIGENANZ = false;
- PRINTA_INFO("SetExpEnable: Set EnableExposure");
- }
- else
- {
- m_bSetEnable = true;
- }
- }
- else
- {
- EnableExposure(1);
- }
- PRINTA_INFO("SetExpEnable: m_bCalibMode: %d, m_bSetEnable: %d, m_bGetIGENANZ: %d\n",(int)m_bCalibMode,(int)m_bSetEnable,(int)m_bGetIGENANZ);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetExpDisable() //202110 对外接口
- {
- PRINTA_INFO("SetExpDisable\n");
- m_bSetEnable = false;
- if (((int)m_DoseUnit.m_GenState->Get() != (int)AttrKey::GENERATOR_STATUS_ERROR))
- {
- EnableExposure(0);
- }
- else
- {
- PRINTA_INFO("SetExpDisable,the same disable status from Axim,don't send disable status to Axim\n");
- }
- return RET_STATUS::RET_SUCCEED;
- }
- /*********************************************************************************
- 函数名称:SendSAUSLBED
- 功能描述:设置当前工作模式(主要设置到自动校正),手闸按下
- 对应需求:IS_Service_xrayrelease
- 修改记录:
- 2015-04-20 创建
- 2017-01-04 改进代码风格
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendSAUSLBED(bool bEnable) //202110 对外接口
- {
- if (bEnable)
- {
- PRINTA_INFO("SAUSLBED 0,1,1\n");
- }
- else
- {
- PRINTA_INFO("SAUSLBED 0,0,0\n");
- }
- sauslbed_t1_tag szSendGen = {};
- m_stGenCommandFDC.id = SAUSLBED;
- m_stGenCommandFDC.length = m_wHeaderLength + 3 * sizeof(ACS_ENUM) + sizeof(ACS_BYTE);
- m_stGenCommandFDC.mode = Clientmode;
- m_stGenCommandFDC.sender = FDC_Controlsender;
- m_stGenCommandFDC.group_index = Clientgroup_index;
- m_stGenCommandFDC.target = Clienttarget;
- szSendGen.header = m_stGenCommandFDC;
- szSendGen.bedeinh = SERVICEPC;
- if (bEnable)
- {
- szSendGen.dl = AUS;
- szSendGen.vorbereitung = EIN;//一档
- szSendGen.hk = EIN;//二档
- }
- else
- {
- szSendGen.dl = AUS;
- szSendGen.vorbereitung = AUS;//一档
- szSendGen.hk = AUS;//二档
- }
- ACS_BYTE* sCommmand = new ACS_BYTE[m_stGenCommandFDC.length * 2];
- memset(sCommmand, 0, m_stGenCommandFDC.length * sizeof(ACS_BYTE) * 2);
- memcpy(sCommmand, &m_stGenCommandFDC, 8);
- memcpy(sCommmand + 8, &szSendGen.bedeinh, sizeof(ACS_ENUM));
- memcpy(sCommmand + 9, &szSendGen.dl, sizeof(ACS_BYTE));
- memcpy(sCommmand + 10, &szSendGen.vorbereitung, sizeof(ACS_BYTE));
- memcpy(sCommmand + 11, &szSendGen.hk, sizeof(ACS_BYTE));
- if (m_pFDCAxnClient != NULL)
- {
- m_pFDCAxnClient->sendObject(sCommmand);
- std::ostringstream buffer;
- buffer << "IS:sender: " << (int)m_stGenCommandFDC.sender << ",dl: " << (int)szSendGen.dl
- << ", vorbereitung: " << (int)szSendGen.vorbereitung << ", hk: " << (int)szSendGen.hk;
- string str = buffer.str();
- SendTelegramLog("SAUSLBED", str.c_str(), m_stGenCommand.sender,0);
- }//ENDIF
- delete[] sCommmand;
- sCommmand = NULL;
- PRINTA_INFO("== SEND == : SAUSLBED in SendSAUSLBED()\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SendIDETEKTORSTATUS
- 功能描述: 设置探测器Ready状态到XCU
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendIDETEKTORSTATUS(int nDetectorStatus) //202110 对外接口 开窗
- {
- idetektorstatus_t1 szSendGen = {};
- m_stGenCommand.id = IDETEKTORSTATUS;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_BYTE) + 3 * sizeof(ACS_DUMMY);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- szSendGen.detstatus = DET_AUFNAHMEBEREIT;
- szSendGen.header = m_stGenCommand;
- m_FPDGUnit->OnXrayStatus(false);
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- SendTelegramLog("IDETEKTORSTATUS","", m_stGenCommand.sender);
- }//ENDIF
- PRINTA_INFO("== SEND == : IDETEKTORSTATUS\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SetProgramList
- 功能描述:设置view到XCU端
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetProgramList(int nCount, int nOrganIndex, string& OrginName, int nDefaultWS) //202110 对外接口
- {
- sprogramlist_t1_tag szSendGen = {};
- m_stGenCommand.id = SPROGRAMLIST;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_INT) + 4 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_WORD) + sizeof(ACS_DCOUNT) + PROGRAM_NAME_LENGTH * sizeof(ACS_STRING); //send one by one
- szSendGen.header = m_stGenCommand;
- szSendGen.obj_count = nOrganIndex; //2015.5.6
- szSendGen.exam_index = EXAM_SET_NRF;
- szSendGen.prog_name_usage = EXAM_SET;
- szSendGen.update_last_selection = ACS_NO_INFORMATION;
- szSendGen.no_prog_name = 1/*nCount*/;//view name
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommand.length * 2];
- memset(p_ID, 0, m_stGenCommand.length * sizeof(ACS_BYTE) * 2);
- memcpy((ACS_BYTE*)p_ID,
- (ACS_BYTE*)(&szSendGen),
- m_wHeaderLength + sizeof(ACS_INT) + 2 * sizeof(ACS_ENUM) + sizeof(ACS_WORD) + sizeof(ACS_DCOUNT));
- int nDefaultWS2TUI = nDefaultWS;
- WSUI2TUI(nDefaultWS, nDefaultWS2TUI);
- sprogramlist_t2_tag szSendGen2 = {};
- szSendGen2.prog_info = nDefaultWS2TUI;
- szSendGen2.prog_executed = ACS_NO;
- szSendGen2.organ_index = abs(nOrganIndex);
- memset(szSendGen2.program_name, 0, PROGRAM_NAME_LENGTH * sizeof(ACS_STRING));
- int nOrginNameLength = (int)sizeof(OrginName);
- wstring wstrOrginName = mb2wc(OrginName.c_str());
- if (nOrginNameLength > PROGRAM_NAME_LENGTH)
- {
- nOrginNameLength = PROGRAM_NAME_LENGTH;
- }
- for (int j = 0; j < nOrginNameLength; j++)
- {
- szSendGen2.program_name[j] = wstrOrginName[j];
- }
- memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_INT) + 2 * sizeof(ACS_ENUM) + sizeof(ACS_WORD) + sizeof(ACS_DCOUNT)),
- (ACS_BYTE*)(&szSendGen2),
- (2 * sizeof(ACS_ENUM) + sizeof(ACS_WORD) + PROGRAM_NAME_LENGTH * sizeof(ACS_STRING)));
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)p_ID);
- std::ostringstream buffer;
- buffer << "IS:obj_count: " << (int)szSendGen.obj_count << ",prog_info: " << szSendGen2.prog_info
- << ", organ_index: " << (int)szSendGen2.organ_index << ", OrginName: " << OrginName;
- string str = buffer.str();
- SendTelegramLog("SPROGRAMLIST", str.c_str(), m_stGenCommand.sender,0);
- }//ENDIF
- delete[] p_ID;
- p_ID = NULL;
- PRINTA_INFO("== SEND == : SPROGRAMLIST(count:%d,organ_index:%d,prog_info: %d)\n", nCount, nOrganIndex, nDefaultWS2TUI);
- return true;
- }
- /*********************************************************************************
- 函数名称:SetOrgNameStatus
- 功能描述:设置OrgName状态
- 对应需求:IS_acim_x_ray_ready_all(VERSION_RAD3-VA10)
- 修改记录:
- 2021-04-22 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SetOrgNameStatus(float fOrgStatus) //202110 对外接口 SHO
- {
- sh_organ_prog_t1_tag SendOrgNameStatus = {};
- m_stGenCommand.id = SH_ORGAN_PROG;
- m_stGenCommand.target = ClientPMS;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_ENUM) + 3 * sizeof(ACS_DUMMY);
- SendOrgNameStatus.header = m_stGenCommand;
- switch ((int)fOrgStatus)
- {
- case STATUS_NOREADY:
- SendOrgNameStatus.acknowledge = ACS_NOK;
- break;
- case STATUS_READY:
- SendOrgNameStatus.acknowledge = ACS_OK;
- break;
- default:
- break;
- }
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&SendOrgNameStatus);
- std::ostringstream buffer;
- buffer << "IS: SendOrgNameStatus.acknowledge:" << (int)SendOrgNameStatus.acknowledge;
- string str = buffer.str();
- SendTelegramLog("SH_ORGAN_PROG", str.c_str(), m_stGenCommand.sender, 0);
- }//ENDIF
- m_stGenCommand.target = Clienttarget;
- PRINTA_INFO("== SEND == : SetOrgNameStatus: fOrgStatus: %d, acknowledge:%d\n", (int)fOrgStatus, SendOrgNameStatus.acknowledge);
- return true;
- }
- /*********************************************************************************
- 函数名称:EnableExposure
- 功能描述:接收到DROC允许曝光消息,通知XCU
- 对应需求:IS_Examination_StopConditions
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::EnableExposure(int nEnable)
- {
- PRINTA_INFO("EnableExposureNotice XCU:%d\n", nEnable);
- SendIasuStatus(nEnable, nEnable);
- Sleep(50);
- SendIdfrStatus(nEnable, nEnable);
- //if (nEnable == STATUS_READY)
- //{
- // SendIasuStatus(JA, JA);
- // Sleep(50);
- // SendIdfrStatus(JA, JA);
- //}//ENDIF
- //else
- //{
- // SendIasuStatus(NEIN, NEIN);
- // Sleep(50);
- // SendIdfrStatus(NEIN, NEIN);
- //}
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackTurnOn
- 功能描述:对TurnOn消息进行反馈处理
- 修改记录:
- 2021-4-21 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackTurnOn(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null\n");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- PRINTA_DEBUG("callback Turn on : object_id: %x\n", object_id);
- std::ostringstream buffer;
- buffer << "object_id:" << (int)object_id;
- string str = buffer.str();
- SendTelegramLog("TURN_ON", str.c_str(), object_id);
- //if ((object_id == Clientsender) || (object_id == Clienttarget) || (object_id == FDC_Controlsender))
- //{
- //}
- if (object_id == Clienttarget)
- {
- SendIdent();
- string code = "TurnOff";
- string info = "";
- int level = CONNECTIONERROR;
- m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackTurnOff
- 功能描述: 解析当前关闭状态信息(turn off message)
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackTurnOff(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null\n");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- PRINTA_DEBUG("callback Trun Off : object_id: %x\n", object_id);
- std::ostringstream buffer;
- buffer << "object_id:" << std::hex << (int)object_id << "h";
- string str = buffer.str();
- SendTelegramLog("TURN_OFF", str.c_str(), object_id);
- string code = "";
- string info = "";
- int level = 0;
- if (object_id == Clienttarget)//XCU
- {
- if (m_bIdentStatus)
- {
- TimeOutWaring();
- EnterCriticalSection(&m_csStatus);
- m_bIdentStatus = false;
- m_bReGetTurnOn = true;
- LeaveCriticalSection(&m_csStatus);
- PRINTA_INFO("callback: Get Client sender, m_bIdentStatus = false,m_bReGetTurnOn = true\n");
- code = "TurnOff";
- info = "Lost communication to generator, Please reboot the system.";
- level = CONNECTIONERROR;
- m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(), 0xF3);
- }//ENDIF
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackGenParam
- 功能描述: 解析当前系统的曝光参数
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::CallbackGenParam(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null\n");
- return 0;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE nET = (ACS_BYTE)(*(stmpBuffer + 8));
- ACS_BYTE nNumberexposurecurve = (ACS_BYTE)(*(stmpBuffer + 9));
- unsigned short* temp;
- temp = (unsigned short*)(stmpBuffer + 10);
- unsigned short wKV = *temp;
- ACS_LINT wMAS = *((ACS_LINT*)(stmpBuffer + 12));
- ACS_LINT wMS = *((ACS_LINT*)(stmpBuffer + 16));
- ACS_BYTE wFO = (ACS_BYTE)(*(stmpBuffer + 20));
- ACS_BYTE wTubeLoad = (ACS_BYTE)(*(stmpBuffer + 21));
- PRINTA_INFO("Received APR Param:kv:%d, MAS:%d,MS:%d,FO:%d,ET:%d,TubeLoad:%d,Numberexposurecurve:%d\n",
- (int)wKV, (int)wMAS, (int)wMS, (int)wFO, (int)nET, (int)wTubeLoad, (int)nNumberexposurecurve);
- std::ostringstream buffer;
- buffer << "Received APR Param:kv:" << (int)wKV << ",MAS :" << (int)wMAS << ",MS:" << (int)wMS << ",FO:" << (int)wFO << ",ET:" << (int)nET << ",TubeLoad:" << (int)wTubeLoad
- << ",Numberexposurecurve:" << (int)nNumberexposurecurve;
- string str = buffer.str();
- SendTelegramLog("IGENANZ", str.c_str(), object_id);
- //KV
- m_DoseUnit.m_KV->Update((float)((wKV) / 10.0));
- //FOCUS
- switch (wFO)
- {
- case KLEINER_FOKUS:
- m_DoseUnit.m_Focus->Update(FOCUS_SMALL);
- break;
- case GROSSER_FOKUS:
- m_DoseUnit.m_Focus->Update(FOCUS_LARGE);
- break;
- case _3_FOKUS:
- m_DoseUnit.m_Focus->Update(FOCUS_SMALL);
- break;
- case AUTOFOCUS:
- m_DoseUnit.m_Focus->Update(FOCUS_SMALL);
- break;
- default:
- break;
- }
- //Tech Mode
- switch (nET)
- {
- case _0_PUNKT_TECHNIK:
- break;
- case _1_PUNKT_TECHNIK:
- m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_1P);
- break;
- case _1_PUNKT_TECHNIK_RED_STROM:
- m_DoseUnit.m_Techmode->Update(TECHMODE_AEC_1P_REDUCEMA);
- break;
- case _2_PUNKT_TECHNIK:
- m_DoseUnit.m_Techmode->Update(TECHMODE_NOAEC_2P);
- break;
- case _3_PUNKT_TECHNIK:
- m_DoseUnit.m_Techmode->Update(TECHMODE_NOAEC_3P);
- break;
- case _3_PUNKT_T_MIT_IONT:
- break;
- default:
- break;
- }
- m_DoseUnit.m_MAS->Update((float)((wMAS) / 100.0f));
- m_DoseUnit.m_MS->Update((float)((wMS) / 10.0f));
- if (m_DoseUnit.m_MS->Get() > 0)
- {
- int nMA = (int)((m_DoseUnit.m_MAS->Get() * 1000) / m_DoseUnit.m_MS->Get());
- m_DoseUnit.m_MA->Update((float)nMA);
- }
- else
- {
- m_DoseUnit.m_MA->Update(0);
- m_DoseUnit.m_MS->Update(0);
- PRINTA_INFO("CallbackGenParam: Get MS is not illegality\n");
- }
- FireNotify(m_DoseUnit.m_KV->GetKey(), m_DoseUnit.m_KV->JSGet());
- FireNotify(m_DoseUnit.m_Focus->GetKey(), m_DoseUnit.m_Focus->JSGet());
- FireNotify(m_DoseUnit.m_Techmode->GetKey(), m_DoseUnit.m_Techmode->JSGet());
- FireNotify(m_DoseUnit.m_MAS->GetKey(), m_DoseUnit.m_MAS->JSGet());
- FireNotify(m_DoseUnit.m_MS->GetKey(), m_DoseUnit.m_MS->JSGet());
- m_FPDGUnit->OnAPRms(m_DoseUnit.m_MS->Get());
- if (m_bSetAPR)
- {
- m_bSetAPR = false;
- if (m_bCalibMode)
- {
- if (m_bSetEnable)
- {
- EnableExposure(1);
- m_bSetEnable = false;
- PRINTA_INFO("CallbackIGENANZ: Set EnableExposure");
- }
- else
- {
- m_bGetIGENANZ = true;
- }
- }
- }
- PRINTA_INFO("IGENANZ: m_bSetAPR:%d,m_bCalibMode: %d, m_bSetEnable: %d, m_bGetIGENANZ: %d\n",
- (int)m_bSetAPR, (int)m_bCalibMode, (int)m_bSetEnable, (int)m_bGetIGENANZ);
- PRINTA_INFO("Processed APR Param m_fKV:%f,m_fMAS: %f, m_fMS: %f, m_nFo: %d,m_nET:%d,wTubeLoad:%d\n",
- m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MAS->Get(), m_DoseUnit.m_MS->Get(),(int)m_DoseUnit.m_Focus->Get(),(int)m_DoseUnit.m_Techmode->Get());
- return 1;
- }
- /*********************************************************************************
- 函数名称:CallbackIFILTERANZParam
- 功能描述: 解析现场的Filter信息
- 修改记录:
- 2021-04-21 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackIFILTERANZParam(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null\n");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE nFilter = (ACS_BYTE)(*(stmpBuffer + 9));
- ACS_BYTE nFilterStatus = (ACS_BYTE)(*(stmpBuffer + 10));
- std::ostringstream buffer;
- buffer << "nFilter:" << (int)nFilter << ",nFilterStatus:" << (int)nFilterStatus;
- string str = buffer.str();
- SendTelegramLog("IFILTERANZ", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackErrorParam
- 功能描述: 解析错误信息,目前仅用作记录
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackErrorParam(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null\n");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE nYear = (*(ACS_BYTE*)(stmpBuffer + 8));
- ACS_BYTE nMonth = (*(ACS_BYTE*)(stmpBuffer + 9));
- ACS_BYTE nDay = (*(ACS_BYTE*)(stmpBuffer + 10));
- ACS_BYTE nHour = (*(ACS_BYTE*)(stmpBuffer + 11));
- ACS_BYTE nMinute = (*(ACS_BYTE*)(stmpBuffer + 12));
- ACS_BYTE nSecond = (*(ACS_BYTE*)(stmpBuffer + 13));
- ACS_BYTE nCentisecond = (*(ACS_BYTE*)(stmpBuffer + 14));
- ACS_DWORD nErrorCode = (*(ACS_DWORD*)(stmpBuffer + 16));
- ACS_BYTE nPID = (*(ACS_BYTE*)(stmpBuffer + 20));
- ACS_ENUM nErrorType = (*(ACS_ENUM*)(stmpBuffer + 21));
- ACS_BYTE nSender = (*(ACS_BYTE*)(stmpBuffer + sizeof(ACS_WORD) + 3 * sizeof(ACS_BYTE)));
- //Error count
- ACS_WORD errcnt = (*(ACS_WORD*)(stmpBuffer + 22 + (FEHLERTEXT2_LENGTH + ADDTEXT2_LENGTH) * sizeof(ACS_STRING)));
- if ((m_nLastErrorCount > errcnt) && (nSender == Clienttarget))
- {
- PRINTA_WARN("Current XCS Error is small than software Error number: LastErrorCount: %d,errcnt:%d\n", m_nLastErrorCount, errcnt);
- if (errcnt == 0)
- {
- m_nLastErrorCount = 0;
- }
- return true;
- }//ENDIF
- if (nSender == Clienttarget)
- {
- m_nErrorCount = errcnt;
- }
- //fehlertext2
- ACS_STRING* tempfehlertext2 = (ACS_STRING*)(pCommand + 22);
- ACS_STRING* strfehlertext2 = new ACS_STRING[(FEHLERTEXT2_LENGTH + 1) * 2];
- memset(strfehlertext2, 0, (FEHLERTEXT2_LENGTH + 1) * sizeof(ACS_STRING) * 2);
- ACS_STRING* tempStrfehlertext2 = strfehlertext2;
- for (int i = 0; i < FEHLERTEXT2_LENGTH; i++, tempStrfehlertext2++, tempfehlertext2++)
- {
- *tempStrfehlertext2 = *(ACS_STRING*)(tempfehlertext2);
- }
- strfehlertext2[FEHLERTEXT2_LENGTH] = '\0';
- string strfehlertext2FromT = wc2mb((const wchar_t*)strfehlertext2);
- //addtext2
- ACS_STRING* tempaddtext2 = (ACS_STRING*)(pCommand + 22 + FEHLERTEXT2_LENGTH * sizeof(ACS_STRING));
- ACS_STRING* straddtext2 = new ACS_STRING[(ADDTEXT2_LENGTH + 1) * 2];
- memset(straddtext2, 0, (ADDTEXT2_LENGTH + 1) * sizeof(ACS_STRING) * 2);
- ACS_STRING* tempStraddtext2 = straddtext2;
- for (int i = 0; i < (ADDTEXT2_LENGTH); i++, tempStraddtext2++, tempaddtext2++)
- {
- *tempStraddtext2 = *(ACS_STRING*)(tempaddtext2);
- }
- straddtext2[ADDTEXT2_LENGTH] = '\0';
- string straddtext2FromT = wc2mb((const wchar_t*)straddtext2);
- PRINTA_WARN("fehlertext2:%s,addtext2:%s\n", strfehlertext2FromT.c_str(), straddtext2FromT.c_str());
- delete[] strfehlertext2;
- strfehlertext2 = NULL;
- tempStrfehlertext2 = NULL;
- delete[] straddtext2;
- straddtext2 = NULL;
- tempStraddtext2 = NULL;
- //string strLogType;
- //strLogType = SwitchCategory2Str(nErrorType);
- //int nLogType;
- //nLogType = SwitchCategory2ECOM(nErrorType);
- int nPosition = string::npos;
- nPosition = strfehlertext2FromT.find("[AUDIT]", 0);
- if ((ClientPMS == nSender)&&(nErrorType == BEDIENEVENT) && (nPosition == 0))
- {
- char strTime[20] = "";
- sprintf_s(strTime, "20%02d%02d%02d%02d%02d%02d%03d", (int)nYear,(int)nMonth,(int)nDay,(int)nHour,(int)nMinute, (int)nSecond, (int)nCentisecond*10);
- AuditMessage(strTime, strfehlertext2FromT.c_str());
- }
- std::ostringstream buffer;
- buffer << "fehlernummer_long:"<< (unsigned long)nErrorCode<<", apid:"<< std::hex << (int)nPID <<"h, category:"<< (int)nErrorType <<"h, fehlertext2:" << strfehlertext2FromT.c_str() << ", addtext2:" << straddtext2FromT.c_str()<<";";
- string str = buffer.str();
- char strErrorCode[20] = "";
- sprintf_s(strErrorCode, "%lu", nErrorCode);
- SendTelegramLog("IERRORLOG2", str.c_str(), nPID,1, SwitchCategory2ECOM(nErrorType), strErrorCode);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackAufnAusl
- 功能描述: 解析当前的手闸状态信息
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackAufnAusl(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE vorbereitung = (ACS_BYTE)(*(stmpBuffer + 8));
- ACS_BYTE hauptkontakt = (ACS_BYTE)(*(stmpBuffer + 9));
- ACS_BYTE strahlgbereit = (ACS_BYTE)(*(stmpBuffer + 10));
- ACS_DWORD acq_index = (*(ACS_DWORD*)(pCommand + 12));
- PRINTA_INFO("pre-contact:%d,main-contact:%d,readyExposure:%d, index: %lu\n", vorbereitung, hauptkontakt, strahlgbereit, acq_index);
- std::ostringstream buffer;
- buffer << "pre-contact:" << (int)vorbereitung << ", main-contact:" << (int)hauptkontakt << ", readyExposure:"
- << (int)strahlgbereit << ",index:" << (int)acq_index;
- string str = buffer.str();
- SendTelegramLog("SAUFNAUSL", str.c_str(), object_id);
- if (vorbereitung == EIN) //one switch
- {
- if (strahlgbereit == AUS)
- {
- if (m_bExposureStatus)
- {
- PRINTA_INFO("Current status is exposure, omit this command\n");
- }
- else
- {
- //if (m_DoseUnit.m_WS->Get() != WS_CONVENTIONAL)
- {
- m_bExposureStatus = true;
- m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_PREPARE);
- FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- PRINTA_INFO("<GEN EXP>pre-contact ,prep ok, set GENERATOR_RAD_PREPARE\n"); //one switch
- }
- }
- }
- else if (strahlgbereit == EIN)
- {
- if (hauptkontakt == AUS)
- {
- PRINTA_INFO("<GEN EXP> No main-contact ,prep ok,the generator ready \n");
- }
- else if (hauptkontakt == EIN)
- {
- //if (m_DoseUnit.m_WS->Get() == WS_CONVENTIONAL)
- //{
- // m_bExposureStatus = true;
- // m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_PREPARE);
- // FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- // PRINTA_INFO("<GEN EXP>main-contact ,casset mode ,set GENERATOR_RAD_PREPARE\n"); //one switch
- //}
- PRINTA_INFO("<GEN EXP> main-contact,prep ok,the generator ready \n");
- }
- }
- return true;
- }//ENDIF
- if ((hauptkontakt == AUS) && (vorbereitung == AUS) && (strahlgbereit == AUS)) // two switch release
- {
- m_bExposureStatus = false;
- m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
- FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- PRINTA_INFO("<GEN EXP>the generator handswitch release\n");
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackSBILD
- 功能描述: image display on imaging system, sent from XCU to DFR or camera
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackSBILD(ACS_BYTE* pCommand) //remove this telegram at VE62P
- {
- //if (pCommand == NULL)
- //{
- // PRINTA_INFO("Get command is Null\n");
- // return false;
- //}//ENDIF
- //ACS_BYTE* stmpBuffer = pCommand;
- //ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- //ACS_ENUM avr_request = (ACS_ENUM)(*(stmpBuffer + 10));
- //if (avr_request == FESTVERSTAERKUNG_1)
- //{
- // PRINTA_INFO("CallbackSBILD:set patient success\n");
- //}//ENDIF
- //ACS_ENUM nZoom = (ACS_ENUM)(*(stmpBuffer + 11));
- //PRINTA_INFO("CallbackSBILD:Format:%d\n", nZoom);
- //std::ostringstream buffer;
- //buffer << "CallbackSBILD:Format:" << (int)nZoom;
- //string str = buffer.str();
- //SendTelegramLog("SBILD", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackSORGANSELECT
- 功能描述: 解析当前SORGANSELECT报文,当前选中view
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackSORGANSELECT(ACS_BYTE* pCommand) //20220326 don't get the telegram
- {
- sorganselect_t1_tag* SelectCurrentOrg;
- SelectCurrentOrg = (sorganselect_t1_tag*)pCommand;
- m_nCurrentViewNumber = SelectCurrentOrg->alt_index;
- m_nTargetViewNumber = SelectCurrentOrg->organ_index;
- PRINTA_DEBUG("CurrentView:%d,TargetView:%d\n", m_nCurrentViewNumber, m_nTargetViewNumber);
- SendTelegramLog("SORGANSELECT");
- if (m_nTargetViewNumber == 0) //0 means No information
- {
- PRINTA_WARN("Get organ_index = 0, mean No information, return\n");
- return true;
- }
- if (m_bSelectORG)
- {
- Sleep(10); //等待OGPWorkThread线程起来
- SetEvent(m_hGenSelectOGPEvent); //select OGP success; 20160721
- PRINTA_INFO("SORGANSELECT:: m_nAPRCommandSynFlag = %d\n", m_nAPRCommandSynFlag);
- if (m_nAPRCommandSynFlag == 2)
- {
- //202110
- SendOrthoLocalParam(AprParamBackup.nWS,
- AprParamBackup.fKV,
- AprParamBackup.fMA,
- AprParamBackup.fMS,
- AprParamBackup.fMAS,
- AprParamBackup.nFocus,
- AprParamBackup.nTechmode,
- AprParamBackup.nAECField,
- AprParamBackup.nAECFilm,
- AprParamBackup.nAECDensity);
- if (m_bGenService)
- {
- Sleep(50);
- //202110
- SendOrthoLocalParam(AprParamBackup.nWS,
- AprParamBackup.fKV,
- AprParamBackup.fMA,
- AprParamBackup.fMS,
- AprParamBackup.fMAS,
- AprParamBackup.nFocus,
- AprParamBackup.nTechmode,
- AprParamBackup.nAECField,
- AprParamBackup.nAECFilm,
- AprParamBackup.nAECDensity,ClientPMS);
- }//ENDIF
- EnterCriticalSection(&m_csStatus);
- m_nAPRCommandSynFlag = 0;//reset
- LeaveCriticalSection(&m_csStatus);
- PRINTA_INFO("Callback SORGANSELECT,SetAPR,m_nAPRCommandSynFlag = %d\n", m_nAPRCommandSynFlag);
- }
- else if (m_nAPRCommandSynFlag == 1)
- {
- EnterCriticalSection(&m_csStatus);
- m_nAPRCommandSynFlag++;//reset
- LeaveCriticalSection(&m_csStatus);
- PRINTA_INFO("IN SORGANSELECT:: m_nAPRCommandSynFlag++, m_nAPRCommandSynFlag = %d\n", m_nAPRCommandSynFlag);
- }
- }
- else
- {
- PRINTA_INFO("Get select per view command from TUI\n");
- }
- return true;
- }
- //typedef struct sh_list_t1_tag
- //{
- //acs_obj_header_t header; /* Object-Header */
- //ACS_INT obj_count; /* number of objects, 1..(n-1), -n (minus = last one) */
- //ACS_WORD ref_object_id; /* ID of the object to that this list refers (e.g. SH_UI_BSR or SH_UI_XCU) */
- //ACS_WORD sel_func; /* function to be selected; all values are defined in an additional include file */
- //ACS_WORD min_list_index; /* Index (0,...) in the list of the minimum selectable value */
- //ACS_WORD max_list_index; /* Index (0,...) in the list of the maximum selectable value */
- /*********************************************************************************
- 函数名称:CallBackShowList
- 功能描述: 解析当前的参数范围信息
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackShowList(const ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null\n");
- return false;
- }//ENDIF
- ACS_INT obj_count = 0;
- ACS_WORD temp = 0;
- int nFuncID = 0;
- int ref_object_id = 0xFFFF;
- int nMinPos = 0;
- int nMaxPos = 0;
- int nstrListNumber = 0;
- ACS_BYTE object_id = (*(ACS_BYTE*)(pCommand + 5)); //sender
- obj_count = *(ACS_INT*)(pCommand + 8);
- temp = *(ACS_WORD*)(pCommand + 10);
- ref_object_id = temp;
- temp = *(ACS_WORD*)(pCommand + 12);
- nFuncID = temp;
- temp = *(ACS_WORD*)(pCommand + 14);
- nMinPos = temp;
- temp = *(ACS_WORD*)(pCommand + 16);
- nMaxPos = temp;
- nstrListNumber = *(ACS_DCOUNT*)(pCommand + 16 + sizeof(ACS_WORD) + sizeof(ACS_DUMMY) * 8);
- try {
- PRINTA_INFO("obj_count:%d, ref_object_id:%x, FuncID:%d, MinPos:%d, MaxPos:%d\n", obj_count, ref_object_id, nFuncID, nMinPos, nMaxPos);
- std::ostringstream buffer;
- buffer << "obj_count:" << obj_count << ", ref_object_id :" << ref_object_id << ", FuncID :" << nFuncID << ", MinPos :" << nMinPos << ", MaxPos :" << nMaxPos;
- string str = buffer.str();
- SendTelegramLog("SH_LIST", str.c_str(), object_id);
- //以下单位转换来源于实际报文定义
- switch (nFuncID)
- {
- case AXCS_ACQ_KV:
- {
- if (ref_object_id == 0xFFFF)
- {
- if (g_KV_List.size() < nMinPos)
- {
- m_fKVmin = ((float)(g_KV_List[g_KV_List.size() - 1])) / 10.0f;
-
- }
- else
- {
- m_fKVmin = ((float)(g_KV_List[nMinPos - 1])) / 10.0f;
- }
- if (g_KV_List.size() < nMaxPos)
- {
- m_fKVmax = ((float)(g_KV_List[g_KV_List.size() - 1])) / 10.0f;
- }
- else
- {
- m_fKVmax = ((float)(g_KV_List[nMaxPos - 1])) / 10.0f;
- }
- float* fKV_List = new float[g_KV_List.size() + 1];
- int nLength = 0;
- for (int i = 0; i <= nMaxPos - nMinPos; i++)
- {
- fKV_List[i] = (float)g_KV_List[i + nMinPos-1] / 10.0f;
- nLength++;
- }
- RefreshParameterList("KVList", fKV_List, nLength, m_fKVmax, m_fKVmin);
- delete[] fKV_List;
- PRINTA_INFO("AXCS_ACQ_KV:m_fKVmin:%f,nMinPos:%d,m_fKVmax:%f,nMaxPos:%d,KVvector size:%d\n",m_fKVmin, nMinPos, m_fKVmax, nMaxPos, g_KV_List.size());
- }
- else
- {
- if (abs(obj_count) == 1)
- {
- g_KV_List.clear();
- }
- char* strInfo = new char[(STRING_FIX_LENGTH + 1)];
- for (int i = 0; i < nstrListNumber; i++)
- {
- memset(strInfo, 0, (STRING_FIX_LENGTH + 1) * sizeof(char));
- ACS_STRING* strtemp = (ACS_STRING*)(pCommand + sizeof(sh_list_t1_tag) + i * sizeof(sh_list_t2_tag) + sizeof(ACS_WORD));
- for (int j = 0; j < (STRING_FIX_LENGTH); j++)
- {
- strInfo[j] = strtemp[j];
- }
- float fTemp = atof(strInfo);
- g_KV_List.push_back(fTemp * 10);
- }
- delete[] strInfo;
- strInfo = NULL;
- if (obj_count <= 0)
- {
- m_fKVmax = (float)g_KV_List[nMaxPos - 1] / 10.0f;
- m_fKVmin = (float)g_KV_List[nMinPos - 1] / 10.0f;
- //for (int i = 0; i < nMaxPos; i++)
- // PRINTA_DEBUG("g_KV_List:%d,sizeof:%d,i: %d\n", g_KV_List[i], g_KV_List.size(), i);
- float* fKV_List = new float[g_KV_List.size() + 1];
- int nLength = 0;
- for (int i = 0; i <= nMaxPos - nMinPos; i++)
- {
- fKV_List[i] = (float)g_KV_List[i] / 10.0f;
- nLength++;
- }
- RefreshParameterList("KVList", fKV_List, nLength, m_fKVmax, m_fKVmin);
- /*for (int i = 0; i < nLength; i++)
- {
- PRINTA_DEBUG("fKV_List:%f,i:%d\n", fKV_List[i], nLength);
- }*/
-
- delete[] fKV_List;
- }
- }
- break;
- }
- case AXCS_ACQ_MAS:
- {
- if (ref_object_id == 0xFFFF)
- {
- if (g_MAS_List.size() < nMinPos)
- {
- m_fMASmin = ((float)(g_MAS_List[g_MAS_List.size() - 1])) / 1000.0f;
- }
- else
- {
- m_fMASmin = ((float)(g_MAS_List[nMinPos - 1])) / 1000.0f;
- }
- if (g_MAS_List.size() < nMaxPos)
- {
- m_fMASmax = ((float)(g_MAS_List[g_MAS_List.size() - 1])) / 1000.0f;
- }
- else
- {
- m_fMASmax = ((float)(g_MAS_List[nMaxPos - 1])) / 1000.0f;
- }
- float* fMAS_List = new float[g_MAS_List.size() + 1];
- int nLength = 0;
- for (int i = 0; i <= nMaxPos - nMinPos; i++)
- {
- fMAS_List[i] = (float)g_MAS_List[i+ nMinPos-1] / 1000.0f;
- nLength++;
- }
- RefreshParameterList("MASList", fMAS_List, nLength, m_fMASmax, m_fMASmin);
- delete[] fMAS_List;
- PRINTA_INFO("AXCS_ACQ_MAS: m_fmAsmin:%f,nMinPos:%d,m_fmAsmax:%f,nMaxPos:%d,MASVector size:%d\n",m_fMASmin, nMinPos, m_fMASmax, nMaxPos, g_MAS_List.size());
- }
- else
- {
- if (abs(obj_count) == 1)
- {
- g_MAS_List.clear();
- }
- char* strInfo = new char[(STRING_FIX_LENGTH + 1)];
- for (int i = 0; i < nstrListNumber; i++)
- {
- memset(strInfo, 0, (STRING_FIX_LENGTH + 1) * sizeof(char));
- ACS_STRING* strtemp = (ACS_STRING*)(pCommand + sizeof(sh_list_t1_tag) + i * sizeof(sh_list_t2_tag) + sizeof(ACS_WORD));
- for (int j = 0; j < (STRING_FIX_LENGTH); j++)
- {
- strInfo[j] = strtemp[j];
- }
- float fTemp = atof(strInfo);
- g_MAS_List.push_back(fTemp * 1000);
- }
- delete[] strInfo;
- strInfo = NULL;
- if (obj_count <= 0)
- {
- m_fMASmax = (float)g_MAS_List[nMaxPos - 1] / 1000.0f;
- m_fMASmin = (float)g_MAS_List[nMinPos - 1] / 1000.0f;
- //for (int i = 0; i < nMaxPos; i++)
- // PRINTA_DEBUG("g_MAS_List:%d,sizeof:%d,i:%d\n", g_MAS_List[i], g_MAS_List.size(), i);
- float* fMAS_List = new float[g_MAS_List.size() + 1];
- int nLength = 0;
- for (int i = 0; i <= nMaxPos - nMinPos; i++)
- {
- fMAS_List[i] = (float)g_MAS_List[i] / 1000.0f;
- nLength++;
- }
- RefreshParameterList("MASList", fMAS_List, nLength, m_fMASmax, m_fMASmin);
- /*for (int i = 0; i < nLength; i++)
- {
- PRINTA_DEBUG("fMAS_List:%f,i:%d\n", fMAS_List[i], nLength);
- }*/
- delete[] fMAS_List;
- }
- }
- break;
- }
- case AXCS_ACQ_MS:
- {
- if (ref_object_id == 0xFFFF)
- {
- if (g_MS_List.size() < nMinPos)
- {
- m_fMSmin = ((float)(g_MS_List[g_MS_List.size() - 1])) / 1000.0f;
- }
- else
- {
- m_fMSmin = ((float)(g_MS_List[nMinPos - 1])) / 1000.0f;
- }
- if (g_MS_List.size() < nMaxPos)
- {
- m_fMSmax = ((float)(g_MS_List[g_MS_List.size() - 1])) / 1000.0f;
- }
- else
- {
- m_fMSmax = ((float)(g_MS_List[nMaxPos - 1])) / 1000.0f;
- }
- PRINTA_INFO("AXCS_ACQ_MS: m_fmsmin:%f,nMinPos:%d,m_fmsmax:%f,nMaxPos:%d, MsVector size:%d\n",m_fMSmin, nMinPos, m_fMSmax, nMaxPos, g_MS_List.size());
- }
- else
- {
- if (abs(obj_count) == 1)
- {
- g_MS_List.clear();
- }
- char* strInfo = new char[(STRING_FIX_LENGTH + 1)];
- for (int i = 0; i < nstrListNumber; i++)
- {
- memset(strInfo, 0, (STRING_FIX_LENGTH + 1) * sizeof(char));
- ACS_STRING* strtemp = (ACS_STRING*)(pCommand + sizeof(sh_list_t1_tag) + i * sizeof(sh_list_t2_tag) + sizeof(ACS_WORD));
- for (int j = 0; j < (STRING_FIX_LENGTH); j++)
- {
- strInfo[j] = strtemp[j];
- }
- float fTemp = atof(strInfo);
- g_MS_List.push_back(fTemp * 1000);
- }
- delete[] strInfo;
- strInfo = NULL;
- /*if (obj_count <= 0)
- {
- for (int i = 0; i < nMaxPos; i++)
- PRINTA_DEBUG("g_MS_List:%d,sizeof:%d,i:%d\n", g_MS_List[i], g_MS_List.size(), i);
- }*/
- }
- break;
- }
- default:
- PRINTA_INFO("obj_count: %d,nFuncID :%d,nMinPos:%d,nMaxPos:%d\n",
- obj_count, nFuncID, nMinPos, nMaxPos);
- break;
- }
- }
- catch (...)
- {
- PRINTA_ERROR("Crash CallBackShowList log\n");
- }
- return true;
- }
- //Description: this function presents how to get the AEC field and film from telegrams.
- /*********************************************************************************
- 函数名称:CallbackGetField
- 功能描述: 解析AEC Field信息
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackGetField(const ACS_BYTE* pCommand)
- {
- return true;
- }
- //Description: this function presents how to get the post exposure parameters from telegrams.
- //ACS_INT kvist; /* Actual voltage of fluoroscopy or exposure, told by generator */
- //ACS_LINT masist; /* mAs value of last exposure */
- //ACS_LINT msist; /* duration of last exposure */
- /*********************************************************************************
- 函数名称:CallbackPostGenParam
- 功能描述: 解析曝光Post参数
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- int nsGEN::SMZDevice::CallbackPostGenParam(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return 0;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- int nTempMAS = (*(long*)(stmpBuffer + 8));
- int nTempMS = (*(long*)(stmpBuffer + 12));
- int nTempKV = (*(short*)(stmpBuffer + 16));
- ACS_DWORD acq_index = (*(ACS_DWORD*)(pCommand + 8 + sizeof(ACS_LINT) * 2 + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_INT) + 3 * sizeof(ACS_BYTE)));
- PRINTA_INFO("== IN ==: CallbackPostGenParam begin kv:%d,wMAS: %d, wMS: %d\n", nTempKV, nTempMAS, nTempMS);
- //KV
- m_DoseUnit.m_PostKV->Update((float)((nTempKV) / 10.0));
- FireNotify(m_DoseUnit.m_PostKV->GetKey(), m_DoseUnit.m_PostKV->JSGet());
- //MAS
- m_DoseUnit.m_PostMAS->Update((float)((nTempMAS) / 100.0));
- FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
- //MS
- m_DoseUnit.m_PostMS->Update((float)((nTempMS) / 10.0));
- FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
- //MA
- if (m_DoseUnit.m_PostMS->Get() > 0)
- {
- m_DoseUnit.m_PostMA->Update(m_DoseUnit.m_PostMAS->Get() * 1000.0/m_DoseUnit.m_PostMS->Get());
- FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
- }
- else
- {
- m_DoseUnit.m_PostMA->Update(0);
- FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
- m_DoseUnit.m_PostMS->Update(0);
- FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
- PRINTA_INFO("Get PostMS is less than 0\n");
- }
- PRINTA_INFO("== IN ==: CallbackPostGenParam PostKV:%f,PostMAS: %f, PostMS: %f, PostMA: %f\n", m_DoseUnit.m_PostKV->Get(), m_DoseUnit.m_PostMAS->Get(), m_DoseUnit.m_PostMS->Get(), m_DoseUnit.m_PostMA->Get());
- std::ostringstream buffer;
- buffer << "kv:" << nTempKV << ",MAS:" << nTempMAS << ",MS:"
- << nTempMS << ",index:" << (int)acq_index;
- string str = buffer.str();
- SendTelegramLog("INACHANZ", str.c_str(), object_id);
- return 1;
- }
- //Description: this function presents how to get the information message from telegrams.
- /*********************************************************************************
- 函数名称:CallBackIdrallganz2
- 功能描述: 解析错误信息,并发给UI进行显示 无CodeID,只有内容
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackIdrallganz2(const ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE object_id = (*(ACS_BYTE*)(pCommand + 5)); //sender
- ACS_ENUM nFunction = (ACS_ENUM)(*(pCommand + 8));
- ACS_BYTE nCommand = *((ACS_BYTE*)(pCommand + 9));
- ACS_BYTE ndisp_style = *((ACS_BYTE*)(pCommand + 12));
- ACS_STRING* temp = (ACS_STRING*)(pCommand + 16);
- ACS_STRING* strInfo = new ACS_STRING[(TEXT_LENGTH + 1) * 2]; //记录日志信息
- if (strInfo != NULL)
- {
- memset(strInfo, 0, (TEXT_LENGTH + 1) * sizeof(ACS_STRING) * 2);
- }
- else
- {
- return false;
- }
- ACS_STRING* tempStr = strInfo;
- for (int i = 0; i < TEXT_LENGTH; i++, tempStr++, temp++)
- {
- *tempStr = *(ACS_STRING*)(temp);
- }
- strInfo[TEXT_LENGTH] = '\0';
- string strInfoDisplayFromT = wc2mb((const wchar_t*)strInfo);
- PRINTA_INFO("CallBackIDFRALLGANZ2: %s\n", strInfoDisplayFromT.c_str());
- string code = "Info";
- int level = AUTOCLEARERROR;
- if (nCommand == ACS_SET_DISPLAY)
- {
- m_MSGUnit->AddWarnMessage(code.c_str(), level, strInfoDisplayFromT.c_str(), object_id); //将消息显示到界面
- }
- else if (nCommand == ACS_CLEAR_DISPLAY)
- {
- m_MSGUnit->DelWarnMessage(code.c_str(), level, strInfoDisplayFromT.c_str()); //清除界面消息
- }
-
- delete[] strInfo;
- strInfo = NULL;
- std::ostringstream buffer;
- buffer << "FunctionID:" << (int)nFunction << ", nCommand:" << (int)nCommand << ", ndisp_style:"
- << (int)ndisp_style << ", Content:" << strInfoDisplayFromT.c_str();
- string str = buffer.str();
- SendTelegramLog("IDFRALLGANZ2", str.c_str(), object_id);
- return true;
- }
- //Description: this function presents how to get the error message from telegrams.
- /*********************************************************************************
- 函数名称:CallBackIfehleranz2
- 功能描述: 获取当前的错误信息,并发给UI进行显示
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackIfehleranz2(const ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE object_id = (*(ACS_BYTE*)(pCommand + 5)); //sender
- ACS_DWORD nFunction = (*(ACS_DWORD*)(pCommand + 8));
- ACS_BYTE apid = *((ACS_BYTE*)(pCommand + 12));
- ACS_ENUM category = *((ACS_ENUM*)(pCommand + 13)); //属性
- //string strAPid = ""; //2021-04 待完善功能:需要设置到UI端
- char strAPid[50] = "";
- sprintf_s(strAPid, "%d", apid);
- char strSiemensCode[50] = "";
- sprintf_s(strSiemensCode, "%lu", nFunction);
- ACS_STRING* temp = (ACS_STRING*)(pCommand + 14);
- ACS_STRING* strInfo = new ACS_STRING[(FEHLERTEXT2_LENGTH + 1) * 2];
- memset(strInfo, 0, (FEHLERTEXT2_LENGTH + 1) * sizeof(ACS_STRING) * 2);
- ACS_STRING* tempStr = strInfo;
- for (int i = 0; i < FEHLERTEXT2_LENGTH; i++, tempStr++, temp++)
- {
- *tempStr = *(ACS_STRING*)(temp);
- }
- strInfo[FEHLERTEXT2_LENGTH] = '\0';
- const string strDisplayError = wc2mb((const wchar_t*)strInfo);
- //PRINTA_INFO(strDisplayError.c_str());
- //按照SSME要求,增加code和ID码 仅对应0x02\0x03\0x04
- char strTemp[50] = "";
- sprintf_s(strTemp, "%lu/%d: ", nFunction, apid); //Error 为英文 Siemens要求 //2021-04 待完善功能:需要设置到UI端
- string strDisplayErrorTemp = strTemp + strDisplayError;
- //end
- /*string strLogType = "";
- strLogType = SwitchCategory2Str(category);*/
- std::ostringstream buffer;
- buffer << "FunctionID:" << (unsigned long)nFunction << ", apid:" << std::hex << (int)apid << "h, category:"
- << (int)category << "h, Content:" << strDisplayError.c_str();
- string str = buffer.str();
- /*SendTelegramLog("IFEHLERANZ2", str.c_str(), 1, strLogType.c_str());*/
- SendTelegramLog("IFEHLERANZ2", str.c_str(), object_id,1, SwitchCategory2ECOM(category));
- PRINTA_INFO("CallBackIfehleranz2: %s,category:%x, objectID: %x\n", strDisplayErrorTemp.c_str(), category,object_id);
- if (nFunction == 0)
- {
- if (strDisplayError.empty())
- {
- PRINTA_INFO("CallBackIfehleranz2: Get SiemensCode:%s, and FEHLERTEXT2 is empty, direct return;\n", strSiemensCode);
- delete[] strInfo;
- return true;
- }
- else
- {
- sprintf_s(strSiemensCode, "%s", "FFFFFFFF"); //将code = 0转化为不可能提供的ID,设置到客户端,规避客户端对code为0 时全清错误消息的情况;
- PRINTA_INFO("CallBackIfehleranz2: Get fehlernummer_long: %lu,switch 0 to SiemensCode:%s, and FEHLERTEXT2 is not empty;\n", nFunction,strSiemensCode);
- }
- }
- //string code = "0";
- string info = "";
- int level = 0;
- //#define CONNECTIONERROR 1
- //#define UNCLEARERROR 2
- //#define CLEARERROR 3
- //#define AUTOCLEARERROR 4
- switch (category)
- {
- case MSGBOX_NO_OK_NO_TUI:
- case ORTHOMESSAGE: //Notify
- //level = CLEARERROR;
- //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), object_id);
- break;
- case USERMESSAGE: //WarnMessage
- level = CLEARERROR;
- m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), apid);
- break;
- case RESET_USERMSG_LEGACY:
- case TELEGRAM:
- case ACS_FLAG_RESET: //InfoMessage
- //level = CLEARERROR;
- //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), object_id);
- break;
- case WARNUNG: //WarnMessage
- //level = CLEARERROR;
- //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), object_id);
- break;
- case BEHEB_FEHLER:
- level = MESSAGEBOX_CLEARERROR;
- m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), apid);
- break;
- case NICHT_BEHEB_FEHLER:
- level = NOCLEARERROR;
- m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), apid);
- break;
- case FATALER_FEHLER: //ERROR
- //level = CLEARERROR;
- //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), object_id);
- break;
- case RESET_WARNING:
- {
- //PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_WARNING\n");
- //level = CLEARERROR;
- //m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
- break;
- }
- case RESET_ERROR: //RESET ERROR
- {
- PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_ERROR\n");
- level = MESSAGEBOX_CLEARERROR;
- m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
- break;
- }
- case RESET_SEVERE:
- {
- PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_SEVERE\n");
- level = NOCLEARERROR;
- m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
- break;
- }
- case RESET_FATAL: //RESET FATAL
- {
- //PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_FATAL\n");
- //level = CLEARERROR;
- //m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
- break;
- }
- case RESET_USERMESSAGE://RESET USEMESSAGE
- {
- PRINTA_ERROR("== CallBackIfehleranz2 ==:RESET_USERMESSAGE\n");
- level = CLEARERROR;
- m_MSGUnit->DelWarnMessage(strSiemensCode, level, info.c_str());
- break;
- }
- case RESET_TELEGRAM:
- break;
- case RESET_MSGBOX:
- break;
- case RESET_ORTHOMSG:
- break;
- case ACS_FLAG_YESNO:
- break;
- default:
- break;
- }
- delete[] strInfo;
- strInfo = NULL;
- tempStr = NULL;
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackIINFOCOMP
- 功能描述: 收集当前组件的版本信息(collected SW/FW-versions of all components)
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackIINFOCOMP(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE backup_set = (*(ACS_BYTE*)(stmpBuffer + 8));
- ACS_COUNT apanzahl = (*(ACS_COUNT*)(stmpBuffer + 9));
- for (int i = 0; i <= apanzahl; i++)
- {
- ACS_BYTE APID = (*(ACS_BYTE*)(pCommand + i * 5 + 10));
- ACS_BYTE anzahlkenndaten = (*(ACS_BYTE*)(pCommand + i * 5 + 11));
- ACS_BYTE kenndatum_id = (*(ACS_BYTE*)(pCommand + i * 5 + 12));
- ACS_BYTE anzahlkenneintr = (*(ACS_BYTE*)(pCommand + i * 5 + 13));
- ACS_STRING_8 kenneintrag = (*(ACS_STRING_8*)(pCommand + i * 5 + 14));
- PRINTA_INFO("APID = %d,anzahlkenndaten = %d,kenndatum_id = %d,anzahlkenneintr = %d,kenneintrag = %s\n",
- APID, anzahlkenndaten, kenndatum_id, anzahlkenneintr, kenneintrag);
- }
- SendTelegramLog("IINFOCOMP");
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackST_MODE
- 功能描述: 解析当前的工作模式(当前仅用service)
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackST_MODE(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_INFO("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE System_Mode = (*(ACS_ENUM*)(stmpBuffer + 8)); //System_mode(1-7)
- ACS_DUMMY dummy1 = (*(ACS_DUMMY*)(stmpBuffer + 9)); //System_mode(1-7)
- int nCode = 1;
- if (System_Mode == ACS_SERVICE)
- {
- nCode = 2;
- }//ENDIF
- m_UIClientUnit.m_STM->Update(nCode);
- FireNotify(m_UIClientUnit.m_STM->GetKey(), m_UIClientUnit.m_STM->JSGet());
- SetSH_Mode(System_Mode);
- PRINTA_INFO("callback ST_MODE: %d,dummy1:%d\n", System_Mode, dummy1);
- std::ostringstream buffer;
- buffer << "ST_MODE:" << (int)System_Mode << ",dummy1:" << dummy1;
- string str = buffer.str();
- SendTelegramLog("ST_MODE", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSDFRNAHBED2
- 功能描述: 解析SDFRNAHBED2;(1、当前的病人信息(体型);2、当前DROC界面)
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSDFRNAHBED2(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_INFO("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_ENUM reply_req = (*(ACS_ENUM*)(stmpBuffer + 8));
- ACS_INT aktcode = (*(ACS_INT*)(stmpBuffer + 12));
- ACS_INT aktdata = (*(ACS_INT*)(stmpBuffer + 14)); //0=No Action / 1=Pat / 2=Exam / 3=Postproc / 4=Doc
- int nTabCard = 0;
- int nStatus = 0;
- if (aktcode == TABCARD_TOGGLE)
- {
- nTabCard = (int)aktdata;
- m_UIClientUnit.m_SDF->Update(nTabCard);
- FireNotify(m_UIClientUnit.m_SDF->GetKey(), m_UIClientUnit.m_SDF->JSGet());
- }
- else if (aktcode == BTN_PATIENT_SIZE) //callback Patient size
- {
- //1: large; 2: Medium; 3:Small; 4;Custom define APR
- //不处理
- PRINTA_INFO("CallBackSDFRNAHBED2 Patient size: aktcode: %d,aktdata:%d\n", aktcode, aktdata);
- }
- else if (aktcode == REFRESH_ORGAN_PROGRAM/*REDO_ORGAN_PROGRAM*/) //根据siemens要求,更改对应的报文内容
- {
- if ((int)aktdata == 1)
- {
- nStatus = 1;
- //PRINTA_INFO("Undo"); //需要设置消息到界面
- }
- else
- {
- nStatus = 0;
- //PRINTA_INFO("No Undo");
- }
- m_UIClientUnit.m_UDO->Update(nStatus);
- FireNotify(m_UIClientUnit.m_UDO->GetKey(), m_UIClientUnit.m_UDO->JSGet());
- }
- else if (aktcode == TOD)
- {
- SendIdfrnahbed(TOD, (int)aktdata);
- }
- if (m_nGenSTMode == ACS_SERVICE)
- {
- if (nTabCard == 2) //Siemens 要求 表示进入服务模式
- {
- m_bGenService = true;
- }
- else if (nTabCard == 1)//Siemens 要求 表示退出服务模式
- {
- m_bGenService = false;
- }
- }//ENDIF
- PRINTA_INFO("CallBackSDFRNAHBED2: reply_req:%d,aktcode: %d,aktdata:%d,TableCard: %d\n", reply_req, aktcode, aktdata, nTabCard);
- std::ostringstream buffer;
- buffer << "aktcode:" << aktcode << ", aktdata:" << aktdata;
- string str = buffer.str();
- SendTelegramLog("SDFRNAHBED2", str.c_str(), object_id);
- return true;
- }
- //ST_ORGAN_PROG: tell DROC to which OGP will be used in the next acquisition.
- /*********************************************************************************
- 函数名称:CallBackST_ORGAN_PROG
- 功能描述: 返回当前使用的view名称
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackST_ORGAN_PROG(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_INFO("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_STRING* temp = (ACS_STRING*)(pCommand + 8);
- ACS_STRING* str = new ACS_STRING[(PROG_NAME_LENGTH + 1) * 2];
- memset(str, 0, (PROG_NAME_LENGTH + 1) * sizeof(ACS_STRING) * 2);
- ACS_STRING* tempStr = str;
- for (int i = 0; i < PROG_NAME_LENGTH; i++, tempStr++, temp++)
- {
- *tempStr = *(ACS_STRING*)(temp);
- }
- str[PROG_NAME_LENGTH] = '\0';
- string strDisplayOrganProg = wc2mb((const wchar_t*)str);
- //m_pGenSiemensSalmon_UI->UIClientUnitLogic::GetSOP(strDisplayOrganProg.c_str()); //待完善
- //ResDataObject resdata;
- //resdata.update("SOP", strDisplayOrganProg.c_str());
- m_UIClientUnit.m_SOP->Update(strDisplayOrganProg.c_str());
- FireNotify(m_UIClientUnit.m_SOP->GetKey(), m_UIClientUnit.m_SOP->JSGet());
- delete[] str;
- str = NULL;
- tempStr = NULL;
- PRINTA_INFO("CallBackST_ORGAN_PROG: prog_name : %s\n", strDisplayOrganProg.c_str());//Warn
- std::ostringstream buffer;
- buffer << "prog_name:" << strDisplayOrganProg;
- string strlog = buffer.str();
- SendTelegramLog("ST_ORGAN_PROG", strlog.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSRESETFEHLER
- 功能描述: reset当前DROC错误状态
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSRESETFEHLER(ACS_BYTE* pCommand)
- {
- //add code, send the reset message to UI, then close the error box;
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSID
- 功能描述: 解析SID信息
- 对应需求:IS_rad_SID(VERSION_RAD3-VA10)
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSID(ACS_BYTE* pCommand) //receive SID "IFFA", unit: mm
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("CallBackSID: Get pCommand is NULL");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_INT nSID = (*(ACS_INT*)(stmpBuffer + 8));
- //m_SiemensSalmon_Element[CMD_ELEMENT_SID].fGetValue = nSID; //202110 待完善
- //m_pCollimatorCommunication->CollimatorLogic::SetCollimatorSID(m_SiemensSalmon_Element[CMD_ELEMENT_SID].fGetValue);
- PRINTA_INFO("CallBackSID: IFFA: %d mm\n", nSID);
- std::ostringstream buffer;
- buffer << "IFFA:" << (int)nSID;
- string str = buffer.str();
- SendTelegramLog("IFFA", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackWorkStation
- 功能描述:获取当前探测器对应的Workstation信息
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackWorkStationFromTUI(ACS_BYTE* pCommand) //receive System workstation SBEDSYS
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("CallBackWorkStation: Get pCommand is NULL");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_INT nFunctionParam = (*(ACS_INT*)(stmpBuffer + 10));
- ACS_INT nWorkStation = (*(ACS_INT*)(stmpBuffer + 12));
- int nWorkStationEcom;
- switch (nWorkStation)
- {
- case AXCS_MODE_SPOTFILM:
- nWorkStationEcom = WS_TABLE;
- break;
- case AXCS_MODE_BWS:
- nWorkStationEcom = WS_WALL;
- break;
- case AXCS_MODE_BED:
- nWorkStationEcom = WS_FREE;
- break;
- case AXCS_MODE_TOMO:
- nWorkStationEcom = WS_CONVENTIONAL;
- break;
- case AXCS_MODE_NONE:
- //break;
- default:
- nWorkStationEcom = WS_CONVENTIONAL;
- break;
- }
- PRINTA_INFO("CallBackWorkStation (SBEDSYS) from TUI: %d,ECOM: %d, FunctionNumber:%d\n", nWorkStation, nWorkStationEcom, nFunctionParam);
- std::ostringstream buffer;
- buffer << "From TUI fktscodesys: " << nWorkStation;
- string str = buffer.str();
- SendTelegramLog("SBEDSYS", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackCollimator
- 功能描述: 获取遮光器尺寸信息
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackCollimator(ACS_BYTE* pCommand) //receive collimator "IBLENDEANZ"
- {
- return true;
- if (pCommand == NULL)
- {
- PRINTA_ERROR("CallBackCollimator: Get pCommand is NULL");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_ENUM nCollimatorMode = (*(ACS_ENUM*)(stmpBuffer + 10));
- //m_pCollimatorCommunication->CollimatorLogic::SetCollimatorMode(nCollimatorMode); //202110 待完善
- ACS_COUNT nCollimatorNumber = (*(ACS_COUNT*)(stmpBuffer + 11));
- ACS_BYTE blendenauswahl = 0; //Collimator Cross or Length;
- ACS_WORD blendenposition = 0; //Current Position size
- ACS_BYTE blendenstatus = 0; //Collimator Status: moving or arrive status
- int niblendeanz_t2_tag_Length = sizeof(ACS_BYTE) * 2 + sizeof(ACS_DUMMY) * 2 + sizeof(ACS_WORD) + sizeof(ACS_INT);
- for (int i = 0; i < nCollimatorNumber; i++)
- {
- blendenauswahl = (*(ACS_BYTE*)(stmpBuffer + 12 + i * niblendeanz_t2_tag_Length));
- blendenposition = (*(ACS_WORD*)(stmpBuffer + 14 + i * niblendeanz_t2_tag_Length));
- blendenstatus = (*(ACS_BYTE*)(stmpBuffer + 18 + i * niblendeanz_t2_tag_Length));
- if (blendenauswahl == HOEHENBLENDE)
- {
- //m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORHEIGHT].fGetValue = (float)blendenposition / 100.0f; //cm //202110 待完善
- }
- else if (blendenauswahl == BREITENBLENDE)
- {
- //m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORWIDTH].fGetValue = (float)blendenposition / 100.0f; //cm //202110 待完善
- }
- else
- {
- PRINTA_INFO("Get Other Collimator value");
- }
- PRINTA_INFO("CallBackCollimator: Number: %d, Collimator Index:%d, Collimator type:%d (1:height;2:Length); Position:%d (mm), Status:%d,Length: %d, CollimatorMode: %d\n",
- nCollimatorNumber, i + 1, blendenauswahl, blendenposition, blendenstatus, niblendeanz_t2_tag_Length, nCollimatorMode);
- std::ostringstream buffer;
- buffer << "blendenauswahl:" << (int)blendenauswahl << ", blendenposition:" << (int)blendenposition
- << ", blendenstatus:" << (int)blendenstatus << ", CollimatorMode:" << (int)nCollimatorMode;
- string str = buffer.str();
- SendTelegramLog("IBLENDEANZ", str.c_str(), object_id);
- }
- //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnCollimatorWidth((float)m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORWIDTH].fGetValue); //202110 待完善
- //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnCollimatorLen((float)m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORHEIGHT].fGetValue); //202110 待完善
- //m_pCollimatorCommunication->CollimatorLogic::SetCollimatorSize((float)m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORWIDTH].fGetValue, (float)m_SiemensSalmon_Element[CMD_ELEMENT_COLLIMATORHEIGHT].fGetValue); //202110 待完善
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackGrid
- 功能描述: 获取滤线栅信息
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackGrid(ACS_BYTE* pCommand)
- {
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackRQ_FDR_DATA
- 功能描述: 获取对应探测器的workstation信息
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackRQ_FDR_DATA(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_ENUM nFPDType = (*(ACS_ENUM*)(stmpBuffer + 9));
- ACS_ENUM nFPDTag = (*(ACS_ENUM*)(stmpBuffer + 12));
- switch (nFPDTag)
- {
- case ACS_FDR_SERNUM: //VE61X
- switch (nFPDType)
- {
- case ACS_FD_TABLE:
- //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnWorkStation(WS_PARAM_TABLE_ECOM); //202110 待完善
- break;
- case ACS_FD_WALL:
- //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnWorkStation(WS_PARAM_WALL_ECOM); //202110 待完善
- break;
- case ACS_FD_PORTABLE:
- m_UIClientUnit.m_WS2FD->Update(WS_PARAM_FREE1_LARGE_ECOM);
- FireDataNotify(m_UIClientUnit.m_WS2FD->GetKey(), m_UIClientUnit.m_WS2FD->JSGet());
- break;
- case ACS_FD_SMALL_PORTABLE:
- m_UIClientUnit.m_WS2FD->Update(WS_PARAM_FREE2_SMALL_ECOM);
- FireDataNotify(m_UIClientUnit.m_WS2FD->GetKey(), m_UIClientUnit.m_WS2FD->JSGet());
- break;
- case ACS_FD_STAND:
- case ACS_FD_C_ARM:
- case ACS_FD_FLEXIBLE:
- default:
- break;
- }
- break;
- default:
- break;
- }
- PRINTA_INFO("CallbackRQ_FDR_DATA: FPDType:%d,FPDTag: %d\n", (int)nFPDType, (int)nFPDTag);
- std::ostringstream buffer;
- buffer << "nFPDType:" << (int)nFPDType << ",nFPDTag:" << (int)nFPDTag;
- string str = buffer.str();
- SendTelegramLog("RQ_FDR_DATA", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackAdjust
- 功能描述: PMS请求AP的读取或写入信息
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackAdjust(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_ENUM nAdjustAction = (*(ACS_ENUM*)(stmpBuffer + 8));
- ACS_INT nAdjustIdent = (*(ACS_INT*)(stmpBuffer + 10));
- PRINTA_INFO("Adjsut Action : %d, Identifier : %d, No Action\n", nAdjustAction, nAdjustIdent);
- return true;
- if ((nAdjustAction == ACS_ADJ_SUPPLY_DATA) && (nAdjustIdent == ACS_ADJUST_ID_FD_WLAN))
- {
- }
- else if ((nAdjustAction == ACS_ADJ_STORE_DATA) && (nAdjustIdent == ACS_ADJUST_ID_FD_WLAN))
- {
- //write AP
- SendAdjust(ACS_ADJ_FILETRANS_RUNNING);
- }//ENDIF
- std::ostringstream buffer;
- buffer << "Adjsut Action:" << (int)nAdjustAction << ", Identifier:" << (int)nAdjustIdent;
- string str = buffer.str();
- SendTelegramLog("ST_ADJUST", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackIGGANZ2
- 功能描述: 获取遮光器平移和探测器旋转状态
- 对应需求:IS_rad_stand_collimation_sym_asym_parameter、IS_Rotaion_portableDet_default_rotation(VERSION_RAD3-VA10)
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackIGGANZ2(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_COUNT nNumber = (*(ACS_COUNT*)(stmpBuffer + 11));
- for (int n = 0; n < nNumber; n++)
- {
- ACS_INT anzcode = (*(ACS_INT*)(stmpBuffer + 12 + n * 4));
- ACS_INT param = (*(ACS_INT*)(stmpBuffer + 14 + n * 4));
- switch (anzcode)
- {
- case A_POSSYS:
- //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnCollimatorAlign(param); //202110 待完善
- break;
- case A_DETECTOR_ORIENTATION:
- //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnPANEL_ROTATE(param); //202110 待完善
- break;
- case A_TIEFENBLENDE_GEDREHT: //遮光器旋转 //与102、17同为ACSS的条件,可以省略;目前先按照现有逻辑设置
- //m_pCollimatorCommunication->CollimatorLogic::SetCollimatorAngle((float)param);
- break;
- case A_TUBE_ROT_HOR: //球管旋转角度
- //m_data.m_gen.m_nmTubeRotHor = param; //球管旋转角度:单位未知 //2021-04-21 待完善功能:需要设置到UI端
- break;
- case A_ORTHO_STEP: //Ortho step
- //m_data.m_gen.m_nmCP_Position_Match = param; //2021-04-21 待完善功能:需要设置到UI端
- if (param >= 9)
- {
- //清除界面消息
- //m_data.m_gen.m_strsNotifyMessage = ""; //2021-04-21 待完善功能:需要设置到UI端
- }
- break;
- default:
- break;
- }
- PRINTA_INFO("CallBackIGGANZ2:nNumber: %d,n: %d,anzcode: %d,(90:CollimatorAlign; 92:collimator Rotate; 98:detector Orientation;114:Ortho Step; 17: A_TUBE_ROT_HOR); Param:%d\n",
- nNumber, n, anzcode, param);
- std::ostringstream buffer;
- buffer << "Number:" << (int)nNumber << ", n:" << n
- << ", anzcode:" << anzcode << ", Param:" << param;
- string str = buffer.str();
- SendTelegramLog("IGGANZ2", str.c_str(), object_id);
- }
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackTubeHeat
- 功能描述: 获取当前设备热容量
- 修改记录:
- 2021-04-22 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackTubeHeat(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE nTubeHeat = (*(ACS_BYTE*)(stmpBuffer + 8));
- ACS_WORD nWaitTime = (*(ACS_WORD*)(stmpBuffer + 10));
- m_DoseUnit.m_HE->Update(nTubeHeat);
- FireNotify(m_DoseUnit.m_HE->GetKey(), m_DoseUnit.m_HE->JSGet());
- PRINTA_INFO("CallBackTubeHeat(IROEANZ): TubeHeat: %d, nWaitTime:%d\n", nTubeHeat, nWaitTime);
- std::ostringstream buffer;
- buffer << "TubeHeat:" << (int)nTubeHeat << ", nWaitTime:" << nWaitTime;
- string str = buffer.str();
- SendTelegramLog("IROEANZ", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSTDIAG
- 功能描述: 接受当前系统需要查询版本的内容
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSTDIAG(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- int nidentifier = (*(ACS_INT*)(stmpBuffer + 10));
- //设置当前的状态信息到软件端
- m_UIClientUnit.m_RSI->Update(nidentifier);
- FireNotify(m_UIClientUnit.m_RSI->GetKey(), m_UIClientUnit.m_RSI->JSGet());
- SetSystemStatusInformation(nidentifier, "", ACS_DIAG_RUNNING);
- PRINTA_INFO("CallBackSTDIAG: nidentifier: %d\n", nidentifier);
- std::ostringstream buffer;
- buffer << "nidentifier:" << (int)nidentifier;
- string str = buffer.str();
- SendTelegramLog("ST_DIAG", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackRQOBJECT
- 功能描述: 接受当前系统需要查询的内容
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackRQOBJECT(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- //设置当前需要查询的模块版本信息到软件端
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_WORD wObject_id = (*(ACS_WORD*)(stmpBuffer + 8));
- if (wObject_id == SH_VERSION_CHECK)
- {
- int nCode = 0;
- m_UIClientUnit.m_RMV->Update(nCode);
- FireNotify(m_UIClientUnit.m_RMV->GetKey(), m_UIClientUnit.m_RMV->JSGet());
- }
- std::ostringstream buffer;
- buffer << "Object_id:" << wObject_id;
- string str = buffer.str();
- SendTelegramLog("RQ_OBJECT", str.c_str(), object_id);
- return true;
- }
- ///*********************************************************************************
- //函数名称:CallBackDoorStatus
- //功能描述: 解析门的开关状态
- //修改记录:
- //2021-04-23 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::CallBackDoorStatus(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//endif
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE nDoorStatus = (*(ACS_BYTE*)(stmpBuffer + 9));
- if (1 == nDoorStatus)
- {
- PRINTA_INFO("Door Close");
- }
- else if (2 == nDoorStatus)
- {
- PRINTA_INFO("Door Open ");
- }
- else
- {
- PRINTA_INFO("Door Status is unknown");
- }
- std::ostringstream buffer;
- buffer << "DoorStatus:" << (int)nDoorStatus;
- string str = buffer.str();
- SendTelegramLog("IALLGANZ", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSTCONFIG
- 功能描述: 获取并解析ST_CONFIG报文
- 参数记录:
- /* Parameter: cfg_action (Defines)
- /* ACS_CFG_SUPPLY_DATA 1 copy to the host
- /* ACS_CFG_STORE_DATA 2 copy from the host
- /* ACS_CFG_ABORT_DATA 3 abort
- /* ACS_CFG_COMPARE 4 compare config data
- /*修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSTCONFIG(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- int nconfigResult = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t))); //执行行为
- int nDummy1 = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DUMMY))); //执行行为
- PRINTA_INFO("CallBackSTCONFIG: nconfigResult: %d,Dummy1: %d\n", nconfigResult, nDummy1);
- if (nDummy1 != 0)
- {
- if (nDummy1 == 1)
- {
- if (nconfigResult == ACS_CFG_STORE_DATA)
- {
- m_UIClientUnit.m_CFM->Update(nDummy1); //1:AutoConfig; 2:Restore
- FireNotify(m_UIClientUnit.m_CFM->GetKey(), m_UIClientUnit.m_CFM->JSGet());//20220406 无法区分configration与backupstore流程
- }
- }
- else
- {
- m_UIClientUnit.m_CFM->Update(nDummy1); //1:AutoConfig; 2:Restore
- FireNotify(m_UIClientUnit.m_CFM->GetKey(), m_UIClientUnit.m_CFM->JSGet());//20220406 无法区分configration与backupstore流程
- }
- }
- std::ostringstream buffer;
- buffer << "cfg_action:" << nconfigResult << "Dummy1:" << nDummy1;
- string str = buffer.str();
- SendTelegramLog("ST_CONFIG", str.c_str(), object_id);
- if ((nconfigResult != ACS_CFG_STORE_DATA)||(nDummy1 != 1))
- //if (nDummy1 != 1)
- {
- SetSHCONFIG(ACS_OK); //20220402 由上层服务端给出配置文件处理结果
- }
-
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackST_PWR_OFF
- 功能描述:接收到关机报文
- 参数:Full_image_size、image_size、overlap、Image number
- 修改记录:
- 2021-4-21 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackST_PWR_OFF(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- int nECOMShutDown = 0;
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- int nShutDown = (*(ACS_ENUM*)(stmpBuffer + 8));
- int nDelay = (*(ACS_INT*)(stmpBuffer + 8 + sizeof(ACS_ENUM) + sizeof(ACS_DUMMY)));
- switch (nShutDown)
- {
- case ACS_REQ_PWR_OFF:
- nECOMShutDown = 1;
- break;
- case ACS_SHUTDOWN_APP:
- nECOMShutDown = 2;
- break;
- case ACS_PWR_OFF_CANCEL:
- nECOMShutDown = 0;
- break;
- default:
- break;
- }
- ResDataObject resdata;
- resdata.add("State", nECOMShutDown);
- resdata.add("DelayTime", nDelay);
- //EventCenter->OnNotify(8, "SDN", resdata.encode());
- m_UIClientUnit.m_SDN->Update(resdata.encode());
- FireDataNotify(m_UIClientUnit.m_SDN->GetKey(), m_UIClientUnit.m_SDN->JSGet());
- PRINTA_INFO("CallbackST_PWR_OFF shutdown: ECOM:%d,From AXIM:Shutdown: %d,Delay:%d\n",
- nECOMShutDown, nShutDown, nDelay);
- std::ostringstream buffer;
- buffer << "CallbackST_PWR_OFF shutdown:" << nShutDown << ",Delay Value:" << nDelay;
- string str = buffer.str();
- SendTelegramLog("ST_PWR_OFF", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackPMSSystemStatus
- 功能描述: 获取当前PMS状态
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackPMSSystemStatus(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_INFO("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_SET LoginStatus = (*(ACS_SET*)(stmpBuffer + 8));
- int nStatus = 0;
- if ((LoginStatus & ACS_STATE_SERVICE_SESSION) > 0)
- {
- nStatus = 1;
- m_nGenSTMode = ACS_SERVICE;
- }
- else
- {
- nStatus = 0;
- m_nGenSTMode = -1;
- }
- m_UIClientUnit.m_PLS->Update(nStatus);
- FireNotify(m_UIClientUnit.m_PLS->GetKey(), m_UIClientUnit.m_PLS->JSGet());
- PRINTA_INFO("CallBackSystemLoginStatus:LoginStatus: %x\n", LoginStatus);
- int nAutoConfig = -1;
- if (LoginStatus == ACS_STATE_SERVICE_SESSION)
- {
- nAutoConfig = 1;
- }
- else if (LoginStatus == (ACS_STATE_CONF_INCONSISTENT & ACS_STATE_SERVICE_SESSION))
- {
- nAutoConfig = 0;
- }
- m_UIClientUnit.m_AutoConfig->Update(nAutoConfig);
- FireNotify(m_UIClientUnit.m_AutoConfig->GetKey(), m_UIClientUnit.m_AutoConfig->JSGet());
- std::ostringstream buffer;
- buffer << "LoginStatus:" << LoginStatus;
- string str = buffer.str();
- SendTelegramLog("ST_SYSTEM_STATE", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackIXRAY
- 功能描述:对IXRAY消息进行反馈处理
- 修改记录:
- 2021-4-22 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackIXRAY(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("CallbackIXRAY: Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE xray = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t)));
- ACS_DWORD acq_index = (*(ACS_DWORD*)(pCommand + sizeof(acs_obj_header_t) + 3 * sizeof(ACS_DUMMY) + sizeof(ACS_BYTE)));
-
- if (xray > 0)
- {
- if ((m_bExposureStatus)||(m_bCalibMode)) //仅在收到手闸信号时,设置XRAYON状态;XRAYOFF不受影响,可以设置
- {
- //if (acq_index != m_nExposureIndex)
- //{
- m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYON);
- FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- PRINTA_INFO("CallbackIXRAY: Get Exposure XRAYON,Send the status GENERATOR_RAD_XRAYON\n");
- Clear_DAP();
- ResetEvent(m_hGenPostEvent);
- ResetEvent(m_hGenPostDAPEvent);
- ResetEvent(m_hWaitForDapEvent);
- m_nExposureIndex = acq_index;
- m_FPDGUnit->OnXrayStatus(true);
- DWORD dwThreadId;
- if (NULL == m_hWaitForDapThread)
- {
- }
- else
- {
- m_hWaitForDapThread = NULL;
- }
- m_hWaitForDapThread = CreateThread(NULL, 0, WaitForDapThread, this, 0, &dwThreadId);
-
- if (m_hWaitForDapThread == NULL)
- {
- PRINTA_DEBUG("Open WaitForDapThread Failed");
- }
- //}
- //else
- //{
- // PRINTA_ERROR("CallbackIXRAY: get same index for IXRAYON, don't send the XRAYON message to HW \n");
- //}
- }
- else
- {
- PRINTA_ERROR("CallbackIXRAY: can't get handswitch status, don't send the ixray status to HW,ExposureStatus: %d,CalibMode: %d \n", m_bExposureStatus, m_bCalibMode);
- }
- }
- else
- {
- m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYOFF);
- FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- m_bExposureStatus = false;
- m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
- FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- PRINTA_INFO("CallbackIXRAY: Get Exposure XRAYOFF,Send the status GENERATOR_RAD_XRAYOFF\n");
- }
- PRINTA_INFO("xray: %d, index:%lu\n", xray, acq_index);
- std::ostringstream buffer;
- buffer << "xray:" << (int)xray << ",index:" << (int)acq_index;
- string str = buffer.str();
- SendTelegramLog("IXRAY", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackIWATERVALACQ
- 功能描述: 获取当前DAP值
- 修改记录:
- 2021-04-22 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackIWATERVALACQ(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- int nTempKV = (*(ACS_INT*)(stmpBuffer + 8 + sizeof(ACS_DWORD) + 2 * sizeof(ACS_WORD) + sizeof(ACS_INT)));
- int nTempMA = (*(ACS_INT*)(stmpBuffer + 8 + sizeof(ACS_DWORD) + 2 * sizeof(ACS_WORD) + 2 * sizeof(ACS_INT))); //20220221:按照Siemens要求,虽然解析,但是不使用
- int nTempMAS = (*(ACS_LINT*)(stmpBuffer + 8 + sizeof(ACS_DWORD) + 3 * sizeof(ACS_WORD) + 3 * sizeof(ACS_INT)));
- int nTempMS = (*(ACS_LINT*)(stmpBuffer + 8 + sizeof(ACS_DWORD) + 3 * sizeof(ACS_WORD) + 3 * sizeof(ACS_INT) + sizeof(ACS_LINT)));
- PRINTA_INFO("== IN ==: IWATERVALACQ CallbackPostGenParam begin kv:%d,wMAS: %d, wMS: %d,ma:%d\n", nTempKV, nTempMAS, nTempMS, nTempMA);
- //KV
- m_DoseUnit.m_PostKV->Update((float)((nTempKV) / 10.0f));
- FireNotify(m_DoseUnit.m_PostKV->GetKey(), m_DoseUnit.m_PostKV->JSGet());
- //MAS
- m_DoseUnit.m_PostMAS->Update((float)((nTempMAS) / 100.0f));
- FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
- //MS
- m_DoseUnit.m_PostMS->Update((float)((nTempMS) / 10.0f));
- FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
- //MA
- if (nTempMS > 0)
- {
- m_DoseUnit.m_PostMA->Update(m_DoseUnit.m_PostMAS->Get() * 1000.0 / m_DoseUnit.m_PostMS->Get());
- }
- else
- {
- m_DoseUnit.m_PostMA->Update(0);
- }
- FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
-
- PRINTA_INFO("== IN ==: IWATERVALACQ CallbackPostGenParam PostKV:%f,PostMAS: %f, PostMS: %f, nTempMA: %f,PostMA:%f\n",
- (float)((nTempKV) / 10.0f),
- (float)((nTempMAS) / 100.0f),
- (float)((nTempMS) / 10.0f),
- (float)nTempMA,
- (float)m_DoseUnit.m_PostMA->Get());
- ACS_DWORD ndfp = (*(ACS_DWORD*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DWORD) * 2 + sizeof(ACS_WORD) * 6 + sizeof(ACS_INT) * 3 + sizeof(ACS_LINT) * 3 + sizeof(ACS_BYTE) * 5 + sizeof(ACS_ENUM)));
- ACS_LINT nskdose = (*(ACS_LINT*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DWORD) * 3 + sizeof(ACS_WORD) * 6 + sizeof(ACS_INT) * 3 + sizeof(ACS_LINT) * 3 + sizeof(ACS_BYTE) * 5 + sizeof(ACS_ENUM)));
- m_DoseUnit.m_ReferenceAirKerma->Update((float)(nskdose * 0.01f));
- FireNotify(m_DoseUnit.m_ReferenceAirKerma->GetKey(), m_DoseUnit.m_ReferenceAirKerma->JSGet());
- ACS_BYTE filter_acq = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DWORD) * 3 + sizeof(ACS_WORD) * 6 + sizeof(ACS_INT) * 3 + sizeof(ACS_LINT) * 4 + sizeof(ACS_BYTE) * 5 + sizeof(ACS_ENUM)));
- m_CollimatorUnit.m_Filter->Update(filter_acq);
- FireNotify(m_CollimatorUnit.m_Filter->GetKey(), m_CollimatorUnit.m_Filter->JSGet());
- ACS_DWORD acq_index = (*(ACS_DWORD*)(stmpBuffer + sizeof(acs_obj_header_t)));
- m_DoseUnit.m_GenCurrentExpNumber->Update(acq_index);
- FireNotify(m_DoseUnit.m_GenCurrentExpNumber->GetKey(), m_DoseUnit.m_GenCurrentExpNumber->JSGet());
- ACS_WORD nStime = (*(ACS_WORD*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DWORD) * 3 + sizeof(ACS_WORD) * 6 + sizeof(ACS_INT) * 5 + sizeof(ACS_LINT) * 4 + sizeof(ACS_BYTE) * 7 + sizeof(ACS_ENUM) * 2 + sizeof(ACS_DUMMY)));
- m_DoseUnit.m_GenTotalAcqTimes->Update(acq_index);
- FireNotify(m_DoseUnit.m_GenTotalAcqTimes->GetKey(), m_DoseUnit.m_GenTotalAcqTimes->JSGet());
-
-
- ACS_BYTE nFocus = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_DWORD) * 5 + sizeof(ACS_WORD) * 9 + sizeof(ACS_INT) * 5 + sizeof(ACS_LINT) * 6 + sizeof(ACS_BYTE) * 11 + sizeof(ACS_ENUM) *4 + sizeof(ACS_DUMMY) * 6));
- if (ndfp > 0)
- {
- m_DAP->Update((float)ndfp / 1000.0f);
- FireNotify(m_DAP->GetKey(), m_DAP->JSGet());
- SetEvent(m_hGenPostDAPEvent);
- PRINTA_INFO("CallbackIWATERVALACQ Get DFP: %f,SetDAPEvent", (float)ndfp);
- }
- SetEvent(m_hGenPostEvent);
- if (((nTempKV == 0)&&(nTempMAS == 0)&&(ndfp == 0))
- ||((nTempKV != 0) && (nTempMAS != 0) && (ndfp != 0)))
- {
- SetEvent(m_hWaitForDapEvent);
- }
- else
- {
- PRINTA_ERROR("CallbackIWATERVALACQ:Get Post Parameter = 0");
- }
-
- PRINTA_INFO("CallbackIWATERVALACQ ACQIndex: %lu,Stime: %f (0.1s),dfp:%f(dGycm^2),DAPUnit: %d (0:uGym2,1:mGycm2),ReferenceAirKerma:%f(mGy),FOKUS:%d(1:small,2:large),filter_acq:%d\n",
- acq_index, (float)nStime, (float)ndfp / 1000.0f, m_nDAPUnit, (float)(nskdose * 0.01f), (int)nFocus,(int)filter_acq);
- std::ostringstream buffer;
- buffer << "CallbackIWATERVALACQ ACQIndex : " << acq_index << ", Stime : "
- << (float)nStime << ", dfp :" << (float)ndfp / 1000.0f << "(dGycm ^ 2), ReferenceAirKerma :" << (float)(nskdose * 0.01f) << "(mGy)"
- << ",PostKV:"<< (float)m_DoseUnit.m_PostKV->Get()<<", PostMAS:"<< m_DoseUnit.m_PostMAS->Get()
- << ",PostMS:" << (float)m_DoseUnit.m_PostMS->Get() << ", PostMA:" << m_DoseUnit.m_PostMA->Get() << ",FOKUS:" << (int)nFocus << ",filter_acq:" << (int)filter_acq;
- string str = buffer.str();
- SendTelegramLog("IWATERVALACQ", str.c_str(), object_id);
- return true;
- }
- //发生器READY,表示可以按手闸曝光了
- /*********************************************************************************
- 函数名称:CallBackIANLBEREIT
- 功能描述: 解析发生器状态是否ready
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackIANLBEREIT(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE nANLAUFNBEREIT = (*(ACS_BYTE*)(stmpBuffer + 8));
- if (1 == nANLAUFNBEREIT)
- {
- string code = "0";
- //string code = "Not_Ready";
- string info = "";
- int level = AUTOCLEARERROR;
- m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
- m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_STANDBY);
- FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
- if (m_bAutoHandSwitch)
- {
- SendSAUSLBED(1); //自动曝光 按下手闸
- m_bAutoHandSwitch = false;
- }
- PRINTA_INFO("CallBack IANLBEREIT:1 ,Generator Ready\n");
- }
- else
- {
- if (nANLAUFNBEREIT == m_nIdfrstatus)
- {
- PRINTA_WARN("CallBack IANLBEREIT: Generator not Ready from IS, %d\n", nANLAUFNBEREIT);
- }
- else
- {
- PRINTA_WARN("CallBack IANLBEREIT: Generator not Ready from Other, %d\n", nANLAUFNBEREIT);
- if ((int)m_DoseUnit.m_GenState->Get() != (int)AttrKey::GENERATOR_STATUS_ERROR)
- {
- m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_ERROR);
- FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
- PRINTA_DEBUG("CallBack IANLBEREIT: Different status as before,send to subSystem\n");
- }
- else
- {
- PRINTA_DEBUG("CallBack IANLBEREIT: Due to the same status,don't send the status to subsystem.\n");
- }
- }
- }
- PRINTA_INFO("CallBack IANLBEREIT: %d\n", nANLAUFNBEREIT);
- std::ostringstream buffer;
- buffer << "CallBack IANLBEREIT:" << (int)nANLAUFNBEREIT;
- string str = buffer.str();
- SendTelegramLog("0xF3 IANLBEREIT", str.c_str(), object_id);
- return true;
- }
- ///*********************************************************************************
- //函数名称:CallBackST_DATA_TRANS
- //功能描述: 获取并解析ST_DATA_TRANS报文
- //修改记录:
- //2021-04-23 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::CallBackST_DATA_TRANS(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- int ndata_action = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t))); //执行行为
- int nIdent = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t) + 2)); //执行行为
- if (ndata_action == 5) //需要进行backup操作
- {
- m_UIClientUnit.m_BRM->Update(ndata_action);
- FireDataNotify(m_UIClientUnit.m_BRM->GetKey(), m_UIClientUnit.m_BRM->JSGet());
- m_nBackup_Restre_Identifier = nIdent;
- }
- else
- {
- SetSH_DATA_TRANS(1,nIdent);
- }
- PRINTA_INFO("CallBackST_DATA_TRANS: nconfigResult = %d,m_nBackup_Restre_Identifier: %d\n",
- ndata_action, m_nBackup_Restre_Identifier);
- std::ostringstream buffer;
- buffer << "data_action:" << ndata_action << "Identifier:" << m_nBackup_Restre_Identifier;
- string str = buffer.str();
- SendTelegramLog("ST_DATA_TRANS", str.c_str(), object_id);
- return true;
- }
- ///*********************************************************************************
- //函数名称:CallbackExposureNumber
- //功能描述: 解析曝光的次数报文(ISERVBETRIEB)
- //修改记录:
- //2021-04-23 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::CallbackExposureNumber(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_LINT nSmallFocusNumber = (*(ACS_LINT*)(stmpBuffer + sizeof(iservbetrieb_t1) + 4));
- ACS_LINT nLargeFocusNumber = (*(ACS_LINT*)(stmpBuffer + sizeof(iservbetrieb_t1) + 4 + sizeof(ACS_LINT) + 2 * sizeof(ACS_WORD)));
- m_DoseUnit.m_GenTotalExpNumber->Update(nSmallFocusNumber + nLargeFocusNumber);
- FireNotify(m_DoseUnit.m_GenTotalExpNumber->GetKey(), m_DoseUnit.m_GenTotalExpNumber->JSGet());
- ACS_WORD nWaitTime = (*(ACS_WORD*)(stmpBuffer + sizeof(iservbetrieb_t1) + 4 + sizeof(ACS_LINT)));
- m_DoseUnit.m_GenTubeCoolWaitTimes->Update((int)nWaitTime);
- FireNotify(m_DoseUnit.m_GenTubeCoolWaitTimes->GetKey(), m_DoseUnit.m_GenTubeCoolWaitTimes->JSGet());
- ACS_WORD nOverLoadNumber = (*(ACS_WORD*)(stmpBuffer + sizeof(iservbetrieb_t1) + 4 + sizeof(ACS_LINT) + sizeof(ACS_WORD)));
- m_DoseUnit.m_GenTubeOverLoadNumber->Update((int)nOverLoadNumber);
- FireNotify(m_DoseUnit.m_GenTubeOverLoadNumber->GetKey(), m_DoseUnit.m_GenTubeOverLoadNumber->JSGet());
- int nExposureNumber = nSmallFocusNumber + nLargeFocusNumber;
- PRINTA_INFO("CallbackExposureNumber: ExposureNumber: %d,WaitTime: %d,OverLoadNumber:%d\n",
- nExposureNumber, nWaitTime, nOverLoadNumber);
- std::ostringstream buffer;
- buffer << "SmallFocusNumber:" << nSmallFocusNumber << "LargeFocusNumber:" << nSmallFocusNumber
- << "WaitTime:" << nWaitTime << "OverLoadNumber:" << nOverLoadNumber;
- string str = buffer.str();
- SendTelegramLog("ISERVBETRIEB", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSOD
- 功能描述: 解析SOD信息
- 对应需求:IS_rad_SOD
- 修改记录:
- 2017-10-09 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSOD(ACS_BYTE* pCommand) //receive SOD "ISOD", unit: mm
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("CallBackSOD: Get pCommand is NULL");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_INT nSOD = (*(ACS_INT*)(stmpBuffer + 8));
- //m_SiemensSalmon_Element[CMD_ELEMENT_SOD].fGetValue = nSOD / 10.0f; //202110 待完善
- //m_pGenSiemensSalmon_Mech->Mech::UpdateSOD(nSOD / 10.0f);
- PRINTA_INFO("Callback ISOD: %d (0.1mm),SOD:%f(mm)\n", nSOD, (float)(nSOD / 10.0f));
- std::ostringstream buffer;
- buffer << "ISOD:" << nSOD << "(0.1mm),SOD::" << (float)(nSOD / 10.0f);
- string str = buffer.str();
- SendTelegramLog("ISOD", str.c_str(), object_id);
- return true;
- }
- ///*********************************************************************************
- //函数名称:CallbackIACSS
- //功能描述: 解析IACSS报文(硬裁剪条件)
- //修改记录:
- //2021-04-23 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::CallbackIACSS(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_ENUM acss = (*(ACS_ENUM*)(stmpBuffer + sizeof(acs_obj_header_t)));
- //m_pFPDCommunication->CFPDCommunicateWithOtherDevice::OnHWcrop((int)acss); //202110 待完善
- PRINTA_INFO("CallbackIACSS acss: %d\n", acss);
- std::ostringstream buffer;
- buffer << "acss:" << (int)acss;
- string str = buffer.str();
- SendTelegramLog("IACSS", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSFANZLOESCHEN
- 功能描述: 获取SFANZLOESCHEN报文,表示错误被清除
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSFANZLOESCHEN(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- string code = "0";
- string info = "";
- int level = 0;
- m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
- PRINTA_INFO("CallBackSFANZLOESCHEN:Get Error Recover\n");
- SendTelegramLog("SFANZLOESCHEN","", object_id);
- return true;
- }
- ///*********************************************************************************
- //函数名称:CallbackIERWALLGANZ
- //功能描述:对IERWALLGANZ消息进行反馈处理,获取在屏保状态下的按下手闸的状态,用于激活屏保登录框;
- //修改记录:
- //2021-4-23 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::CallbackIERWALLGANZ(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("CallbackIERWALLGANZ: Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE nSS = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + sizeof(ACS_BYTE)));
- ACS_BYTE nScreensave = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + 2 * sizeof(ACS_BYTE)));
- ACS_SET xray_switch_state = (*(ACS_SET*)(stmpBuffer + sizeof(acs_obj_header_t) + 8 * sizeof(ACS_BYTE)));
- ACS_BYTE battery_level = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + 7 * sizeof(ACS_BYTE)));
- ACS_ENUM mains_connected = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + 10 * sizeof(ACS_BYTE) + sizeof(ACS_SET) + 3 * sizeof(ACS_ENUM)));
- ACS_ENUM nLockStatus = (*(ACS_BYTE*)(stmpBuffer + sizeof(acs_obj_header_t) + 10 * sizeof(ACS_BYTE) + sizeof(ACS_SET) + 5 * sizeof(ACS_ENUM)));
- int nSaftySwitch = 0;
- int nScreenSaveToClient = -1;
- if (nSS == EIN)
- {
- nSaftySwitch = EIN;
- }
- m_UIClientUnit.m_SHS->Update(nSaftySwitch);
- FireNotify(m_UIClientUnit.m_SHS->GetKey(), m_UIClientUnit.m_SHS->JSGet());
- if (nLockStatus == ACS_YES)
- {
- nScreenSaveToClient = 1;
- }
- else if (nLockStatus == ACS_NO)
- {
- nScreenSaveToClient = 0;
- }
- m_UIClientUnit.m_SCREENLOCK->Update(nScreenSaveToClient);
- FireNotify(m_UIClientUnit.m_SCREENLOCK->GetKey(), m_UIClientUnit.m_SCREENLOCK->JSGet());
- int nBatteryChargeState = 0;
- //string code = "";
- //string info = "";
- //int level = AUTOCLEARERROR;
- int nPlugPowerStatus = 1;
- try {
- nPlugPowerStatus = (int)(m_GenConfig["PowerPlugStatus"]);
- }
- catch (...)
- {
- PRINTA_ERROR("Can't get the PowerPlugStatus\n");
- }
- if (nPlugPowerStatus == 1)
- {
- if (mains_connected == ACS_YES)
- {
- nBatteryChargeState = POWER_AC;
- //code = "Main_Contact_unplug";
- //info = "";
- //m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str()); //调用时会崩溃
- //PRINTA_INFO("CallbackIERWALLGANZ:DelErrorMessage Mains unpluged\n");
- }
- else if (mains_connected == ACS_NO)
- {
- nBatteryChargeState = POWER_DC;
- //code = "Main_Contact_unplug";
- //info = "Mains unpluged";
- //m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str());
- }
- else
- {
- nBatteryChargeState = POWER_DC;
- //code = "Main_Contact_unplug";
- //info = "Mains unpluged";
- //m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str());
- }
- }
- m_DoseUnit.m_BatteryChargeState->Update(nBatteryChargeState);
- FireNotify(m_DoseUnit.m_BatteryChargeState->GetKey(), m_DoseUnit.m_BatteryChargeState->JSGet());
- PRINTA_INFO("CallbackIERWALLGANZ:nScreensave: %d,xray_switch_state: %d,safety relay:%d,Battery:%d,mains_connected:%d,nScreenSaveToClient: %d\n",
- (int)nScreensave, xray_switch_state, (int)nSS, (int)nBatteryChargeState, (int)mains_connected, nScreenSaveToClient);
- std::ostringstream buffer;
- buffer << "nScreensave:" << (int)nScreensave << ", xray_switch_state:" << (int)xray_switch_state << ", safety relay:" << (int)nSS << ", mains_connected:" << (int)mains_connected << ", LockStatus:" << (int)nLockStatus;
- string str = buffer.str();
- SendTelegramLog("IERWALLGANZ", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackSORTHO
- 功能描述:接收到拼接图像信息
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackSORTHO(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_LINT nfull_image_size = (*(ACS_LINT*)(stmpBuffer + 8));
- ACS_COUNT nr_images = (*(ACS_COUNT*)(stmpBuffer + 8 + sizeof(ACS_LINT) + sizeof(ACS_DUMMY)));
- ACS_WORD image_size = (*(ACS_WORD*)(stmpBuffer + 8 + sizeof(ACS_LINT) + sizeof(ACS_DUMMY) + sizeof(ACS_COUNT)));
- ACS_WORD ortho_overlap = (*(ACS_WORD*)(stmpBuffer + 8 + sizeof(ACS_LINT) + sizeof(ACS_DUMMY) + sizeof(ACS_COUNT) + sizeof(ACS_WORD)));
- PRINTA_INFO("nfull_image_size:%d, nr_images: %d,image_size: %d, ortho_overlap:%d\n", nfull_image_size, nr_images, image_size, ortho_overlap);
- std::ostringstream buffer;
- buffer << "nfull_image_size:" << nfull_image_size << ",nr_images:" << nr_images
- << ",image_size:" << image_size << ",ortho_overlap:" << ortho_overlap;
- string str = buffer.str();
- SendTelegramLog("SORTHO", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackSH_STPAR_RFP
- 功能描述:接收到拼接图像信息
- 参数:Full_image_size、image_size、overlap、Image number
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackSH_STPAR_RFP(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_ENUM projection = (*(ACS_ENUM*)(stmpBuffer + 8 + sizeof(ACS_BYTE)));
- ACS_INT tube_rot_hor = (*(ACS_INT*)(stmpBuffer + 8 + sizeof(ACS_BYTE) + 13 * sizeof(ACS_ENUM) + 9 * sizeof(ACS_INT) + 8 * sizeof(ACS_LINT) + 3 * sizeof(ACS_WORD)));
- ACS_ENUM cp_position_match = (*(ACS_ENUM*)(stmpBuffer + 8 + sizeof(ACS_BYTE) + 14 * sizeof(ACS_ENUM) + 16 * sizeof(ACS_INT) + 9 * sizeof(ACS_LINT) + 5 * sizeof(ACS_WORD)));
- PRINTA_INFO("projection: %d, cp_position_match: %d, tube_rot_hor:%d\n", projection, cp_position_match, tube_rot_hor);
- std::ostringstream buffer;
- buffer << "projection:" << (int)projection << ", cp_position_match:" << (int)cp_position_match
- << ",tube_rot_hor:" << (int)tube_rot_hor;
- string str = buffer.str();
- SendTelegramLog("SH_STPAR_RFP", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:TimeOutWaring
- 功能描述: 连接超时判断
- 修改记录:
- 2021-04-23 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::TimeOutWaring(void)
- {
- m_nTimeoutCount++;
- if (m_nTimeoutCount >= 3)
- {
- PRINTA_DEBUG("m_nTimeoutCount = %d,Can't communicate with generator\n", m_nTimeoutCount);
- m_nTimeoutCount = 0;
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:FDCConnectXCS
- 功能描述: FDC节点连接到XCU节点
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::FDCConnectXCS()
- {
- axn_word wtimeout = 10;
- axn_status status;
- if (m_pFDCAxnClient)
- {
- CAxnClientIFCreator::deleteAxnClientIF(m_pFDCAxnClient);
- m_pFDCAxnClient = NULL;
- PRINTA_INFO("FDCConnectXCS,deleteFDCAxnClientIF\n");
- }
- if ((m_pFDCAxnClient = CAxnClientIFCreator::newAxnClientIF()) == NULL)
- {
- PRINTA_ERROR("FDC newAxnClientIF fail");
- }//ENDIF
- int ConnectTime = 0; //默认重连次数为1
- PRINTA_INFO("== SEND == : connectToServer FDCAxnClient\n");
- while ((m_pFDCAxnClient != NULL) && (status = m_pFDCAxnClient->connectToServer(FDC_Controlsender, wtimeout)) != ACS_AXN_OK)
- {
- PRINTA_INFO(("FDC Connect Time: %d\n"), ConnectTime);
- printf("FDC Connect Time: %d\n", ConnectTime);
- if (ConnectTime >= 20)
- {
- break;
- }
- else
- {
- ConnectTime++;
- Sleep(1000);
- PRINTA_INFO("Call FDC connectToServer again\n");
- }
- }
- if (ConnectTime >= 20)
- {
- PRINTA_ERROR(("FDC Tried %d times, still failed to connect XCS, return\n"), ConnectTime);
- string code = "ConnectError";
- string info = "Can't connect to Axim, Please reboot the system.";
- int level = CONNECTIONERROR;
- m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(),0xF3);
- return false;
- }
- else
- {
- PRINTA_INFO("Call FDC connectToServer success\n");
- }
- return true;
- }
- /*********************************************************************************
- 函数名称:DisconnectFDCAxn
- 功能描述: 断开FDC节点连接
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- void nsGEN::SMZDevice::DisconnectFDCAxn()
- {
- //FDC
- if (m_pFDCAxnClient)
- {
- CAxnClientIFCreator::deleteAxnClientIF(m_pFDCAxnClient);
- m_pFDCAxnClient = NULL;
- PRINTA_INFO("deleteFDCAxnClientIF\n");
- }//ENDIF
- }
- /*********************************************************************************
- 函数名称:TurnOffRequest
- 功能描述: 设置FLC关闭请求确认到XCU端
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- void nsGEN::SMZDevice::TurnOffRequest()
- {
- if (m_pAxnClient)
- {
- inlist_red_t1 inlistRedObj;
- int no_objects_p = 0;
- inlist_red_t2* pinlist_red_t2_p = NULL;
- unsigned int iObjectSize = sizeof(*pinlist_red_t2_p) * no_objects_p;
- inlistRedObj.header.length = (int)(sizeof(inlistRedObj)) + iObjectSize;
- inlistRedObj.header.mode = ACS_MODE_FUNCTIONAL;
- inlistRedObj.header.target = ACS_NO_TARGET;
- inlistRedObj.header.group_index = 0x01;
- inlistRedObj.header.sender = Clientsender;
- inlistRedObj.header.id = INLIST_RED;
- inlistRedObj.no_objects = (ACS_DCOUNT)no_objects_p;
- // Allocate memory for the data to be sent.
- ACS_BYTE* pDataForSending = new ACS_BYTE[inlistRedObj.header.length * 2];
- if (pDataForSending == NULL)
- {
- //DO NOTHING
- }//ENDIF
- // Copy all objects together in a continous section of memory.
- ACS_BYTE* pCh = pDataForSending;
- ::memcpy(pCh, &inlistRedObj, sizeof(inlistRedObj));
- pCh += sizeof(inlistRedObj);
- ::memcpy(pCh, pinlist_red_t2_p, iObjectSize);
- // Send the resulting memory section.
- ACS_ENUM axnResult = CAxnClientIF::sendObjectToServer(pDataForSending);
- // Release memory.
- delete[] pDataForSending;
- pDataForSending = NULL;
- if (axnResult != ACS_AXN_OK)
- {
- //DO Nothing
- }//ENDIF
- pCh = NULL;
- PRINTA_DEBUG("Turnoff request\n");
- }//ENDIF
- }
- /*********************************************************************************
- 函数名称:ReveiveFDCData
- 功能描述: 接受探测器报文函数
- 修改记录:
- 2020-04-20 创建
- *******************************************************************************/
- DWORD nsGEN::SMZDevice::ReveiveFDCData(LPVOID pParam)
- {
- nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
- while (true)
- {
- if (pCurOpr->m_pFDCBuffer == NULL)
- {
- return 1;
- }//ENDIF
- axn_status status;
- try {
- ::ZeroMemory(pCurOpr->m_pFDCBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
- try
- {
- status = pCurOpr->m_pFDCAxnClient->recvObject((ACS_BYTE*)pCurOpr->m_pFDCBuffer);
- }
- catch (...)
- {
- PRINTA_ERROR("Crash FDC, m_pFDCAxnClient->recvObject\n");
- }
- if (status == ACS_AXN_NOK)
- {
- PRINTA_INFO("Some Error when AxnClient recvObject\n");
- Sleep(2 * AXN_DUMMYTIME_BASE_RATE_IN_MS * 1);
- if (pCurOpr->m_nFDCLostConnectNumber >= 5)
- {
- //m_data.m_gen.m_strsErrorCodeGet = "01000002"; //communication fail 断线
- string code = "ReceiveError";
- string info = "Can't receive the command from generator,Please reboot the system.";
- int level = CONNECTIONERROR;
- pCurOpr->m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(), 0xF3);
- }
- else
- {
- pCurOpr->m_nFDCLostConnectNumber++;
- }
- PRINTA_ERROR("FDC communication fail\n");
- printf("!!!!!!!!FDC communication fail!!!!!!!! \n");
- pCurOpr->DisconnectFDCAxn();
- Sleep(2000);
- pCurOpr->FDCConnectXCS();
- }
- else if (status == ACS_AXN_TIMEOUT)
- {
- PRINTA_ERROR("FDC receive communication Timeout\n");
- }
- else
- {
- if (pCurOpr->m_nFDCLostConnectNumber > 0)
- {
- pCurOpr->m_nFDCLostConnectNumber = 0;
- }
- if (pCurOpr->m_pFDCBuffer != NULL)
- {
- acs_obj_header_t* tel_hdr_p;
- tel_hdr_p = (acs_obj_header_t*)pCurOpr->m_pFDCBuffer;
- try {
- if (tel_hdr_p->length <= MAX_LEN_ACS_OBJ)
- {
- if (tel_hdr_p->id != DUMMY_MSG)
- {
- axn_byte* pFDCBuffer;
- pFDCBuffer = new axn_byte[MAX_LEN_ACS_OBJ];
- ::ZeroMemory(pFDCBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
- ::memcpy(pFDCBuffer, pCurOpr->m_pFDCBuffer, MAX_LEN_ACS_OBJ * sizeof(axn_byte));
- EnterCriticalSection(&pCurOpr->m_csFDCData);
- pCurOpr->m_sFDCCallbackData.push_back(pFDCBuffer);
- LeaveCriticalSection(&pCurOpr->m_csFDCData);
- SetEvent(pCurOpr->m_hFDCDataEvent);
- }
- if (pCurOpr->m_nTimeoutCount != 0)
- {
- pCurOpr->m_nTimeoutCount = 0;
- PRINTA_INFO("ReceiveFDCCommand get command, then set TimeoutCount to 0\n");
- }
- }
- else
- {
- PRINTA_ERROR("Get a error command: > max_len_acs_obj\n");
- }
- }
- catch (...)
- {
- PRINTA_ERROR("Crash log 1, other error\n");
- }
- }
- else
- {
- PRINTA_ERROR("m_pFDCBuffer = NULL\n");
- }
- }
- }
- catch (...)
- {
- PRINTA_ERROR("Crash log 2, other error\n");
- }
- if (pCurOpr->m_bExited)
- {
- break;
- }
- }
- return 1;
- }
- DWORD nsGEN::SMZDevice::FDCDataThread(LPVOID pParam)
- {
- nsGEN::SMZDevice* pCurOpr = (nsGEN::SMZDevice*)pParam;
- while (true)
- {
- axn_byte* dd;
- bool bGetData = false;
- EnterCriticalSection(&pCurOpr->m_csFDCData);
- if (!pCurOpr->m_sFDCCallbackData.empty())
- {
- bGetData = true;
- dd = pCurOpr->m_sFDCCallbackData.front();
- pCurOpr->m_sFDCCallbackData.pop_front();
- LeaveCriticalSection(&pCurOpr->m_csFDCData);
- }
- else
- {
- LeaveCriticalSection(&pCurOpr->m_csFDCData);
- WaitForSingleObject(pCurOpr->m_hFDCDataEvent, 50);
- }
- if (bGetData)
- {
- pCurOpr->FDCCallback((acs_obj_header_t*)dd);
- if (dd != NULL)
- {
- delete[] dd;
- dd = NULL;
- }
- }//ENDIF
- if (pCurOpr->m_bExited)
- {
- break;
- }
- }
- return 0;
- }
- /*********************************************************************************
- 函数名称:FDCCallback
- 功能描述: 将获取到的与探测器相关的报文对应到相应的解析函数
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::FDCCallback(const acs_obj_header_t* pCommand)
- {
- printf("== IN == FDC Telegram ID: %x \n", pCommand->id);
- try
- {
- switch (pCommand->id)
- {
- case UINT16(INIT_MSG):
- PRINTA_INFO("== IN == : FDC INIT_MSG\n");
- SendListFDC();
- SendTelegramLog("0xF4 INIT_MSG");
- break;
- case UINT16(TURN_ON):
- PRINTA_INFO("== IN == : FDC TURN_ON\n");
- CallbackFDCTurnOn((ACS_BYTE*)pCommand);
- break;
- case UINT16(TURN_OFF):
- PRINTA_INFO("== IN == : FDC TURN_OFF\n");
- CallBackFDCTurnOff((ACS_BYTE*)pCommand);
- break;
- case UINT16(SH_SS):
- PRINTA_INFO("== IN == : FDC SH_SS\n");
- CallBackSHSS((ACS_BYTE*)pCommand);
- break;
- case UINT16(SH_RADIATION):
- PRINTA_INFO("== IN == : FDC SH_RADIATION\n");
- CallBackSHRA((ACS_BYTE*)pCommand);
- break;
- //case UINT16(IANLBEREIT):
- // PRINTA_INFO(m_pLog, _T("== IN == : FDC IANLBEREIT"));
- // CallBackIANLBEREIT((ACS_BYTE*)pCommand);
- // break;
- case UINT16(INETZAUFNAHME):
- PRINTA_INFO("== IN == : FDC INETZAUFNAHME\n");
- SendTelegramLog("0xF4 INETZAUFNAHME");
- EnterCriticalSection(&m_csStatus);
- m_bFDCIdentStatus = true;
- LeaveCriticalSection(&m_csStatus);
- break;
- case UINT16(DUMMY_MSG):
- break;
- default:
- break;
- }
- }
- catch (...)
- {
- PRINTA_ERROR("Call FDC Data: Carsh\n");
- }
- return true;
- }
- /*********************************************************************************
- 函数名称:SendListFDC
- 功能描述:设置DROC端需要从PMS端接收的报文清单
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendListFDC(void)
- {
- ACS_WORD szID[FDC_MESSAGE_NUM] = { RQ_OBJECT,
- SH_MODE,
- SH_READY,
- SPATWECHSEL,
- ST_CONFIG,
- ST_DATA_TRANS,
- ST_MODE,
- TURN_ON,
- TURN_OFF,
- SH_SS,
- SH_RADIATION,
- SAUFNAUSL,
- SDETEKTORSTART,
- SAUSLBED,
- IANLBEREIT,
- INETZAUFNAHME,
- DUMMY_MSG
- };
- inlist_enh_t1_tag szSendGen = {};
- m_stGenCommandFDC.id = INLIST_ENH;
- m_stGenCommandFDC.sender = FDC_Controlsender;
- m_stGenCommandFDC.mode = 0;
- m_stGenCommandFDC.target = 0;
- m_stGenCommandFDC.group_index = Clientgroup_index;
- m_stGenCommandFDC.length = m_wHeaderLength + (FDC_MESSAGE_NUM + 1) * sizeof(ACS_WORD);
- szSendGen.no_objects = FDC_MESSAGE_NUM;
- szSendGen.header = m_stGenCommandFDC;
- ACS_BYTE* p_ID = new ACS_BYTE[m_stGenCommandFDC.length * 2];
- ::memset(p_ID, 0, m_stGenCommandFDC.length * sizeof(ACS_BYTE) * 2);
- ::memcpy((ACS_BYTE*)p_ID, (ACS_BYTE*)(&szSendGen), m_wHeaderLength + sizeof(ACS_WORD));
- ::memcpy((ACS_BYTE*)(p_ID + m_wHeaderLength + sizeof(ACS_WORD)),
- (ACS_BYTE*)(&szID), FDC_MESSAGE_NUM * sizeof(ACS_WORD));
- if (m_pFDCAxnClient != NULL)
- {
- m_pFDCAxnClient->sendObject((ACS_BYTE*)p_ID);
- SendTelegramLog("INLIST_ENH", "", m_stGenCommand.sender, 0);
- }//ENDIF
- delete[]p_ID;
- p_ID = NULL;
- PRINTA_DEBUG("== SEND == : INLIST_ENH(FDC LIST)\n");
- return true;
- }
- /*********************************************************************************
- 函数名称:SendIdentFDC
- 功能描述: 设置F4状态到FO端
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::SendIdentFDC(void)
- {
- iident_t1 szSendGen = {};
- m_stGenCommandFDC.id = IIDENT;
- m_stGenCommandFDC.length = m_wHeaderLength + 3 * sizeof(ACS_BYTE) + 10 * sizeof(ACS_STRING_8) + 3 * sizeof(ACS_DUMMY);
- m_stGenCommandFDC.mode = Clientmode;
- m_stGenCommandFDC.sender = FDC_Controlsender;
- m_stGenCommandFDC.group_index = Clientgroup_index;
- m_stGenCommandFDC.target = Clienttarget;
- szSendGen.fetyp = BILDVERARBEITUNG;
- szSendGen.knotenid = FDC_Controlsender;
- szSendGen.apid = FDC_Controlsender;
- ACS_STRING_8 temp[10] = "FLSP_COMP";
- ::memcpy(szSendGen.kompname, temp, 10);
- szSendGen.header = m_stGenCommandFDC;
- if (m_pFDCAxnClient != NULL)
- {
- m_pFDCAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- PRINTA_DEBUG("== SEND == : IIDENT\n");
- SendTelegramLog("IIDENT", "", m_stGenCommand.sender, 0);
- }//ENDIF
- else
- {
- PRINTA_DEBUG("== SEND == : IIDENT is not successful\n");
- }
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackFDCTurnOn
- 功能描述:对TurnOn消息进行反馈处理
- 修改记录:
- 2017-10-16 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackFDCTurnOn(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- PRINTA_DEBUG("callback FDC Turn on : object_id: %x\n", object_id);
- if ((!m_bFDCIdentStatus) && (object_id == Clienttarget))
- {
- SendIdentFDC();
- PRINTA_INFO("callback: m_bFDCIdentStatus = true\n");
- string code = "TurnOff";
- string info = "";
- int level = CONNECTIONERROR;
- m_MSGUnit->DelErrorMessage(code.c_str(), level, info.c_str());
- }//ENDIF
- std::ostringstream buffer;
- buffer << "object_id:" << (int)object_id;
- string str = buffer.str();
- SendTelegramLog("0xF4 TURN_ON", str.c_str(), object_id);
- return true;
- }
- ///*********************************************************************************
- //函数名称:CallBackFDCTurnOff
- //功能描述: 解析当前F4节点关闭状态信息(turn off message)
- //修改记录:
- //2021-04-20 创建
- //*******************************************************************************/
- bool nsGEN::SMZDevice::CallBackFDCTurnOff(ACS_BYTE* Command)
- {
- if (Command == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = Command;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- PRINTA_DEBUG("callback F4 Trun Off : object_id: %x\n", object_id);
- std::ostringstream buffer;
- buffer << "object_id:" << std::hex << (int)object_id <<"h";
- string str = buffer.str();
- SendTelegramLog("0xF4 TURN_OFF", str.c_str(), object_id);
- string code = "";
- string info = "";
- int level = 0;
- if (object_id == Clienttarget)
- {
- TimeOutWaring();
- if (m_bFDCIdentStatus)
- {
- m_bFDCIdentStatus = false;
- PRINTA_INFO("callback: Get FDC Client sender,m_bFDCIdentStatus = false\n");
- }//ENDIF
- code = "TurnOff";
- info = "Lost communication to generator, Please reboot the system.";
- level = CONNECTIONERROR;
- m_MSGUnit->AddErrorMessage(code.c_str(), level, info.c_str(), 0xF3);
- }//ENDIF
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSHSS
- 功能描述: 用来切换DROC当前是否要处于服务模式;
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSHSS(ACS_BYTE* pCommand)
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_ENUM hw_switch = (*(ACS_ENUM*)(stmpBuffer + 8));
- ACS_ENUM sw_switch = (*(ACS_ENUM*)(stmpBuffer + 9));
- ACS_ENUM serv_rad_switch = (*(ACS_ENUM*)(stmpBuffer + 10));
- PRINTA_INFO("CallBackSHSS: hw_switch=%d, sw_switch=%d, serv_rad_switch=%d\n", hw_switch, sw_switch, serv_rad_switch);
- int nCode = serv_rad_switch;
- m_UIClientUnit.m_SHS->Update(nCode);
- FireNotify(m_UIClientUnit.m_SHS->GetKey(), m_UIClientUnit.m_SHS->JSGet());
- std::ostringstream buffer;
- buffer << "hw_switch:" << (int)hw_switch << ", sw_switch:" << (int)sw_switch << ", serv_rad_switch:" << (int)serv_rad_switch;
- string str = buffer.str();
- SendTelegramLog("0xF4 SH_SS", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallBackSHRA
- 功能描述: 记录状态信息,仅为记录( confirm start/stop of xray,
- released by software and hands free movement controlled by software )
- 对应需求:IS_automatic_calibration、IS_hm_UserCalibNoUserOperation(VERSION_RAD3-VA10)、IS_Service_xrayrelease
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallBackSHRA(ACS_BYTE* pCommand)//TODO
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- if (!m_bCalibMode)
- {
- PRINTA_INFO("Not in AutoCalibration, CallBackSHRA return\n");
- return true;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_ENUM rad_ack = (*(ACS_ENUM*)(stmpBuffer + 8));
- ACS_ENUM ecg_sim_ack = (*(ACS_ENUM*)(stmpBuffer + 9));
- ACS_BYTE alive_tag = (*(ACS_ENUM*)(stmpBuffer + 10));
- ACS_ENUM sw_control_status = (*(ACS_ENUM*)(stmpBuffer + 9));
- PRINTA_INFO("CallBackSHRA: rad_ack=%d\n", rad_ack);
- std::ostringstream buffer;
- buffer << "rad_ack:" << (int)rad_ack << ",ecg_sim_ack:" << (int)ecg_sim_ack << ",alive_tag:"
- << (int)alive_tag << ",sw_control_status:" << (int)sw_control_status;
- string str = buffer.str();
- SendTelegramLog("0xF4 SH_RADIATION", str.c_str(), object_id);
- return true;
- }
- /*********************************************************************************
- 函数名称:CallbackSystemParam
- 功能描述: 解析当前workstation设置状态(是否成功)
- 修改记录:
- 2015-04-20 创建
- *******************************************************************************/
- bool nsGEN::SMZDevice::CallbackWorkstationFromXCU(ACS_BYTE* pCommand)//for system status
- {
- if (pCommand == NULL)
- {
- PRINTA_ERROR("Get command is Null");
- return false;
- }//ENDIF
- ACS_BYTE* stmpBuffer = pCommand;
- ACS_BYTE object_id = (*(ACS_BYTE*)(stmpBuffer + 5)); //sender
- ACS_BYTE nSystemNr = (*(ACS_BYTE*)(stmpBuffer + 8));
- ACS_BYTE nstrahler = (*(ACS_BYTE*)(stmpBuffer + 9));
- ACS_BYTE nsysok = (*(ACS_BYTE*)(stmpBuffer + 10)); //if workstation set ok
- int nWS = 0;
- if (1 == nsysok)
- {
- WSGen2UI(nSystemNr, nWS);
- //m_SiemensSalmon_Element[CMD_ELEMENT_WS].fGetValue = nWS; //202110 设置工作位到UI端
- //m_pGenDose->GenUnitLogic::SetValue(nWS, Gen_Param_WORKSTATION);
- m_DoseUnit.m_WS->Update(nWS);
- FireNotify(m_DoseUnit.m_WS->GetKey(), m_DoseUnit.m_WS->JSGet());
- if (m_bReGetTurnOn)
- {
- if (m_bCalibMode)
- {
- }
- else
- {
- //202110 设置APR参数
- SendOrthoLocalParam(AprParamBackup.nWS,
- AprParamBackup.fKV,
- AprParamBackup.fMA,
- AprParamBackup.fMS,
- AprParamBackup.fMAS,
- AprParamBackup.nFocus,
- AprParamBackup.nTechmode,
- AprParamBackup.nAECField,
- AprParamBackup.nAECFilm,
- AprParamBackup.nAECDensity);
- PRINTA_INFO("CallBack isystemanz:1 ,ReTurnOn, Resend APR Parameter\n");
- }
- EnterCriticalSection(&m_csStatus);
- m_bReGetTurnOn = false;
- PRINTA_INFO("CallBack isystemanz:m_bReGetTurnOn = false\n");
- LeaveCriticalSection(&m_csStatus);
- }
- }
- //else
- //{
- // m_data.m_gen.m_nmWorkStation = -2; //show workstation set fail; 20160923 //2021-04-21 待完善功能:需要设置到UI端
- //}
- PRINTA_INFO("== CallbackWorkstationFromXCU == Number of the system : %d, Number of active tube : %d, System is ready : %d, m_nWS : %d\n", nSystemNr, nstrahler, nsysok, nWS);
- std::ostringstream buffer;
- buffer << "Number of the system:" << (int)nSystemNr
- << ", Number of active tube:" << (int)nstrahler
- << ", System is ready :" << (int)nsysok
- << ", nWS:" << (int)nWS;
- string str = buffer.str();
- SendTelegramLog("ISYSTEMANZ", str.c_str(), object_id);
- return true;
- }
- RET_STATUS nsGEN::SMZDevice::IncKV ()
- {
- if (!m_DoseUnit.m_KV->CanInc ()) return RET_STATUS::RET_SUCCEED;
- int nKV = 0;
- int nPos = 0;
- if ((float)m_DoseUnit.m_KV->Get() < (float)m_fKVmin)
- {
- nKV = (int)((float)m_fKVmin * 10);
- nPos = GetFacKvValue(nKV);
- }
- else if ((float)m_DoseUnit.m_KV->Get() >= (float)m_fKVmax)
- {
- nKV = (int)((float)m_fKVmax * 10);
- nPos = GetFacKvValue(nKV);
- }
- else
- {
- nKV = (int)((float)m_DoseUnit.m_KV->Get() * 10);
- nPos = GetFacKvValue(nKV);
- nPos += 1;
- }
- if (nPos >= (int)(g_KV_List.size()))
- {
- nPos = (int)(g_KV_List.size()) - 1;
- }
- else
- {
- //DO NOTHING
- }//ENDIF
- nKV = g_KV_List[nPos];
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, KV, nKV);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::DecKV ()
- {
- if (!m_DoseUnit.m_KV->CanDec ()) return RET_STATUS::RET_SUCCEED;
- int nKV = 0;
- int nPos = 0;
- if ((float)m_DoseUnit.m_KV->Get() > (float)m_fKVmax)
- {
- nKV = (int)((float)m_fKVmax * 10);
- nPos = GetFacKvValue(nKV);
- }
- else if ((float)m_DoseUnit.m_KV->Get() <= (float)m_fKVmin)
- {
- nKV = (int)((float)m_fKVmin * 10);
- nPos = GetFacKvValue(nKV);
- }
- else
- {
- nKV = (int)((float)m_DoseUnit.m_KV->Get() * 10);
- nPos = GetFacKvValue(nKV);
- if (nPos > 0)
- {
- nPos -= 1;
- }
- }
- //ENDIF
- nKV = g_KV_List[nPos];
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, KV, nKV);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetKV (float value)
- {
- if (! m_DoseUnit.m_KV->Verify (value)) return RET_STATUS::RET_SUCCEED;
- if (abs(value - (float)m_DoseUnit.m_KV->Get()) < 0.001)
- {
- return RET_STATUS::RET_FAILED;
- }//ENDIF
- int nKV = (int)value * 10;
- int nPos = GetFacKvValue(nKV);
- int ntempKV = g_KV_List[nPos];
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, KV, ntempKV);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::IncMA ()
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::DecMA ()
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetMA (float value)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::IncMS ()
- {
- if (!m_DoseUnit.m_MS->CanInc ()) return RET_STATUS::RET_SUCCEED;
- if (m_DoseUnit.m_Techmode->Get () == AttrKey::TECHMODE_V2TYPE::ET_MAS)
- {
- printf ("\n Techmode is MAS, can't set MS\n");
- return RET_STATUS::RET_FAILED;
- }
- int nms = 0;
- int nPos = 0;
- if ((float)m_DoseUnit.m_MS->Get() >= (float)m_fMSmax)
- {
- nms = (int)((float)m_fMSmax * 1000);
- nPos = GetFacmSValue(nms);
- }//ENDIF
- else if ((float)m_DoseUnit.m_MS->Get() < (float)m_fMSmin)
- {
- nms = (int)((float)m_fMSmin * 1000);
- nPos = GetFacmSValue(nms);
- }
- else
- {
- nms = (int)((float)m_DoseUnit.m_MS->Get() * 1000);
- nPos = GetFacmSValue(nms);
- nPos += 1;
- }
- if (nPos < (int)g_MS_List.size())
- {
- nms = g_MS_List[nPos] / 10;
- }
- else
- {
- nPos = (int)(g_MS_List.size()) - 1;
- nms = g_MS_List[nPos] / 10;
- }//ENDIF
- if ((int)m_DoseUnit.m_Techmode->Get() != TECHMODE_NOAEC_3P)
- {
- nms = (int)((float)m_fMSmin * 100);
- }//ENDIF
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MS, nms, 1);
- PRINTA_INFO("Set INCMS: %f,To generator:%d\n", (float)m_DoseUnit.m_MS->Get(), nms);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::DecMS ()
- {
- if (!m_DoseUnit.m_MS->CanDec ()) return RET_STATUS::RET_SUCCEED;
- if (m_DoseUnit.m_Techmode->Get () == AttrKey::TECHMODE_V2TYPE::ET_MAS)
- {
- printf ("\n Techmode is MAS, can't set MS");
- return RET_STATUS::RET_FAILED;
- }
- int nms = 0;
- int nPos = 0;
- if ((float)m_DoseUnit.m_MS->Get() <= (float)m_fMSmin)
- {
- nms = (int)(m_fMSmin * 1000);
- nPos = GetFacmSValue(nms);
- }//ENDIF
- else if ((float)m_DoseUnit.m_MS->Get() > (float)m_fMSmax)
- {
- nms = (int)((float)m_fMSmax * 1000);
- nPos = GetFacmSValue(nms);
- }
- else
- {
- nms = (int)((float)m_DoseUnit.m_MS->Get() * 1000);
- nPos = GetFacmSValue(nms);
- if (nPos > 0)
- {
- nPos -= 1;
- }
- }
- nms = g_MS_List[nPos] / 10;
- if ((int)m_DoseUnit.m_MS->Get() != TECHMODE_NOAEC_3P)
- {
- nms = (int)(m_fMSmin * 100);
- }//ENDIF
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MS, nms, 1);
- PRINTA_INFO("Set DECMS: %f,To generator:%d\n", (float)m_DoseUnit.m_MS->Get(), nms);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetMS (float value)
- {
- if (! m_DoseUnit.m_MA->Verify (value)) return RET_STATUS::RET_SUCCEED;
- if (m_DoseUnit.m_Techmode->Get () == AttrKey::TECHMODE_V2TYPE::ET_MAS)
- {
- printf ("\n Techmode is MAS, can't set MS\n");
- return RET_STATUS::RET_FAILED;
- }
- if (abs(value - (float)m_DoseUnit.m_MS->Get()) < 0.001)
- {
- return RET_STATUS::RET_SUCCEED;
- }//ENDIF
- int nMS = (int)(value * 1000);
- int nPos = GetFacmSValue(nMS);
- int ntempmS = g_MS_List[nPos] / 100;
- PRINTA_INFO("Set SetMS: %f,To generator:%d\n", value, ntempmS);
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MS, ntempmS, 1);
- return RET_STATUS::RET_SUCCEED;
- }
- //
- RET_STATUS nsGEN::SMZDevice::IncMAS ()
- {
- if (!m_DoseUnit.m_MAS->CanInc ()) return RET_STATUS::RET_SUCCEED;
- if (m_DoseUnit.m_Techmode->Get () != AttrKey::TECHMODE_V2TYPE::ET_MAS)
- {
- printf ("\n Techmode is not MAS, can't set MAS\n");
- return RET_STATUS::RET_FAILED;
- }
- int nmAs = 0;
- int nPos = 0;
- if ((float)(float)m_DoseUnit.m_MAS->Get() >= m_fMASmax)
- {
- nmAs = (int)((float)m_fMASmax * 1000);
- nPos = GetFacmAsValue(nmAs);
- }//ENDIF
- else if ((float)(float)m_DoseUnit.m_MAS->Get() < (float)m_fMASmin)
- {
- nmAs = (int)((float)m_fMASmin * 1000);
- nPos = GetFacmAsValue(nmAs);
- }
- else
- {
- nmAs = (int)((float)m_DoseUnit.m_MAS->Get() * 1000);
- nPos = GetFacmAsValue(nmAs);
- nPos += 1;
- }
- if (nPos < (int)(g_MAS_List.size()))
- {
- nmAs = g_MAS_List[nPos] / 10;
- }
- else
- {
- nPos = (int)(g_MAS_List.size()) - 1;
- nmAs = g_MAS_List[nPos] / 10;
- }//ENDIF
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MAS, nmAs, 1);
- if (g_MAS_List[nPos] == 560) // Siemens方面特殊要求
- {
- SendGenData(DFR_BEDIENUNG, PLUS_MINUS_TASTEN, MAS, 20, 1); //2为Siemens方面要求 特殊要求取消 20180308
- }//ENDIF
- PRINTA_INFO("Set INCMAS: %f,To generator:%d,nPos:%d\n", (float)(float)m_DoseUnit.m_MAS->Get(), nmAs, nPos);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::DecMAS ()
- {
- if (!m_DoseUnit.m_MAS->CanDec ()) return RET_STATUS::RET_SUCCEED;
- int nmAs = 0;
- int nPos = 0;
- if ((float)m_DoseUnit.m_MAS->Get()<= (float)m_fMASmin)
- {
- nmAs = (int)((float)m_fMASmin * 1000);
- nPos = GetFacmAsValue(nmAs);
- }//ENDIF
- else if ((float)m_DoseUnit.m_MAS->Get() > (float)m_fMASmax)
- {
- nmAs = (int)((float)m_fMASmax * 1000);
- nPos = GetFacmAsValue(nmAs);
- }
- else
- {
- nmAs = (int)((float)m_DoseUnit.m_MAS->Get() * 1000);
- nPos = GetFacmAsValue(nmAs);
- if (nPos > 0)
- {
- nPos -= 1;
- }
- }
- nmAs = g_MAS_List[nPos] / 10;
- if (g_MAS_List[nPos] == 560) //Siemens要求
- {
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MAS, 60, 1);
- SendGenData(DFR_BEDIENUNG, PLUS_MINUS_TASTEN, MAS, 40, 1); //siemens要求 特殊要求取消 20180308
- }//ENDIF
- else
- {
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MAS, nmAs, 1);
- }
- PRINTA_INFO("Set DECMAS: %f,To generator:%d,nPos:%d\n", (float)m_DoseUnit.m_MAS->Get(), nmAs, nPos);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetMAS (float value)
- {
- if (! m_DoseUnit.m_MAS->Verify (value)) return RET_STATUS::RET_SUCCEED;
- if (m_DoseUnit.m_Techmode->Get () != AttrKey::TECHMODE_V2TYPE::ET_MAS)
- {
- printf ("\n Techmode is not MAS, can't set MAS");
- return RET_STATUS::RET_FAILED;
- }
- int nmAs = (int)(value * 1000);
- int nPos = GetFacmAsValue(nmAs);
- if (nPos < (int)(g_MAS_List.size()))
- {
- nmAs = g_MAS_List[nPos] / 10;
- }
- else if (nPos >= (int)g_MAS_List.size())
- {
- nPos = (int)(g_MAS_List.size()) - 1;
- nmAs = g_MAS_List[nPos] / 10;
- }
- else if (nPos <= 0)
- {
- nPos = 0;
- nmAs = g_MAS_List[0] / 10;
- }
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MAS, nmAs, 1);
- return RET_STATUS::RET_SUCCEED;
- }
- //
- RET_STATUS nsGEN::SMZDevice::SetTechmode (int value)
- {
- if (!m_DoseUnit.m_Techmode->Verify (value)) return RET_STATUS::RET_SUCCEED;
- return RET_STATUS::RET_SUCCEED;
- }
- //
- RET_STATUS nsGEN::SMZDevice::SetFocus (int value)
- {
- if (!m_DoseUnit.m_Focus->Verify (value)) return RET_STATUS::RET_SUCCEED;
- int nFOSetting;
- nFOSetting = value;
- if (value == FOCUS_SMALL)
- {
- value = 1; //小焦点
- }
- else if (value == FOCUS_LARGE)
- {
- value = 2; //大焦点
- }
- else
- {
- value = 3; //自动焦点
- }
- PRINTA_INFO("Set FocusSel: %d,To generator:%d\n", nFOSetting, value);
- std::ostringstream buffer;
- buffer << "Focus:" << value << "(1=small; 2=large)";
- string str = buffer.str();
- SendTelegramLog("SBEDGEN", str.c_str(), 0xF3,0);
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, FOKUS, value);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetAECDensity (int value)
- {
- if (!m_DoseUnit.m_AECDensity->Verify (value)) return RET_STATUS::RET_SUCCEED;
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetAECField (int value)
- {
- if (!m_DoseUnit.m_AECField->Verify (value)) return RET_STATUS::RET_SUCCEED;
- int nAECField2Gen = 0;
- switch (value)
- {
- case FIELD_RIGHT:
- nAECField2Gen = RECHTS;
- break;
- case FIELD_CENTER:
- nAECField2Gen = MITTE;
- break;
- case FIELD_RIGHT_CENTER:
- nAECField2Gen = MITTE_RECHTS;
- break;
- case FIELD_LEFT:
- nAECField2Gen = LINKS;
- break;
- case FIELD_LEFT_RIGHT:
- nAECField2Gen = LINKS_RECHTS;
- break;
- case FIELD_CENTER_LEFT:
- nAECField2Gen = LINKS_MITTE;
- break;
- case FIELD_LEFT_CENTER_RIGHT:
- nAECField2Gen = LINKS_MITTE_RECHTS;
- break;
- default:
- nAECField2Gen = 0; //siemens要求 默认为0
- break;
- }
- //若当前在非AEC模式下,设置Techmode以及与AEC相关的参数(Density、Field、Dose,避免参数缺失)
- if (!((int)m_DoseUnit.m_Techmode->Get() == TECHMODE_AEC_3P)
- || ((int)m_DoseUnit.m_Techmode->Get() == TECHMODE_AEC_2P)
- || ((int)m_DoseUnit.m_Techmode->Get() == TECHMODE_AEC_1P)
- || ((int)m_DoseUnit.m_Techmode->Get() == TECHMODE_AEC_1P_REDUCEMA))
- {
- SendsBEDSP(DFR_BEDIENUNG, SELEKTIONSTASTEN, DOSIS_BILD, (int)(m_fAECDensitymin * 1000));
- }
- SendGenData(DFR_BEDIENUNG, SELEKTIONSTASTEN, MESSFELD, nAECField2Gen);
- PRINTA_INFO("Set AECField: %d,To generator:%d\n", value, nAECField2Gen);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetAECFilm (int value)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetWS (const string value)
- {
- PRINTA_INFO("Set WorkStation: %s\n", value.c_str());
- printf("Set WorkStation: %s\n", value.c_str());
- int tempws = 0;
- try
- {
- if (value == "Table") tempws = 0;
- else if (value == "Wall") tempws = 1;
- else if (value == "Direct") tempws = 2;
- else if (value == "Free") tempws = 3;
- }
- catch (const std::exception&)
- {
- printf("SetWS Crash\n");
- }
- m_nSettingWS = tempws;
- AprParamBackup.nWS = tempws; //202110
- //SendOrthoLocalParam(AprParamBackup.nWS,
- // AprParamBackup.fKV,
- // AprParamBackup.fMA,
- // AprParamBackup.fMS,
- // AprParamBackup.fMAS,
- // AprParamBackup.nFocus,
- // AprParamBackup.nTechmode,
- // AprParamBackup.nAECField,
- // AprParamBackup.nAECFilm,
- // AprParamBackup.nAECDensity);
- SendOrthoLocalParam(AprParamBackup.nWS,
- m_DoseUnit.m_KV->Get(),
- m_DoseUnit.m_MA->Get(),
- m_DoseUnit.m_MS->Get(),
- m_DoseUnit.m_MAS->Get(),
- m_DoseUnit.m_Focus->Get(),
- m_DoseUnit.m_Techmode->Get(),
- AprParamBackup.nAECField, //Salmon环境中没有返回该参数,直接使用APR设置的参数
- AprParamBackup.nAECFilm,
- AprParamBackup.nAECDensity);
- PRINTA_INFO("Set WorkStation: %d,To generator:%d\n", m_nSettingWS, tempws);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetAPR (const _tAPRArgs& t)
- {
- AprParamBackup.nWS = t.nWS;
- AprParamBackup.nFocus = t.nFocus;
- AprParamBackup.nTechmode = t.nTechmode;
- AprParamBackup.nAECField = t.nAECField;
- AprParamBackup.nAECFilm = t.nAECFilm;
- AprParamBackup.nAECDensity = t.nAECDensity;
- AprParamBackup.fKV = t.fKV;
- AprParamBackup.fMA = t.fMA;
- AprParamBackup.fMS = t.fMS;
- AprParamBackup.fMAS = t.fMAS;
- m_bSetAPR = true;
- SendOrthoLocalParam(AprParamBackup.nWS,
- AprParamBackup.fKV,
- AprParamBackup.fMA,
- AprParamBackup.fMS,
- AprParamBackup.fMAS,
- AprParamBackup.nFocus,
- AprParamBackup.nTechmode,
- AprParamBackup.nAECField,
- AprParamBackup.nAECFilm,
- AprParamBackup.nAECDensity);
- if (m_bGenService) //服务模式需要设置指令到PMS端
- {
- Sleep(50);
- SendOrthoLocalParam(AprParamBackup.nWS,
- AprParamBackup.fKV,
- AprParamBackup.fMA,
- AprParamBackup.fMS,
- AprParamBackup.fMAS,
- AprParamBackup.nFocus,
- AprParamBackup.nTechmode,
- AprParamBackup.nAECField,
- AprParamBackup.nAECFilm,
- AprParamBackup.nAECDensity,
- ClientPMS);
- }
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::QueryHE(int& value)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::QueryPostKV(float& value)
- {
- if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostEvent, 2000))
- {
- value = m_DoseUnit.m_PostKV->Get();
- return RET_STATUS::RET_SUCCEED;
- }
- else
- {
- value = 0.0;
- return RET_STATUS::RET_FAILED;
- }
- }
- RET_STATUS nsGEN::SMZDevice::QueryPostMA(float& value)
- {
- if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostEvent, 2000))
- {
- value = m_DoseUnit.m_PostMA->Get();
- return RET_STATUS::RET_SUCCEED;
- }
- else
- {
- value = 0.0;
- return RET_STATUS::RET_FAILED;
- }
- }
- RET_STATUS nsGEN::SMZDevice::QueryPostMS(float& value)
- {
- if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostEvent, 2000))
- {
- value = m_DoseUnit.m_PostMS->Get();
- return RET_STATUS::RET_SUCCEED;
- }
- else
- {
- value = 0.0;
- return RET_STATUS::RET_FAILED;
- }
- }
- RET_STATUS nsGEN::SMZDevice::QueryPostMAS(float& value)
- {
- if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostEvent, 2000))
- {
- value = m_DoseUnit.m_PostMAS->Get();
- return RET_STATUS::RET_SUCCEED;
- }
- else
- {
- value = 0.0;
- return RET_STATUS::RET_FAILED;
- }
- }
- RET_STATUS nsGEN::SMZDevice::Clear_DAP()
- {
- m_DoseUnit.m_PostKV->Update(0);
- FireNotify(m_DoseUnit.m_PostKV->GetKey(), m_DoseUnit.m_PostKV->JSGet());
- m_DoseUnit.m_PostMA->Update(0);
- FireNotify(m_DoseUnit.m_PostMA->GetKey(), m_DoseUnit.m_PostMA->JSGet());
- m_DoseUnit.m_PostMS->Update(0);
- FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
- m_DoseUnit.m_PostMAS->Update(0);
- FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
- m_DAP->Update(0);
- FireNotify(m_DAP->GetKey(), m_DAP->JSGet());
- PRINTA_INFO("Clear_DAP: Clear Post Parameter(KV,mA,mS,mAs,Dap)");
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::GetValue_DAP(float& value)
- {
- if (WAIT_OBJECT_0 == WaitForSingleObject(m_hGenPostDAPEvent, 2000))
- {
- value = m_DAP->Get();
- return RET_STATUS::RET_SUCCEED;
- }
- else
- {
- //string strCode = "LostPostParm";
- //string strinfo = "IS can't receive IWATERVALACQ telegram from Axim,please check the DAP setting.";
- //int nlevel = MESSAGEBOX_CLEARERROR;
- //m_MSGUnit->AddWarnMessage(strCode.c_str(), nlevel, strinfo.c_str(), 0xF3);
- value = 0.0;
- return RET_STATUS::RET_FAILED;
- }
- }
- bool SMZDevice::DoExposure()
- {
- PRINTA_INFO("DoExposure");
- if (m_bAlreadyExposure)
- {
- PRINTA_INFO("AlreadyExposure by SetGenSynState");
- return true;
- }
- m_bAlreadyExposure = true;
- SendIDETEKTORSTATUS(1); //打开窗口
- return true;
- }
- RET_STATUS nsGEN::SMZDevice::SetGenSynState(int value)
- {
- PRINTA_INFO("SetGenSynState: %d",value);
- switch (value)
- {
- case AttrKey::GENERATOR_RAD_READY:
- if (m_DoseUnit.m_GenState->Get() == AttrKey::GENERATOR_STATUS_STANDBY)
- {
- SendSAUSLBED(1); //自动曝光 按下手闸
- m_bAutoHandSwitch = false;
- }
- else
- {
- m_bAutoHandSwitch = true;
- }
- break;
- case AttrKey::GENERATOR_RAD_XRAYON:
- {
- try
- {
- m_nXwindowTime = (int)(m_GenConfig["XWindowOpenTimeout"]);
- }
- catch (...)
- {
- PRINTA_ERROR("Can't get the XWindowOpenTimeout value,default = 100ms\n");
- }
- DWORD tmNowTime = GetTickCount();
- int nSpanTime = tmNowTime - m_tmDetectorStart;
- if (nSpanTime <= 0)
- {
- nSpanTime += 1;
- PRINTA_INFO("Span Time = 0, add 1ms"); //siemens requirement 20230220
- }
- PRINTA_INFO("Span Time:%d,tmNowTime:%d, m_tmDetectorStart:%d,XWindowOpenTimeout:%d", nSpanTime, tmNowTime, m_tmDetectorStart,m_nXwindowTime);
- if (m_bAlreadyExposure)
- {
- PRINTA_INFO("AlreadyExposure by SetGenSynState");
- break;
- }
- if (!m_bCalibMode && (nSpanTime > m_nXwindowTime))
- {
- PRINTA_INFO("Omit Send IDETEKTORSTATUS");
- //int level = MESSAGEBOX_CLEARERROR;
- //const char* strSiemensCode = "60019";
- string strDisplayErrorTemp = "Omit Send IDETEKTORSTATUS,Xray isn't released, please try exposure again";
- //m_MSGUnit->AddWarnMessage(strSiemensCode, level, strDisplayErrorTemp.c_str(), 0xF3);
- SendTelegramLog("IDETEKTORSTATUS", strDisplayErrorTemp.c_str(), 0xF3, 1, SYS_LOG_LEVEL_Error, "60019");
- break;
- }
- else if (m_bCalibMode)
- {
- PRINTA_INFO("Send IDETEKTORSTATUS in calibration");
- }
- SendIDETEKTORSTATUS(1); //打开窗口
- m_bAlreadyExposure = true;
- break;
- }
- case AttrKey::GENERATOR_RAD_OFF:
- if (m_DoseUnit.m_GenSynState->Get() != AttrKey::GENERATOR_RAD_OFF)
- {
- if (m_bCalibMode)
- {
- SendSAUSLBED(0); //用于FD自动校正 松开手闸
- }
- else
- {
- //此处会影响冻屏功能,对应bug13337,删除此处代码
- //m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
- //FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- //PRINTA_INFO("<GEN EXP>Get GENERATOR_RAD_OFF in normal, Direct set the synstate to RAD_OFF\n");
- }
- }
- else
- {
- PRINTA_INFO("<GEN EXP>already GENERATOR_RAD_OFF, Don't need to change GenSynState value\n");
- }
-
- break;
- default:
- break;
- }
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetGenState(int value)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::RefreshData ()
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::Reset()
- {
- m_stGenCommand.id = SBEDALLG;
- m_stGenCommand.length = m_wHeaderLength + 2 * sizeof(ACS_ENUM) + 2 * sizeof(ACS_INT) + 2 * sizeof(ACS_DUMMY);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- sbedallg_t1_tag szSendGen = {};
- szSendGen.bedeinh = DFR_BEDIENUNG;
- szSendGen.bedienobj = SELEKTIONSTASTEN;
- szSendGen.fktscodeallg = FEHLER_LOESCHEN;
- szSendGen.param = 1; //Siemens 要求
- ACS_BYTE* sCommmand = new ACS_BYTE[(m_stGenCommand.length + 1) * 2];
- ::memset(sCommmand, 0, (m_stGenCommand.length + 1) * sizeof(ACS_BYTE) * 2);
- ::memcpy(sCommmand, &m_stGenCommand, 8);
- ::memcpy(sCommmand + 8, &szSendGen.bedeinh, 1);
- ::memcpy(sCommmand + 9, &szSendGen.bedienobj, 1);
- ::memcpy(sCommmand + 10, &szSendGen.fktscodeallg, 2);
- ::memcpy(sCommmand + 12, &szSendGen.param, 2);
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject(sCommmand);
- PRINTA_DEBUG("SBEDALLG IS: Reset\n");
- SendTelegramLog("SBEDALLG", "", m_stGenCommand.sender, 0);
- }//ENDIF
- PRINTA_DEBUG("== SEND == : SBEDALLG (Reset)\n");
- delete[] sCommmand;
- sCommmand = NULL;
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetExpMode(std::string value)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetFrameRate(FLOAT frameRate)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetFLFMode(std::string value)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetEXAMMode(std::string value)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetHET() //模拟测试热容量
- {
- PRINTA_INFO("SetHET\n");
- TubeHeatTest();
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetSHO(bool state)//设置检查名称是否正确
- {
- PRINTA_INFO("SetSHO,set the result of view name is %d\n", state);
- SetOrgNameStatus(state);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetSTA(int state)//设置软件状态
- {
- PRINTA_INFO("SetSTA,set the software status is %d\n", state);
- SendIdfrStatus(state, state);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetPIM(const char* viewname)//设置当前view名称到TUI
- {
- PRINTA_INFO("SetPIM,set Viewname %s\n", viewname);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetSSI(const char* key, const char* value)//设置系统信息
- {
- PRINTA_INFO("SetSSI,set SystemStatusInformation key:%s,value:%s\n", key, value);
- string strCode = key;
- int nCode = atoi(strCode.c_str());
- SetSystemStatusInformation(nCode, value, ACS_DIAG_COMPLETED);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetSMV(const char* key, const char* value)//设置组件版本信息
- {
- PRINTA_INFO("SetSMV,set module versionnumber:key:%s,value:%s\n", key, value);
- SetVersionInfor(key, value);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetCFM(const char* key, const char* value)//设置处理配置文件结果
- {
- PRINTA_INFO("Set configure file resul key: %s, value: %s\n",key,value);
- string strCode = value;
- int nCode = atoi(strCode.c_str());
- SetSHCONFIG(nCode);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetBRM(int state)//设置backup结果
- {
- PRINTA_INFO("Set Backup result\n");
- SetSH_DATA_TRANS(state, m_nBackup_Restre_Identifier);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetERA(int state)//检查最后错误数目
- {
- PRINTA_INFO("check the last Error Number\n");
- GetLastErrorAmount();
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetPNS(int state)//病人属性
- {
- PRINTA_INFO("check the Patient Status:%d", state);
- SetPatientStatus(state);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetScreenLockState(int state)
- {
- PRINTA_INFO("Set ScreenLockState: %d\n", state);
- SetScreenSaver(state);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetFDSerialNumber(const char* key, const char* value)
- {
- PRINTA_INFO("Set SendFPDSerialNumber: %s:%s\n", key, value);
- SendFPDSerialNumber(atoi(key),value);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetUIDoing(void)
- {
- PRINTA_INFO("Set UIDoing\n");
- m_stGenCommand.id = IBINOK;
- m_stGenCommand.length = m_wHeaderLength + sizeof(ACS_STRING) *(VERSION_XCU_LENGTH + SVN_REVISION_LENGTH + VERSION_AXCS_LENGTH);
- m_stGenCommand.mode = Clientmode;
- m_stGenCommand.sender = Clientsender;
- m_stGenCommand.group_index = Clientgroup_index;
- m_stGenCommand.target = Clienttarget;
- ibinok_t1 szSendGen = {};
- szSendGen.header = m_stGenCommand;
- if (m_pAxnClient != NULL)
- {
- m_pAxnClient->sendObject((ACS_BYTE*)&szSendGen);
- SendTelegramLog("IBINOK", "IBINOK", m_stGenCommand.sender, 0);
- }//ENDIF
- PRINTA_INFO("== SEND == : IBINOK\n");
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::JSSetFPDCalibrationStatus(std::string in, std::string& out)
- {
- ResDataObject json;
- json.decode(in.c_str());
- unsigned int nValue = json[0];
- PRINTA_INFO("OnCAL: %d", nValue);
- if (nValue == 1)//开始校正
- {
- //需要先发送ORGDATE,然后GetSwitchState(RQ_OJECT)
- m_bCalibMode = true;
- m_bGetIGENANZ = false;
- m_bSetEnable = false;
- SetST_SYSTEM_STATE(ACS_STATE_FDCALIB_RUNNING);
- PRINTA_INFO("--Func-- SetSatetySwitch \n");
- if (!SetSatetySwitch())//发送RQ_OBJECT,收到SH_SS,发送ST_SS; TODO 002
- {
- return RET_STATUS::RET_SUCCEED;;
- }//ENDIF
- }
- else if (nValue == 2)//接受校正结果;
- {
- if (!SendIDFRABSCHALTUNG())
- {
- return RET_STATUS::RET_SUCCEED;;
- }//ENDIF
- }
- else if (nValue == 3)//拒绝校正结果;
- {
- if(m_DoseUnit.m_GenSynState->Get() != AttrKey::GENERATOR_RAD_OFF)
- {
- m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
- FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- PRINTA_INFO("refuse calibration, clear the exposure status to OFF\n");
- }
- if (!SendIDFRABSCHALTUNG())
- {
- return RET_STATUS::RET_SUCCEED;;
- }//ENDIF
- }
- else if ((nValue == 4)||(nValue == 5))//终止校正 || 完成校正;
- {
- if (m_DoseUnit.m_GenSynState->Get() != AttrKey::GENERATOR_RAD_OFF)
- {
- m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
- FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
- PRINTA_INFO("Stop calibration, clear the exposure status to OFF\n");
- }
- m_bCalibMode = false;
- m_bGetIGENANZ = false;
- m_bSetEnable = false;
- SetST_SYSTEM_STATE(ACS_STATE_CONSISTENT);
- }
- //else if (nValue == 5)//完成校正;
- //{
- // m_bCalibMode = false;
- // m_bGetIGENANZ = false;
- // m_bSetEnable = false;
- // SetST_SYSTEM_STATE(ACS_STATE_CONSISTENT);
- //}
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::JSSetPanelSN(std::string in, std::string& out)
- {
- ResDataObject json;
- json.decode(in.c_str());
- string strValue = json[0];
- PRINTA_INFO("SetPanelSN: %s", strValue);
- m_strPanelSN = strValue.c_str();
- SendFPDSerialNumber(ACS_FD_PORTABLE, strValue.c_str());
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::JSSendFPDError(std::string in, std::string& out)
- {
- ResDataObject json;
- json.decode(in.c_str());
- string strBackCom = (string)json["P0"]["BackCommand"];
- int nValue = atoi(strBackCom.c_str());
- m_strPanelSN = (string)json["P0"]["DetectorSN"];
- PRINTA_INFO("SendFPDError: %d, SN: %s", nValue, m_strPanelSN.c_str());
- //SetFDErrorCode(nValue, BEHEB_FEHLER, m_strPanelSN);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::JSClearFPDError(std::string in, std::string& out)
- {
- ResDataObject json;
- json.decode(in.c_str());
- string strBackCom = (string)json["P0"]["BackCommand"];
- int nValue = atoi(strBackCom.c_str());
- if (nValue == 0)
- {
- PRINTA_INFO("Clear all FPD Error");
- }
- else
- {
- PRINTA_INFO("ClearFPDError: %d", nValue);
- }
- //SetFDErrorCode(nValue, BEHEB_FEHLER, m_strPanelSN);
- //Reset();
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::JSSendFPDWarn(std::string in, std::string& out)
- {
- ResDataObject json;
- json.decode(in.c_str());
- string strBackCom = (string)json["BackCommand"];
- int nValue = atoi(strBackCom.c_str());
- m_strPanelSN = (string)json["DetectorSN"];
- PRINTA_INFO("SendFPDWarn: %d, SN: %s", nValue, m_strPanelSN.c_str());
- //SetFDErrorCode(nValue, WARNUNG, m_strPanelSN);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::JSSendFPDStatus(std::string in, std::string& out)
- {
- ResDataObject json;
- json.decode(in.c_str());
- unsigned int nValue = json[0];
- PRINTA_INFO("SendFPDStatus: %d", nValue);
- if (m_DoseUnit.m_WS->Get() != WS_CONVENTIONAL)
- {
- SendIdfrStatus(nValue, nValue);
- }
- else
- {
- PRINTA_INFO("Cassette mode, don't send the Detector status");
- }
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::JSFPDXWindowOpen(std::string in, std::string& out)
- {
- ResDataObject json;
- json.decode(in.c_str());
- m_tmDetectorStart = json[0];
- PRINTA_INFO("JSFPDXWindowOpen time: %d", m_tmDetectorStart);
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::RefreshParameterList(const char* ParamType, float* List, int ListCount, float maxvalue, float minvalue)
- {
- string strtype = ParamType;
- ResDataObject temp;
- temp.update("Max", maxvalue);
- temp.update("Min", minvalue);
- temp.update("List", "");
- for (int i = 0; i < ListCount; i++)
- {
- char chindex[4] = { 0 };
- sprintf_s(chindex, "%d", i);
- temp["List"].add(chindex, List[i]);
- }
- if (strtype == "KVList")
- {
- m_DoseUnit.m_KVList->Update(temp.encode());
- FireNotify(m_DoseUnit.m_KVList->GetKey(),m_DoseUnit.m_KVList->JSGet());
- }
- else if (strtype == "MASList")
- {
- m_DoseUnit.m_mAsList->Update(temp.encode());
- FireNotify(m_DoseUnit.m_mAsList->GetKey(), m_DoseUnit.m_mAsList->JSGet());
- FireNotify(m_DoseUnit.m_KVList->GetKey(), m_DoseUnit.m_KVList->JSGet());
- }
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::AuditMessage(const char* strTime, const char* strMessage)
- {
- ResDataObject temp;
- temp.update("Time", strTime);
- temp.update("Message", strMessage);
- m_UIClientUnit.m_AuditMessage->Update(temp.encode());
- FireDataNotify(m_UIClientUnit.m_AuditMessage->GetKey(), m_UIClientUnit.m_AuditMessage->JSGet());
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetCollimatorSize(unsigned short xsize, unsigned short ysize)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetCollimatorSID(unsigned short sid)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetCollimatorFilter(unsigned short pParams)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetCollimatorAngle(float pParams)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetCollimatorMode(unsigned short pParams)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- RET_STATUS nsGEN::SMZDevice::SetCollimatorLight(unsigned short pParams)
- {
- return RET_STATUS::RET_SUCCEED;
- }
- //-----------------------------------------------------------------------------
- // ProcessCmd
- //-----------------------------------------------------------------------------
- void nsGEN::SMZDevice::FireNotify (std::string key, std::string content)
- {
- EventCenter->OnNotify (1, key, content);
- }
- void nsGEN::SMZDevice::FireDataNotify(std::string key, std::string content)
- {
- EventCenter->OnNotify(ATTRACTION_MSG, key, content);
- }
- void nsGEN::SMZDevice::SendTelegramLog(const char* strTelegramKey, const char* strTelegramLog, int nSender, int nMode, int nTelegramType,const char* strCode) //已完善 20211029
- {
- std::ostringstream buffer;
- buffer << "["<< strTelegramKey << "] " << strTelegramLog;
- string str = buffer.str();
- string strSender = std::to_string(nSender);
- if (nMode == 1)
- {
- EventCenter->OnSystemLog(nTelegramType, strCode, str, strSender);
- }//Endif
- else
- {
- EventCenter->OnSystemLog(SYS_LOG_LEVEL_Telegram, strCode, str, strSender); //系统日志接口问题
- }
- }
- /*********************************************************************************
- 函数名称:WSUI2TUI
- 功能描述:切换workstations从UI到XCU,用于映射对应的workstation值
- 修改记录:
- 2021-4-22 创建
- #define ACS_PF_WP_CASS (ACS_ENUM) 1 work place cassette
- #define ACS_PF_WP_FREE (ACS_ENUM) 4 work place free exposure
- #define ACS_PF_WP_TABLE (ACS_ENUM) 2 work place table
- #define ACS_PF_WP_WALL (ACS_ENUM) 3 work place wall stand
- *******************************************************************************/
- void nsGEN::SMZDevice::WSUI2TUI(int nUIWS, int& nGenWS)
- {
- if (nUIWS == WS_TABLE) //lying: cross mode
- {
- nGenWS = ACS_PF_WP_TABLE;
- }
- else if (nUIWS == WS_WALL) //standing mode
- {
- nGenWS = ACS_PF_WP_WALL;
- }
- else if (nUIWS == WS_FREE) //mobile mode
- {
- nGenWS = ACS_PF_WP_FREE;
- }
- else if (nUIWS == WS_TOMO) //tomo mode
- {
- nGenWS = ACS_PF_WP_TABLE;
- }
- else if (nUIWS == WS_CONVENTIONAL) //Conventional table
- {
- nGenWS = ACS_PF_WP_CASS;
- }
- else
- {
- nGenWS = ACS_PF_WP_CASS;
- }
- PRINTA_INFO("Set default WS: %d,TUI workstaion: %d\n", nUIWS, nGenWS);
- }
- ///*********************************************************************************
- //函数名称:mb2wc
- //功能描述: 字符转换函数:宽字符转多字节
- //修改记录:
- //2021-04-20 创建
- //*******************************************************************************/
- string nsGEN::SMZDevice::wc2mb(const wchar_t* pwcstr)
- {
- std::string strVal = "";
- int nSize = WideCharToMultiByte(CP_UTF8, 0, pwcstr, -1, NULL, 0, NULL, NULL);
- char* pszStr = new char[nSize + 1];
- if (pszStr)
- {
- memset(pszStr, 0, nSize * sizeof(char));
- int nRet = WideCharToMultiByte(CP_UTF8, 0, pwcstr, -1, pszStr, nSize, NULL, NULL);
- if (nRet != 0) // MultiByteToWideChar returns 0 if it does not succeed.
- {
- strVal = pszStr;
- }
- delete[] pszStr;
- pszStr = NULL;
- }
- return strVal;
- }
- ///*********************************************************************************
- //函数名称:mb2wc
- //功能描述: 字符转换函数:多字节转宽字符
- //修改记录:
- //2021-04-20 创建
- //*******************************************************************************/
- wstring nsGEN::SMZDevice::mb2wc(const char* pszStr)
- {
- std::wstring strVal = L"";
- int nSize = MultiByteToWideChar(CP_UTF8, 0, pszStr, -1, NULL, 0);
- wchar_t* pwcStr = new wchar_t[nSize + 1];
- if (pwcStr)
- {
- memset(pwcStr, 0, nSize * sizeof(wchar_t));
- int nRet = MultiByteToWideChar(CP_UTF8, 0, pszStr, -1, pwcStr, nSize);
- if (nRet != 0) // MultiByteToWideChar returns 0 if it does not succeed.
- {
- pwcStr[nSize] = '\0';
- strVal = pwcStr;
- }
- delete[] pwcStr;
- pwcStr = NULL;
- }
- return strVal;
- }
- void nsGEN::SMZDevice::DecodeBase64(string strMessageIn, wstring& strMessageOut)
- {
- vector<unsigned char> listdata;
- CBase64::Decode(strMessageIn, listdata);
- strMessageOut = GetWString(listdata);
- }
- wstring nsGEN::SMZDevice::GetWString(vector<unsigned char>& listdata)
- {
- wstring strOutData = L"";
- for (size_t i = 1; i < listdata.size(); i += 2)
- {
- wchar_t wchar = L'\000';
- unsigned char mchar[2] = { 0 };
- mchar[0] = listdata[i - 1];
- mchar[1] = listdata[i];
- memcpy(&wchar, mchar, 2);
- strOutData += wchar;
- }
- return strOutData;
- }
- ///*********************************************************************************
- //函数名称:SwitchLogLevel
- //功能描述:切换日志属性类型
- //对应需求:
- //修改记录:
- //2021-4-23 创建
- //*******************************************************************************/
- string nsGEN::SMZDevice::SwitchCategory2Str(ACS_ENUM nCatrgoryNumber)
- {
- string strCategory = "";
- switch (nCatrgoryNumber)
- {
- case BEDIENEVENT:
- strCategory = A_BEDIENEVENT;
- break;
- case USERMESSAGE:
- strCategory = I_USERMESSAGE;
- break;
- case RESET_USERMSG_LEGACY:
- strCategory = X_RESET_USERMSG_LEGACY;
- break;
- case TELEGRAM:
- strCategory = T_TELEGRAM;
- break;
- case MSGBOX_NO_OK_NO_TUI:
- strCategory = O_MSGBOX_NO_OK_NO_TUI;
- break;
- case ORTHOMESSAGE:
- strCategory = O_ORTHOMESSAGE;
- break;
- case ACS_FLAG_RESET:
- strCategory = A_ACS_FLAG_RESET;
- break;
- case WARNUNG:
- strCategory = W_WARNUNG;
- break;
- case BEHEB_FEHLER:
- strCategory = R_BEHEB_FEHLER;
- break;
- case NICHT_BEHEB_FEHLER:
- strCategory = E_NICHT_BEHEB_FEHLER;
- break;
- case FATALER_FEHLER:
- strCategory = F_FATALER_FEHLER;
- break;
- case RESET_WARNING:
- strCategory = X_RESET_WARNING;
- break;
- case RESET_ERROR:
- strCategory = X_RESET_ERROR;
- break;
- case RESET_SEVERE:
- strCategory = X_RESET_SEVERE;
- break;
- case RESET_FATAL:
- strCategory = X_RESET_FATAL;
- break;
- case RESET_USERMESSAGE:
- strCategory = X_RESET_USERMESSAGE;
- break;
- case RESET_TELEGRAM:
- strCategory = X_RESET_TELEGRAM;
- break;
- case RESET_MSGBOX:
- strCategory = X_RESET_MSGBOX;
- break;
- case RESET_ORTHOMSG:
- strCategory = X_RESET_ORTHOMSG;
- break;
- case ACS_FLAG_YESNO:
- strCategory = T_ACS_FLAG_YESNO;
- break;
- default:
- strCategory = T_ACS_FLAG_YESNO;
- break;
- }
- return strCategory;
- }
- ///*********************************************************************************
- //函数名称:SwitchLogLevel
- //功能描述:切换日志属性类型
- //对应需求:
- //修改记录:
- //2021-12-20 创建 提供日志属性
- //*******************************************************************************/
- int nsGEN::SMZDevice::SwitchCategory2ECOM(ACS_ENUM nCatrgoryNumber)
- {
- int strCategory = -1;
- switch (nCatrgoryNumber)
- {
- case BEDIENEVENT:
- strCategory = SYS_LOG_LEVEL_Action;
- break;
- case USERMESSAGE:
- strCategory = SYS_LOG_LEVEL_Information;
- break;
- case RESET_USERMSG_LEGACY:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case TELEGRAM:
- strCategory = SYS_LOG_LEVEL_Telegram;
- break;
- case MSGBOX_NO_OK_NO_TUI:
- strCategory = SYS_LOG_LEVEL_Ortho;
- break;
- case ORTHOMESSAGE:
- strCategory = SYS_LOG_LEVEL_Ortho;
- break;
- case ACS_FLAG_RESET:
- strCategory = SYS_LOG_LEVEL_Action;
- break;
- case WARNUNG:
- strCategory = SYS_LOG_LEVEL_Warning;
- break;
- case BEHEB_FEHLER:
- strCategory = SYS_LOG_LEVEL_Recoverable;
- break;
- case NICHT_BEHEB_FEHLER:
- strCategory = SYS_LOG_LEVEL_Error;
- break;
- case FATALER_FEHLER:
- strCategory = SYS_LOG_LEVEL_Fatal;
- break;
- case RESET_WARNING:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case RESET_ERROR:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case RESET_SEVERE:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case RESET_FATAL:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case RESET_USERMESSAGE:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case RESET_TELEGRAM:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case RESET_MSGBOX:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case RESET_ORTHOMSG:
- strCategory = SYS_LOG_LEVEL_RESET;
- break;
- case ACS_FLAG_YESNO:
- strCategory = SYS_LOG_LEVEL_Telegram;
- break;
- default:
- strCategory = SYS_LOG_LEVEL_Telegram;
- break;
- }
- return strCategory;
- }
- /*********************************************************************************
- 函数名称:WSGen2UI
- 功能描述:切换workstations从XCU到UI,用于映射对应的workstation值
- 修改记录:
- 2021-04-20 创建
- *******************************************************************************/
- void nsGEN::SMZDevice::WSGen2UI(int nWSGen, int& nWSUI)
- {
- int nWSGenLying = 1;
- int nWSGenStand = 2;
- int nWSGenFree = 3;
- int nWSGenTomo = 0; //2021-04-21 待完善功能 临时写死 可能不使用
- int nWSGenConventional = 4; //2021-04-21 待完善功能 临时写死
- int nWSGenConventionalTable = 7; //2021-04-21 待完善功能 临时写死 可能不使用
- int nWSGenConventionalWall = 8; //2021-04-21 待完善功能 临时写死 可能不使用
- int nWSGenOrthoWALL = 5; //2021-04-21 待完善功能 临时写死
- int nWSGenOrthoTable = 6; //2021-04-21 待完善功能 临时写死
- try
- {
- nWSGenLying = (int)(m_GenConfig["WorkStation"]["Table"]);
- nWSGenStand = (int)(m_GenConfig["WorkStation"]["Wall"]);
- nWSGenFree = (int)(m_GenConfig["WorkStation"]["Free"]);
- nWSGenConventional = (int)(m_GenConfig["WorkStation"]["Conventional"]);
- }
- catch (ResDataObjectExption& exp)
- {
- PRINTA_ERROR("Get configuration failed, %s", exp.what());
- }
- #pragma region GEN2UI
- if (nWSGen == nWSGenLying)
- {
- if ((nWSGenLying == nWSGenStand)
- || (nWSGenLying == nWSGenTomo)
- || (nWSGenLying == nWSGenFree)
- || (nWSGenLying == nWSGenConventional)
- || (nWSGenLying == nWSGenConventionalTable)
- || (nWSGenLying == nWSGenConventionalWall))
- {
- nWSUI = m_nSettingWS;
- }
- else
- {
- nWSUI = WS_TABLE;
- }
- }
- else if (nWSGen == nWSGenStand)
- {
- if ((nWSGenStand == nWSGenTomo)
- || (nWSGenStand == nWSGenFree)
- || (nWSGenStand == nWSGenConventional)
- || (nWSGenStand == nWSGenConventionalTable)
- || (nWSGenStand == nWSGenConventionalWall))
- {
- nWSUI = m_nSettingWS;
- }
- else
- {
- nWSUI = WS_WALL;
- }
- }
- else if (nWSGen == nWSGenConventional)
- {
- if ((nWSGenConventional == nWSGenTomo)
- || (nWSGenConventional == nWSGenFree)
- || (nWSGenConventional == nWSGenConventionalTable)
- || (nWSGenConventional == nWSGenConventionalWall))
- {
- nWSUI = m_nSettingWS;
- }
- else
- {
- nWSUI = WS_CONVENTIONAL;
- }
- }
- else if (nWSGen == nWSGenFree)
- {
- if ((nWSGenFree == nWSGenTomo)
- || (nWSGenFree == nWSGenConventionalTable)
- || (nWSGenFree == nWSGenConventionalWall))
- {
- nWSUI = m_nSettingWS;
- }
- else
- {
- nWSUI = WS_FREE;
- }
- }
- else if (nWSGen == nWSGenTomo)
- {
- if ((nWSGenFree == nWSGenConventionalTable)
- || (nWSGenFree == nWSGenConventionalWall))
- {
- nWSUI = m_nSettingWS;
- }
- else
- {
- nWSUI = WS_TOMO;
- }
- }
- else if (nWSGen == nWSGenConventionalTable)
- {
- if ((nWSGenConventionalTable == nWSGenConventionalWall))
- {
- nWSUI = m_nSettingWS;
- }
- else
- {
- nWSUI = WS_CONVENTIONAL;
- }
- }
- else if (nWSGen == nWSGenConventionalWall)
- {
- nWSUI = WS_CONVENTIONAL;
- }
- else if (nWSGen == nWSGenOrthoWALL)
- {
- nWSUI = WS_WALL;
- }
- else if (nWSGen == nWSGenOrthoTable)
- {
- nWSUI = WS_TABLE;
- }
- else
- {
- PRINTA_INFO("WSGen2UI: Get workstation %d from Generator,please check the configuration\n", nWSGen);
- }
- #pragma endregion
- }
- //-----------------------------------------------------------------------------
- // SMZDriver
- //-----------------------------------------------------------------------------
- nsGEN::SMZDriver::SMZDriver ()
- {
- m_bConnect = false;
- CreateLogger("Salmon");
- }
- nsGEN::SMZDriver::~SMZDriver ()
- {
- ReleaseLogger();
- }
- auto nsGEN::SMZDriver::CreateDevice (int index) -> std::unique_ptr <IODevice>
- {
- PRINTA_INFO("CreateDevice");
- auto dev = std::unique_ptr <IODevice>(new IODevice(new SMZDevice(EventCenter, m_ConfigFileName)));
- return dev;
- }
- void nsGEN::SMZDriver::FireNotify (int code, std::string key, std::string content)
- {
- EventCenter->OnNotify (code, key, content);
- }
- void nsGEN::SMZDriver::Prepare ()
- {
- super::Prepare ();
- }
- bool DATA_ACTION nsGEN::SMZDriver::Connect ()
- {
- PRINTA_INFO("================Salmon version 3.0.32.0 =============================\n");
-
- ResDataObject Connection = GetConnectParam(m_ConfigFileName);
- printf("connections:%s \n", Connection.encode());
- printf("Connect begin \n");
- m_bConnect = true;
- //auto rc = super::Connect();
- //if (!rc)
- // return 0;
- return 2;
- }
- void nsGEN::SMZDriver::Disconnect()
- {
- super::Disconnect();
- m_bConnect = false;
- }
- bool nsGEN::SMZDriver::isConnected() const
- {
- return m_bConnect;
- }
- std::string nsGEN::SMZDriver::DriverProbe ()
- {
- ResDataObject r_config, HardwareInfo;
- if (r_config.loadFile (m_ConfigFileName.c_str ()))
- {
- HardwareInfo.add ("MajorID", r_config ["CONFIGURATION"] ["MajorID"]);
- HardwareInfo.add ("MinorID", r_config ["CONFIGURATION"] ["MinorID"]);
- HardwareInfo.add ("VendorID", r_config ["CONFIGURATION"] ["VendorID"]);
- HardwareInfo.add ("ProductID", r_config ["CONFIGURATION"] ["ProductID"]);
- HardwareInfo.add ("SerialID", r_config ["CONFIGURATION"] ["SerialID"]);
- }
- else
- {
- HardwareInfo.add ("MajorID", "Generator");
- HardwareInfo.add ("MinorID", "Dr");
- HardwareInfo.add ("VendorID", "Siemens");
- HardwareInfo.add ("ProductID", "Salmon");
- HardwareInfo.add ("SerialID", "Drv");
- }
- string ret = HardwareInfo.encode ();
- return ret;
- }
- std::string nsGEN::SMZDriver::GetResource ()
- {
- ResDataObject temp;
- if (!temp.loadFile (m_ConfigFileName.c_str ()))
- return std::string ();
- auto r_config = temp ["CONFIGURATION"];
- for (auto &Item : m_ConfigInfo)
- {
- string key = Item.GetKey ();
- if (key == ConfKey::CcosGeneratorType)
- {
- Item.SetCurrentValue (((string)r_config ["VendorID"]).c_str ());
- }
- else if (key == ConfKey::CcosGeneratorModel)
- {
- Item.SetCurrentValue (((string)r_config ["ProductID"]).c_str ());
- }
- else if (key == ConfKey::CcosWSTable || key == ConfKey::CcosWSWall || key == ConfKey::CcosWSFree
- || key == ConfKey::CcosWSTomo || key == ConfKey::CcosWSConventional)
- {
- Item.SetCurrentValue (((string)r_config [key.c_str ()]).c_str ());
- }
- else if (key == ConfKey::CcosSynTable || key == ConfKey::CcosSynWall || key == ConfKey::CcosSynFree
- || key == ConfKey::CcosSynTomo || key == ConfKey::CcosSynConventional)
- {
- Item.SetCurrentValue (((string)r_config [key.c_str ()]).c_str ());
- }
- else if (key == ConfKey::CcosSCFType)
- {
- Item.SetCurrentValue (((string)r_config ["connections"] [0] ["type"]).c_str ());
- }
- else if (key == ConfKey::CcosSCFPort || key == ConfKey::CcosSCFBaudrate || key == ConfKey::CcosSCFBytesize
- || key == ConfKey::CcosSCFParity || key == ConfKey::CcosSCFStopbits || key == ConfKey::CcosSCFIP)
- {
- if (r_config ["connections"] [0].GetFirstOf (key.c_str ()) >= 0)
- {
- Item.SetCurrentValue (((string)r_config ["connections"] [0] [key.c_str ()]).c_str ());
- }
- }
- }
- ResDataObject resAttr, resDescription;
- for (auto Item : m_ConfigInfo)
- {
- resAttr.add (Item.GetKey (), Item.GetCurrentValue ());
- resDescription.add (Item.GetKey (), Item.GetDescription ());
- }
- ResDataObject resDeviceResource;
- resDeviceResource.add (ConfKey::CcosGeneratorAttribute, resAttr);
- resDeviceResource.add (ConfKey::CcosGeneratorDescription, resDescription);
- string res = resDeviceResource.encode ();
- printf ("resDeviceResource :%s \n", resDeviceResource.encode ());
- ResDataObject DescriptionTempEx;
- DescriptionTempEx.add(ConfKey::CcosGeneratorConfig, resDeviceResource);
- m_DeviceConfig = DescriptionTempEx;
- return res;
- }
- bool nsGEN::SMZDriver::GetDeviceConfig(std::string& Cfg)
- {
- Cfg = m_DeviceConfig.encode();
- PRINTA_INFO("GetDeviceConfig over");
- return true;
- }
- std::string nsGEN::SMZDriver::DeviceProbe ()
- {
- ResDataObject r_config, HardwareInfo;
- if (r_config.loadFile (m_ConfigFileName.c_str ()))
- {
- HardwareInfo.add ("MajorID", r_config ["CONFIGURATION"] ["MajorID"]);
- HardwareInfo.add ("MinorID", r_config ["CONFIGURATION"] ["MinorID"]);
- HardwareInfo.add ("VendorID", r_config ["CONFIGURATION"] ["VendorID"]);
- HardwareInfo.add ("ProductID", r_config ["CONFIGURATION"] ["ProductID"]);
- HardwareInfo.add ("SerialID", r_config ["CONFIGURATION"] ["SerialID"]);
- }
- else
- {
- HardwareInfo.add ("MajorID", "Generator");
- HardwareInfo.add ("MinorID", "Dr");
- HardwareInfo.add ("VendorID", "Siemens");
- HardwareInfo.add ("ProductID", "Salmon");
- HardwareInfo.add ("SerialID", "1234");
- }
- string ret = HardwareInfo.encode ();
- return ret;
- }
- void nsGEN::SMZDriver::Dequeue (const char * Packet, DWORD Length)
- {
-
- }
- //-----------------------------------------------------------------------------
- // GetIODriver & CreateIODriver
- //-----------------------------------------------------------------------------
- static nsGEN::SMZDriver gIODriver;
- extern "C" CCOS::Dev::IODriver * __cdecl GetIODriver () // 返回静态对象的引用, 调用者不能删除 !
- {
- return &gIODriver;
- }
- extern "C" CCOS::Dev::IODriver * __cdecl CreateIODriver () // 返回新对象, 调用者必须自行删除此对象 !
- {
- return new nsGEN::SMZDriver ();
- }
|